<table border="1" cellspacing="0" cellpadding="8">
<tr>
<th>Issue</th>
<td>
<a href=https://github.com/llvm/llvm-project/issues/65925>65925</a>
</td>
</tr>
<tr>
<th>Summary</th>
<td>
Customized pass execute fail when inserted into LLVM?
</td>
</tr>
<tr>
<th>Labels</th>
<td>
new issue
</td>
</tr>
<tr>
<th>Assignees</th>
<td>
</td>
</tr>
<tr>
<th>Reporter</th>
<td>
for-just-we
</td>
</tr>
</table>
<pre>
I have written a new pass for instrumentation using LLVM-15.0.0. The pass can be executed normally when using command like `clang -g -fpass-plugin=../xxPass.so`. Now I want to insert it into LLVM so default clang will output a instrumented binary without extra command args. But the instrumentation can not operate when Pass is inserted into LLVM.
The part of the code of the pass the cause the error is:
```cpp
...
IRBuilder<> builder(beginInst);
// call ptr @fopen(ptr @.str, ptr @.str.1)
// fileName, mode
ArrayRef<Value*> fopenArgs = {
getStrConstant(fileName, builder), // icall_log.txt
getStrConstant(mode, builder) // a
};
errs() << "-----------------inserting fopen for log func names\n";
CallInst* fid = builder.CreateCall(fopenFunc, fopenArgs);
```
`builder.CreateCall` is where the error occur. When compiled into a plugin, the registration code is:
```cpp
PassPluginLibraryInfo getTraceLogCallBack() {
const auto callback = [](PassBuilder &PB) {
PB.registerPipelineEarlySimplificationEPCallback(
[&](ModulePassManager &MPM, auto) {
MPM.addPass(TraceLogPass());
return true;
});
};
return {
LLVM_PLUGIN_API_VERSION, "TraceLogPass", "v0.1", callback
};
}
// This part is the new way of registering your pass
extern "C" ::llvm::PassPluginLibraryInfo LLVM_ATTRIBUTE_WEAK
llvmGetPassPluginInfo() {
return getTraceLogCallBack();
}
```
When inserted into LLVM, I register it in [addSanitizers](https://github.com/llvm/llvm-project/blob/llvmorg-15.0.0/clang/lib/CodeGen/BackendUtil.cpp#L623) function like
```cpp
static void addSanitizers(const Triple &TargetTriple,
const CodeGenOptions &CodeGenOpts,
const LangOptions &LangOpts, PassBuilder &PB) {
errs() << "start executing addSanitizer\n";
PB.registerPipelineEarlySimplificationEPCallback(
[&](ModulePassManager &MPM, OptimizationLevel Level) {
MPM.addPass(TraceLogPass()); // MyPass
});
PB.registerOptimizerLastEPCallback([&](ModulePassManager &MPM,
...
```
The part of error trace is:
```
#4 0x00007f3f08b21fe9 llvm::CallInst::init(llvm::FunctionType*, llvm::Value*, llvm::ArrayRef<llvm::Value*>, llvm::ArrayRef<llvm::OperandBundleDefT<llvm::Value*>>, llvm::Twine const&) (/llvm/llvm-15.0.0/bin/../lib/libLLVM-15.so+0x850fe9)
#5 0x00007f3f08a5cacb llvm::CallInst::Create(llvm::FunctionType*, llvm::Value*, llvm::ArrayRef<llvm::Value*>, llvm::ArrayRef<llvm::OperandBundleDefT<llvm::Value*>>, llvm::Twine const&, llvm::Instruction*) (/llvm/llvm-15.0.0/bin/../lib/libLLVM-15.so+0x78bacb)
#6 0x00007f3f08a5c5ad llvm::IRBuilderBase::CreateCall(llvm::FunctionType*, llvm::Value*, llvm::ArrayRef<llvm::Value*>, llvm::Twine const&, llvm::MDNode*) (/llvm/llvm-15.0.0/bin/../lib/libLLVM-15.so+0x78b5ad)
#7 0x00007f3f09690948 (anonymous namespace)::TraceLog::insertForAllFunc(llvm::Function&) TraceLogPass.cpp:0:0
#8 0x00007f3f096906a3 llvm::TraceLogPass::run(llvm::Module&, llvm::AnalysisManager<llvm::Module>&) (/llvm/llvm-15.0.0/bin/../lib/libLLVM-15.so+0x13bf6a3)
#9 0x00007f3f0cda3cbd llvm::detail::PassModel<llvm::Module, llvm::TraceLogPass, llvm::PreservedAnalyses, llvm::AnalysisManager<llvm::Module>>::run(llvm::Module&, llvm::AnalysisManager<llvm::Module>&) (/llvm/llvm-15.0.0/bin/../lib/libclang-cpp.so.15+0x17e9cbd)
#10 0x00007f3f08b73b66 llvm::PassManager<llvm::Module, llvm::AnalysisManager<llvm::Module>>::run(llvm::Module&, llvm::AnalysisManager<llvm::Module>&) (/llvm/llvm-15.0.0/bin/../lib/libLLVM-15.so+0x8a2b66)
#11 0x00007f3f0cd9f0ee (anonymous namespace)::EmitAssemblyHelper::RunOptimizationPipeline(clang::BackendAction, std::unique_ptr<llvm::raw_pwrite_stream, std::default_delete<llvm::raw_pwrite_stream>>&, std::unique_ptr<llvm::ToolOutputFile, std::default_delete<llvm::ToolOutputFile>>&) BackendUtil.cpp:0:0
```
How should I register the pass in LLVM?
</pre>
<img width="1px" height="1px" alt="" src="http://email.email.llvm.org/o/eJzcWN1y4jgWfhrlRhWXkcHBF1wACTPUJt1UN91zmZLtY9C0kLySHMI8_daRDNiE7s7OTk3tritNW5Z0fj5958fm1oqNApiQ0YyM7m9447baTCptbn9vrLvdw02uy8NkSbf8BejeCOdAUU4V7GnNraWVNlQo60yzA-W4E1rRxgq1oY-PX59uB6MojuKIrrcQ1hdc0RwovELROCip0mbHpTzQ_RaOOwu923FVUim-ASVpXEiuNvR2Q28rlHFby2YjFEnuo4iwxevrilsbWU3SOKIf9J4u6Z4rR51Gy8A4KhwVymlvErWallDxRjoaBO-FlFQ3rm4c5R1noKS5UNwc6F64rW4chVdn-Mk8bjY2orPGUbeFNyCgo0o7qmsw3EHwDy2lwrZ2QXk2KyLxPYmn4TegZRzVlZdd6BKO9x5F_5A3FvwdGIOnYEky7UohaRz-iroOT6KoVbP8NGuELMGQZE6SB5q3IzbOYSPUUllHWEaSWSuJLQhb0IJLSWtnKBnGla5BETZuh5F1hrA57QyjAYro7q-EhA98B7hwp0sIk1Nj-OETVCSZf-WyAcKmaJJXMDUbS0lyT8ldawptrw24z87MtbKOK0fYuCv85E6Go1a7QPOfpd5E7tX9RJi3rifoKIW3O8nd_QkeMMYSNvarEE9UyW4vr3DmyG_vmo8cqTe0alRBFd-BJaO5Ioyd5M65lOEoprQSpQeitSiaG-AOcAX6jgIXjSrQ5hNwvRM8cuGCIFfEpTEydL8F02WXLorGRPQ3ZHGhd7WQR_Zy2sYjm_v1BjbCOtNGATL3HczEwFh5MY8iN9wclqrSeC5rwwt41Bs0bcaLb0ecT3wo8NQob5z2_Mx58S0wxmc0wsYoumU7JSxdzfr7V7MoWAxmJWqQQsEDN_LwWexqKSpReEceVvNWOBrQUmA0IywNSp502UhAVU9c8U1Q9bR6QlDQtr7Op9VTxMsSlxM2PrrYDj1rzydHr1wGXGMUdaaB8zpk5MW-Lkk7-94EE16YhJ5Xj19-WX54nq6Wz18fPn1efvwQAoj1bWTt05cYg9yPjthfV4733fMPsbTeChvynAgpDavKnh8w1R3PBOPloBvj814bbq8O0AvG5oQxitxKplK-7MLddSp596br9afl7Mv64fm3h-k_gjTc-Au48y5c_oZlZ_C-y8krzl4LOh9Bb_M_Yrg8eR0qFjKMl-VnroQTf4CxgWtb52ofUR7FjXDbJo8KvSNs4VEI_93WRv8OhSNskUudt0-12bQ1mbCFL384IXB6rkv4BXP6An0CVX5xQkYYoSx5TFmCgGCu8nGNpfnHEW2xDhb0RYuS9p1g4xCzayNqCRgoa248rDgmbP594ocrbG_t_VijQRbFnJ_Yd0t55GrTEdEOcT_9SeKgV9O-dcjn0N4gd7uuX-b3vyH3oGs78YeX8wgvIKn__TPp6FgBnw6rUygGJC8zT8etVj-YR25d35H3eXDRuFwNqW67FKqVQx9-UHeOaSgZ0vg1juP4rkqqeJyzQQUZPeeSUwX2I6EENgfn6UUbDutD7dsWNu_sPTUzvaedbufK0uThHas_YkepylmjSgn3UK2_K-tS3HovFATiI_a-qxlfpI1TdsixpC98ix0ShBT5sae3mrBZ_DoexRVknTYvGfXw5KOCF_l38QxNx_8Vot25pX8j8O54o_9TtO_GOS_yLtrpJdojXnYNOHb5M26hC3nbNv6NsP8Ip6f7D77d_msgGvGyC9FdF6IszeJsOEYlXGl12OnGhta75gX4HOaNbTPgMeqxVi-0mUoZeuwrwLXh1M2dvnQm09j_O5ozvjQn5UkXpm7u9U9Mo3oKQ6p8g-FUcXmw4pg_e4fSbsEj-QtifpDkVcqTLsZZ16mi5EmRd2lYguNCnpuzJ12CvGZhnzG9MtSdWRmwYF6gDE6D_TNQ4N9_B76-C7st6jqyOhqMAsh3kBV5j8iDuF-q7pI8TWm_7f2Bdf_TEF2WHc7yNO2BM-hTMKtigJ-F-cNOuKm1sMvl4VeQNdqMzz81qts2HTsz7Ft9w-wXtT3ytI3-ObWuDDONEv9s4Ll2fQgM3z_XeyMcPFtngO96m9ovUs8lSHDwk41tHUrfo3attfzov20tRKDBe3Re7DorzOjly0E_w11rz37Ve2q3upFl9w3n9C1LqPAClCxuyklSZknGb2AySLPhcDC8G6c320lVJfFwlJZFlQ3i4TAepKNBFvOyGhZFymO4ERMWsyTOBoM4HaYsje6yHPI8LbKsHI2yakyGMey4kBH6GGmzuRHWNjBJRxkb3Uieg7T-Iyhj-BLqJ7FVH93fmIknaN5sLBnGUlhnz1KccBIm88Y6jW1uGVxqv27SigsZPvxdeeFLFjeNkZN_-23O22YJW3jb_xUAAP__OfOOsA">