Commit a85cfff4 by Ian Lance Taylor

debug/elf, debug/dwarf: DWARF line number fixes.

Support DW_AT_high_pc as a constant.
Support DW_AT_ranges.

PR gcc/52583

From-SVN: r191008
parent 67401072
...@@ -67,12 +67,22 @@ func (d *Data) readUnitLine(i int, u *unit) error { ...@@ -67,12 +67,22 @@ func (d *Data) readUnitLine(i int, u *unit) error {
switch e.Tag { switch e.Tag {
case TagCompileUnit, TagSubprogram, TagEntryPoint, TagInlinedSubroutine: case TagCompileUnit, TagSubprogram, TagEntryPoint, TagInlinedSubroutine:
low, lowok := e.Val(AttrLowpc).(uint64) low, lowok := e.Val(AttrLowpc).(uint64)
high, highok := e.Val(AttrHighpc).(uint64) var high uint64
var highok bool
switch v := e.Val(AttrHighpc).(type) {
case uint64:
high = v
highok = true
case int64:
high = low + uint64(v)
highok = true
}
if lowok && highok { if lowok && highok {
u.pc = append(u.pc, addrRange{low, high}) u.pc = append(u.pc, addrRange{low, high})
} else if f, ok := e.Val(AttrRanges).(Offset); ok { } else if off, ok := e.Val(AttrRanges).(Offset); ok {
// TODO: Handle AttrRanges and .debug_ranges. if err := d.readAddressRanges(off, low, u); err != nil {
_ = f return err
}
} }
val := e.Val(AttrStmtList) val := e.Val(AttrStmtList)
if val != nil { if val != nil {
...@@ -98,6 +108,38 @@ func (d *Data) readUnitLine(i int, u *unit) error { ...@@ -98,6 +108,38 @@ func (d *Data) readUnitLine(i int, u *unit) error {
return nil return nil
} }
// readAddressRanges adds address ranges to a unit.
func (d *Data) readAddressRanges(off Offset, base uint64, u *unit) error {
b := makeBuf(d, u, "ranges", off, d.ranges[off:])
var highest uint64
switch u.addrsize {
case 1:
highest = 0xff
case 2:
highest = 0xffff
case 4:
highest = 0xffffffff
case 8:
highest = 0xffffffffffffffff
default:
return errors.New("unknown address size")
}
for {
if b.err != nil {
return b.err
}
low := b.addr()
high := b.addr()
if low == 0 && high == 0 {
return b.err
} else if low == highest {
base = high
} else {
u.pc = append(u.pc, addrRange{low + base, high + base})
}
}
}
// findLine finds the line information for a PC value, given the unit // findLine finds the line information for a PC value, given the unit
// containing the information. // containing the information.
func (d *Data) findLine(u *unit, pc uint64) ([]*Line, error) { func (d *Data) findLine(u *unit, pc uint64) ([]*Line, error) {
......
...@@ -563,7 +563,7 @@ func (f *File) DWARF() (*dwarf.Data, error) { ...@@ -563,7 +563,7 @@ func (f *File) DWARF() (*dwarf.Data, error) {
// There are many other DWARF sections, but these // There are many other DWARF sections, but these
// are the required ones, and the debug/dwarf package // are the required ones, and the debug/dwarf package
// does not use the others, so don't bother loading them. // does not use the others, so don't bother loading them.
var names = [...]string{"abbrev", "info", "line", "str"} var names = [...]string{"abbrev", "info", "line", "ranges", "str"}
var dat [len(names)][]byte var dat [len(names)][]byte
for i, name := range names { for i, name := range names {
name = ".debug_" + name name = ".debug_" + name
...@@ -592,8 +592,8 @@ func (f *File) DWARF() (*dwarf.Data, error) { ...@@ -592,8 +592,8 @@ func (f *File) DWARF() (*dwarf.Data, error) {
} }
} }
abbrev, info, line, str := dat[0], dat[1], dat[2], dat[3] abbrev, info, line, ranges, str := dat[0], dat[1], dat[2], dat[3], dat[4]
return dwarf.New(abbrev, nil, nil, info, line, nil, nil, str) return dwarf.New(abbrev, nil, nil, info, line, nil, ranges, str)
} }
// Symbols returns the symbol table for f. // Symbols returns the symbol table for f.
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment