[PATCH] D141183: [LoongArch] Add support for emulated TLS model

wanglei via Phabricator via llvm-commits llvm-commits at lists.llvm.org
Fri Jan 6 23:34:39 PST 2023


wangleiat created this revision.
wangleiat added reviewers: SixWeining, xen0n, xry111, MaskRay.
Herald added subscribers: StephenFan, hiraditya.
Herald added a project: All.
wangleiat requested review of this revision.
Herald added a project: LLVM.
Herald added a subscriber: llvm-commits.

This will ensure that the emulated TLS code should be generated when
`useEmulatedTLS()` is true.


Repository:
  rG LLVM Github Monorepo

https://reviews.llvm.org/D141183

Files:
  llvm/lib/Target/LoongArch/LoongArchISelLowering.cpp
  llvm/test/CodeGen/LoongArch/emutls_generic.ll


Index: llvm/test/CodeGen/LoongArch/emutls_generic.ll
===================================================================
--- /dev/null
+++ llvm/test/CodeGen/LoongArch/emutls_generic.ll
@@ -0,0 +1,43 @@
+; RUN: llc < %s --emulated-tls --mtriple=loongarch64 --relocation-model=pic \
+; RUN:     | FileCheck %s
+
+; RUN: llc < %s --mtriple=loongarch64 --relocation-model=pic \
+; RUN:     | FileCheck --check-prefix=NoEMU %s
+
+;; NoEMU-NOT: __emutls
+
+;; Make sure that TLS symbols are emitted in expected order.
+
+ at external_x = external thread_local global i32, align 8
+ at external_y = thread_local global i8 7, align 2
+ at internal_y = internal thread_local global i64 9, align 16
+
+define ptr @get_external_x() {
+; CHECK-LABEL: get_external_x:
+; CHECK-NOT:   _tls_get_address
+; CHECK:       __emutls_get_address
+entry:
+  ret ptr @external_x
+}
+
+define ptr @get_external_y() {
+; CHECK-LABEL: get_external_y:
+; CHECK:       __emutls_get_address
+; CHECK-NOT:   _tls_get_address
+entry:
+  ret ptr @external_y
+}
+
+define ptr @get_internal_y() {
+; CHECK-LABEL: get_internal_y:
+; CHECK-NOT:   __emutls_t.external_x:
+; CHECK-NOT:   __emutls_v.external_x:
+; CHECK-LABEL: __emutls_v.external_y:
+; CHECK-LABEL: __emutls_t.external_y:
+; CHECK:       __emutls_t.external_y
+; CHECK-LABEL: __emutls_v.internal_y:
+; CHECK-LABEL: __emutls_t.internal_y:
+; CHECK:       __emutls_t.internal_y
+entry:
+  ret ptr @internal_y
+}
Index: llvm/lib/Target/LoongArch/LoongArchISelLowering.cpp
===================================================================
--- llvm/lib/Target/LoongArch/LoongArchISelLowering.cpp
+++ llvm/lib/Target/LoongArch/LoongArchISelLowering.cpp
@@ -557,6 +557,9 @@
   GlobalAddressSDNode *N = cast<GlobalAddressSDNode>(Op);
   assert(N->getOffset() == 0 && "unexpected offset in global node");
 
+  if (DAG.getTarget().useEmulatedTLS())
+    return LowerToTLSEmulatedModel(N, DAG);
+
   SDValue Addr;
   switch (getTargetMachine().getTLSModel(N->getGlobal())) {
   case TLSModel::GeneralDynamic:


-------------- next part --------------
A non-text attachment was scrubbed...
Name: D141183.487057.patch
Type: text/x-patch
Size: 2020 bytes
Desc: not available
URL: <http://lists.llvm.org/pipermail/llvm-commits/attachments/20230107/4f64afab/attachment.bin>


More information about the llvm-commits mailing list