in pkg/tools/elf/dwarf_init.go [260:323]
func (r *DwarfReader) getFunctionArgs(data *dwarf.Data, entry *dwarf.Entry) (map[string]*FunctionArgsInfo, error) {
reader := data.Reader()
reader.Seek(entry.Offset)
_, err := reader.Next()
if err != nil {
return nil, err
}
locator := NewArgumentLocator(r)
args := make(map[string]*FunctionArgsInfo)
for {
child, err := reader.Next()
if err != nil {
return nil, err
}
if child == nil || child.Tag == 0 {
break
}
if child.Tag != dwarf.TagFormalParameter {
continue
}
name, ok := child.Val(dwarf.AttrName).(string)
if !ok {
continue
}
if existsArgs := args[name]; existsArgs != nil {
continue
}
curArgs := &FunctionArgsInfo{}
// data type
dtyp, err := r.entryType(data, child)
if err != nil {
return nil, err
}
curArgs.tp = dtyp
// Is return value
if r.language == ReaderLanguageGolang {
isRet, err1 := r.IsRetArgs(child)
if err1 != nil {
return nil, err1
}
curArgs.IsRet = isRet
}
// get location
typeClass := r.getArgTypeClass(child, dtyp)
byteSize := r.getArgTypeByteSize(child, dtyp)
alignmentByteSize := r.getArgAlignmentByteSize(child, dtyp)
primitiveFieldCount := r.getPrimitiveFieldCount(child, dtyp)
location, err := locator.GetLocation(typeClass, byteSize, alignmentByteSize, primitiveFieldCount, curArgs.IsRet)
if err != nil {
return nil, err
}
curArgs.Location = location
args[name] = curArgs
}
return args, nil
}