mirror of
https://github.com/go-delve/delve.git
synced 2025-10-30 02:07:58 +08:00
pkg/proc: Avoid passing BinaryInfo when not needed
This is going towards untangling proc in order to clean it up.
This commit is contained in:
committed by
Alessandro Arzilli
parent
a3d530bbd4
commit
2de4930ad1
@ -15,9 +15,9 @@ type Arch interface {
|
|||||||
BreakpointInstruction() []byte
|
BreakpointInstruction() []byte
|
||||||
BreakpointSize() int
|
BreakpointSize() int
|
||||||
DerefTLS() bool
|
DerefTLS() bool
|
||||||
FixFrameUnwindContext(fctxt *frame.FrameContext, pc uint64, bi *BinaryInfo) *frame.FrameContext
|
FixFrameUnwindContext(*frame.FrameContext, uint64, *BinaryInfo) *frame.FrameContext
|
||||||
RegSize(uint64) int
|
RegSize(uint64) int
|
||||||
RegistersToDwarfRegisters(bi *BinaryInfo, regs Registers) op.DwarfRegisters
|
RegistersToDwarfRegisters(uint64, Registers) op.DwarfRegisters
|
||||||
GoroutineToDwarfRegisters(*G) op.DwarfRegisters
|
GoroutineToDwarfRegisters(*G) op.DwarfRegisters
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -261,7 +261,7 @@ func maxAmd64DwarfRegister() int {
|
|||||||
|
|
||||||
// RegistersToDwarfRegisters converts hardware registers to the format used
|
// RegistersToDwarfRegisters converts hardware registers to the format used
|
||||||
// by the DWARF expression interpreter.
|
// 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 := make([]*op.DwarfRegister, maxAmd64DwarfRegister()+1)
|
||||||
|
|
||||||
dregs[amd64DwarfIPRegNum] = op.DwarfRegisterFromUint64(regs.PC())
|
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: staticBase,
|
||||||
return op.DwarfRegisters{StaticBase: so.StaticBase, Regs: dregs, ByteOrder: binary.LittleEndian, PCRegNum: amd64DwarfIPRegNum, SPRegNum: amd64DwarfSPRegNum, BPRegNum: amd64DwarfBPRegNum}
|
Regs: dregs,
|
||||||
|
ByteOrder: binary.LittleEndian,
|
||||||
|
PCRegNum: amd64DwarfIPRegNum,
|
||||||
|
SPRegNum: amd64DwarfSPRegNum,
|
||||||
|
BPRegNum: amd64DwarfBPRegNum,
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// GoroutineToDwarfRegisters extract the saved DWARF registers from a parked
|
// 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[amd64DwarfSPRegNum] = op.DwarfRegisterFromUint64(g.SP)
|
||||||
dregs[amd64DwarfBPRegNum] = op.DwarfRegisterFromUint64(g.BP)
|
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}
|
return op.DwarfRegisters{StaticBase: so.StaticBase, Regs: dregs, ByteOrder: binary.LittleEndian, PCRegNum: amd64DwarfIPRegNum, SPRegNum: amd64DwarfSPRegNum, BPRegNum: amd64DwarfBPRegNum}
|
||||||
}
|
}
|
||||||
|
|||||||
@ -435,8 +435,8 @@ func (bi *BinaryInfo) PCToFunc(pc uint64) *Function {
|
|||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
|
|
||||||
// pcToImage returns the image containing the given PC address.
|
// PCToImage returns the image containing the given PC address.
|
||||||
func (bi *BinaryInfo) pcToImage(pc uint64) *Image {
|
func (bi *BinaryInfo) PCToImage(pc uint64) *Image {
|
||||||
fn := bi.PCToFunc(pc)
|
fn := bi.PCToFunc(pc)
|
||||||
return bi.funcToImage(fn)
|
return bi.funcToImage(fn)
|
||||||
}
|
}
|
||||||
|
|||||||
@ -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 {
|
func dwarfRegisters(bi *proc.BinaryInfo, regs *linutil.AMD64Registers) op.DwarfRegisters {
|
||||||
a := proc.AMD64Arch("linux")
|
a := proc.AMD64Arch("linux")
|
||||||
dwarfRegs := a.RegistersToDwarfRegisters(bi, regs)
|
so := bi.PCToImage(regs.PC())
|
||||||
|
dwarfRegs := a.RegistersToDwarfRegisters(so.StaticBase, regs)
|
||||||
dwarfRegs.CFA = defaultCFA
|
dwarfRegs.CFA = defaultCFA
|
||||||
dwarfRegs.FrameBase = defaultCFA
|
dwarfRegs.FrameBase = defaultCFA
|
||||||
return dwarfRegs
|
return dwarfRegs
|
||||||
|
|||||||
@ -100,7 +100,8 @@ func ThreadStacktrace(thread Thread, depth int) ([]Stackframe, error) {
|
|||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, err
|
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 it.stacktrace(depth)
|
||||||
}
|
}
|
||||||
return g.Stacktrace(depth, false)
|
return g.Stacktrace(depth, false)
|
||||||
@ -117,7 +118,8 @@ func (g *G) stackIterator() (*stackIterator, error) {
|
|||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, err
|
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
|
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)
|
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}
|
callFrameRegs = op.DwarfRegisters{StaticBase: callimage.StaticBase, ByteOrder: it.regs.ByteOrder, PCRegNum: it.regs.PCRegNum, SPRegNum: it.regs.SPRegNum, BPRegNum: it.regs.BPRegNum}
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user