- android - RelativeLayout 背景可绘制重叠内容
- android - 如何链接 cpufeatures lib 以获取 native android 库?
- java - OnItemClickListener 不起作用,但 OnLongItemClickListener 在自定义 ListView 中起作用
- java - Android 文件转字符串
在 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 的原因,有不同的解决方案:
llc main.cpp && clang++ -lpthread main.s
(需要 pthread s. What is the correct link options to use std::thread in GCC under linux?)lli
LD_PRELOAD="x.so y.so"
强制加载库
LoadLibraryPermanently(nullptr)
(将程序的符号添加到搜索空间)和 LoadLibraryPermanently(file, err)
用于其他库(s . http://llvm.org/docs/doxygen/html/classllvm_1_1sys_1_1DynamicLibrary.html )我只能猜测为什么 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/
如何重定向 lli 输出(fprintf、cout)以将其作为变量获取或执行我的回调? 我已经查看了 /tools/lli/lli.cpp 并且据我所知代码由 ExecutionEngine 执行,而
我正在尝试使用 lli 来解释/JIT 编译位代码文件 a.bc,该文件使用共享对象 afl-llvm 中定义的函数-rt.so。当我尝试像这样使用 lli 时 lli -dlopen ./afl-l
我想使用 lli 3.4 计算在任何程序中动态执行的 LLVM 指令的数量。 我查了 this链接,但它没有提供任何与指令计数相关的信息。 最佳答案 在 LLVM 中没有内置的方法来做到这一点,AFA
我将 32 位 ARM 代码移植到 64 位 x86 并遇到以下错误: format '%lli' expects argument of type 'long long int', but argu
我有以下 rust 代码。 $ cat hello.rs fn main() { println!("Hello world!"); } $ rustc hello.rs; ./hello Hel
我正在尝试使用 LLVM/clang 的一个非常简单的示例,但似乎失败了。 我尝试以下操作: clang++ -emit-llvm -c -x c++ -o main.bc -isystem incl
我使用polybench内核。在polybench.c中,代码有一行如下: int ret = posix_memalign (&new, 32, num); 这一行给 lli 解释器带来了问题。
我有一个多文件 C++ 项目,是在 Makefile 的帮助下构建的。 CC和CXX相对于gcc和g++。现在我需要在 llvm (lli) 下尝试这个项目。我已经更换了 CC = gcc CXX =
这个问题已经有答案了: What is the difference between conversion specifiers %i and %d in formatted IO functions
我正在尝试学习一些关于 LLVM IR 的知识,尤其是 rustc 输出的内容。即使是一个非常简单的案例,我也遇到了一些麻烦。 我将以下内容放入源文件 simple.rs: fn main() {
在 ubuntu-14.10_amd64 中,我通过 clang/llvm-3.4 编译了 smplayer-14.9.0.6690。我更改了 src 中的 Makefile,例如: CC=clang
在 Linux(Debian) 上使用 clang++ -S -emit-llvm main.cpp && lli main.ll 运行以下代码 #include int main () { r
如何使用 itext 获取单词在 pdf 中的 llx、lly、urx、ury 位置。这里的要求是在pdf中需要在word上面加上数字签名。这个词不是一个固定的位置,这个词可能出现在第一页或第二页或同
我想在 llvm 的 IR 解释器 lli 中运行 RxCpp 示例。 不幸的是,在 lli 中运行任何 RxCpp 示例都失败了: git clone https://github.com/Reac
我是一名优秀的程序员,十分优秀!