[PATCH] D143619: [llvm][codegen] Disallow default Emulated TLS for RISCV

Paul Kirth via Phabricator via llvm-commits llvm-commits at lists.llvm.org
Thu Feb 9 16:30:40 PST 2023


paulkirth updated this revision to Diff 496280.
paulkirth marked an inline comment as done.
paulkirth added a comment.

git clang-format


Repository:
  rG LLVM Github Monorepo

CHANGES SINCE LAST ACTION
  https://reviews.llvm.org/D143619/new/

https://reviews.llvm.org/D143619

Files:
  llvm/include/llvm/TargetParser/Triple.h
  llvm/test/LTO/RISCV/riscv-no-emutls.ll


Index: llvm/test/LTO/RISCV/riscv-no-emutls.ll
===================================================================
--- /dev/null
+++ llvm/test/LTO/RISCV/riscv-no-emutls.ll
@@ -0,0 +1,39 @@
+; Ensure targets that normally enable emulated TLS by default, don't run the
+; LowerEmuTLSPass under LTO when targeting RISCV. Under LTO the backend options
+; for emulated TLS won't be propagated unless passed explicitly as part of the
+; linker invocation. Since LLVM doesn't support emulated TLS on RISCV, we want
+; to be sure related transforms don't take place.
+
+; RUN: opt < %s -o %t.bc --mtriple=riscv64-unknown-linux-android10000
+
+; RUN: llvm-lto2 run %t.bc -o %t.out.o  \
+; RUN:     -r=%t.bc,baz,pxl \
+; RUN:     -debug-pass=Structure 2>&1 | FileCheck %s --allow-empty
+; RUN: llvm-readelf -s %t.out.o.1 | FileCheck %s --check-prefix=NOUNDEF
+
+; Ensure the backend pass we want to avoid doesn't run: LowerEmuTLSPass
+; so we check for its output under pass structure
+; CHECK-NOT: Add __emutls_
+
+; Also check that we don't end up creating internal thread_locals that are
+; undefined in the final link. This used to happen because the LowerEmuTLSPass
+; would be added when targeting platforms with default emulated TLS.
+; NOUNDEF    : TLS     LOCAL  DEFAULT  {[0-9]+} Mem
+; NOUNDEF-NOT: TLS     GLOBAL DEFAULT  UND Mem
+
+target datalayout = "e-m:e-p:64:64-i64:64-i128:128-n32:64-S128"
+
+%struct.Memory = type { i32, i32 }
+
+ at Mem = internal thread_local global ptr null, align 8
+
+define void @baz(i32 noundef signext %n) {
+entry:
+  %loc = inttoptr i64 66 to ptr
+  %threadlocal = call align 8 ptr @llvm.threadlocal.address.p0(ptr align 8 @Mem)
+  store ptr %loc, ptr %threadlocal, align 8
+
+  ret void
+}
+
+declare nonnull ptr @llvm.threadlocal.address.p0(ptr nonnull)
Index: llvm/include/llvm/TargetParser/Triple.h
===================================================================
--- llvm/include/llvm/TargetParser/Triple.h
+++ llvm/include/llvm/TargetParser/Triple.h
@@ -950,9 +950,13 @@
              isOSBinFormatDXContainer());
   }
 
+  /// Tests whether the target supports emulated tls
+  bool supportsEmulatedTLS() const { return !isRISCV(); }
+
   /// Tests whether the target uses emulated TLS as default.
   bool hasDefaultEmulatedTLS() const {
-    return isAndroid() || isOSOpenBSD() || isWindowsCygwinEnvironment();
+    return supportsEmulatedTLS() &&
+           (isAndroid() || isOSOpenBSD() || isWindowsCygwinEnvironment());
   }
 
   /// Tests whether the target uses -data-sections as default.


-------------- next part --------------
A non-text attachment was scrubbed...
Name: D143619.496280.patch
Type: text/x-patch
Size: 2538 bytes
Desc: not available
URL: <http://lists.llvm.org/pipermail/llvm-commits/attachments/20230210/0c3da0c6/attachment-0001.bin>


More information about the llvm-commits mailing list