diff --git a/dwarf/frame/entries.go b/dwarf/frame/entries.go index e63c41a1..39f760a7 100644 --- a/dwarf/frame/entries.go +++ b/dwarf/frame/entries.go @@ -19,12 +19,8 @@ type CommonInformationEntry struct { InitialInstructions []byte } -type addrange struct { - begin, end uint64 -} - func (fde *FrameDescriptionEntry) Cover(addr uint64) bool { - if (addr - fde.AddressRange.begin) < fde.AddressRange.end { + if (addr - fde.begin) < fde.end { return true } @@ -36,8 +32,16 @@ func (fde *FrameDescriptionEntry) Cover(addr uint64) bool { type FrameDescriptionEntry struct { Length uint32 CIE *CommonInformationEntry - AddressRange *addrange Instructions []byte + begin, end uint64 +} + +func (fde *FrameDescriptionEntry) Begin() uint64 { + return fde.begin +} + +func (fde *FrameDescriptionEntry) End() uint64 { + return fde.begin + fde.end } func (fde *FrameDescriptionEntry) EstablishFrame(pc uint64) *FrameContext { @@ -68,22 +72,21 @@ func (fdes *FrameDescriptionEntries) FDEForPC(pc uint64) (*FrameDescriptionEntry } func (frame *FrameDescriptionEntry) Less(item rbtree.Item) bool { - return frame.AddressRange.begin < item.(*FrameDescriptionEntry).AddressRange.begin + return frame.Begin() < item.(*FrameDescriptionEntry).Begin() } func (frame *FrameDescriptionEntry) More(item rbtree.Item) bool { - r := item.(*FrameDescriptionEntry).AddressRange - fnr := frame.AddressRange - return fnr.begin+fnr.end > r.begin+r.end + f := item.(*FrameDescriptionEntry) + return frame.End() > f.End() } type Addr uint64 func (a Addr) Less(item rbtree.Item) bool { - return uint64(a) < item.(*FrameDescriptionEntry).AddressRange.begin + return uint64(a) < item.(*FrameDescriptionEntry).Begin() } func (a Addr) More(item rbtree.Item) bool { - r := item.(*FrameDescriptionEntry).AddressRange - return uint64(a) > r.begin+r.end + f := item.(*FrameDescriptionEntry) + return uint64(a) > f.End() } diff --git a/dwarf/frame/entries_test.go b/dwarf/frame/entries_test.go index 688a9810..6e854699 100644 --- a/dwarf/frame/entries_test.go +++ b/dwarf/frame/entries_test.go @@ -7,10 +7,10 @@ import ( ) func TestFDEForPC(t *testing.T) { - fde1 := &FrameDescriptionEntry{AddressRange: &addrange{begin: 100, end: 200}} - fde2 := &FrameDescriptionEntry{AddressRange: &addrange{begin: 50, end: 99}} - fde3 := &FrameDescriptionEntry{AddressRange: &addrange{begin: 0, end: 49}} - fde4 := &FrameDescriptionEntry{AddressRange: &addrange{begin: 201, end: 245}} + fde1 := &FrameDescriptionEntry{begin: 100, end: 200} + fde2 := &FrameDescriptionEntry{begin: 50, end: 99} + fde3 := &FrameDescriptionEntry{begin: 0, end: 49} + fde4 := &FrameDescriptionEntry{begin: 201, end: 245} tree := NewFrameIndex() tree.Put(fde1) diff --git a/dwarf/frame/parser.go b/dwarf/frame/parser.go index 4016c5fc..392ca517 100644 --- a/dwarf/frame/parser.go +++ b/dwarf/frame/parser.go @@ -50,15 +50,15 @@ func parseLength(ctx *parseContext) parsefunc { return parseCIE } - ctx.Frame = &FrameDescriptionEntry{Length: ctx.Length, CIE: ctx.Common, AddressRange: new(addrange)} + ctx.Frame = &FrameDescriptionEntry{Length: ctx.Length, CIE: ctx.Common} return parseFDE } func parseFDE(ctx *parseContext) parsefunc { r := ctx.Buf.Next(int(ctx.Length)) - ctx.Frame.AddressRange.begin = binary.LittleEndian.Uint64(r[:8]) - ctx.Frame.AddressRange.end = binary.LittleEndian.Uint64(r[8:16]) + ctx.Frame.begin = binary.LittleEndian.Uint64(r[:8]) + ctx.Frame.end = binary.LittleEndian.Uint64(r[8:16]) // Insert into the tree after setting address range begin // otherwise compares won't work. diff --git a/dwarf/frame/table.go b/dwarf/frame/table.go index 916c46a1..6c145683 100644 --- a/dwarf/frame/table.go +++ b/dwarf/frame/table.go @@ -136,7 +136,7 @@ func executeCIEInstructions(cie *CommonInformationEntry) *FrameContext { // Unwind the stack to find the return address register. func executeDwarfProgramUntilPC(fde *FrameDescriptionEntry, pc uint64) *FrameContext { frame := executeCIEInstructions(fde.CIE) - frame.loc = fde.AddressRange.begin + frame.loc = fde.Begin() frame.address = pc frame.ExecuteUntilPC(fde.Instructions)