From 6f8e8faa12daaf4dfd80039ccdeccda68e99850b Mon Sep 17 00:00:00 2001 From: cceerczw Date: Thu, 8 Aug 2024 01:56:48 +0800 Subject: [PATCH] =?UTF-8?q?[TargetLowering]=20Fix=20the=20problem=20of=20e?= =?UTF-8?q?mulated-TLS=20implementation=20witho=E2=80=A6=20(#101490)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 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. --- .../lib/CodeGen/SelectionDAG/TargetLowering.cpp | 9 ++++++--- llvm/test/CodeGen/AArch64/emutls_alias.ll | 17 +++++++++++++++++ 2 files changed, 23 insertions(+), 3 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 7fa83a5999df..e269ca83fab7 100644 --- a/llvm/lib/CodeGen/SelectionDAG/TargetLowering.cpp +++ b/llvm/lib/CodeGen/SelectionDAG/TargetLowering.cpp @@ -10245,10 +10245,13 @@ SDValue TargetLowering::LowerToTLSEmulatedModel(const GlobalAddressSDNode *GA, ArgListTy Args; ArgListEntry Entry; - std::string NameString = ("__emutls_v." + GA->getGlobal()->getName()).str(); - Module *VariableModule = const_cast(GA->getGlobal()->getParent()); + const GlobalValue *GV = + cast(GA->getGlobal()->stripPointerCastsAndAliases()); + SmallString<32> NameString("__emutls_v."); + NameString += GV->getName(); StringRef EmuTlsVarName(NameString); - GlobalVariable *EmuTlsVar = VariableModule->getNamedGlobal(EmuTlsVarName); + const GlobalVariable *EmuTlsVar = + GV->getParent()->getNamedGlobal(EmuTlsVarName); assert(EmuTlsVar && "Cannot find EmuTlsVar "); Entry.Node = DAG.getGlobalAddress(EmuTlsVar, dl, PtrVT); Entry.Ty = VoidPtrType; diff --git a/llvm/test/CodeGen/AArch64/emutls_alias.ll b/llvm/test/CodeGen/AArch64/emutls_alias.ll new file mode 100644 index 000000000000..4a157d8d03e7 --- /dev/null +++ b/llvm/test/CodeGen/AArch64/emutls_alias.ll @@ -0,0 +1,17 @@ +; RUN: llc < %s -emulated-tls -mtriple=aarch64-linux-ohos \ +; RUN: | FileCheck -check-prefix=EMUTLS_CHECK %s + +%struct.__res_state = type { [5 x i8] } + +@foo = dso_local thread_local global %struct.__res_state { [5 x i8] c"\01\02\03\04\05" }, align 1 + +@bar = hidden thread_local(initialexec) alias %struct.__res_state, ptr @foo + +define dso_local i32 @main() { + %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 +}