Issue |
135996
|
Summary |
Crash on LLVM MachineFunctionPass Plugin with `opt`
|
Labels |
new issue
|
Assignees |
|
Reporter |
tijme
|
I've written the following empty MachineFunctionPass:
#include "llvm/CodeGen/MachineFunctionPass.h"
#include "llvm/CodeGen/MachineFunction.h"
#include "llvm/Passes/PassBuilder.h"
#include "llvm/Passes/PassPlugin.h"
#include "llvm/CodeGen/MachinePassManager.h"
#include "llvm/CodeGen/MachineFunctionPass.h"
#include "llvm/Support/raw_ostream.h"
using namespace llvm;
struct MyMachineFunctionPass : PassInfoMixin<MyMachineFunctionPass> {
static StringRef name() { return "MyMachineFunctionPass"; }
// Doing transformations here...
PreservedAnalyses run(MachineFunction &MF, MachineFunctionAnalysisManager &AM) {
errs() << "Running MyMachineFunctionPass\n";
return PreservedAnalyses::none();
}
/// (2) Optional initialization before any MachineFunction runs
static Error doInitialization(Module &M, MachineFunctionAnalysisManager &AM) {
errs() << "Initializing MyMachineFunctionPass on module: " << M.getName() << "\n";
return Error::success();
}
/// (3) Optional finalization after all MachineFunctions have run
static Error doFinalization(Module &M, MachineFunctionAnalysisManager &AM) {
errs() << "Finalizing MyMachineFunctionPass on module: " << M.getName() << "\n";
return Error::success();
}
/// (4) Fallback: runs on module if invoked incorrectly as an IR pass (shouldn't happen in proper use)
static Error run(Module &M, MachineFunctionAnalysisManager &AM) {
errs() << "WARNING: MyMachineFunctionPass called on Module — skipping\n";
return Error::success();
}
};
extern "C" LLVM_ATTRIBUTE_WEAK ::llvm::PassPluginLibraryInfo llvmGetPassPluginInfo() {
errs() << "[+] Running llvmGetPassPluginInfo()\n";
return {
LLVM_PLUGIN_API_VERSION, "MyMachineFunctionPass", LLVM_VERSION_STRING,
[](PassBuilder &PB) {
PB.registerPipelineParsingCallback(
[](StringRef Name, MachineFunctionPassManager &MFPM, ArrayRef<PassBuilder::PipelineElement>) {
errs() << "[+] Running registerPipelineParsingCallback()\n";
if (Name == "MyMachineFunctionPass") {
errs() << " - Name is MyMachineFunctionPass\n";
MFPM.addPass(MyMachineFunctionPass());
return true;
}
return false;
}
);
}
};
}
However, `opt` segfaults on compilation using this plugin:
root@5c9cdbf4bf7a:/tmp/workdir# clang -O0 -emit-llvm -c beacon/test.c -o builds/test.bc
root@5c9cdbf4bf7a:/tmp/workdir# llc -O0 -stop-after=finalize-isel -march=x86-64 -o builds/test.mir builds/test.bc
root@5c9cdbf4bf7a:/tmp/workdir# opt -load-pass-plugin=./transpiler/build/libMyMachineFunctionPass.so -passes=MyMachineFunctionPass -S ./builds/test.bc -o ./builds/test.ll
[+] Running llvmGetPassPluginInfo()
[+] Running registerPipelineParsingCallback()
- Name is MyMachineFunctionPass
[+] Running registerPipelineParsingCallback()
- Name is MyMachineFunctionPass
PLEASE submit a bug report to https://github.com/llvm/llvm-project/issues/ and include the crash backtrace.
Stack dump:
0. Program arguments: opt -load-pass-plugin=./transpiler/build/libMyMachineFunctionPass.so -passes=MyMachineFunctionPass -S ./builds/test.bc -o ./builds/test.ll
1. Running pass "function(machine-function(MyMachineFunctionPass))" on module "./builds/test.bc"
2. Running pass "machine-function(MyMachineFunctionPass)" on function "main"
#0 0x00007f2b019c7d46 llvm::sys::PrintStackTrace(llvm::raw_ostream&, int) (/usr/lib/llvm-20/bin/../lib/libLLVM.so.20.1+0x1025d46)
#1 0x00007f2b019c59d0 llvm::sys::RunSignalHandlers() (/usr/lib/llvm-20/bin/../lib/libLLVM.so.20.1+0x10239d0)
#2 0x00007f2b019c83fb (/usr/lib/llvm-20/bin/../lib/libLLVM.so.20.1+0x10263fb)
#3 0x00007f2b004dd050 (/lib/x86_64-linux-gnu/libc.so.6+0x3c050)
#4 0x00007f2b01b57ffe llvm::AnalysisManager<llvm::Function>::getResultImpl(llvm::AnalysisKey*, llvm::Function&) (/usr/lib/llvm-20/bin/../lib/libLLVM.so.20.1+0x11b5ffe)
#5 0x00007f2b01e0613e llvm::FunctionToMachineFunctionPassAdaptor::run(llvm::Function&, llvm::AnalysisManager<llvm::Function>&) (/usr/lib/llvm-20/bin/../lib/libLLVM.so.20.1+0x146413e)
#6 0x00007f2b03d7b80d (/usr/lib/llvm-20/bin/../lib/libLLVM.so.20.1+0x33d980d)
#7 0x00007f2b01b55349 llvm::PassManager<llvm::Function, llvm::AnalysisManager<llvm::Function>>::run(llvm::Function&, llvm::AnalysisManager<llvm::Function>&) (/usr/lib/llvm-20/bin/../lib/libLLVM.so.20.1+0x11b3349)
#8 0x00007f2b03d6da1d (/usr/lib/llvm-20/bin/../lib/libLLVM.so.20.1+0x33cba1d)
#9 0x00007f2b01b59306 llvm::ModuleToFunctionPassAdaptor::run(llvm::Module&, llvm::AnalysisManager<llvm::Module>&) (/usr/lib/llvm-20/bin/../lib/libLLVM.so.20.1+0x11b7306)
#10 0x00007f2b03d7765d (/usr/lib/llvm-20/bin/../lib/libLLVM.so.20.1+0x33d565d)
#11 0x00007f2b01b54057 llvm::PassManager<llvm::Module, llvm::AnalysisManager<llvm::Module>>::run(llvm::Module&, llvm::AnalysisManager<llvm::Module>&) (/usr/lib/llvm-20/bin/../lib/libLLVM.so.20.1+0x11b2057)
#12 0x000055d5e57d6b61 llvm::runPassPipeline(llvm::StringRef, llvm::Module&, llvm::TargetMachine*, llvm::TargetLibraryInfoImpl*, llvm::ToolOutputFile*, llvm::ToolOutputFile*, llvm::ToolOutputFile*, llvm::StringRef, llvm::ArrayRef<llvm::PassPlugin>, llvm::ArrayRef<std::function<void (llvm::PassBuilder&)>>, llvm::opt_tool::OutputKind, llvm::opt_tool::VerifierKind, bool, bool, bool, bool, bool, bool, bool) (/usr/lib/llvm-20/bin/opt+0x29b61)
#13 0x000055d5e57cbc2e optMain (/usr/lib/llvm-20/bin/opt+0x1ec2e)
#14 0x00007f2b004c824a (/lib/x86_64-linux-gnu/libc.so.6+0x2724a)
#15 0x00007f2b004c8305 __libc_start_main (/lib/x86_64-linux-gnu/libc.so.6+0x27305)
#16 0x000055d5e57c60b1 _start (/usr/lib/llvm-20/bin/opt+0x190b1)
Segmentation fault (core dumped)
I wonder if anyone could guide me in the right direction.
_______________________________________________
llvm-bugs mailing list
llvm-bugs@lists.llvm.org
https://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-bugs