Closed
Description
Here is the code that can reproduce this problem, it is modified based on OrcV2CBindingsIRTransforms.c
under llvm example by reducing some irrelevant noise
#include <llvm-c/Core.h>
#include <llvm-c/Error.h>
#include <llvm-c/Initialization.h>
#include <llvm-c/LLJIT.h>
#include <llvm-c/Support.h>
#include <llvm-c/Target.h>
#include <iostream>
namespace {
LLVMOrcThreadSafeModuleRef createDemoModule() {
LLVMOrcThreadSafeContextRef TSCtx = LLVMOrcCreateNewThreadSafeContext();
LLVMContextRef Ctx = LLVMOrcThreadSafeContextGetContext(TSCtx);
LLVMModuleRef M = LLVMModuleCreateWithNameInContext("demo", Ctx);
LLVMTypeRef ParamTypes[] = {LLVMInt32Type(), LLVMInt32Type()};
LLVMTypeRef SumFunctionType = LLVMFunctionType(LLVMInt32Type(), ParamTypes, 2, 0);
LLVMValueRef SumFunction = LLVMAddFunction(M, "sum", SumFunctionType);
LLVMBasicBlockRef EntryBB = LLVMAppendBasicBlock(SumFunction, "entry");
LLVMBuilderRef Builder = LLVMCreateBuilder();
LLVMPositionBuilderAtEnd(Builder, EntryBB);
LLVMValueRef SumArg0 = LLVMGetParam(SumFunction, 0);
LLVMValueRef SumArg1 = LLVMGetParam(SumFunction, 1);
LLVMValueRef Result = LLVMBuildAdd(Builder, SumArg0, SumArg1, "result");
LLVMBuildRet(Builder, Result);
LLVMDisposeBuilder(Builder); // THIS IS MISSING FROM EXAMPLE FILE
LLVMOrcThreadSafeModuleRef TSM = LLVMOrcCreateNewThreadSafeModule(M, TSCtx);
LLVMOrcDisposeThreadSafeContext(TSCtx);
return TSM;
}
LLVMErrorRef transform(void*, LLVMOrcThreadSafeModuleRef*, LLVMOrcMaterializationResponsibilityRef) {
return LLVMErrorSuccess;
}
void cant_fail(LLVMErrorRef Err) {
if (Err != LLVMErrorSuccess) {
std::cerr << LLVMGetErrorMessage(Err) << '\n';
exit(1);
}
}
}
int main() {
LLVMInitializeCore(LLVMGetGlobalPassRegistry());
LLVMInitializeNativeTarget();
LLVMInitializeNativeAsmPrinter();
LLVMOrcLLJITRef J{};
cant_fail(LLVMOrcCreateLLJIT(&J, 0));
LLVMOrcIRTransformLayerSetTransform(LLVMOrcLLJITGetIRTransformLayer(J), transform, nullptr);
cant_fail(LLVMOrcLLJITAddLLVMIRModule(J, LLVMOrcLLJITGetMainJITDylib(J), createDemoModule()));
LLVMOrcJITTargetAddress SumAddr{};
cant_fail(LLVMOrcLLJITLookup(J, &SumAddr, "sum"));
auto Sum = reinterpret_cast<int32_t (*)(int32_t, int32_t)>(SumAddr);
int32_t Result = Sum(1, 2);
std::cout << "1 + 2 = " << Result;
cant_fail(LLVMOrcDisposeLLJIT(J));
LLVMShutdown();
}
I first noticed this problem with llvm14.0.4 from vcpkg.json
, my project setting can be found at vcpkg.json
. By default, I build everything with address sanitizer, with LLVMOrcIRTransformLayerSetTransform
, it reports
==4161738==ERROR: LeakSanitizer: detected memory leaks
Direct leak of 24 byte(s) in 1 object(s) allocated from:
#0 0x7efe946fa1c7 in operator new(unsigned long) ../../../../src/libsanitizer/asan/asan_new_delete.cpp:99
#1 0x55753c4ef882 in operator() /home/mx/repos/toolchains/vcpkg/buildtrees/llvm/src/org-14.0.4-df58f01928.clean/llvm/lib/ExecutionEngine/Orc/OrcV2CBindings.cpp:796
#2 0x55753c4f1c06 in CallImpl<LLVMOrcIRTransformLayerSetTransform(LLVMOrcIRTransformLayerRef, LLVMOrcIRTransformLayerTransformFunction, void*)::<lambda(llvm::orc::ThreadSafeModule, llvm::orc::MaterializationResponsibility&)> > /home/mx/repos/toolchains/vcpkg/buildtrees/llvm/
src/org-14.0.4-df58f01928.clean/llvm/include/llvm/ADT/FunctionExtras.h:222
#3 0x55753c68ecac in llvm::unique_function<llvm::Expected<llvm::orc::ThreadSafeModule> (llvm::orc::ThreadSafeModule, llvm::orc::MaterializationResponsibility&)>::operator()(llvm::orc::ThreadSafeModule, llvm::orc::MaterializationResponsibility&) /home/mx/repos/toolchains/vcpk
g/buildtrees/llvm/src/org-14.0.4-df58f01928.clean/llvm/include/llvm/ADT/FunctionExtras.h:384
#4 0x55753c68eb2c in llvm::orc::IRTransformLayer::emit(std::unique_ptr<llvm::orc::MaterializationResponsibility, std::default_delete<llvm::orc::MaterializationResponsibility> >, llvm::orc::ThreadSafeModule) /home/mx/repos/toolchains/vcpkg/buildtrees/llvm/src/org-14.0.4-df58f
01928.clean/llvm/lib/ExecutionEngine/Orc/IRTransformLayer.cpp:24
#5 0x55753c68ebbb in llvm::orc::IRTransformLayer::emit(std::unique_ptr<llvm::orc::MaterializationResponsibility, std::default_delete<llvm::orc::MaterializationResponsibility> >, llvm::orc::ThreadSafeModule) /home/mx/repos/toolchains/vcpkg/buildtrees/llvm/src/org-14.0.4-df58f
01928.clean/llvm/lib/ExecutionEngine/Orc/IRTransformLayer.cpp:25
#6 0x55753c5e1dd1 in llvm::orc::BasicIRLayerMaterializationUnit::materialize(std::unique_ptr<llvm::orc::MaterializationResponsibility, std::default_delete<llvm::orc::MaterializationResponsibility> >) /home/mx/repos/toolchains/vcpkg/buildtrees/llvm/src/org-14.0.4-df58f01928.c
lean/llvm/lib/ExecutionEngine/Orc/Layer.cpp:151
#7 0x55753c5315d7 in llvm::orc::MaterializationTask::run() /home/mx/repos/toolchains/vcpkg/buildtrees/llvm/src/org-14.0.4-df58f01928.clean/llvm/lib/ExecutionEngine/Orc/Core.cpp:1853
#8 0x55753c5436cb in llvm::orc::ExecutionSession::runOnCurrentThread(std::unique_ptr<llvm::orc::Task, std::default_delete<llvm::orc::Task> >) /home/mx/repos/toolchains/vcpkg/buildtrees/llvm/src/org-14.0.4-df58f01928.clean/llvm/include/llvm/ExecutionEngine/Orc/Core.h:1667
#9 0x55753c5678da in void llvm::detail::UniqueFunctionBase<void, std::unique_ptr<llvm::orc::Task, std::default_delete<llvm::orc::Task> > >::CallImpl<void (*)(std::unique_ptr<llvm::orc::Task, std::default_delete<llvm::orc::Task> >)>(void*, std::unique_ptr<llvm::orc::Task, std
::default_delete<llvm::orc::Task> >&) (/home/mx/repos/getting-started-llvm-c-api/build/src/getting-started-llvm-c-api+0x15428da)
#10 0x55753c547858 in llvm::unique_function<void (std::unique_ptr<llvm::orc::Task, std::default_delete<llvm::orc::Task> >)>::operator()(std::unique_ptr<llvm::orc::Task, std::default_delete<llvm::orc::Task> >) (/home/mx/repos/getting-started-llvm-c-api/build/src/getting-start
ed-llvm-c-api+0x1522858)
#11 0x55753c5435d0 in llvm::orc::ExecutionSession::dispatchTask(std::unique_ptr<llvm::orc::Task, std::default_delete<llvm::orc::Task> >) /home/mx/repos/toolchains/vcpkg/buildtrees/llvm/src/org-14.0.4-df58f01928.clean/llvm/include/llvm/ExecutionEngine/Orc/Core.h:1557
#12 0x55753c534a66 in llvm::orc::ExecutionSession::dispatchOutstandingMUs() /home/mx/repos/toolchains/vcpkg/buildtrees/llvm/src/org-14.0.4-df58f01928.clean/llvm/lib/ExecutionEngine/Orc/Core.cpp:2231
#13 0x55753c539131 in llvm::orc::ExecutionSession::OL_completeLookup(std::unique_ptr<llvm::orc::InProgressLookupState, std::default_delete<llvm::orc::InProgressLookupState> >, std::shared_ptr<llvm::orc::AsynchronousSymbolQuery>, std::function<void (llvm::DenseMap<llvm::orc::
JITDylib*, llvm::DenseSet<llvm::orc::SymbolStringPtr, llvm::DenseMapInfo<llvm::orc::SymbolStringPtr, void> >, llvm::DenseMapInfo<llvm::orc::JITDylib*, void>, llvm::detail::DenseMapPair<llvm::orc::JITDylib*, llvm::DenseSet<llvm::orc::SymbolStringPtr, llvm::DenseMapInfo<llvm::orc:
:SymbolStringPtr, void> > > > const&)>) /home/mx/repos/toolchains/vcpkg/buildtrees/llvm/src/org-14.0.4-df58f01928.clean/llvm/lib/ExecutionEngine/Orc/Core.cpp:2773
#14 0x55753c544502 in llvm::orc::InProgressFullLookupState::complete(std::unique_ptr<llvm::orc::InProgressLookupState, std::default_delete<llvm::orc::InProgressLookupState> >) /home/mx/repos/toolchains/vcpkg/buildtrees/llvm/src/org-14.0.4-df58f01928.clean/llvm/lib/ExecutionE
ngine/Orc/Core.cpp:550
#15 0x55753c5370ef in llvm::orc::ExecutionSession::OL_applyQueryPhase1(std::unique_ptr<llvm::orc::InProgressLookupState, std::default_delete<llvm::orc::InProgressLookupState> >, llvm::Error) /home/mx/repos/toolchains/vcpkg/buildtrees/llvm/src/org-14.0.4-df58f01928.clean/llvm
/lib/ExecutionEngine/Orc/Core.cpp:2529
#16 0x55753c53354d in llvm::orc::ExecutionSession::lookup(llvm::orc::LookupKind, std::vector<std::pair<llvm::orc::JITDylib*, llvm::orc::JITDylibLookupFlags>, std::allocator<std::pair<llvm::orc::JITDylib*, llvm::orc::JITDylibLookupFlags> > > const&, llvm::orc::SymbolLookupSet
, llvm::orc::SymbolState, llvm::unique_function<void (llvm::Expected<llvm::DenseMap<llvm::orc::SymbolStringPtr, llvm::JITEvaluatedSymbol, llvm::DenseMapInfo<llvm::orc::SymbolStringPtr, void>, llvm::detail::DenseMapPair<llvm::orc::SymbolStringPtr, llvm::JITEvaluatedSymbol> > >)>,
std::function<void (llvm::DenseMap<llvm::orc::JITDylib*, llvm::DenseSet<llvm::orc::SymbolStringPtr, llvm::DenseMapInfo<llvm::orc::SymbolStringPtr, void> >, llvm::DenseMapInfo<llvm::orc::JITDylib*, void>, llvm::detail::DenseMapPair<llvm::orc::JITDylib*, llvm::DenseSet<llvm::orc:
:SymbolStringPtr, llvm::DenseMapInfo<llvm::orc::SymbolStringPtr, void> > > > const&)>) /home/mx/repos/toolchains/vcpkg/buildtrees/llvm/src/org-14.0.4-df58f01928.clean/llvm/lib/ExecutionEngine/Orc/Core.cpp:2069
#17 0x55753c5337e9 in llvm::orc::ExecutionSession::lookup(std::vector<std::pair<llvm::orc::JITDylib*, llvm::orc::JITDylibLookupFlags>, std::allocator<std::pair<llvm::orc::JITDylib*, llvm::orc::JITDylibLookupFlags> > > const&, llvm::orc::SymbolLookupSet const&, llvm::orc::Loo
kupKind, llvm::orc::SymbolState, std::function<void (llvm::DenseMap<llvm::orc::JITDylib*, llvm::DenseSet<llvm::orc::SymbolStringPtr, llvm::DenseMapInfo<llvm::orc::SymbolStringPtr, void> >, llvm::DenseMapInfo<llvm::orc::JITDylib*, void>, llvm::detail::DenseMapPair<llvm::orc::JITD
ylib*, llvm::DenseSet<llvm::orc::SymbolStringPtr, llvm::DenseMapInfo<llvm::orc::SymbolStringPtr, void> > > > const&)>) /home/mx/repos/toolchains/vcpkg/buildtrees/llvm/src/org-14.0.4-df58f01928.clean/llvm/lib/ExecutionEngine/Orc/Core.cpp:2106
#18 0x55753c533a29 in llvm::orc::ExecutionSession::lookup(std::vector<std::pair<llvm::orc::JITDylib*, llvm::orc::JITDylibLookupFlags>, std::allocator<std::pair<llvm::orc::JITDylib*, llvm::orc::JITDylibLookupFlags> > > const&, llvm::orc::SymbolStringPtr, llvm::orc::SymbolStat
e) /home/mx/repos/toolchains/vcpkg/buildtrees/llvm/src/org-14.0.4-df58f01928.clean/llvm/lib/ExecutionEngine/Orc/Core.cpp:2132
#19 0x55753c5ed648 in llvm::orc::LLJIT::lookupLinkerMangled(llvm::orc::JITDylib&, llvm::orc::SymbolStringPtr) /home/mx/repos/toolchains/vcpkg/buildtrees/llvm/src/org-14.0.4-df58f01928.clean/llvm/lib/ExecutionEngine/Orc/LLJIT.cpp:707
#20 0x55753c4f54d3 in llvm::orc::LLJIT::lookupLinkerMangled(llvm::orc::JITDylib&, llvm::StringRef) (/home/mx/repos/getting-started-llvm-c-api/build/src/getting-started-llvm-c-api+0x14d04d3)
#21 0x55753c4f5580 in llvm::orc::LLJIT::lookup(llvm::orc::JITDylib&, llvm::StringRef) (/home/mx/repos/getting-started-llvm-c-api/build/src/getting-started-llvm-c-api+0x14d0580)
#22 0x55753c4f55f5 in llvm::orc::LLJIT::lookup(llvm::StringRef) (/home/mx/repos/getting-started-llvm-c-api/build/src/getting-started-llvm-c-api+0x14d05f5)
#23 0x55753c4f084e in LLVMOrcLLJITLookup /home/mx/repos/toolchains/vcpkg/buildtrees/llvm/src/org-14.0.4-df58f01928.clean/llvm/lib/ExecutionEngine/Orc/OrcV2CBindings.cpp:948
#24 0x55753b2b4153 in foo() /home/mx/repos/getting-started-llvm-c-api/src/orcv2jit.cpp:368
#25 0x55753b2b3bb5 in main /home/mx/repos/getting-started-llvm-c-api/src/main.cpp:8
#26 0x7efe93addd8f in __libc_start_call_main ../sysdeps/nptl/libc_start_call_main.h:58
then I upgraded the llvm to 14.0.4 in vcpkg, but got the same error
then I build llvm14.0.6 from source by
export LLVM_VER=14.0.6
git clone --depth=1 https://github.com/llvm/llvm-project.git llvm-${LLVM_VER} -b llvmorg-${LLVM_VER} --single-branch
cmake -G Ninja -S llvm -B build -DLLVM_OPTIMIZED_TABLEGEN=ON -DLLVM_TARGETS_TO_BUILD=X86 -DCMAKE_INSTALL_PREFIX=$PWD/install -DLLVM_USE_SPLIT_DWARF=ON -DLLVM_USE_SANITIZER="Address"
cmake --build build
cmake --install build
g++ ../the-file-at-the-beginning.cpp `./install/bin/llvm-config --cxxflags --ldflags --system-libs --libs` -fsanitize=address
I got the same error
$ ./a.out
1 + 2 = 3
=================================================================
==1604253==ERROR: LeakSanitizer: detected memory leaks
Direct leak of 24 byte(s) in 1 object(s) allocated from:
#0 0x7f081f9cf1c7 in operator new(unsigned long) ../../../../src/libsanitizer/asan/asan_new_delete.cpp:99
#1 0x5653f47123f4 in llvm::Expected<llvm::orc::ThreadSafeModule> llvm::detail::UniqueFunctionBase<llvm::Expected<llvm::orc::ThreadSafeModule>, llvm::orc::ThreadSafeModule, llvm::orc::MaterializationResponsibility&>::CallImpl<LLVMOrcIRTransformLayerSetTransform::{lambda(llvm:
:orc::ThreadSafeModule, llvm::orc::MaterializationResponsibility&)#1}>(void*, llvm::orc::ThreadSafeModule&, llvm::orc::MaterializationResponsibility&) (/home/mx/repos/llvm-14.0.6/a.out+0x19ac3f4)
#2 0x5653f4abe616 in llvm::orc::IRTransformLayer::emit(std::unique_ptr<llvm::orc::MaterializationResponsibility, std::default_delete<llvm::orc::MaterializationResponsibility> >, llvm::orc::ThreadSafeModule) (/home/mx/repos/llvm-14.0.6/a.out+0x1d58616)
#3 0x5653f4abe844 in llvm::orc::IRTransformLayer::emit(std::unique_ptr<llvm::orc::MaterializationResponsibility, std::default_delete<llvm::orc::MaterializationResponsibility> >, llvm::orc::ThreadSafeModule) (/home/mx/repos/llvm-14.0.6/a.out+0x1d58844)
#4 0x5653f490cda6 in llvm::orc::BasicIRLayerMaterializationUnit::materialize(std::unique_ptr<llvm::orc::MaterializationResponsibility, std::default_delete<llvm::orc::MaterializationResponsibility> >) [clone .localalias] (/home/mx/repos/llvm-14.0.6/a.out+0x1ba6da6)
#5 0x5653f47a9e02 in llvm::orc::MaterializationTask::run() (/home/mx/repos/llvm-14.0.6/a.out+0x1a43e02)
#6 0x5653f47ec796 in llvm::orc::ExecutionSession::runOnCurrentThread(std::unique_ptr<llvm::orc::Task, std::default_delete<llvm::orc::Task> >) (/home/mx/repos/llvm-14.0.6/a.out+0x1a86796)
#7 0x5653f47ed77e in void llvm::detail::UniqueFunctionBase<void, std::unique_ptr<llvm::orc::Task, std::default_delete<llvm::orc::Task> > >::CallImpl<void (*)(std::unique_ptr<llvm::orc::Task, std::default_delete<llvm::orc::Task> >)>(void*, std::unique_ptr<llvm::orc::Task, std
::default_delete<llvm::orc::Task> >&) (/home/mx/repos/llvm-14.0.6/a.out+0x1a8777e)
#8 0x5653f47f293c in llvm::orc::ExecutionSession::dispatchTask(std::unique_ptr<llvm::orc::Task, std::default_delete<llvm::orc::Task> >) (/home/mx/repos/llvm-14.0.6/a.out+0x1a8c93c)
#9 0x5653f47aaad3 in llvm::orc::ExecutionSession::dispatchOutstandingMUs() (/home/mx/repos/llvm-14.0.6/a.out+0x1a44ad3)
#10 0x5653f47daf5f in llvm::orc::ExecutionSession::OL_completeLookup(std::unique_ptr<llvm::orc::InProgressLookupState, std::default_delete<llvm::orc::InProgressLookupState> >, std::shared_ptr<llvm::orc::AsynchronousSymbolQuery>, std::function<void (llvm::DenseMap<llvm::orc::
JITDylib*, llvm::DenseSet<llvm::orc::SymbolStringPtr, llvm::DenseMapInfo<llvm::orc::SymbolStringPtr, void> >, llvm::DenseMapInfo<llvm::orc::JITDylib*, void>, llvm::detail::DenseMapPair<llvm::orc::JITDylib*, llvm::DenseSet<llvm::orc::SymbolStringPtr, llvm::DenseMapInfo<llvm::orc:
:SymbolStringPtr, void> > > > const&)>) [clone .localalias] (/home/mx/repos/llvm-14.0.6/a.out+0x1a74f5f)
#11 0x5653f4829446 in llvm::orc::InProgressFullLookupState::complete(std::unique_ptr<llvm::orc::InProgressLookupState, std::default_delete<llvm::orc::InProgressLookupState> >) (/home/mx/repos/llvm-14.0.6/a.out+0x1ac3446)
#12 0x5653f4787594 in llvm::orc::ExecutionSession::OL_applyQueryPhase1(std::unique_ptr<llvm::orc::InProgressLookupState, std::default_delete<llvm::orc::InProgressLookupState> >, llvm::Error) [clone .localalias] (/home/mx/repos/llvm-14.0.6/a.out+0x1a21594)
#13 0x5653f47abb73 in llvm::orc::ExecutionSession::lookup(llvm::orc::LookupKind, std::vector<std::pair<llvm::orc::JITDylib*, llvm::orc::JITDylibLookupFlags>, std::allocator<std::pair<llvm::orc::JITDylib*, llvm::orc::JITDylibLookupFlags> > > const&, llvm::orc::SymbolLookupSet
, llvm::orc::SymbolState, llvm::unique_function<void (llvm::Expected<llvm::DenseMap<llvm::orc::SymbolStringPtr, llvm::JITEvaluatedSymbol, llvm::DenseMapInfo<llvm::orc::SymbolStringPtr, void>, llvm::detail::DenseMapPair<llvm::orc::SymbolStringPtr, llvm::JITEvaluatedSymbol> > >)>,
std::function<void (llvm::DenseMap<llvm::orc::JITDylib*, llvm::DenseSet<llvm::orc::SymbolStringPtr, llvm::DenseMapInfo<llvm::orc::SymbolStringPtr, void> >, llvm::DenseMapInfo<llvm::orc::JITDylib*, void>, llvm::detail::DenseMapPair<llvm::orc::JITDylib*, llvm::DenseSet<llvm::orc:
:SymbolStringPtr, llvm::DenseMapInfo<llvm::orc::SymbolStringPtr, void> > > > const&)>) [clone .localalias] (/home/mx/repos/llvm-14.0.6/a.out+0x1a45b73)
#14 0x5653f47ac8b9 in llvm::orc::ExecutionSession::lookup(std::vector<std::pair<llvm::orc::JITDylib*, llvm::orc::JITDylibLookupFlags>, std::allocator<std::pair<llvm::orc::JITDylib*, llvm::orc::JITDylibLookupFlags> > > const&, llvm::orc::SymbolLookupSet const&, llvm::orc::Loo
kupKind, llvm::orc::SymbolState, std::function<void (llvm::DenseMap<llvm::orc::JITDylib*, llvm::DenseSet<llvm::orc::SymbolStringPtr, llvm::DenseMapInfo<llvm::orc::SymbolStringPtr, void> >, llvm::DenseMapInfo<llvm::orc::JITDylib*, void>, llvm::detail::DenseMapPair<llvm::orc::JITD
ylib*, llvm::DenseSet<llvm::orc::SymbolStringPtr, llvm::DenseMapInfo<llvm::orc::SymbolStringPtr, void> > > > const&)>) (/home/mx/repos/llvm-14.0.6/a.out+0x1a468b9)
#15 0x5653f47add37 in llvm::orc::ExecutionSession::lookup(std::vector<std::pair<llvm::orc::JITDylib*, llvm::orc::JITDylibLookupFlags>, std::allocator<std::pair<llvm::orc::JITDylib*, llvm::orc::JITDylibLookupFlags> > > const&, llvm::orc::SymbolStringPtr, llvm::orc::SymbolStat
e) [clone .localalias] (/home/mx/repos/llvm-14.0.6/a.out+0x1a47d37)
#16 0x5653f4929d70 in llvm::orc::LLJIT::lookupLinkerMangled(llvm::orc::JITDylib&, llvm::orc::SymbolStringPtr) (/home/mx/repos/llvm-14.0.6/a.out+0x1bc3d70)
#17 0x5653f471ca89 in LLVMOrcLLJITLookup (/home/mx/repos/llvm-14.0.6/a.out+0x19b6a89)
#18 0x5653f3914e28 in main (/home/mx/repos/llvm-14.0.6/a.out+0xbaee28)
#19 0x7f081f1b5d8f in __libc_start_call_main ../sysdeps/nptl/libc_start_call_main.h:58
SUMMARY: AddressSanitizer: 24 byte(s) leaked in 1 allocation(s).
Did I do something wrong with this function call?