mirror of
https://github.com/golang/go.git
synced 2025-12-08 06:10:04 +00:00
cmd/link: add variable_parameter attr to functype outparams
When generating DW_TAG_subroutine_type DIEs during linker DWARF type synthesis, ensure that in the list of children of the subroutine type DIE (correspondings to input/output params) the output params are marked with the DW_AT_variable_parameter attribute. In addition, fix up the generated types of the output params: prior to this patch for a given output parameter of type T, we would emit the DIE type as *T (presumably due to how parameter passing/returning worked prior to the register ABI); with this patch the emitted type will just be T, not *T. Fixes #59977. Change-Id: I5b5600be86473695663c75b85baeecad667b9245 Reviewed-on: https://go-review.googlesource.com/c/go/+/595715 LUCI-TryBot-Result: Go LUCI <golang-scoped@luci-project-accounts.iam.gserviceaccount.com> Reviewed-by: David Chase <drchase@google.com> Reviewed-by: Cherry Mui <cherryyz@google.com>
This commit is contained in:
parent
13b3af0391
commit
ae33b66c19
2 changed files with 30 additions and 4 deletions
|
|
@ -338,6 +338,7 @@ const (
|
|||
DW_ABRV_LEXICAL_BLOCK_SIMPLE
|
||||
DW_ABRV_STRUCTFIELD
|
||||
DW_ABRV_FUNCTYPEPARAM
|
||||
DW_ABRV_FUNCTYPEOUTPARAM
|
||||
DW_ABRV_DOTDOTDOT
|
||||
DW_ABRV_ARRAYRANGE
|
||||
DW_ABRV_NULLTYPE
|
||||
|
|
@ -572,6 +573,8 @@ var abbrevs = []dwAbbrev{
|
|||
{
|
||||
DW_TAG_member,
|
||||
DW_CHILDREN_no,
|
||||
// This abbrev is special-cased by the linker (unlike other DIEs
|
||||
// we don't want a loader.Sym created for this DIE).
|
||||
[]dwAttrForm{
|
||||
{DW_AT_name, DW_FORM_string},
|
||||
{DW_AT_data_member_location, DW_FORM_udata},
|
||||
|
|
@ -586,15 +589,34 @@ var abbrevs = []dwAbbrev{
|
|||
DW_CHILDREN_no,
|
||||
|
||||
// No name!
|
||||
// This abbrev is special-cased by the linker (unlike other DIEs
|
||||
// we don't want a loader.Sym created for this DIE).
|
||||
[]dwAttrForm{
|
||||
{DW_AT_type, DW_FORM_ref_addr},
|
||||
},
|
||||
},
|
||||
|
||||
/* FUNCTYPEOUTPARAM */
|
||||
{
|
||||
DW_TAG_formal_parameter,
|
||||
DW_CHILDREN_no,
|
||||
|
||||
// No name!
|
||||
// This abbrev is special-cased by the linker (unlike other DIEs
|
||||
// we don't want a loader.Sym created for this DIE).
|
||||
[]dwAttrForm{
|
||||
{DW_AT_variable_parameter, DW_FORM_flag},
|
||||
{DW_AT_type, DW_FORM_ref_addr},
|
||||
},
|
||||
},
|
||||
|
||||
/* DOTDOTDOT */
|
||||
{
|
||||
DW_TAG_unspecified_parameters,
|
||||
DW_CHILDREN_no,
|
||||
// No name.
|
||||
// This abbrev is special-cased by the linker (unlike other DIEs
|
||||
// we don't want a loader.Sym created for this DIE).
|
||||
[]dwAttrForm{},
|
||||
},
|
||||
|
||||
|
|
@ -604,6 +626,8 @@ var abbrevs = []dwAbbrev{
|
|||
DW_CHILDREN_no,
|
||||
|
||||
// No name!
|
||||
// This abbrev is special-cased by the linker (unlike other DIEs
|
||||
// we don't want a loader.Sym created for this DIE).
|
||||
[]dwAttrForm{
|
||||
{DW_AT_type, DW_FORM_ref_addr},
|
||||
{DW_AT_count, DW_FORM_udata},
|
||||
|
|
|
|||
|
|
@ -286,7 +286,7 @@ func (d *dwctxt) newdie(parent *dwarf.DWDie, abbrev int, name string) *dwarf.DWD
|
|||
|
||||
var st sym.SymKind
|
||||
switch abbrev {
|
||||
case dwarf.DW_ABRV_FUNCTYPEPARAM, dwarf.DW_ABRV_DOTDOTDOT, dwarf.DW_ABRV_STRUCTFIELD, dwarf.DW_ABRV_ARRAYRANGE:
|
||||
case dwarf.DW_ABRV_FUNCTYPEPARAM, dwarf.DW_ABRV_FUNCTYPEOUTPARAM, dwarf.DW_ABRV_DOTDOTDOT, dwarf.DW_ABRV_STRUCTFIELD, dwarf.DW_ABRV_ARRAYRANGE:
|
||||
// There are no relocations against these dies, and their names
|
||||
// are not unique, so don't create a symbol.
|
||||
return die
|
||||
|
|
@ -622,8 +622,9 @@ func (d *dwctxt) newtype(gotype loader.Sym) *dwarf.DWDie {
|
|||
for i := 0; i < nfields; i++ {
|
||||
s := decodetypeFuncOutType(d.ldr, d.arch, gotype, &relocs, i)
|
||||
sn := d.ldr.SymName(s)
|
||||
fld := d.newdie(die, dwarf.DW_ABRV_FUNCTYPEPARAM, sn[5:])
|
||||
d.newrefattr(fld, dwarf.DW_AT_type, d.defptrto(d.defgotype(s)))
|
||||
fld := d.newdie(die, dwarf.DW_ABRV_FUNCTYPEOUTPARAM, sn[5:])
|
||||
newattr(fld, dwarf.DW_AT_variable_parameter, dwarf.DW_CLS_FLAG, 1, 0)
|
||||
d.newrefattr(fld, dwarf.DW_AT_type, d.defgotype(s))
|
||||
}
|
||||
|
||||
case abi.Interface:
|
||||
|
|
@ -2096,7 +2097,8 @@ func (d *dwctxt) dwarfGenerateDebugSyms() {
|
|||
seen := loader.MakeBitmap(d.ldr.NSym())
|
||||
for _, s := range infoSec.syms {
|
||||
if seen.Has(s) {
|
||||
log.Fatalf("symbol %s listed multiple times", d.ldr.SymName(s))
|
||||
log.Fatalf("dwarf symbol %s listed multiple times",
|
||||
d.ldr.SymName(s))
|
||||
}
|
||||
seen.Set(s)
|
||||
}
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue