mirror of git://gcc.gnu.org/git/gcc.git
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
This commit is contained in:
parent
67401072c2
commit
a85cfff41d
|
|
@ -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 {
|
||||||
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) {
|
||||||
// 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) {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
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.
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue