Merge remote-tracking branch 'origin/GP-6055_dev747368_fix_golang_abi0_func_callingconv'

This commit is contained in:
Ryan Kurtz
2025-10-17 12:30:54 -04:00
3 changed files with 27 additions and 21 deletions
@@ -276,17 +276,19 @@ public class GolangSymbolAnalyzer extends AbstractAnalyzer {
functionSignatureFromMethod++;
}
GoFunctionFixup ff = new GoFunctionFixup(func, funcDefResult.funcDef(),
goBinary.getCallingConventionFor(funcdata), goBinary.newStorageAllocator());
if (funcdata.getFlags().isEmpty()) {
GoFunctionFixup ff = new GoFunctionFixup(func, funcDefResult.funcDef(),
goBinary.getDefaultCallingConventionName(), goBinary.newStorageAllocator());
try {
ff.apply();
}
catch (DuplicateNameException | InvalidInputException
| IllegalArgumentException e) {
MarkupSession.logWarningAt(program, func.getEntryPoint(),
"Failed to update function signature: " + e.getMessage());
continue;
try {
ff.apply();
}
catch (DuplicateNameException | InvalidInputException
| IllegalArgumentException e) {
MarkupSession.logWarningAt(program, func.getEntryPoint(),
"Failed to update function signature: " + e.getMessage());
continue;
}
}
if (funcDefResult.symbolName().hasReceiver()) {
@@ -53,24 +53,36 @@ public class GoFunctionFixup {
this.func = func;
this.storageAllocator = new GoParamStorageAllocator(program, goVersion);
this.newSignature = func.getSignature();
this.newCallingConv = null;
if (GoRttiMapper.isAbi0Func(func.getEntryPoint(), program)) {
// Some (typically lower level) functions in the binary will be marked with a
// symbol that ends in the string "abi0".
// Throw away all registers and force stack allocation for everything
storageAllocator.setAbi0Mode();
this.newCallingConv = GoConstants.GOLANG_ABI0_CALLINGCONVENTION_NAME;
}
else {
this.newCallingConv = null;
}
}
public GoFunctionFixup(Function func, FunctionSignature newSignature, String newCallingConv,
public GoFunctionFixup(Function func, FunctionSignature newSignature, String defaultCCName,
GoParamStorageAllocator storageAllocator) {
this.program = func.getProgram();
this.dtm = program.getDataTypeManager();
this.func = func;
this.storageAllocator = storageAllocator;
this.newSignature = newSignature;
this.newCallingConv = newCallingConv;
if (GoRttiMapper.isAbi0Func(func.getEntryPoint(), program)) {
// Some (typically lower level) functions in the binary will be marked with a
// symbol that ends in the string "abi0".
// Throw away all registers and force stack allocation for everything
storageAllocator.setAbi0Mode();
this.newCallingConv = GoConstants.GOLANG_ABI0_CALLINGCONVENTION_NAME;
}
else {
this.newCallingConv = defaultCCName;
}
}
public static boolean isClosureContext(ParameterDefinition p) {
@@ -552,14 +552,6 @@ public class GoRttiMapper extends DataTypeMapper implements DataTypeMapperContex
return false;
}
public String getCallingConventionFor(GoFuncData func) {
// TODO: this logic needs work. Currently we are not strongly declaring functions
// as abi0.
return defaultCCName != null && !isAbi0Func(func.getFuncAddress(), program)
? defaultCCName
: null;
}
/**
* Returns true if the specified calling convention is defined for the program.
* @param ccName calling convention name