在 LLVM JIT 代码中启用 RTTI 的问题
Problems enabling RTTI in LLVM JIT-ed code
我正在 Windows 应用程序中 JIT-ting C++ 代码。我使用的是 LLVM/CLang 5.0,应用程序是使用 MsVc 2015 编译的。
虽然使用这两个工具链创建的 DLL 和可执行代码可以很好地混合和匹配,但我遇到了 JIT-ted 代码的问题,该代码不包含 LLVM 应自动生成的变量,例如 ??_7type_info@@6B@
和相关的东西,比如 ??_R0H@8
。它们仅注册为外部,任何使用它们都会导致应用程序崩溃
LLVM ERROR: Program used external function '??_7type_info@@6B@' which could not be resolved!
虽然我找到了将用户定义的变量添加到 JIT 代码的示例,但我找不到有效的解决方案来解决使 JIT 代码引用这些幕后生成的内部变量的问题。
我相信我可以通过用 CLang 编译的 DLL 提供缺少的变量,并调整 .ll
但我更喜欢更简洁的解决方案,只需配置 JIT-ter 引擎。
有人能帮帮我吗?
??_7type_info@@6B@ 是 std::type_info class 的 vtable 的损坏名称,它由获取的一个或其他 MSVC 静态库提供隐式链接,例如:
c:/Program Files (x86)/Microsoft Visual Studio/2017/Professional/VC/Tools/MSVC/14.15.26726/lib/x64/msvcrt.lib
要修复 LLVM 查找错误,您可以从您自己的 DLL 或 EXE 中导出该符号,实际上您可以从您的 C++ 代码中执行此操作,如下所示:
#pragma comment(linker, "/export:??_7type_info@@6B@")
另见 https://docs.microsoft.com/en-us/cpp/build/reference/export-exports-a-function?view=vs-2017
您可能还必须调用下面的实用函数以确保您的所有符号对 LLVM 可见
llvm::sys::DynamicLibrary::LoadLibraryPermanently(nullptr);
不确定在这种情况下是否绝对必要,但 LLVM JIT 编译器教程推荐这样做。
我正在 Windows 应用程序中 JIT-ting C++ 代码。我使用的是 LLVM/CLang 5.0,应用程序是使用 MsVc 2015 编译的。
虽然使用这两个工具链创建的 DLL 和可执行代码可以很好地混合和匹配,但我遇到了 JIT-ted 代码的问题,该代码不包含 LLVM 应自动生成的变量,例如 ??_7type_info@@6B@
和相关的东西,比如 ??_R0H@8
。它们仅注册为外部,任何使用它们都会导致应用程序崩溃
LLVM ERROR: Program used external function '??_7type_info@@6B@' which could not be resolved!
虽然我找到了将用户定义的变量添加到 JIT 代码的示例,但我找不到有效的解决方案来解决使 JIT 代码引用这些幕后生成的内部变量的问题。
我相信我可以通过用 CLang 编译的 DLL 提供缺少的变量,并调整 .ll
但我更喜欢更简洁的解决方案,只需配置 JIT-ter 引擎。
有人能帮帮我吗?
??_7type_info@@6B@ 是 std::type_info class 的 vtable 的损坏名称,它由获取的一个或其他 MSVC 静态库提供隐式链接,例如:
c:/Program Files (x86)/Microsoft Visual Studio/2017/Professional/VC/Tools/MSVC/14.15.26726/lib/x64/msvcrt.lib
要修复 LLVM 查找错误,您可以从您自己的 DLL 或 EXE 中导出该符号,实际上您可以从您的 C++ 代码中执行此操作,如下所示:
#pragma comment(linker, "/export:??_7type_info@@6B@")
另见 https://docs.microsoft.com/en-us/cpp/build/reference/export-exports-a-function?view=vs-2017
您可能还必须调用下面的实用函数以确保您的所有符号对 LLVM 可见
llvm::sys::DynamicLibrary::LoadLibraryPermanently(nullptr);
不确定在这种情况下是否绝对必要,但 LLVM JIT 编译器教程推荐这样做。