标签: lli

如何在llvm-ir中模拟thread_local?

以下代码目前在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)

c++ multithreading llvm llvm-ir lli

25
推荐指数
1
解决办法
761
查看次数

在LLVM中命名错误混淆

我一直在尝试构建和执行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)

c++ llvm llvm-ir lli

15
推荐指数
1
解决办法
1877
查看次数

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

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(遗憾的是直接将它嵌入到这里)

c++ g++ clang llvm-ir lli

10
推荐指数
1
解决办法
321
查看次数

llvm错误:搬迁尚未实施!在orcjit或lli中运行RxCpp时

我想在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)

c++ llvm clang rxcpp lli

7
推荐指数
1
解决办法
278
查看次数

当使用lli运行时,rustc生成的LLVM会给出关于main的参数类型的错误

我正在尝试学习一些关于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)

llvm rust lli

5
推荐指数
1
解决办法
168
查看次数

如何使用共享库运行LLVM解释器?

我有mylib.c一些有一些功能的文件.我想.c在编译的llvm代码中使用我的文件中的那些函数作为外部函数.我正在玩LLVM解释器(lli-4.0),我想知道如何lli使用我的.c文件中的函数?

llvm dynamic-linking lli

3
推荐指数
1
解决办法
453
查看次数

标签 统计

lli ×6

llvm ×5

c++ ×4

llvm-ir ×3

clang ×2

dynamic-linking ×1

g++ ×1

multithreading ×1

rust ×1

rxcpp ×1