[CodeGen][i386] Move -mregparm storage earlier and fix Runtime calls (#89707)
When building the Linux kernel for i386, the -mregparm=3 option is
enabled. Crashes were observed in the sanitizer handler functions, and
the problem was found to be mismatched calling convention.
As was fixed in commit c167c0a4dc ("[BuildLibCalls] infer inreg param
attrs from NumRegisterParameters"), call arguments need to be marked as
"in register" when -mregparm is set. Use the same helper developed there
to update the function arguments.
Since CreateRuntimeFunction() is actually part of CodeGenModule, storage
of the -mregparm value is also moved to the constructor, as doing this
in Release() is too late.
Fixes: https://github.com/llvm/llvm-project/issues/89670
This commit is contained in:
@@ -73,6 +73,7 @@
|
||||
#include "llvm/TargetParser/RISCVISAInfo.h"
|
||||
#include "llvm/TargetParser/Triple.h"
|
||||
#include "llvm/TargetParser/X86TargetParser.h"
|
||||
#include "llvm/Transforms/Utils/BuildLibCalls.h"
|
||||
#include <optional>
|
||||
|
||||
using namespace clang;
|
||||
@@ -442,6 +443,11 @@ CodeGenModule::CodeGenModule(ASTContext &C,
|
||||
}
|
||||
ModuleNameHash = llvm::getUniqueInternalLinkagePostfix(Path);
|
||||
}
|
||||
|
||||
// Record mregparm value now so it is visible through all of codegen.
|
||||
if (Context.getTargetInfo().getTriple().getArch() == llvm::Triple::x86)
|
||||
getModule().addModuleFlag(llvm::Module::Error, "NumRegisterParameters",
|
||||
CodeGenOpts.NumRegisterParameters);
|
||||
}
|
||||
|
||||
CodeGenModule::~CodeGenModule() {}
|
||||
@@ -980,11 +986,6 @@ void CodeGenModule::Release() {
|
||||
NMD->addOperand(MD);
|
||||
}
|
||||
|
||||
// Record mregparm value now so it is visible through rest of codegen.
|
||||
if (Context.getTargetInfo().getTriple().getArch() == llvm::Triple::x86)
|
||||
getModule().addModuleFlag(llvm::Module::Error, "NumRegisterParameters",
|
||||
CodeGenOpts.NumRegisterParameters);
|
||||
|
||||
if (CodeGenOpts.DwarfVersion) {
|
||||
getModule().addModuleFlag(llvm::Module::Max, "Dwarf Version",
|
||||
CodeGenOpts.DwarfVersion);
|
||||
@@ -4781,6 +4782,10 @@ CodeGenModule::CreateRuntimeFunction(llvm::FunctionType *FTy, StringRef Name,
|
||||
}
|
||||
}
|
||||
setDSOLocal(F);
|
||||
// FIXME: We should use CodeGenModule::SetLLVMFunctionAttributes() instead
|
||||
// of trying to approximate the attributes using the LLVM function
|
||||
// signature. This requires revising the API of CreateRuntimeFunction().
|
||||
markRegisterParameterAttributes(F);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user