Следующий код в настоящее время не работает в lli:
//main.cpp
extern thread_local int tls;
int main() {
tls = 42;
return 0;
}
//clang++ -S -emit-llvm main.cpp && lli main.ll
LLVM-л:
; 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()
Есть ли способ эмулировать TLS и преобразовать llvm-ir, чтобы сделать эту работу?
Можно ли использовать глобальную карту от thread_id для указателей и заменить каждое возникновение локально-потокового на allocator/deallocator/getter/setter?
Используются ли -femulated-tls
и -ftls-model
?