Files
delve/pkg/proc/moduledata.go
Alessandro Arzilli 18ce5d6baa proc: add support for struct literals (#3935)
* service/test: fix compile error in tests

Due to a merge conflict the tests in service/test are not compiling.

* proc: add support for struct literals

Adds support for evaluating struct literals, and allocating them into
the target's memory.

Updates #1465
2025-03-18 10:11:05 -07:00

92 lines
1.9 KiB
Go

package proc
// ModuleData counterpart to runtime.moduleData
type ModuleData struct {
text, etext uint64
types, etypes uint64
typemapVar *Variable
}
func LoadModuleData(bi *BinaryInfo, mem MemoryReadWriter) ([]ModuleData, error) {
// +rtype -var firstmoduledata moduledata
// +rtype -field moduledata.text uintptr
// +rtype -field moduledata.types uintptr
scope := globalScope(nil, bi, bi.Images[0], mem)
var md *Variable
md, err := scope.findGlobal("runtime", "firstmoduledata")
if err != nil {
return nil, err
}
r := []ModuleData{}
for md.Addr != 0 {
const (
typesField = "types"
etypesField = "etypes"
textField = "text"
etextField = "etext"
nextField = "next"
typemapField = "typemap"
)
vars := map[string]*Variable{}
for _, fieldName := range []string{typesField, etypesField, textField, etextField, nextField, typemapField} {
var err error
vars[fieldName], err = md.structMember(fieldName)
if err != nil {
return nil, err
}
}
var err error
touint := func(name string) (ret uint64) {
if err == nil {
var n uint64
n, err = vars[name].asUint()
ret = n
}
return ret
}
r = append(r, ModuleData{
types: touint(typesField), etypes: touint(etypesField),
text: touint(textField), etext: touint(etextField),
typemapVar: vars[typemapField],
})
if err != nil {
return nil, err
}
md = vars[nextField].maybeDereference()
if md.Unreadable != nil {
return nil, md.Unreadable
}
}
return r, nil
}
func findModuleDataForType(mds []ModuleData, typeAddr uint64) *ModuleData {
for i := range mds {
if typeAddr >= mds[i].types && typeAddr < mds[i].etypes {
return &mds[i]
}
}
return nil
}
func findModuleDataForImage(mds []ModuleData, so *Image) *ModuleData {
var md *ModuleData
for i := range mds {
if so == nil || mds[i].text > so.StaticBase {
if md == nil || mds[i].text < md.text {
md = &mds[i]
}
}
}
return md
}