Issue 76382
Summary If LLJIT instance is static member, it aborts when ~orc::LLJIT::~LLJIT(), and "report pure virtual method called"
Labels new issue
Assignees
Reporter zhping8080
    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.
_______________________________________________
llvm-bugs mailing list
[email protected]
https://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-bugs

Reply via email to