paulkirth created this revision.
paulkirth added reviewers: arichardson, hiraditya, jrtc27, phosek.
Herald added subscribers: luismarques, s.egerton, PkmX, simoncook.
Herald added a project: All.
paulkirth requested review of this revision.
Herald added subscribers: cfe-commits, pcwang-thead, MaskRay.
Herald added a project: clang.

LLVM does not support Emulated TLS for some architectures, like RISCV.
This patch issues an error during options parsing to avoid potential
problems during codegen.

Bug: https://github.com/llvm/llvm-project/issues/59500

Depends on D143619 <https://reviews.llvm.org/D143619>


Repository:
  rG LLVM Github Monorepo

https://reviews.llvm.org/D143692

Files:
  clang/lib/Driver/ToolChains/Clang.cpp
  clang/test/Driver/emulated-tls.cpp


Index: clang/test/Driver/emulated-tls.cpp
===================================================================
--- clang/test/Driver/emulated-tls.cpp
+++ clang/test/Driver/emulated-tls.cpp
@@ -28,6 +28,9 @@
 // RUN: | FileCheck -check-prefix=NOEMU %s
 // RUN: %clang -### -target i686-pc-openbsd %s -femulated-tls 
-fno-emulated-tls 2>&1 \
 // RUN: | FileCheck -check-prefix=NOEMU %s
+//
+// RUN: %clang -### -target riscv64-linux-android %s -fno-emulated-tls 
-femulated-tls 2>&1 \
+// RUN: | FileCheck -check-prefix=RISCV-ERROR %s
 
 
 // Default without -f[no-]emulated-tls, will be decided by the target triple.
@@ -40,3 +43,6 @@
 
 // NOEMU: "-cc1" {{.*}}"-fno-emulated-tls"
 // NOEMU-NOT: "-cc1" {{.*}}"-femulated-tls"
+
+// RISCV-ERROR:  unsupported option '-femulated-tls' for target 
'riscv64-unknown-linux-android'
+
Index: clang/lib/Driver/ToolChains/Clang.cpp
===================================================================
--- clang/lib/Driver/ToolChains/Clang.cpp
+++ clang/lib/Driver/ToolChains/Clang.cpp
@@ -6166,6 +6166,17 @@
   Args.AddLastArg(CmdArgs, options::OPT_fdigraphs, options::OPT_fno_digraphs);
   Args.AddLastArg(CmdArgs, options::OPT_femulated_tls,
                   options::OPT_fno_emulated_tls);
+
+  if (Arg *A = Args.getLastArg(options::OPT_femulated_tls)) {
+    // LLVM does not support Emulated TLS for some architectures, like RISCV
+    // So issue an error to avoid subtle problems in codegen.
+    // https://github.com/llvm/llvm-project/issues/59500
+    if (!Triple.supportsEmulatedTLS()) {
+      D.Diag(diag::err_drv_unsupported_opt_for_target)
+          << A->getAsString(Args) << TripleStr;
+    }
+  }
+
   Args.AddLastArg(CmdArgs, options::OPT_fzero_call_used_regs_EQ);
 
   if (Arg *A = Args.getLastArg(options::OPT_fzero_call_used_regs_EQ)) {


Index: clang/test/Driver/emulated-tls.cpp
===================================================================
--- clang/test/Driver/emulated-tls.cpp
+++ clang/test/Driver/emulated-tls.cpp
@@ -28,6 +28,9 @@
 // RUN: | FileCheck -check-prefix=NOEMU %s
 // RUN: %clang -### -target i686-pc-openbsd %s -femulated-tls -fno-emulated-tls 2>&1 \
 // RUN: | FileCheck -check-prefix=NOEMU %s
+//
+// RUN: %clang -### -target riscv64-linux-android %s -fno-emulated-tls -femulated-tls 2>&1 \
+// RUN: | FileCheck -check-prefix=RISCV-ERROR %s
 
 
 // Default without -f[no-]emulated-tls, will be decided by the target triple.
@@ -40,3 +43,6 @@
 
 // NOEMU: "-cc1" {{.*}}"-fno-emulated-tls"
 // NOEMU-NOT: "-cc1" {{.*}}"-femulated-tls"
+
+// RISCV-ERROR:  unsupported option '-femulated-tls' for target 'riscv64-unknown-linux-android'
+
Index: clang/lib/Driver/ToolChains/Clang.cpp
===================================================================
--- clang/lib/Driver/ToolChains/Clang.cpp
+++ clang/lib/Driver/ToolChains/Clang.cpp
@@ -6166,6 +6166,17 @@
   Args.AddLastArg(CmdArgs, options::OPT_fdigraphs, options::OPT_fno_digraphs);
   Args.AddLastArg(CmdArgs, options::OPT_femulated_tls,
                   options::OPT_fno_emulated_tls);
+
+  if (Arg *A = Args.getLastArg(options::OPT_femulated_tls)) {
+    // LLVM does not support Emulated TLS for some architectures, like RISCV
+    // So issue an error to avoid subtle problems in codegen.
+    // https://github.com/llvm/llvm-project/issues/59500
+    if (!Triple.supportsEmulatedTLS()) {
+      D.Diag(diag::err_drv_unsupported_opt_for_target)
+          << A->getAsString(Args) << TripleStr;
+    }
+  }
+
   Args.AddLastArg(CmdArgs, options::OPT_fzero_call_used_regs_EQ);
 
   if (Arg *A = Args.getLastArg(options::OPT_fzero_call_used_regs_EQ)) {
_______________________________________________
cfe-commits mailing list
cfe-commits@lists.llvm.org
https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits

Reply via email to