// As an exception to that rule, we typically write down all the
// size variants of an operation even if we just use a subset.
var progtable = [x86.ALAST & obj.AMask]gc.ProgInfo{
- obj.ATYPE: {Flags: gc.Pseudo | gc.Skip},
obj.ATEXT: {Flags: gc.Pseudo},
obj.AFUNCDATA: {Flags: gc.Pseudo},
obj.APCDATA: {Flags: gc.Pseudo},
// As an exception to that rule, we typically write down all the
// size variants of an operation even if we just use a subset.
var progtable = [arm.ALAST & obj.AMask]gc.ProgInfo{
- obj.ATYPE: {Flags: gc.Pseudo | gc.Skip},
obj.ATEXT: {Flags: gc.Pseudo},
obj.AFUNCDATA: {Flags: gc.Pseudo},
obj.APCDATA: {Flags: gc.Pseudo},
//
// The table is formatted for 8-space tabs.
var progtable = [arm64.ALAST & obj.AMask]gc.ProgInfo{
- obj.ATYPE: {Flags: gc.Pseudo | gc.Skip},
obj.ATEXT: {Flags: gc.Pseudo},
obj.AFUNCDATA: {Flags: gc.Pseudo},
obj.APCDATA: {Flags: gc.Pseudo},
// Gins inserts instruction as. f is from, t is to.
func Gins(as obj.As, f, t *Node) *obj.Prog {
switch as {
- case obj.AVARKILL, obj.AVARLIVE, obj.AVARDEF, obj.ATYPE,
+ case obj.AVARKILL, obj.AVARLIVE, obj.AVARDEF,
obj.ATEXT, obj.AFUNCDATA, obj.AUSEFIELD:
default:
Fatalf("unhandled gins op %v", as)
}
}
- for _, n := range fn.Func.Dcl {
+ gendebug(ptxt.From.Sym, fn.Func.Dcl)
+
+ genssa(ssafn, ptxt, gcargs, gclocals)
+ ssafn.Free()
+}
+
+func gendebug(fn *obj.LSym, decls []*Node) {
+ if fn == nil {
+ return
+ }
+
+ for _, n := range decls {
if n.Op != ONAME { // might be OTYPE or OLITERAL
continue
}
+
+ var name int16
switch n.Class {
case PAUTO:
if !n.Used {
continue
}
- fallthrough
+ name = obj.NAME_AUTO
case PPARAM, PPARAMOUT:
- // The symbol is excluded later from debugging info if its name begins ".autotmp_", but the type is still necessary.
- // See bugs #17644 and #17830 and cmd/internal/dwarf/dwarf.go
- p := Gins(obj.ATYPE, n, nil)
- p.From.Sym = obj.Linklookup(Ctxt, n.Sym.Name, 0)
- p.To.Type = obj.TYPE_MEM
- p.To.Name = obj.NAME_EXTERN
- p.To.Sym = Linksym(ngotype(n))
+ name = obj.NAME_PARAM
+ default:
+ continue
}
- }
- genssa(ssafn, ptxt, gcargs, gclocals)
- ssafn.Free()
+ a := &obj.Auto{
+ Asym: obj.Linklookup(Ctxt, n.Sym.Name, 0),
+ Aoffset: int32(n.Xoffset),
+ Name: name,
+ Gotype: Linksym(ngotype(n)),
+ }
+
+ a.Link = fn.Autom
+ fn.Autom = a
+ }
}
type symByName []*Sym
if false {
fmt.Printf("analyzing '%v'\n", p)
}
- if p.As != obj.ATYPE {
- checkprog(fn, p)
- }
+ checkprog(fn, p)
}
}
//
// The table is formatted for 8-space tabs.
var progtable = [mips.ALAST & obj.AMask]gc.ProgInfo{
- obj.ATYPE: {Flags: gc.Pseudo | gc.Skip},
obj.ATEXT: {Flags: gc.Pseudo},
obj.AFUNCDATA: {Flags: gc.Pseudo},
obj.APCDATA: {Flags: gc.Pseudo},
//
// The table is formatted for 8-space tabs.
var progtable = [mips.ALAST & obj.AMask]gc.ProgInfo{
- obj.ATYPE: {Flags: gc.Pseudo | gc.Skip},
obj.ATEXT: {Flags: gc.Pseudo},
obj.AFUNCDATA: {Flags: gc.Pseudo},
obj.APCDATA: {Flags: gc.Pseudo},
//
// The table is formatted for 8-space tabs.
var progtable = [ppc64.ALAST & obj.AMask]gc.ProgInfo{
- obj.ATYPE: {Flags: gc.Pseudo | gc.Skip},
obj.ATEXT: {Flags: gc.Pseudo},
obj.AFUNCDATA: {Flags: gc.Pseudo},
obj.APCDATA: {Flags: gc.Pseudo},
// As an exception to that rule, we typically write down all the
// size variants of an operation even if we just use a subset.
var progtable = [s390x.ALAST & obj.AMask]gc.ProgInfo{
- obj.ATYPE & obj.AMask: {Flags: gc.Pseudo | gc.Skip},
obj.ATEXT & obj.AMask: {Flags: gc.Pseudo},
obj.AFUNCDATA & obj.AMask: {Flags: gc.Pseudo},
obj.APCDATA & obj.AMask: {Flags: gc.Pseudo},
//
// The table is formatted for 8-space tabs.
var progtable = [x86.ALAST & obj.AMask]gc.ProgInfo{
- obj.ATYPE: {Flags: gc.Pseudo | gc.Skip},
obj.ATEXT: {Flags: gc.Pseudo},
obj.AFUNCDATA: {Flags: gc.Pseudo},
obj.APCDATA: {Flags: gc.Pseudo},
AMOVM,
ARFE,
obj.ATEXT,
- obj.AUSEFIELD,
- obj.ATYPE:
+ obj.AUSEFIELD:
break
case AADDF:
APCDATA
ARET
ATEXT
- ATYPE
AUNDEF
AUSEFIELD
AVARDEF
case AEND:
continue
- case ATYPE:
- // Assume each TYPE instruction describes
- // a different local variable or parameter,
- // so no dedup.
- // Using only the TYPE instructions means
- // that we discard location information about local variables
- // in C and assembly functions; that information is inferred
- // from ordinary references, because there are no TYPE
- // instructions there. Without the type information, gdb can't
- // use the locations, so we don't bother to save them.
- // If something else could use them, we could arrange to
- // preserve them.
- if curtext == nil {
- continue
- }
- a := new(Auto)
- a.Asym = p.From.Sym
- a.Aoffset = int32(p.From.Offset)
- a.Name = int16(p.From.Name)
- a.Gotype = p.To.Sym
- a.Link = curtext.Autom
- curtext.Autom = a
- continue
-
case ATEXT:
s := p.From.Sym
if s == nil {
"PCDATA",
"RET",
"TEXT",
- "TYPE",
"UNDEF",
"USEFIELD",
"VARDEF",
{AXTEST, ynone, Px, [23]uint8{0x0f, 01, 0xd6}},
{AXGETBV, ynone, Pm, [23]uint8{01, 0xd0}},
{obj.AUSEFIELD, ynop, Px, [23]uint8{0, 0}},
- {obj.ATYPE, nil, 0, [23]uint8{}},
{obj.AFUNCDATA, yfuncdata, Px, [23]uint8{0, 0}},
{obj.APCDATA, ypcdata, Px, [23]uint8{0, 0}},
{obj.AVARDEF, nil, 0, [23]uint8{}},