Register LLVM passes with the correct LLVM pass manager.
LLVM was upgraded to a new version in this commit:f9d4149c29
which was part of this pull request: https://github.com/rust-lang/rust/issues/26025 Consider the following two lines from that commit:f9d4149c29 (diff-a3b24dbe2ea7c1981f9ac79f9745f40aL462)
f9d4149c29 (diff-a3b24dbe2ea7c1981f9ac79f9745f40aL469)
The purpose of these lines is to register LLVM passes. Prior to the that commit, the passes being handled were assumed to be ModulePasses (a specific type of LLVM pass) since they were being added to a ModulePass manager. After that commit, both lines were refactored (presumably in an attempt to DRY out the code), but the ModulePasses were changed to be registered to a FunctionPass manager. This change resulted in ModulePasses being run, but a Function object was being passed as a parameter to the pass instead of a Module, which resulted in segmentation faults. In this commit, I changed relevant sections of the code to check the type of the passes being added and register them to the appropriate pass manager. Closes https://github.com/rust-lang/rust/issues/31067
This commit is contained in:
parent
289020b21c
commit
d9426210b1
4 changed files with 65 additions and 12 deletions
|
@ -58,19 +58,43 @@ LLVMInitializePasses() {
|
|||
initializeTarget(Registry);
|
||||
}
|
||||
|
||||
extern "C" bool
|
||||
LLVMRustAddPass(LLVMPassManagerRef PM, const char *PassName) {
|
||||
PassManagerBase *pm = unwrap(PM);
|
||||
|
||||
enum class SupportedPassKind {
|
||||
Function,
|
||||
Module,
|
||||
Unsupported
|
||||
};
|
||||
|
||||
extern "C" Pass*
|
||||
LLVMRustFindAndCreatePass(const char *PassName) {
|
||||
StringRef SR(PassName);
|
||||
PassRegistry *PR = PassRegistry::getPassRegistry();
|
||||
|
||||
const PassInfo *PI = PR->getPassInfo(SR);
|
||||
if (PI) {
|
||||
pm->add(PI->createPass());
|
||||
return true;
|
||||
return PI->createPass();
|
||||
}
|
||||
return false;
|
||||
return NULL;
|
||||
}
|
||||
|
||||
extern "C" SupportedPassKind
|
||||
LLVMRustPassKind(Pass *pass) {
|
||||
assert(pass);
|
||||
PassKind passKind = pass->getPassKind();
|
||||
if (passKind == PT_Module) {
|
||||
return SupportedPassKind::Module;
|
||||
} else if (passKind == PT_Function) {
|
||||
return SupportedPassKind::Function;
|
||||
} else {
|
||||
return SupportedPassKind::Unsupported;
|
||||
}
|
||||
}
|
||||
|
||||
extern "C" void
|
||||
LLVMRustAddPass(LLVMPassManagerRef PM, Pass *pass) {
|
||||
assert(pass);
|
||||
PassManagerBase *pm = unwrap(PM);
|
||||
pm->add(pass);
|
||||
}
|
||||
|
||||
extern "C" LLVMTargetMachineRef
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue