clang++ -S -emit-llvm main.cpp && lli main.ll
在 Linux(Debian) 上运行以下代码
#include <future>
int main () {
return std::async([]{return 1;}).get();
}
由于以下错误,无法在 lli 上运行:
LLVM ERROR: Cannot select: 0xd012e0:
i64 = X86ISD::WrapperRIP TargetGlobalTLSAddress:i64<i8** @_ZSt15__once_callable> 0 [TF=10]
0xd020c0: i64 = TargetGlobalTLSAddress<i8** @_ZSt15__once_callable> 0 [TF=10]
In function: _ZSt9call_onceIMNSt13__future_base13_State_baseV2EFvPSt8functionIFSt10unique_ptrINS0_12_Result_baseENS4_8_DeleterEEvEEPbEJPS1_S9_SA_EEvRSt9once_flagOT_DpOT0_
问题:
这是什么意思?
是否有任何编译器标志可以解决此问题?
using-stdlib=libc++
编译并运行成功*;libstdc++ 使用哪些特定功能会导致此问题?
编辑:
这个问题背后的动机是了解 libc++ 和 libstdc++ 之间的差异,这会导致 llvm 的 orcjit 中出现这个特定的错误消息(在 Linux 上)。
在 OSX 上 gcc 已被弃用,默认情况下使用 clang libc++
。要在 OSX 上重现此错误,您可能必须安装 gcc 并使用-stdlib=libstdc++
.
这是llvm-ir(不幸的是,直接在这里嵌入它太大了)