delve/pkg/proc/arch.go

80 lines
2.0 KiB
Go
Raw Normal View History

2015-06-12 19:49:23 +00:00
package proc
2016-01-10 08:57:52 +00:00
// Arch defines an interface for representing a
// CPU architecture.
type Arch interface {
SetGStructOffset(ver GoVersion, iscgo bool)
PtrSize() int
BreakpointInstruction() []byte
BreakpointSize() int
GStructOffset() uint64
}
2016-01-10 11:47:54 +00:00
// AMD64 represents the AMD64 CPU architecture.
type AMD64 struct {
ptrSize int
breakInstruction []byte
breakInstructionLen int
gStructOffset uint64
hardwareBreakpointUsage []bool
goos string
}
2016-01-10 08:57:52 +00:00
// AMD64Arch returns an initialized AMD64
// struct.
func AMD64Arch(goos string) *AMD64 {
var breakInstr = []byte{0xCC}
return &AMD64{
ptrSize: 8,
breakInstruction: breakInstr,
breakInstructionLen: len(breakInstr),
hardwareBreakpointUsage: make([]bool, 4),
goos: goos,
}
}
2016-01-10 08:57:52 +00:00
// SetGStructOffset sets the offset of the G struct on the AMD64
2016-07-08 05:57:40 +00:00
// arch struct. The offset is dependent on the Go compiler Version
2016-01-10 08:57:52 +00:00
// and whether or not the target program was externally linked.
func (a *AMD64) SetGStructOffset(ver GoVersion, isextld bool) {
switch a.goos {
case "darwin":
a.gStructOffset = 0x8a0
case "linux":
a.gStructOffset = 0xfffffffffffffff0
2015-08-11 13:37:27 +00:00
if isextld || ver.AfterOrEqual(GoVersion{1, 5, -1, 2, 0}) || ver.IsDevel() {
2015-07-28 23:56:55 +00:00
a.gStructOffset += 8
}
2016-01-15 05:26:54 +00:00
case "windows":
2016-01-24 16:30:23 +00:00
// Use ArbitraryUserPointer (0x28) as pointer to pointer
2016-01-15 05:26:54 +00:00
// to G struct per:
// https://golang.org/src/runtime/cgo/gcc_windows_amd64.c
a.gStructOffset = 0x28
}
}
2016-01-10 08:57:52 +00:00
// PtrSize returns the size of a pointer
// on this architecture.
func (a *AMD64) PtrSize() int {
return a.ptrSize
}
2016-01-10 08:57:52 +00:00
// BreakpointInstruction returns the Breakpoint
// instruction for this architecture.
func (a *AMD64) BreakpointInstruction() []byte {
return a.breakInstruction
}
2016-01-10 08:57:52 +00:00
// BreakpointSize returns the size of the
// breakpoint instruction on this architecture.
func (a *AMD64) BreakpointSize() int {
return a.breakInstructionLen
}
2016-01-10 08:57:52 +00:00
// GStructOffset returns the offset of the G
// struct in thread local storage.
func (a *AMD64) GStructOffset() uint64 {
return a.gStructOffset
}