【问题标题】:lli is generating run-time error for clang++ generated IR while the generated executable is not generating run-time error for c++ source codelli 正在为 clang++ 生成的 IR 生成运行时错误,而生成的可执行文件没有为 c++ 源代码生成运行时错误
【发布时间】:2021-08-21 03:32:32
【问题描述】:

我正在尝试从 c++ 源代码生成位代码并通过即时编译器运行。当我通过 clang++ 编译并生成二进制可执行文件时,它可以完美运行,但是当我生成位码并尝试使用 lli 命令通过 JIT 运行时,它会生成运行时错误。你能帮我理解发生了什么吗?

例如:让example.cpp包含以下代码:

 #include <iostream>

 int main(){
    std::cout << "\nHello World!";
    return 0;
 }

我正在使用以下命令生成运行良好的可执行文件。

clang++ example.cpp 

我正在使用以下命令生成位码:

clang++ -S -emit-llvm example.cpp 

然后使用以下生成运行时错误的命令运行 JIT:

lli example.ll 

我收到以下访问冲突错误:

Stack dump:
0.      Program arguments: lli example.ll
#0 0x00000000025fd9af llvm::sys::PrintStackTrace(llvm::raw_ostream&) /home/xpc/llvm/llvm-project1/llvm-project/llvm/lib/Support/Unix/Signals.inc:564:0
#1 0x00000000025fda42 PrintStackTraceSignalHandler(void*) /home/xpc/llvm/llvm-project1/llvm-project/llvm/lib/Support/Unix/Signals.inc:625:0
#2 0x00000000025fb7ca llvm::sys::RunSignalHandlers() /home/xpc/llvm/llvm-project1/llvm-project/llvm/lib/Support/Signals.cpp:68:0
#3 0x00000000025fd329 SignalHandler(int) /home/xpc/llvm/llvm-project1/llvm-project/llvm/lib/Support/Unix/Signals.inc:406:0
#4 0x00007fa75dbdc390 __restore_rt (/lib/x86_64-linux-gnu/libpthread.so.0+0x11390)
Segmentation fault (core dumped)

【问题讨论】:

  • 不完全确定发生了什么,但通过一些测试似乎问题出在 C++ 上(C 代码不会产生问题,就像 clang++ 生成的 C 之类的 C++ 一样)。不确定lli 是否需要一些参数来支持 C++ 字节码(显式指定外部共享对象)或什么。不幸的是,我找不到 C++ 字节码编译/使用的示例,但祝您搜索顺利

标签: c++ clang llvm llvm-c++-api lli


【解决方案1】:

尝试使用clang++ -S -emit-llvm -fno-use-cxa-atexit example.cpp编译。

我认为这可能是因为 clang 和 gcc 尝试更喜欢 __cxa_atexit atexit 默认情况下(这些函数用于在程序退出时清理全局对象)。这意味着如果您的 libc 实现不支持前者,您将收到链接器错误。所以禁用use-cxa-atexit 标志应该可以工作。

【讨论】:

    【解决方案2】:

    这似乎是一个库链接问题。尝试使用以下内容:

    1. 尝试lli -force-interpreter example.ll 而不是lli example.ll 当 JIT 不能正常工作时,你应该尝试解释器。 如果出现以下错误: LLVM ERROR: Could not resolve external global address: __dso_handle 然后将-fno-use-cxa-atexit添加到clang标志中,原因来自[LLVMdev] MCJIT/interpreter and iostream
    2. 重试lli -force-interpreter example.ll后,如果仍然有一些错误,如LLVM ERROR: Tried to execute an unknown external function: ...。然后你应该重新编译 LLVM 并启用 ffi 库。原因请参见以下内容:Advice on Packaging LLVM¶ [LLVMdev] lli --force-interpreter does not find external function

    【讨论】:

      猜你喜欢
      • 2011-11-22
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-11-27
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2010-12-22
      相关资源
      最近更新 更多