func()

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
}