以下代码目前在lli中不起作用:
//main.cpp
extern thread_local int tls;
int main() {
tls = 42;
return 0;
}
//clang++ -S -emit-llvm main.cpp && lli main.ll
Run Code Online (Sandbox Code Playgroud)
LLVM-IR:
; ModuleID = 'main.cpp'
target datalayout = "e-m:e-i64:64-f80:128-n8:16:32:64-S128"
target triple = "x86_64-pc-linux-gnu"
@tls = external thread_local global i32, align 4
; Function Attrs: norecurse uwtable
define i32 @main() #0 {
%1 = alloca i32, align 4
store i32 0, i32* %1, align 4
%2 = call i32* @_ZTW3tls()
store i32 42, i32* %2, align 4
ret i32 …Run Code Online (Sandbox Code Playgroud) 我一直在尝试构建和执行LLVM模块.我生成模块的代码很长,所以我不会在这里发布.相反,我的问题是Clang和LLVM如何协同工作来实现名称修改.我会解释我的具体问题来激发这个问题.
以下是我的一个LLVM模块的源代码:
#include <iostream>
int main() {
std::cout << "Hello, world. " << std::endl;
return 0;
}
Run Code Online (Sandbox Code Playgroud)
这是生成的LLVM IR ; 它对于StackOverflow来说太大了.
当我尝试使用我的模块时lli,我收到以下错误:
LLVM错误:程序使用了无法解析的外部函数'__ZNSt3__112basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEEC1Emc'!
通过demangler运行符号,缺少的符号是:
_std :: __ 1 :: basic_string,std :: __ 1 :: allocator> :: basic_string(unsigned long,char)
额外_是可疑的,没有前导下划线的功能似乎存在于IR中!
; Function Attrs: alwaysinline ssp uwtable
define available_externally hidden void @_ZNSt3__112basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEEC1Emc(%"class.std::__1::basic_string"*, i64, i8 signext) unnamed_addr #2 align 2 {
%4 = alloca %"class.std::__1::basic_string"*, align 8
%5 = alloca i64, align 8
%6 = alloca i8, align 1 …Run Code Online (Sandbox Code Playgroud) clang++ -S -emit-llvm main.cpp && lli main.ll在Linux上运行以下代码(Debian)
#include <future>
int main () {
return std::async([]{return 1;}).get();
}
Run Code Online (Sandbox Code Playgroud)
由于以下错误,无法在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_
Run Code Online (Sandbox Code Playgroud)
问题:
这是什么意思?
是否有任何编译器标志可以解决此问题?
使用-stdlib=libc++编译并成功运行*; libstdc ++使用哪些特定功能会导致此问题?
编辑:
这个问题背后的动机是理解libc ++和libstdc ++之间的差异,这些差异导致llvm的orcjit中的这个特定错误消息(在Linux上).
在OSX上,gcc已被弃用,默认情况下使用clang libc++.要在OSX上重现此错误,您可能需要安装gcc和use -stdlib=libstdc++.
这是llvm-ir(遗憾的是直接将它嵌入到这里)
我想在llvm的IR解释器中运行RxCpp示例lli.
不幸的是,在lli中运行任何RxCpp示例都失败了:
git clone https://github.com/Reactive-Extensions/RxCpp.git --depth 1
cd RxCpp/Rx/v2/examples/pythogerian
clang++ -S -emit-llvm -fno-use-cxa-exit -I../../src main.cpp
lli main.ll
Run Code Online (Sandbox Code Playgroud)
错误信息:
Relocation type not implemented yet!
UNREACHABLE executed at llvm/lib/ExecutionEngine/RuntimeDyld/RuntimeDyldELF.cpp:232!
Run Code Online (Sandbox Code Playgroud)
问题:
这个错误究竟意味着什么? - llvm的orc-jit中哪些假设不满足?
有解决方法吗? - 我可以应用任何LLVM-IR转换来实现这项工作(例如通过编译器标志)吗?
RxCpp使用哪些特殊功能会导致llvm的orcjit出现此问题?
测试:
clang version 5.0.0 (https://github.com/llvm-mirror/clang.git 6c9e299494de2a5b0425e46bc937f29a05128252)
clang version 4.0.0-+rc1-1 (tags/RELEASE_400/rc1)
clang version 3.9.0-1 (tags/RELEASE_390/final)
clang version 3.8.1-12 (tags/RELEASE_381/final)
Target: x86_64-pc-linux-gnu
Thread model: posix
InstalledDir: /usr/bin
Run Code Online (Sandbox Code Playgroud) 我正在尝试学习一些关于LLVM IR的知识,特别是什么是rustc输出.即使是一个非常简单的案例,我也遇到了一些麻烦.
我将以下内容放在源文件中simple.rs:
fn main() {
let x = 7u32;
let y = x + 2;
}
Run Code Online (Sandbox Code Playgroud)
并运行rustc --emit llvm-ir simple.rs以获取simple.ll包含的文件
; ModuleID = 'simple.cgu-0.rs'
source_filename = "simple.cgu-0.rs"
target datalayout = "e-m:e-i64:64-f80:128-n8:16:32:64-S128"
target triple = "x86_64-unknown-linux-gnu"
; Function Attrs: uwtable
define internal void @_ZN6simple4main17h8ac50d7470339b75E() unnamed_addr #0 {
start:
br label %bb1
bb1: ; preds = %start
ret void
}
define i64 @main(i64, i8**) unnamed_addr {
top:
%2 = call i64 @_ZN3std2rt10lang_start17ha09816a4e25587eaE(void ()* @_ZN6simple4main17h8ac50d7470339b75E, i64 …Run Code Online (Sandbox Code Playgroud) 我有mylib.c一些有一些功能的文件.我想.c在编译的llvm代码中使用我的文件中的那些函数作为外部函数.我正在玩LLVM解释器(lli-4.0),我想知道如何lli使用我的.c文件中的函数?