Skip to content

Commit ea72068

Browse files
committed
[TargetLowering] Fix the problem of emulated-TLS implementation without checking alias of current global value at first.
For a __thread variable x, when emulated TLS is enabled and there is an access to x, the compiler first looks up the symbol __emutls_v.x within the module. However, the issue arises with an alias y of x, the compiler still tries to look up __emutls_v.y instead of __emutls_v.x. As a result, the lookup returns a nullptr, causing the compiler to crash. The purpose of this MR (Merge Request) is to ensure that in emulated TLS, before checking __emutls_v.y, the compiler first identifies which global value y is an alias of.
1 parent 26ca782 commit ea72068

File tree

2 files changed

+24
-2
lines changed

2 files changed

+24
-2
lines changed

llvm/lib/CodeGen/SelectionDAG/TargetLowering.cpp

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -10225,8 +10225,10 @@ SDValue TargetLowering::LowerToTLSEmulatedModel(const GlobalAddressSDNode *GA,
1022510225

1022610226
ArgListTy Args;
1022710227
ArgListEntry Entry;
10228-
std::string NameString = ("__emutls_v." + GA->getGlobal()->getName()).str();
10229-
Module *VariableModule = const_cast<Module*>(GA->getGlobal()->getParent());
10228+
const GlobalValue *GV = GA->getGlobal();
10229+
GV = GV->getAliaseeObject() ? GV->getAliaseeObject() : GV;
10230+
std::string NameString = ("__emutls_v." + GV->getName()).str();
10231+
Module *VariableModule = const_cast<Module*>(GV->getParent());
1023010232
StringRef EmuTlsVarName(NameString);
1023110233
GlobalVariable *EmuTlsVar = VariableModule->getNamedGlobal(EmuTlsVarName);
1023210234
assert(EmuTlsVar && "Cannot find EmuTlsVar ");
Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,20 @@
1+
; RUN: llc < %s -emulated-tls -mtriple=aarch64-linux-ohos -O0 \
2+
; RUN: | FileCheck -check-prefix=EMUTLS_CHECK %s
3+
4+
%struct.__res_state = type { [5 x i8] }
5+
6+
@foo = dso_local thread_local global %struct.__res_state { [5 x i8] c"\01\02\03\04\05" }, align 1
7+
8+
@bar = hidden thread_local(initialexec) alias %struct.__res_state, ptr @foo
9+
10+
; Function Attrs: noinline nounwind optnone uwtable
11+
define dso_local i32 @main() #0 {
12+
%1 = alloca i32, align 4
13+
store i32 0, ptr %1, align 4
14+
store i8 0, ptr @bar, align 1
15+
; EMUTLS_CHECK: adrp x0, __emutls_v.foo
16+
; EMUTLS_CHECK-NEXT: add x0, x0, :lo12:__emutls_v.foo
17+
ret i32 0
18+
}
19+
20+
attributes #0 = { noinline nounwind optnone uwtable "frame-pointer"="non-leaf" "min-legal-vector-width"="0" "no-trapping-math"="true" "stack-protector-buffer-size"="8" "target-cpu"="generic" "target-features"="+neon,+v8a" }

0 commit comments

Comments
 (0)