gpt4 book ai didi

c++ - lli: LLVM 错误: 无法选择: X86ISD::WrapperRIP TargetGlobalTLSAddress:i64

转载 作者:可可西里 更新时间:2023-11-01 16:17:09 26 4
gpt4 key购买 nike

在 Linux(Debian) 上使用 clang++ -S -emit-llvm main.cpp && lli main.ll 运行以下代码

#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_

问题:

这是什么意思?

是否有任何编译器标志可以解决此问题?

使用-stdlib=libc++编译运行成功*; libstdc++ 使用哪些特定功能会导致此问题?

编辑:

这个问题背后的动机是了解 libc++ 和 libstdc++ 之间的差异,这些差异导致 llvm 的 orcjit 中出现此特定错误消息(在 Linux 上)。

在 OSX 上,gcc 已被弃用,clang 默认使用 libc++。要在 OSX 上重现此错误,您可能必须安装 gcc 并使用 -stdlib=libstdc++

这是 llvm-ir (不幸的是直接嵌入这里太大了)

最佳答案

编辑:

错误原来是由于 JITer 中缺少 TLS 支持引起的。这个答案描述了另一个与链接和 lli 有关的问题。


如果您查看 clang++ -std=c++11 -S -emit-llvm test.cpp 生成的 IR,您会发现许多符号,例如_ZNSt6futureIiE3getEv,仅声明,但从未定义。永远不会调用链接器,因为 -S“仅运行 [s] 预处理和编译步骤”(clang --help)。

lli 只执行 IR 模块,没有“隐式”链接,它怎么知道要链接到哪些库?

根据您使用 lli 的原因,有不同的解决方案:

我只能猜测为什么 libc++ 对你有效,因为它在我的机器上失败了,但大概是这种情况,因为它已经加载到 lli 并且 lli 调用 sys::DynamicLibrary::LoadLibraryPermanently(nullptr) 将程序的符号添加到其 JIT 搜索空间(s. https://github.com/llvm-mirror/llvm/blob/release_40/tools/lli/OrcLazyJIT.cpp#L110 )。

关于c++ - lli: LLVM 错误: 无法选择: X86ISD::WrapperRIP TargetGlobalTLSAddress:i64,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42022864/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com