diff options
Diffstat (limited to 'src/cmd/ld/dwarf.c')
-rw-r--r-- | src/cmd/ld/dwarf.c | 51 |
1 files changed, 11 insertions, 40 deletions
diff --git a/src/cmd/ld/dwarf.c b/src/cmd/ld/dwarf.c index 5ba4b7c64..fa55fcbb4 100644 --- a/src/cmd/ld/dwarf.c +++ b/src/cmd/ld/dwarf.c @@ -6,7 +6,6 @@ // - eliminate DW_CLS_ if not used // - package info in compilation units // - assign global variables and types to their packages -// - (upstream) type info for C parts of runtime // - gdb uses c syntax, meaning clumsy quoting is needed for go identifiers. eg // ptype struct '[]uint8' and qualifiers need to be quoted away // - lexical scoping is lost, so gdb gets confused as to which 'main.i' you mean. @@ -943,14 +942,16 @@ enum { static char* decodetype_structfieldname(Sym *s, int i) { + Reloc *r; + // go.string."foo" 0x28 / 0x40 s = decode_reloc_sym(s, CommonSize + PtrSize + 2*4 + i*StructFieldSize); if (s == nil) // embedded structs have a nil name. return nil; - s = decode_reloc_sym(s, 0); // string."foo" - if (s == nil) // shouldn't happen. + r = decode_reloc(s, 0); // s has a pointer to the string data at offset 0 + if (r == nil) // shouldn't happen. return nil; - return (char*)s->p; // the c-string + return (char*) r->sym->p + r->add; // the c-string } static Sym* @@ -989,8 +990,8 @@ lookup_or_diag(char *n) { Sym *s; - s = lookup(n, 0); - if (s->size == 0) { + s = rlookup(n, 0); + if (s == nil || s->size == 0) { diag("dwarf: missing type: %s", n); errorexit(); } @@ -1021,22 +1022,8 @@ defgotype(Sym *gotype) if (die != nil) return die; - if (0 && debug['v'] > 2) { - print("new type: %s @0x%08x [%d]", gotype->name, gotype->value, gotype->size); - for (i = 0; i < gotype->size; i++) { - if (!(i%8)) print("\n\t%04x ", i); - print("%02x ", gotype->p[i]); - } - print("\n"); - for (i = 0; i < gotype->nr; i++) { - print("\t0x%02x[%x] %d %s[%llx]\n", - gotype->r[i].off, - gotype->r[i].siz, - gotype->r[i].type, - gotype->r[i].sym->name, - (vlong)gotype->r[i].add); - } - } + if (0 && debug['v'] > 2) + print("new type: %Y\n", gotype); kind = decodetype_kind(gotype); bytesize = decodetype_size(gotype); @@ -1117,7 +1104,6 @@ defgotype(Sym *gotype) fld = newdie(die, DW_ABRV_FUNCTYPEPARAM, s->name+5); newrefattr(fld, DW_AT_type, defptrto(defgotype(s))); } - die = defptrto(die); break; case KindInterface: @@ -1391,7 +1377,7 @@ static void synthesizechantypes(DWDie *die) { DWDie *sudog, *waitq, *link, *hchan, - *dws, *dww, *dwl, *dwh, *elemtype; + *dws, *dww, *dwh, *elemtype; DWAttr *a; int elemsize, linksize, sudogsize; @@ -1430,21 +1416,10 @@ synthesizechantypes(DWDie *die) newattr(dww, DW_AT_byte_size, DW_CLS_CONSTANT, getattr(waitq, DW_AT_byte_size)->value, NULL); - // link<T> - dwl = newdie(&dwtypes, DW_ABRV_STRUCTTYPE, - mkinternaltypename("link", getattr(elemtype, DW_AT_name)->data, NULL)); - copychildren(dwl, link); - substitutetype(dwl, "link", defptrto(dwl)); - substitutetype(dwl, "elem", elemtype); - newattr(dwl, DW_AT_byte_size, DW_CLS_CONSTANT, - linksize + (elemsize > 8 ? elemsize - 8 : 0), NULL); - // hchan<T> dwh = newdie(&dwtypes, DW_ABRV_STRUCTTYPE, mkinternaltypename("hchan", getattr(elemtype, DW_AT_name)->data, NULL)); copychildren(dwh, hchan); - substitutetype(dwh, "senddataq", defptrto(dwl)); - substitutetype(dwh, "recvdataq", defptrto(dwl)); substitutetype(dwh, "recvq", dww); substitutetype(dwh, "sendq", dww); substitutetype(dwh, "free", dws); @@ -1463,12 +1438,8 @@ defdwsymb(Sym* sym, char *s, int t, vlong v, vlong size, int ver, Sym *gotype) if (strncmp(s, "go.string.", 10) == 0) return; - if (strncmp(s, "string.", 7) == 0) - return; - if (strncmp(s, "type._.", 7) == 0) - return; - if (strncmp(s, "type.", 5) == 0) { + if (strncmp(s, "type.", 5) == 0 && strcmp(s, "type.*") != 0) { defgotype(sym); return; } |