[llvm] [TargetLowering] Fix the problem of emulated-TLS implementation witho… (PR #101490)
via llvm-commits
llvm-commits at lists.llvm.org
Thu Aug 1 07:21:59 PDT 2024
https://github.com/cceerczw created https://github.com/llvm/llvm-project/pull/101490
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.
>From ea72068b8472b39b093452a0c8088af198abe949 Mon Sep 17 00:00:00 2001
From: chengzhiwei <chengzhiwei6 at huawei.com>
Date: Thu, 18 Jul 2024 15:03:35 +0800
Subject: [PATCH] [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.
---
.../CodeGen/SelectionDAG/TargetLowering.cpp | 6 ++++--
llvm/test/CodeGen/AArch64/emutls_alias.ll | 20 +++++++++++++++++++
2 files changed, 24 insertions(+), 2 deletions(-)
create mode 100644 llvm/test/CodeGen/AArch64/emutls_alias.ll
diff --git a/llvm/lib/CodeGen/SelectionDAG/TargetLowering.cpp b/llvm/lib/CodeGen/SelectionDAG/TargetLowering.cpp
index 6fd23b5ab9f5f..e61f05445030d 100644
--- a/llvm/lib/CodeGen/SelectionDAG/TargetLowering.cpp
+++ b/llvm/lib/CodeGen/SelectionDAG/TargetLowering.cpp
@@ -10225,8 +10225,10 @@ SDValue TargetLowering::LowerToTLSEmulatedModel(const GlobalAddressSDNode *GA,
ArgListTy Args;
ArgListEntry Entry;
- std::string NameString = ("__emutls_v." + GA->getGlobal()->getName()).str();
- Module *VariableModule = const_cast<Module*>(GA->getGlobal()->getParent());
+ const GlobalValue *GV = GA->getGlobal();
+ GV = GV->getAliaseeObject() ? GV->getAliaseeObject() : GV;
+ std::string NameString = ("__emutls_v." + GV->getName()).str();
+ Module *VariableModule = const_cast<Module*>(GV->getParent());
StringRef EmuTlsVarName(NameString);
GlobalVariable *EmuTlsVar = VariableModule->getNamedGlobal(EmuTlsVarName);
assert(EmuTlsVar && "Cannot find EmuTlsVar ");
diff --git a/llvm/test/CodeGen/AArch64/emutls_alias.ll b/llvm/test/CodeGen/AArch64/emutls_alias.ll
new file mode 100644
index 0000000000000..78a08fe454dd9
--- /dev/null
+++ b/llvm/test/CodeGen/AArch64/emutls_alias.ll
@@ -0,0 +1,20 @@
+; RUN: llc < %s -emulated-tls -mtriple=aarch64-linux-ohos -O0 \
+; RUN: | FileCheck -check-prefix=EMUTLS_CHECK %s
+
+%struct.__res_state = type { [5 x i8] }
+
+ at foo = dso_local thread_local global %struct.__res_state { [5 x i8] c"\01\02\03\04\05" }, align 1
+
+ at bar = hidden thread_local(initialexec) alias %struct.__res_state, ptr @foo
+
+; Function Attrs: noinline nounwind optnone uwtable
+define dso_local i32 @main() #0 {
+ %1 = alloca i32, align 4
+ store i32 0, ptr %1, align 4
+ store i8 0, ptr @bar, align 1
+ ; EMUTLS_CHECK: adrp x0, __emutls_v.foo
+ ; EMUTLS_CHECK-NEXT: add x0, x0, :lo12:__emutls_v.foo
+ ret i32 0
+}
+
+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" }
More information about the llvm-commits
mailing list