Я пытаюсь вызвать LLVM API, который хочет ThreadSafeModule
, когда у меня есть Module*
.Я смотрю вверх ThreadSafeModule
, и он имеет следующие конструкторы:
ThreadSafeModule(ThreadSafeModule &&Other) = default;
/// Construct a ThreadSafeModule from a unique_ptr<Module> and a
/// unique_ptr<LLVMContext>. This creates a new ThreadSafeContext from the
/// given context.
ThreadSafeModule(std::unique_ptr<Module> M, std::unique_ptr<LLVMContext> Ctx)
: M(std::move(M)), TSCtx(std::move(Ctx)) {}
/// Construct a ThreadSafeModule from a unique_ptr<Module> and an
/// existing ThreadSafeContext.
ThreadSafeModule(std::unique_ptr<Module> M, ThreadSafeContext TSCtx)
: M(std::move(M)), TSCtx(std::move(TSCtx)) {}
Второй или третий кажется подходящим, поэтому я пробую несколько вариантов:
ThreadSafeContext tsc;
ThreadSafeModule tsm(*module, tsc);
ThreadSafeModule tsm(module, tsc);
ThreadSafeModule tsm(std::move(*module), tsc);
ThreadSafeModule tsm(std::move(module), tsc);
auto tsm = new ThreadSafeModule(*module, tsc);
auto tsm = new ThreadSafeModule(module, tsc);
и выше с LLVMContext*
вместо ThreadSafeContext
, и во всех случаях я получаю одно и то же сообщение об ошибке:
jit.cpp(21): error C2664: 'llvm::orc::ThreadSafeModule::ThreadSafeModule(const llvm::orc::ThreadSafeModule &)': cannot convert argument 1 from 'llvm::Module *' to 'std::unique_ptr<llvm::Module,std::default_delete<_Ty>>'
with
[
_Ty=llvm::Module
]
jit.cpp(21): note: Constructor for class 'std::unique_ptr<llvm::Module,std::default_delete<_Ty>>' is declared 'explicit'
with
[
_Ty=llvm::Module
]
Первая часть сообщения об ошибке, кажется, говорит, что по какой-то причине пытается вызвать копиюконструктор, но это кажется противоречащим следующей части.
Есть идеи, что с этим происходит, и каким будет правильное заклинание?
Редактировать:
Отдельная строка для этого работает, насколько это возможно:
std::unique_ptr<Module> up(module);
Но тогда это все равно не получается:
ThreadSafeModule tsm(up, tsc);
с немного другим сообщением об ошибке:
jit.cpp(23): error C2280: 'std::unique_ptr<llvm::Module,std::default_delete<_Ty>>::unique_ptr(const std::unique_ptr<_Ty,std::default_delete<_Ty>> &)': attempting to reference a deleted function
with
[
_Ty=llvm::Module
]
C:\Program Files (x86)\Microsoft Visual Studio\2017\Community\VC\Tools\MSVC\14.16.27023\include\memory(2337): note: see declaration of 'std::unique_ptr<llvm::Module,std::default_delete<_Ty>>::unique_ptr'
with
[
_Ty=llvm::Module
]
C:\Program Files (x86)\Microsoft Visual Studio\2017\Community\VC\Tools\MSVC\14.16.27023\include\memory(2337): note: 'std::unique_ptr<llvm::Module,std::default_delete<_Ty>>::unique_ptr(const std::unique_ptr<_Ty,std::default_delete<_Ty>> &)': function was explicitly deleted
with
[
_Ty=llvm::Module
] (compiling source file jit.cpp)