Commit 059c10b5 authored by Keith Randall's avatar Keith Randall

cmd/ld: get rid of map.bucket's data field from dwarf info.

The data field is the generic array that acts as a standin
for the keys and values arrays for the generic runtime code.
We want to substitute the keys and values arrays for the data
array, not just add keys and values in addition to it.

LGTM=iant
R=golang-codereviews, iant
CC=golang-codereviews
https://golang.org/cl/81160044
parent 9121e7e4
...@@ -1099,21 +1099,29 @@ defptrto(DWDie *dwtype) ...@@ -1099,21 +1099,29 @@ defptrto(DWDie *dwtype)
} }
// Copies src's children into dst. Copies attributes by value. // Copies src's children into dst. Copies attributes by value.
// DWAttr.data is copied as pointer only. // DWAttr.data is copied as pointer only. If except is one of
// the top-level children, it will not be copied.
static void static void
copychildren(DWDie *dst, DWDie *src) copychildrenexcept(DWDie *dst, DWDie *src, DWDie *except)
{ {
DWDie *c; DWDie *c;
DWAttr *a; DWAttr *a;
for (src = src->child; src != nil; src = src->link) { for (src = src->child; src != nil; src = src->link) {
if(src == except)
continue;
c = newdie(dst, src->abbrev, getattr(src, DW_AT_name)->data); c = newdie(dst, src->abbrev, getattr(src, DW_AT_name)->data);
for (a = src->attr; a != nil; a = a->link) for (a = src->attr; a != nil; a = a->link)
newattr(c, a->atr, a->cls, a->value, a->data); newattr(c, a->atr, a->cls, a->value, a->data);
copychildren(c, src); copychildrenexcept(c, src, nil);
} }
reverselist(&dst->child); reverselist(&dst->child);
} }
static void
copychildren(DWDie *dst, DWDie *src)
{
copychildrenexcept(dst, src, nil);
}
// Search children (assumed to have DW_TAG_member) for the one named // Search children (assumed to have DW_TAG_member) for the one named
// field and set its DW_AT_type to dwtype // field and set its DW_AT_type to dwtype
...@@ -1253,7 +1261,10 @@ synthesizemaptypes(DWDie *die) ...@@ -1253,7 +1261,10 @@ synthesizemaptypes(DWDie *die)
mkinternaltypename("bucket", mkinternaltypename("bucket",
getattr(keytype, DW_AT_name)->data, getattr(keytype, DW_AT_name)->data,
getattr(valtype, DW_AT_name)->data)); getattr(valtype, DW_AT_name)->data));
copychildren(dwhb, bucket); // Copy over all fields except the field "data" from the generic bucket.
// "data" will be replaced with keys/values below.
copychildrenexcept(dwhb, bucket, find(bucket, "data"));
fld = newdie(dwhb, DW_ABRV_STRUCTFIELD, "keys"); fld = newdie(dwhb, DW_ABRV_STRUCTFIELD, "keys");
newrefattr(fld, DW_AT_type, dwhk); newrefattr(fld, DW_AT_type, dwhk);
newmemberoffsetattr(fld, BucketSize + PtrSize); newmemberoffsetattr(fld, BucketSize + PtrSize);
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment