首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何在llvm-ir中模拟thread_local?

如何在llvm-ir中模拟thread_local?
EN

Stack Overflow用户
提问于 2017-02-08 00:59:02
回答 1查看 1.2K关注 0票数 26

下面的代码目前在lli中不起作用:

代码语言:javascript
复制
//main.cpp 
extern thread_local int tls;
int main() {
    tls = 42;
    return 0;
}

//clang++ -S -emit-llvm main.cpp && lli main.ll

llvm-ir:

代码语言:javascript
复制
; 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 0
}

define weak_odr hidden i32* @_ZTW3tls() {
  br i1 icmp ne (void ()* @_ZTH3tls, void ()* null), label %1, label %2

; <label>:1                                       ; preds = %0
  call void @_ZTH3tls()
  br label %2

; <label>:2                                       ; preds = %1, %0
  ret i32* @tls
}

declare extern_weak void @_ZTH3tls()

它会导致以下错误:

代码语言:javascript
复制
LLVM ERROR: Cannot select: 0x55ec0e9c3a60: i64 = X86ISD::WrapperRIP 
TargetGlobalTLSAddress:i64<i32* @tls> 0 [TF=10]
   0x55ec0e9c3858: i64 = TargetGlobalTLSAddress<i32* @tls> 0 [TF=10]
In function: _ZTW3tls

有没有一种方法可以模拟TLS并转换llvm-ir来使其工作?

使用从thread_id到指针的全局映射,并用分配器/解除分配器/getter/setter替换所有出现的线程本地,这是否可行?

-femulated-tls-ftls-model有什么用吗?

相关问题:

how to perform TargetLowering in a IR-trasformation pass?

http://lists.llvm.org/pipermail/llvm-dev/2017-February/109947.html

EN

回答 1

Stack Overflow用户

发布于 2018-04-22 00:14:36

既然你还没有说出你看到的错误是什么,我假设它是某种形式的LLVM ERROR: Program used external function '_ZTH3tls' which could not be resolved!

这是一个链接错误,它实际上是指这样一个事实,即tls被声明为具有外部链接,但是没有另一个定义可以链接(至少您已经发布了)。

替换

代码语言:javascript
复制
extern thread_local int tls;

使用

代码语言:javascript
复制
thread_local int tls;

然后,编译器将生成以下IR

代码语言:javascript
复制
@tls = thread_local global i32 0, align 4

如果您确实需要外部链接并使用lli,则需要首先使用llvm-link链接llvm文件,因为lli不具备自行链接的能力。

例如:

ext.cpp

代码语言:javascript
复制
thread_local int tls = 0;

main.cpp

代码语言:javascript
复制
extern thread_local int tls;
int main() {
  tls = 42;
  return 0;
}

编译此代码将生成ext.llmain.ll。运行llvm-link -S ext.ll main.ll > output.ll获取链接文件,然后lli output.ll也应该可以工作。

如果问题解决了,请告诉我。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/42095672

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档