From 2de4930ad17dca6d9e7d701de4e45d9edfca1f6e Mon Sep 17 00:00:00 2001 From: Derek Parker Date: Wed, 7 Aug 2019 20:15:20 -0700 Subject: [PATCH] pkg/proc: Avoid passing BinaryInfo when not needed This is going towards untangling proc in order to clean it up. --- pkg/proc/arch.go | 19 ++++++++++++------- pkg/proc/bininfo.go | 4 ++-- pkg/proc/dwarf_expr_test.go | 3 ++- pkg/proc/stack.go | 8 +++++--- 4 files changed, 21 insertions(+), 13 deletions(-) diff --git a/pkg/proc/arch.go b/pkg/proc/arch.go index 5888e1b4..d8265f55 100644 --- a/pkg/proc/arch.go +++ b/pkg/proc/arch.go @@ -15,9 +15,9 @@ type Arch interface { BreakpointInstruction() []byte BreakpointSize() int DerefTLS() bool - FixFrameUnwindContext(fctxt *frame.FrameContext, pc uint64, bi *BinaryInfo) *frame.FrameContext + FixFrameUnwindContext(*frame.FrameContext, uint64, *BinaryInfo) *frame.FrameContext RegSize(uint64) int - RegistersToDwarfRegisters(bi *BinaryInfo, regs Registers) op.DwarfRegisters + RegistersToDwarfRegisters(uint64, Registers) op.DwarfRegisters GoroutineToDwarfRegisters(*G) op.DwarfRegisters } @@ -261,7 +261,7 @@ func maxAmd64DwarfRegister() int { // RegistersToDwarfRegisters converts hardware registers to the format used // by the DWARF expression interpreter. -func (a *AMD64) RegistersToDwarfRegisters(bi *BinaryInfo, regs Registers) op.DwarfRegisters { +func (a *AMD64) RegistersToDwarfRegisters(staticBase uint64, regs Registers) op.DwarfRegisters { dregs := make([]*op.DwarfRegister, maxAmd64DwarfRegister()+1) dregs[amd64DwarfIPRegNum] = op.DwarfRegisterFromUint64(regs.PC()) @@ -283,9 +283,14 @@ func (a *AMD64) RegistersToDwarfRegisters(bi *BinaryInfo, regs Registers) op.Dwa } } - so := bi.pcToImage(regs.PC()) - - return op.DwarfRegisters{StaticBase: so.StaticBase, Regs: dregs, ByteOrder: binary.LittleEndian, PCRegNum: amd64DwarfIPRegNum, SPRegNum: amd64DwarfSPRegNum, BPRegNum: amd64DwarfBPRegNum} + return op.DwarfRegisters{ + StaticBase: staticBase, + Regs: dregs, + ByteOrder: binary.LittleEndian, + PCRegNum: amd64DwarfIPRegNum, + SPRegNum: amd64DwarfSPRegNum, + BPRegNum: amd64DwarfBPRegNum, + } } // GoroutineToDwarfRegisters extract the saved DWARF registers from a parked @@ -296,7 +301,7 @@ func (a *AMD64) GoroutineToDwarfRegisters(g *G) op.DwarfRegisters { dregs[amd64DwarfSPRegNum] = op.DwarfRegisterFromUint64(g.SP) dregs[amd64DwarfBPRegNum] = op.DwarfRegisterFromUint64(g.BP) - so := g.variable.bi.pcToImage(g.PC) + so := g.variable.bi.PCToImage(g.PC) return op.DwarfRegisters{StaticBase: so.StaticBase, Regs: dregs, ByteOrder: binary.LittleEndian, PCRegNum: amd64DwarfIPRegNum, SPRegNum: amd64DwarfSPRegNum, BPRegNum: amd64DwarfBPRegNum} } diff --git a/pkg/proc/bininfo.go b/pkg/proc/bininfo.go index cf64ebcc..e4a30d49 100644 --- a/pkg/proc/bininfo.go +++ b/pkg/proc/bininfo.go @@ -435,8 +435,8 @@ func (bi *BinaryInfo) PCToFunc(pc uint64) *Function { return nil } -// pcToImage returns the image containing the given PC address. -func (bi *BinaryInfo) pcToImage(pc uint64) *Image { +// PCToImage returns the image containing the given PC address. +func (bi *BinaryInfo) PCToImage(pc uint64) *Image { fn := bi.PCToFunc(pc) return bi.funcToImage(fn) } diff --git a/pkg/proc/dwarf_expr_test.go b/pkg/proc/dwarf_expr_test.go index fe4ecc9e..04fabe8e 100644 --- a/pkg/proc/dwarf_expr_test.go +++ b/pkg/proc/dwarf_expr_test.go @@ -90,7 +90,8 @@ func dwarfExprCheck(t *testing.T, mem proc.MemoryReadWriter, regs op.DwarfRegist func dwarfRegisters(bi *proc.BinaryInfo, regs *linutil.AMD64Registers) op.DwarfRegisters { a := proc.AMD64Arch("linux") - dwarfRegs := a.RegistersToDwarfRegisters(bi, regs) + so := bi.PCToImage(regs.PC()) + dwarfRegs := a.RegistersToDwarfRegisters(so.StaticBase, regs) dwarfRegs.CFA = defaultCFA dwarfRegs.FrameBase = defaultCFA return dwarfRegs diff --git a/pkg/proc/stack.go b/pkg/proc/stack.go index c28af74d..4e6da257 100644 --- a/pkg/proc/stack.go +++ b/pkg/proc/stack.go @@ -100,7 +100,8 @@ func ThreadStacktrace(thread Thread, depth int) ([]Stackframe, error) { if err != nil { return nil, err } - it := newStackIterator(thread.BinInfo(), thread, thread.BinInfo().Arch.RegistersToDwarfRegisters(thread.BinInfo(), regs), 0, nil, -1, nil) + so := thread.BinInfo().PCToImage(regs.PC()) + it := newStackIterator(thread.BinInfo(), thread, thread.BinInfo().Arch.RegistersToDwarfRegisters(so.StaticBase, regs), 0, nil, -1, nil) return it.stacktrace(depth) } return g.Stacktrace(depth, false) @@ -117,7 +118,8 @@ func (g *G) stackIterator() (*stackIterator, error) { if err != nil { return nil, err } - return newStackIterator(g.variable.bi, g.Thread, g.variable.bi.Arch.RegistersToDwarfRegisters(g.variable.bi, regs), g.stackhi, stkbar, g.stkbarPos, g), nil + so := g.variable.bi.PCToImage(regs.PC()) + return newStackIterator(g.variable.bi, g.Thread, g.variable.bi.Arch.RegistersToDwarfRegisters(so.StaticBase, regs), g.stackhi, stkbar, g.stkbarPos, g), nil } return newStackIterator(g.variable.bi, g.variable.mem, g.variable.bi.Arch.GoroutineToDwarfRegisters(g), g.stackhi, stkbar, g.stkbarPos, g), nil } @@ -517,7 +519,7 @@ func (it *stackIterator) advanceRegs() (callFrameRegs op.DwarfRegisters, ret uin } it.regs.CFA = int64(cfareg.Uint64Val) - callimage := it.bi.pcToImage(it.pc) + callimage := it.bi.PCToImage(it.pc) callFrameRegs = op.DwarfRegisters{StaticBase: callimage.StaticBase, ByteOrder: it.regs.ByteOrder, PCRegNum: it.regs.PCRegNum, SPRegNum: it.regs.SPRegNum, BPRegNum: it.regs.BPRegNum}