mirror of
https://github.com/golang/go.git
synced 2025-12-08 06:10:04 +00:00
cmd/compile: output DWARF lexical blocks for local variables
Change compiler and linker to emit DWARF lexical blocks in debug_info. Version of debug_info is updated from DWARF v.2 to DWARF v.3 since version 2 does not allow lexical blocks with discontinuous ranges. Second attempt at https://go-review.googlesource.com/#/c/29591/ Remaining open problems: - scope information is removed from inlined functions - variables in debug_info do not have DW_AT_start_scope attributes so a variable will shadow other variables with the same name as soon as its containing scope begins, before its declaration. Updates golang/go#12899, golang/go#6913 Change-Id: I0e260a45b564d14a87b88974eb16c5387cb410a5 Reviewed-on: https://go-review.googlesource.com/36879 Run-TryBot: Matthew Dempsky <mdempsky@google.com> TryBot-Result: Gobot Gobot <gobot@golang.org> Reviewed-by: Matthew Dempsky <mdempsky@google.com>
This commit is contained in:
parent
7165bcc6ba
commit
c8b889cc48
21 changed files with 890 additions and 110 deletions
|
|
@ -187,7 +187,7 @@ func Import(imp *types.Pkg, in *bufio.Reader) {
|
|||
|
||||
if f := p.funcList[i]; f != nil {
|
||||
// function not yet imported - read body and set it
|
||||
funchdr(f)
|
||||
funchdr(f, src.NoPos)
|
||||
body := p.stmtList()
|
||||
if body == nil {
|
||||
// Make sure empty body is not interpreted as
|
||||
|
|
@ -198,7 +198,7 @@ func Import(imp *types.Pkg, in *bufio.Reader) {
|
|||
body = []*Node{nod(OEMPTY, nil, nil)}
|
||||
}
|
||||
f.Func.Inl.Set(body)
|
||||
funcbody(f)
|
||||
funcbody(f, src.NoPos)
|
||||
} else {
|
||||
// function already imported - read body but discard declarations
|
||||
dclcontext = PDISCARD // throw away any declarations
|
||||
|
|
@ -1091,54 +1091,54 @@ func (p *importer) node() *Node {
|
|||
return nodl(p.pos(), op, p.expr(), nil)
|
||||
|
||||
case OIF:
|
||||
markdcl()
|
||||
markdcl(src.NoPos)
|
||||
n := nodl(p.pos(), OIF, nil, nil)
|
||||
n.Ninit.Set(p.stmtList())
|
||||
n.Left = p.expr()
|
||||
n.Nbody.Set(p.stmtList())
|
||||
n.Rlist.Set(p.stmtList())
|
||||
popdcl()
|
||||
popdcl(src.NoPos)
|
||||
return n
|
||||
|
||||
case OFOR:
|
||||
markdcl()
|
||||
markdcl(src.NoPos)
|
||||
n := nodl(p.pos(), OFOR, nil, nil)
|
||||
n.Ninit.Set(p.stmtList())
|
||||
n.Left, n.Right = p.exprsOrNil()
|
||||
n.Nbody.Set(p.stmtList())
|
||||
popdcl()
|
||||
popdcl(src.NoPos)
|
||||
return n
|
||||
|
||||
case ORANGE:
|
||||
markdcl()
|
||||
markdcl(src.NoPos)
|
||||
n := nodl(p.pos(), ORANGE, nil, nil)
|
||||
n.List.Set(p.stmtList())
|
||||
n.Right = p.expr()
|
||||
n.Nbody.Set(p.stmtList())
|
||||
popdcl()
|
||||
popdcl(src.NoPos)
|
||||
return n
|
||||
|
||||
case OSELECT, OSWITCH:
|
||||
markdcl()
|
||||
markdcl(src.NoPos)
|
||||
n := nodl(p.pos(), op, nil, nil)
|
||||
n.Ninit.Set(p.stmtList())
|
||||
n.Left, _ = p.exprsOrNil()
|
||||
n.List.Set(p.stmtList())
|
||||
popdcl()
|
||||
popdcl(src.NoPos)
|
||||
return n
|
||||
|
||||
// case OCASE, OXCASE:
|
||||
// unreachable - mapped to OXCASE case below by exporter
|
||||
|
||||
case OXCASE:
|
||||
markdcl()
|
||||
markdcl(src.NoPos)
|
||||
n := nodl(p.pos(), OXCASE, nil, nil)
|
||||
n.Xoffset = int64(block)
|
||||
n.List.Set(p.exprList())
|
||||
// TODO(gri) eventually we must declare variables for type switch
|
||||
// statements (type switch statements are not yet exported)
|
||||
n.Nbody.Set(p.stmtList())
|
||||
popdcl()
|
||||
popdcl(src.NoPos)
|
||||
return n
|
||||
|
||||
// case OFALL:
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue