<table border="1" cellspacing="0" cellpadding="8">
<tr>
<th>Issue</th>
<td>
<a href=https://github.com/llvm/llvm-project/issues/76382>76382</a>
</td>
</tr>
<tr>
<th>Summary</th>
<td>
If LLJIT instance is static member, it aborts when ~orc::LLJIT::~LLJIT(), and "report pure virtual method called"
</td>
</tr>
<tr>
<th>Labels</th>
<td>
new issue
</td>
</tr>
<tr>
<th>Assignees</th>
<td>
</td>
</tr>
<tr>
<th>Reporter</th>
<td>
zhping8080
</td>
</tr>
</table>
<pre>
I try to use a static llvm::orc::LLJIT instance to manage ir modules, and it aborted when the program exited and deconstruct the LLJIT instance. The code is below. The "foo" module simply "a = a + 100; b = b + 200", and it can execute correctly. If I change LLJIT from static to non-static, it can also exit normly.
> #include "llvm/ADT/StringMap.h"
#include "llvm/ExecutionEngine/Orc/LLJIT.h"
#include "llvm/Support/InitLLVM.h"
#include "llvm/Support/TargetSelect.h"
#include "llvm/Support/raw_ostream.h"
#include "llvm/Support/Error.h"
#include "llvm/Support/SourceMgr.h"
#include "llvm/IRReader/IRReader.h"
#include "stdio.h"
using namespace llvm;
using namespace llvm::orc;
ExitOnError ExitOnErr;
extern "C" int printf (const char *format, ...);
class CustomOrcJIT
{
public:
static std::unique_ptr<llvm::orc::LLJIT> J;
public:
CustomOrcJIT(/* args */) {
J = ExitOnErr(LLJITBuilder().create());
}
~CustomOrcJIT() = default;
};
// initialize
std::unique_ptr<llvm::orc::LLJIT> CustomOrcJIT::J = nullptr;
// load and execute
int main(int argc, char *argv[]) {
InitLLVM X(argc, argv);
InitializeNativeTarget();
InitializeNativeTargetAsmPrinter();
CustomOrcJIT jit;
llvm::SMDiagnostic error;
// Compile Module
std::unique_ptr<llvm::LLVMContext> context = std::make_unique<llvm::LLVMContext>();
std::unique_ptr<llvm::Module> module = std::make_unique<llvm::Module>("foo", *context);
StringRef filePath = "foo.ll";
module = parseIRFile(filePath, error, *context);
auto TSM = ThreadSafeModule(std::move(module), std::move(context));
// Load the module.
ExitOnErr(jit.J->addIRModule(std::move(TSM)));
// bind variable
int32_t a = 3;
int32_t b = 4;
ExitOnErr(jit.J->getMainJITDylib().define
(absoluteSymbols(
{
{jit.J->mangleAndIntern("a"), JITEvaluatedSymbol::fromPointer(&a)},
{jit.J->mangleAndIntern("b"), JITEvaluatedSymbol::fromPointer(&b)},
{jit.J->mangleAndIntern("printf"), JITEvaluatedSymbol::fromPointer(&printf)}
})
)
);
// Execute
auto fooAdrr = ExitOnErr(jit.J->lookup("foo"));
void (*foo)() = fooAdrr.toPtr<void()>();
foo();
outs() << "a = " << a << ", b = " << b << "\n";
return 0;
}
Output is below.
> a = 103, b = 204
pure virtual method called
terminate called without an active exception
PLEASE submit a bug report to https://github.com/llvm/llvm-project/issues/ and include the crash backtrace.
#0 0x0000555aa3795216 llvm::sys::PrintStackTrace(llvm::raw_ostream&, int) ~/llvm-project-release-15.x/llvm/lib/Support/Unix/Signals.inc:565:22
#1 0x0000555aa37952d1 PrintStackTraceSignalHandler(void*) ~/llvm-project-release-15.x/llvm/lib/Support/Unix/Signals.inc:632:1
#2 0x0000555aa3792f30 llvm::sys::RunSignalHandlers() ~/llvm-project-release-15.x/llvm/lib/Support/Signals.cpp:103:20
#3 0x0000555aa3794b62 SignalHandler(int) ~/llvm-project-release-15.x/llvm/lib/Support/Unix/Signals.inc:407:1
#4 0x00007f8297f83420 __restore_rt (/lib/x86_64-linux-gnu/libpthread.so.0+0x14420)
#5 0x00007f8297a3c00b raise (/lib/x86_64-linux-gnu/libc.so.6+0x4300b)
#6 0x00007f8297a1b859 abort (/lib/x86_64-linux-gnu/libc.so.6+0x22859)
#7 0x00007f8297df58d1 (/lib/x86_64-linux-gnu/libstdc++.so.6+0x9e8d1)
#8 0x00007f8297e0137c (/lib/x86_64-linux-gnu/libstdc++.so.6+0xaa37c)
#9 0x00007f8297e013e7 (/lib/x86_64-linux-gnu/libstdc++.so.6+0xaa3e7)
#10 0x00007f8297e02145 (/lib/x86_64-linux-gnu/libstdc++.so.6+0xab145)
#11 0x0000555aa3dbb958 llvm::SectionMemoryManager::~SectionMemoryManager() ~/llvm-project-release-15.x/llvm/lib/ExecutionEngine/SectionMemoryManager.cpp:237:40
#12 0x0000555aa3dbba06 llvm::SectionMemoryManager::~SectionMemoryManager() ~/llvm-project-release-15.x/llvm/lib/ExecutionEngine/SectionMemoryManager.cpp:239:1
#13 0x0000555aa3505738 std::default_delete<llvm::RuntimeDyld::MemoryManager>::operator()(llvm::RuntimeDyld::MemoryManager*) const /usr/include/c++/9/bits/unique_ptr.h:82:7
#14 0x0000555aa3502954 std::unique_ptr<llvm::RuntimeDyld::MemoryManager, std::default_delete<llvm::RuntimeDyld::MemoryManager>>::~unique_ptr() /usr/include/c++/9/bits/unique_ptr.h:293:2
#15 0x0000555aa350cc57 void std::_Destroy<std::unique_ptr<llvm::RuntimeDyld::MemoryManager, std::default_delete<llvm::RuntimeDyld::MemoryManager>>>(std::unique_ptr<llvm::RuntimeDyld::MemoryManager, std::default_delete<llvm::RuntimeDyld::MemoryManager>>*) /usr/include/c++/9/bits/stl_construct.h:98:26
#16 0x0000555aa350b98d void std::_Destroy_aux<false>::__destroy<std::unique_ptr<llvm::RuntimeDyld::MemoryManager, std::default_delete<llvm::RuntimeDyld::MemoryManager>>*>(std::unique_ptr<llvm::RuntimeDyld::MemoryManager, std::default_delete<llvm::RuntimeDyld::MemoryManager>>*, std::unique_ptr<llvm::RuntimeDyld::MemoryManager, std::default_delete<llvm::RuntimeDyld::MemoryManager>>*) /usr/include/c++/9/bits/stl_construct.h:107:4
#17 0x0000555aa35098da void std::_Destroy<std::unique_ptr<llvm::RuntimeDyld::MemoryManager, std::default_delete<llvm::RuntimeDyld::MemoryManager>>*>(std::unique_ptr<llvm::RuntimeDyld::MemoryManager, std::default_delete<llvm::RuntimeDyld::MemoryManager>>*, std::unique_ptr<llvm::RuntimeDyld::MemoryManager, std::default_delete<llvm::RuntimeDyld::MemoryManager>>*) /usr/include/c++/9/bits/stl_construct.h:138:5
#18 0x0000555aa3506899 void std::_Destroy<std::unique_ptr<llvm::RuntimeDyld::MemoryManager, std::default_delete<llvm::RuntimeDyld::MemoryManager>>*, std::unique_ptr<llvm::RuntimeDyld::MemoryManager, std::default_delete<llvm::RuntimeDyld::MemoryManager>>>(std::unique_ptr<llvm::RuntimeDyld::MemoryManager, std::default_delete<llvm::RuntimeDyld::MemoryManager>>*, std::unique_ptr<llvm::RuntimeDyld::MemoryManager, std::default_delete<llvm::RuntimeDyld::MemoryManager>>*, std::allocator<std::unique_ptr<llvm::RuntimeDyld::MemoryManager, std::default_delete<llvm::RuntimeDyld::MemoryManager>>>&) /usr/include/c++/9/bits/stl_construct.h:207:5
#19 0x0000555aa3503c73 std::vector<std::unique_ptr<llvm::RuntimeDyld::MemoryManager, std::default_delete<llvm::RuntimeDyld::MemoryManager>>, std::allocator<std::unique_ptr<llvm::RuntimeDyld::MemoryManager, std::default_delete<llvm::RuntimeDyld::MemoryManager>>>>::~vector() /usr/include/c++/9/bits/stl_vector.h:680:7
#20 0x0000555aa34ff432 llvm::orc::RTDyldObjectLinkingLayer::handleRemoveResources(unsigned long) ~/llvm-project-release-15.x/llvm/lib/ExecutionEngine/Orc/RTDyldObjectLinkingLayer.cpp:335:25
#21 0x0000555aa3445fbe llvm::orc::ExecutionSession::removeResourceTracker(llvm::orc::ResourceTracker&) ~/llvm-project-release-15.x/llvm/lib/ExecutionEngine/Orc/Core.cpp:2290:33
#22 0x0000555aa34349a3 llvm::orc::ResourceTracker::remove() ~/llvm-project-release-15.x/llvm/lib/ExecutionEngine/Orc/Core.cpp:53:1
#23 0x0000555aa3438b64 llvm::orc::JITDylib::clear() ~/llvm-project-release-15.x/llvm/lib/ExecutionEngine/Orc/Core.cpp:656:35
#24 0x0000555aa3442ae1 llvm::orc::ExecutionSession::endSession() ~/llvm-project-release-15.x/llvm/lib/ExecutionEngine/Orc/Core.cpp:1907:35
#25 0x0000555aa34b2234 llvm::orc::LLJIT::~LLJIT() ~/llvm-project-release-15.x/llvm/lib/ExecutionEngine/Orc/LLJIT.cpp:692:34
#26 0x0000555aa34b2382 llvm::orc::LLJIT::~LLJIT() ~/llvm-project-release-15.x/llvm/lib/ExecutionEngine/Orc/LLJIT.cpp:694:1
#27 0x0000555aa3176dc6 std::default_delete<llvm::orc::LLJIT>::operator()(llvm::orc::LLJIT*) const /usr/include/c++/9/bits/unique_ptr.h:82:7
#28 0x0000555aa3174888 std::unique_ptr<llvm::orc::LLJIT, std::default_delete<llvm::orc::LLJIT>>::~unique_ptr() /usr/include/c++/9/bits/unique_ptr.h:293:2
#29 0x00007f8297a3f8a7 (/lib/x86_64-linux-gnu/libc.so.6+0x468a7)
#30 0x00007f8297a3fa60 on_exit (/lib/x86_64-linux-gnu/libc.so.6+0x46a60)
#31 0x00007f8297a1d08a __libc_start_main (/lib/x86_64-linux-gnu/libc.so.6+0x2408a)
#32 0x0000555aa316fa8e _start (./TestJIT+0x2b8a8e)
Aborted
However, if I directly declare `static std::unique_ptr<llvm::orc::LLJIT> J = ExitOnErr(LLJITBuilder().create());` in main function and use it, It's correct. So whether it means that LLJIT can not be a static member of class.
</pre>
<img width="1px" height="1px" alt="" src="http://email.email.llvm.org/o/eJzsWktz46j2_zRkQ8UlgSRLiywcx65xKvl3V-z_rbtzIQnZTEvgCyiPWfRnvwXIesXdeUxmbrpqetGRBeec33lyQBCl2I5TegHCSxBenZFa74W8-GN_YHwXe7F3lor86WIFtXyCWsBaUUig0kSzDJblfQXwDOCZkJl7uLm5Xm0g40oTnlFDURFOdhQyCSuR1yVVAM0h4TlkGpJUSE1z-LCnHOo9hQcpdpJUkD4y895My2kmuNKyzrSdMpQwgZs9hZnIKWQKprQUD-4VQKgQAiDUiIWKVYfyybwnEOArSCBAl9D3PIAvYWpfpfYV8jyAUA9lRjikjzSrtZEkJc10-TSBqwKuYLYnfHcEVUhRHW2jBeSCn7tfhlnDiJRKWPUgF7IqnybAuwLerPkfLyBAmPGsrHOrgzUxWs6uNgAt11oyvrslh8neIHQkp6YvLFom-ILvGKcALb_IDKClhfkS8bo-HITUAC1XnOmbm3_dvp5iQ-SO6jUtaaZfTyXJw1YoLSmpXk-0kFLI109fi1pm9Hb3Isnq7o6SnMre4w9JlM6Z6I3WivEd5KSi6kAy2iTI5c8G2-xpZi0emf7CrXKwfW5H6aOmkhvRcxPajGt4kIzrAgIU2zwxESkhQLNCyIpoE3mTyQSgpOWRlUQpOK-VFtUXmV2vNo1q02bCoU5LZvPZ_oTHkFY6d3hrzv5T0-1BS4DnPyoCJpavW6HPeA7koxigJUAzSOROGfD2ZwJbSND-u7ZZ2lkFxVbSZc1K67AYoGSSSUo0dT_6akMIplfHx-_PxCeWd04LUpe6JTIk7bPBtISMM81Iyf6g0L1_u1kGwu2Q04zXZWmphxJLQVwpbIqQGzS-rwjjAMXmkcidLTNH9xO5u3c1fWTIY1LDfwMUH6ns7IGxVq2a_0c0u6cusxuzttNOz5qp6quJyqNPemz7qsPfWWfpXjqsb68Y2XGhTNBRkwl9JzqbzEV1YCWFt7a4N4MvecKoPRdc00dt3JC5R2v6lrQi3-jW0f-E9pleL4lucOLFcTl6ldCWysprFjTjL4BmDfohDLdC3NECFqykX4neW0GOdlKWhryb3YNyIFLR1d2SlSZ1jsRGlHPAT2SSWgu4Wd9aPpu9pCRfk4I22FHcaSnuze-qGUgM0_FgT8Iwd53bb0wqmC7AMWkWz0FJ-J3pyfU5wAuS56u7H6LYrG8bIafkpIzn8J5IRtI2uhjXGG01dO0D7hEdR1wXEXQjJ3HtqL4ljF-vNldPJUubspXTwqzUbbUzyZkqUdaarp-qVJTKTHTDo7JoKttly74ifFfSGc9XJgG5ixxi48Za_Hq1WdyTsiaa5o6zs4tpXr6KLmsjYgimVwDNO7E_l5K-Q0r6ZiluwXuHqCNh0lsInPVMjeybPunCoRccTWws-lW4Cf9CiFku5bP1qdWkFOJbfRim8Sj07gXLoZ0xszOS3rrU8J9o8dUWFjP3WIOeFyNLPnonaq1ahnOA510nbDqJ5h3pDRrbpuMJaX9COOfDgiKpriWH3mD97PW3X2p9qHXXqXddr0Pie7iTirzg2DtICu-Z1DUpYUX1XuQwI2VJczeuqawYJ6Y7t2_hA9N7UWto2u3MLEuQPmb0YBpiR_H1ZjFbL6Cq08rsQmBa76CkplM0ffte64MyMWT9vWN6X6eTTJjmsOkRzZ_zgxS_08z0lkyp2uxrlm7H0PSHpkxlkqg9TEn2TUuStfUKIOxB79HzPC8MQ0LwNAmRH_XWQPWk3INdSNeaZN82hgNAcTep1zcDFNlNBjelE34fYTyXtKRE0XM_nDz21DDVp9cj_z9nZnTNdpyUasK4aVzCKAR4duxwDXT_GfTchyOcjsdvhOelTT8XsLOPBhdhBPDM77ChETZUYO-UWe9qPoB4zI13gjuiyg4Hg8fDxmReBwuPYAVphODYRn-B8wJvOrRP0ACZFjFKpkWMA-TB7VZSpYWkW6ldBWq4P8bRNgrOS8brx_Mdr93AQdtFfqLExAPo0nv0gwB5XdUECIcDMQRnnpdCSZiir-CfGc6R5Rxgz0sHnKMhZz-Nw8SdI7yNM0JxmAw4Twec8yKMc_8VPJXOM4AuAbrsmCc0zv0B83jAnHo-nmbvZG4CKBswT54xp9P3M6fTlrlJdm_EHPlB-F7mqR-EA-bDUpKnaRLG_Z0AzUzRvqWVkE-39iBJupHvJ4fekcPPj0pOcW4SG-GpTapOATRWgHjRp1Yg6eqBwT8sTKEXTnHcNeXNdnib05Lq4dbkruaaVfTqqWzmjnRcNJvfA5VEi-NGsL96vcDBLRbuTAOgZa2kWWnd2grQsgkugJYJQMuUme5m2W2-JnuAZ7FZHKadssFIWZSEwYs7t5dgzj_KXI3FvvdwNP3a-7RHiV2FOvXDkfpZFk5d19lqsL2iSkvxBPD8M9ll0d_A_e_xuNB8rVuULrftEbb1TBIbx0SdZ6KRZ9Ikzn_gmS2pHwGeF6RUtI2Z7Tb_jH5Ds0_puvlnyvk_G0u-7fCCLpamo1hK4pz8Eln-T7T8DdGCTekJu2iJR9ESxUnyq0TL53LNP7H7NkCkLEVmW8NPFVcGaPTnkgzZktxLsmSUZDib4g7xPc0-nRV-DUe1LXNjwre1y8ZxjtB6LYq9wW4BDU_ogqIIMDp15eFuY4B-Sc1O7Ybxb4zvbsjTcZ-3t8c7d7QS9_SOKvsVWgEU19xevMhhKfjuAzZ97gP_j7A02z-M7VleF5pouAEPgrBIn32ZNg-twDVVigneHEAO1NpIkn2zm9hTVhpPij5M6bmQ9Li_RYln9ew0HO7QAxwkBJ904whgT8GP2ZY_AxviwV4c4RHSOI2CU0jbL0f2V1ZS8kEHB88QRmFkrNmLl2AUL4hQ__XxQnl-_P3XAPYTW3v7iIe73iBFCJ-0avN13tYT9_yBEN3Fm8aoCTIQu5YdRWOIOD5Zaf5GiMEwNIebCn8a5Vn0qlL-7PJD8_rHx0Ijio8_BkLxSJkgjuO3Xm555Up2Qv2_-pgHJaOz9yImrzkN7p-6RzEZHAJjb8yTRB4UfGsvsr2RN4m8AW9_dKKfezGB260h2ypNpN5WhPE3nu4HXkwGUobLgB8VJKbQ8TesJwAtN1Rp61vDII1JTFsOM3dRsf8t8zfxQO9dT8MKuII5cxcDYU6zkkgKQeS9_-LUO286RR5k3F4LgkXN7TGw_SZZKwqZvQy20gBN1fEe4wSuBXzYU72nEjINK0q4gnpPdHOlMSMccqFh2rv2WdEqpRKKAtqrZJOz_ALnCU7IGb3wpx4OoyhOorP9RUHSKS2SzPenSYbTFHsExXGchDmOE29anLEL5CHsIxR5oedjf0IIioo49_M0SxCKfRB4tCKsnBhjTYTcndlvrRfTCMforCQpLZW9uooQpw_QDtov01dn8sKWxLTeKRB4JVNadVw00yW9WBWj26SQqaGSzcVN-31JuWuq318qx8ebowCh5pvyTz5gI3RWy_Li_Z-crSX-GwAA__9eVkDc">