<table border="1" cellspacing="0" cellpadding="8">
<tr>
<th>Issue</th>
<td>
<a href=https://github.com/llvm/llvm-project/issues/135996>135996</a>
</td>
</tr>
<tr>
<th>Summary</th>
<td>
Crash on LLVM MachineFunctionPass Plugin with `opt`
</td>
</tr>
<tr>
<th>Labels</th>
<td>
new issue
</td>
</tr>
<tr>
<th>Assignees</th>
<td>
</td>
</tr>
<tr>
<th>Reporter</th>
<td>
tijme
</td>
</tr>
</table>
<pre>
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.
</pre>
<img width="1" height="1" alt="" src="http://email.email.llvm.org/o/eJzUWd9z26gT_2vIC2OPBJIsP_jBceJepk3rSXK9Rw8SyOaKQQMoP75__XdAUm3Jchq36c2dXpQI2P3sZxd2FxNj-EYyNgPxJYivLkhlt0rPLP97xy4yRV9mNwBNHhl80txaJqHdMlgoIdQTlxvIdqV9gbck33LJlpXMLVdyRYwBeA6COYQQti-EucxFRRkECAnxuANouVCUfWASoOWAiPEWIPRTq3-40olnpvnjsuKCMn3eopWoNvzHio4gurW3RJLNGxT-Gjv3VVkqbQFaavK0VsZqRnadVfWrMs6RkuyYKUnOoF-OL7uTjNVVbuHtywASCPAcuj9uZKFu-TOXAC8GZwJ8DcGkJ7oWTyzP4b3VXG7uWOHhAJQCNHULoGa20tIZNywXIYAvIZhcHcjsagBoCdASXilnrNVEmkLpHXESDNwyzcbj8cH0lWaG6UdG55KIF8MM1JUEKO0phwAlt0uAFv0tUC_jravdvPltY00XI2Ram9ZUvAB44cy8q6R0SIfNjReyNvmYSfc0bB3Z4PYknkslG2r3AryQ7-wd0eaYAyhFDuOX0sEgAnLJLSeC_8-TCDNWKM0gkUfHgaPOHDv7WmulIVU3HTmOY0UrwTy1v4HZ7-pO0guVhDuPwQU2QKhdfTveMPv5IDK_Cz3ySM8V3taaflPlOTPm5zyAOx4ouNzzTwrLNCRC9AkzcEsemY_fkz5YHkj67R5olP0X-Y-c2iURIiP5N4fOhfYeL-QF5PJRfWMUcpkrrVluxQskBhIJb-5g6Y9LlJqtqgSVAE0s3JKyZBJyCUutSqZhZZiDdsJZzTn0Wz301_zu883nD87AYQ_lRAhGneEtkGsE0gBMI2i-8bLkcvObXOI-9M899mxZnR0WLlo-ffp6u54_PNzdXP75cL3-63r-EdaK6tTm_tqn8E8800S_uNzlU98HZveD7us-DR3gGqTNlVDIVVGwPb5fEfjaId6muyNvedNWn_78cPN5PV_drL9e393ffPnsQuC13IgW9cpm-vr-4c65Fy164usaEKD0oCxywbO6HA4e96wux5ptuLFMr3jJhK9xtKspFu0-QenAuo6-feKvt_dRRB-UTXXOXfm4n2tNXu5YAfDiAHLj4gbNtWA7Ji3A16eNONOtbzD4dQf3H164U8HZDgG-AvjqdXf-yIyTpriBkecYcvPG4uLU43wwJpTWqNITaD0T_V099DQxb3XFXp88eEqfkFYQYV4Rd1Qw1l-H4Handk8hPwSC-R_qiT0y7XdjEqjSgiSAhm0KUgnr00SudiUXdcKu62675QaW_myoW6ZGqFbKgiiI82lOsyLKiglx42hpdyVAyyelv1GuAcIwF0Ru4OhLAEdsx-3InTlwlMOMkdxl86Vlxo5zOFIwc_vDtJ-y_GxdQuS1JmNVOfIlB8BXTR3CRtwwAUc7ovMtwFfPaTJKomO9O65_HYkqLRwJRejI5dRRy-DV2E125X3JhXPF0msCaCl4NhiiY6Ogl-Hq46vhdDe6h-NW1AFoZ9rxdyHauDgrHZxa87azZh-aP9re_6ye1afr-f01NFW24xYSmFVOk-tLoVVwa21pagcDtNxwu62yca5c99o0se41KrX6m-Wuk-XGVL4Fh0T6Esv3vHbLYK6J2UKH1GqSs7aXu7ck_wZptSv3FxLBuLZgpdVGkx0kelO5DOGQ_BfiKmzwt55rikpUNKIBSne1stHBpxPnsz-cETqoYQFCQ6D29wbohP6zlHqNxb6NRjvC5V4HBAgHMHgOgiCYFCgLwmk-oVEC9yWceWka2pXm0npHPzjXA5TuJx1cfQCUuJOZS-tzoovnZWV07cI21FDgTHdIluPxfohnrn4aGzVGwTgE6DJ4DgMU0yg52BQA4bAHOZ7SYAjyXSXv-UYS8QeRVLB9pn4HVHhKgy4q1EOV4iJ7F1UJLrKuKnyoKogoDeKgUVVLek6TdRKNBJfV82gjq3ogd5ITLxbnQdzDH3XwZ_GkKNgBq71uB-DFfqyNO1f9-Q8bZu-YqYS92ZWiEyqtmI_sBaC5C5UBMS6G3sNNYRYXBeuaGXfMZEESYjaA4UEN7Kk5JaVt-6m6RTyBfvETzL2X1VEShbhndXJoNaaTLA3or6vCmE7TgHZVTXpxFONoCrs94atM_BR3beD9a50SZhhH0y5TadcpCSXhuzglz0jYc8q055QpDg5P-fp-4UG9OdjrBWex2ix5V04nODjIDS41BL1AnyTx-wR6nMS0qyrscRoF8eQNgd5Sdz5vp4L8X-IMFMSTLkNtSoxjGrN4QpMsCQ8A6soHWlsLd2z6flfRtemEqQ9Eb5htTuyjvFKPHlxB1VmpP0sp8aWyZWWXXAwI-aXhE-Yc3KwM3Zp5_5yYbyytv30vBPHiUXEf7F1Z7X2N93QTRx2pqrRrq5So_6ut-MglfW3WV6Z5wZlu52Vu5Oz3WwLPdfguwtA0S8JufOFufOVZjpjrLW4Jl2dIDlmOWFdy1K2w8hRF5LwKC01QRLpC475QHMRwvXbr1sYSbde7PfA3q8FB3FWT9FhJgiyEtYJzSJkG2QHd92zjurf6UsVftThZudLM932sORtBML-BT0pSpiEvIJEvSjKYq0pQuKk4ZdB1s_Xv25pvthZSrln9c_IFnWE6xVNywWbhJIpSNMEovdjO0klB84TGNCUEh3EUT6dTltA4m8TxJMvTCz5DAYqDKEzCNIxROi6SkAaTOMME0QglIYgCtiNcjJ21Y6U3F77HnYU4nk6TC0EyJoz_cR4hyZ6gH_WXklcXeuYpyqqNAVEguLFmL8ZyK9hs4dtiJf3979ClKqz3M3zidru_tbqotJj9fHfegH-cof8HAAD__9VXhug">