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 +}