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;  	} | 
