<table border="1" cellspacing="0" cellpadding="8">
<tr>
<th>Issue</th>
<td>
<a href=https://github.com/llvm/llvm-project/issues/74903>74903</a>
</td>
</tr>
<tr>
<th>Summary</th>
<td>
Using the same name for function name and LLVM module id in LLVM 10
</td>
</tr>
<tr>
<th>Labels</th>
<td>
new issue
</td>
</tr>
<tr>
<th>Assignees</th>
<td>
</td>
</tr>
<tr>
<th>Reporter</th>
<td>
niyue
</td>
</tr>
</table>
<pre>
When switching Gandiva from MCJIT to LLJIT [1], I find some test case failed on Ubuntu 20.04 + LLVM 10, after some investigation, I find if LLVM module's ModuleID is the same as the function name created in the module, the `LLJIT->lookup` API returns an symbol successfully, however the symbol's function address is 0.
Could anyone help to confirm if this is a known issue for LLVM 10 (on Linux)? I did some searching on LLVM bug tracker and github but could not find it.
The minimum test case looks roughly like this:
```cpp
auto module_ = std::make_unique<llvm::Module>("codegen", *context_); // <== pay special attention to the module id
lljit_ = BuildJIT();
auto buffer = LoadBitcodeFile();
auto src_ir_module = getOwningLazyBitcodeModule(std::move(buffer), *context_);
llvm::Linker::linkModules(*module_, std::move(src_ir_module));
std::string fn_name = "codegen"; // <== use the same name as the llvm::Module above
llvm::Function* fn = llvm::Function::Create(
prototype, llvm::GlobalValue::ExternalLinkage, fn_name, module_.get());
llvm::orc::ThreadSafeModule tsm(std::move(module_), std::move(context_));
auto error = lljit_->addIRModule(std::move(tsm));
auto sym = lljit_->lookup(fn_name);
if (!sym) { // <== the returned sym has no error
return Status::CodeGenError("Failed to look up function: " + function +
" error: " + llvm::toString(sym.takeError()));
}
auto fn_addr = sym->getAddress(); // <== the fn_addr is 0
auto fn_ptr = reinterpret_cast<FnPtr>(fn_addr); // <== this becomes a nullptr
```
* the code doesn't work for LLJIT under LLVM 10 + Ubuntu 20.04, but if I change the function name from "codegen" to some different value, the code works
* the similar code (using the same name for LLVM module and function name) works for MCJIT under LLVM 10 + Ubuntu 20.04
* the same code works for LLJIT under LLVM 14 + macOS/Ubuntu 22.04
[1] https://github.com/apache/arrow/pull/39098
</pre>
<img width="1px" height="1px" alt="" src="http://email.email.llvm.org/o/eJyEVltz2jgU_jXi5UwZI4cEP_DAJXTo0Glnk3YfGWEd2yqy5NUllP31O5Icbkt2mQwRts7Rp-87N2atqBXilIznZLwcMO8abaZKHD0Odpofp382qMAehCsboWr4zBQXbwwqo1v4uviyfgWnYbMJCzKej8h4SegC1lAJxcHqFsGhdVAyi1AxIZGDVvBj55XzQLNh9gCEzmGz-fkVRlmwZZVDk0yFekPrRM2c0OrCr6iSQau5l0jok4WvcblegrDgGgTLWgSW1pVXZfAAKjwsDTKHHISKL999LOIv8pjFy3wi-bPUeu878pjB7PsaDDpvlAWmwB7bnZZgfVmitZWX8hjsG33ANzTp-LglIjudzjg3aG1AmA2BZEuSzdL3QnvJgamjVggNyi6QWmpVCdOGy7pGRDMGe6UPCoS1HqHS5p03IHSiFWyE8r8JLUi-gjVw0StgkZkkX9gTLHa-BmdYuUcDTHGohWv8DnbeQRmxKO16qt3wEulrYEwo0fr2QtjAlAWjfd3II0ixxwiZ5LNLW_KYpb-y69IT5p3uBdgCyZdgHQ9G-axle9x6Jf7ySPKFlG9tep5kJvkzoRNCaak51qgIpUEAQmelVg5_u20kYQ6ErghdAckXJF-GAzp2BNthKZgE5hyqqIzTF6EAgid0Uv4SLuGaeyH5l_VrPDV4vsC_81WFJm7baMbnwgVUKxGC6t-7rSm3wmz7o4JRje7bQQlVb9jfx966vyadnAnRb-F3Oix4vXffd9zvbG2E2qNJaynUPrm1Edes5z04uj3lCmQ87Ow9fZ8srDMhsCq1jckVLnStyz0VvMVzkqqLTL0VGtguILq51qrPKEJnUKl45p2X8dciJnu4cPQB8dMZ7bQ7djHrz5afpd4x-ZPJEHPhwfNvh0YxGWhkddzd3zMse_6GNbpe6LsaaFOmxWtjkPEXVvXqgrPtHYVPshT3lLnU-za00BhtejZC5IYaxjhf__FhNEUEd9RNkXpsb5z1BZFOTiycDUUFkYWRPQafQJ7u6B4kTnUUefTfMAuqR35WKG2BF8ect72OmuNnVM9xY0z9VWomTsfqA747FVqSz0IMxr5yKr6Ezi9D4P4nWCUsFy7OUjr9EqM9MHlsh47t8QyouGXyaXlBZqW2ofynIndsA5s1ulnqCKc6cZ-xd9vQN65ddi55NCiUQ9MZdNuSWUfyxUp9dybVyd7-4yOEhR2WusXQYZSXsnPmpmRf1XE6i7hCkgPXaBWhTw4O2uz7nhSmAa84Xvan-VXTD7Eduo2oYA1lw1SNd1p1nDKuyknQO_Y0LkIhROXgLSZs378jpoDEXmO1ohWSmfSe0Im3oWpd16BTP-2Lc2iMV3hCXEffcWuafv7nmtcg4vhxQvgBWWkgaln57YXQ1bs3evaWvtOwBY1zXcyRKGvq48NSt4SuWMfKBsPCGH0gdNV5KQld5UVWTAZ8mvMiL9gAp6OnjGaT0YSOBs10xIqKP4wmrMgYloxPKM92EzqhOctGZTYZiCnNaD6iWZFleTYaD0v2WLBxWYwKWhbjRyQPGbZMyGHInKE29SDOK9OnhyLLB5LtUNo4cFKq8JCGmdApxsuBmQabTztfW_KQSWGdPXtxwkmc_vhAuevICdpdainivNfLNPBGTv-DuJjx6d-nzuhfWDpCVxGnJXQV7_FPAAAA___rDXsi">