From 9c79d8aa6cb80f8bf969517732f802fc627aa630 Mon Sep 17 00:00:00 2001 From: Brian Fiete Date: Tue, 11 Mar 2025 15:11:40 -0400 Subject: [PATCH] Fixed shadowing issue on varargs method on non-varargs param --- IDEHelper/Backend/BeMCContext.cpp | 23 ++++++++++++++--------- IDEHelper/Backend/BeMCContext.h | 4 ++-- 2 files changed, 16 insertions(+), 11 deletions(-) diff --git a/IDEHelper/Backend/BeMCContext.cpp b/IDEHelper/Backend/BeMCContext.cpp index 4fef51c8..2f8645b1 100644 --- a/IDEHelper/Backend/BeMCContext.cpp +++ b/IDEHelper/Backend/BeMCContext.cpp @@ -2867,7 +2867,7 @@ BeMCOperand BeMCContext::GetCallArgVReg(int argIdx, BeTypeCode typeCode) } } -BeMCOperand BeMCContext::CreateCall(const BeMCOperand &func, const SizedArrayImpl& args, BeType* retType, BfIRCallingConv callingConv, bool structRet, bool noReturn, bool isVarArg) +BeMCOperand BeMCContext::CreateCall(const BeMCOperand &func, const SizedArrayImpl& args, BeType* retType, BfIRCallingConv callingConv, bool structRet, bool noReturn, int varArgStart) { SizedArray opArgs; for (auto itr = args.begin(); itr != args.end(); ++itr) @@ -2875,7 +2875,7 @@ BeMCOperand BeMCContext::CreateCall(const BeMCOperand &func, const SizedArrayImp auto& arg = *itr; opArgs.push_back(GetOperand(arg)); } - return CreateCall(func, opArgs, retType, callingConv, structRet, noReturn, isVarArg); + return CreateCall(func, opArgs, retType, callingConv, structRet, noReturn, varArgStart); } BeMCOperand BeMCContext::CreateLoad(const BeMCOperand& mcTarget) @@ -3029,7 +3029,7 @@ void BeMCContext::CreateStore(BeMCInstKind instKind, const BeMCOperand& val, con } } -BeMCOperand BeMCContext::CreateCall(const BeMCOperand& func, const SizedArrayImpl& args, BeType* retType, BfIRCallingConv callingConv, bool structRet, bool noReturn, bool isVarArg) +BeMCOperand BeMCContext::CreateCall(const BeMCOperand& func, const SizedArrayImpl& args, BeType* retType, BfIRCallingConv callingConv, bool structRet, bool noReturn, int varArgStart) { BeMCOperand mcResult; //TODO: Allow user to directly specify ret addr with "sret" attribute @@ -3080,8 +3080,11 @@ BeMCOperand BeMCContext::CreateCall(const BeMCOperand& func, const SizedArrayImp if ((argIdx == 0) && (compositeRetReg == X64Reg_RDX)) argOfs = 0; + bool isVarArg = (varArgStart != -1) && (argIdx >= varArgStart); + auto mcValue = args[argIdx]; - auto argType = GetType(mcValue); + auto argType = GetType(mcValue); + X64CPURegister useReg = X64Reg_None; int useArgIdx = argIdx + argOfs; @@ -3122,7 +3125,7 @@ BeMCOperand BeMCContext::CreateCall(const BeMCOperand& func, const SizedArrayImp } if (isVarArg) - { + { X64CPURegister shadowReg = X64Reg_None; switch (useArgIdx) { @@ -3138,7 +3141,7 @@ BeMCOperand BeMCContext::CreateCall(const BeMCOperand& func, const SizedArrayImp case 3: shadowReg = X64Reg_R9; break; - } + } if ((shadowReg != X64Reg_None) && (useReg != X64Reg_None)) { @@ -17595,7 +17598,7 @@ void BeMCContext::Generate(BeFunction* function) auto castedInst = (BeCallInst*)inst; BeMCOperand mcFunc; BeType* returnType = NULL; - bool isVarArg = false; + int varArgStart = -1; bool useAltArgs = false; SizedArray args; @@ -18187,7 +18190,9 @@ void BeMCContext::Generate(BeFunction* function) auto elementType = ((BePointerType*)funcPtrType)->mElementType; if (elementType->mTypeCode == BeTypeCode_Function) { - isVarArg = ((BeFunctionType*)elementType)->mIsVarArg; + BeFunctionType* funcType = (BeFunctionType*)elementType; + if (funcType->mIsVarArg) + varArgStart = funcType->mParams.mSize; } } @@ -18204,7 +18209,7 @@ void BeMCContext::Generate(BeFunction* function) args.Add(arg.mValue); } - result = CreateCall(mcFunc, args, returnType, castedInst->mCallingConv, castedInst->HasStructRet(), castedInst->mNoReturn, isVarArg); + result = CreateCall(mcFunc, args, returnType, castedInst->mCallingConv, castedInst->HasStructRet(), castedInst->mNoReturn, varArgStart); } } break; diff --git a/IDEHelper/Backend/BeMCContext.h b/IDEHelper/Backend/BeMCContext.h index f3d8952f..208768c9 100644 --- a/IDEHelper/Backend/BeMCContext.h +++ b/IDEHelper/Backend/BeMCContext.h @@ -1377,8 +1377,8 @@ public: void RemoveInst(BeMCBlock* block, int instIdx, bool needChangesMerged = true, bool removeFromList = true); BeMCOperand AllocBinaryOp(BeMCInstKind instKind, const BeMCOperand & lhs, const BeMCOperand & rhs, BeMCBinIdentityKind identityKind, BeMCOverflowCheckKind overflowCheckKind = BeMCOverflowCheckKind_None); BeMCOperand GetCallArgVReg(int argIdx, BeTypeCode typeCode); - BeMCOperand CreateCall(const BeMCOperand& func, const SizedArrayImpl& args, BeType* retType = NULL, BfIRCallingConv callingConv = BfIRCallingConv_CDecl, bool structRet = false, bool noReturn = false, bool isVarArg = false); - BeMCOperand CreateCall(const BeMCOperand& func, const SizedArrayImpl& args, BeType* retType = NULL, BfIRCallingConv callingConv = BfIRCallingConv_CDecl, bool structRet = false, bool noReturn = false, bool isVarArg = false); + BeMCOperand CreateCall(const BeMCOperand& func, const SizedArrayImpl& args, BeType* retType = NULL, BfIRCallingConv callingConv = BfIRCallingConv_CDecl, bool structRet = false, bool noReturn = false, int varArgStart = -1); + BeMCOperand CreateCall(const BeMCOperand& func, const SizedArrayImpl& args, BeType* retType = NULL, BfIRCallingConv callingConv = BfIRCallingConv_CDecl, bool structRet = false, bool noReturn = false, int varArgStart = -1); BeMCOperand CreateLoad(const BeMCOperand& mcTarget); void CreateStore(BeMCInstKind instKind, const BeMCOperand& val, const BeMCOperand& ptr); void CreateMemSet(const BeMCOperand& addr, uint8 val, int size, int align);