[clang] 527b0f8 - [Driver] Allow -mnop-mcount for SystemZ and -mfentry for X86 and SystemZ

Fangrui Song via cfe-commits cfe-commits at lists.llvm.org
Sun Dec 22 00:04:06 PST 2019


Author: Fangrui Song
Date: 2019-12-22T00:01:42-08:00
New Revision: 527b0f8c7448707aa6b8159e6e4707a49f1dcb87

URL: https://github.com/llvm/llvm-project/commit/527b0f8c7448707aa6b8159e6e4707a49f1dcb87
DIFF: https://github.com/llvm/llvm-project/commit/527b0f8c7448707aa6b8159e6e4707a49f1dcb87.diff

LOG: [Driver] Allow -mnop-mcount for SystemZ and -mfentry for X86 and SystemZ

gcc/config/{i386,s390} support -mnop-mcount. We currently only support
-mnop-mcount for SystemZ. The function attribute "mnop-mcount" is
ignored on other targets.

gcc/config/{i386,s390} support -mfentry. We currently only support
-mfentry for X86 and SystemZ. TargetOpcode::FENTRY_CALL is not handled
on other targets.

  % clang -target aarch64 -pg -mfentry a.c -c
  fatal error: error in backend: Not supported instr: <MCInst 21>

-mfentry, -mrecord-mcount, and -mnop-mcount were invented for Linux
ftrace. Linux uses $(call cc-option-yn,-mrecord-mcount) to detect if the
specific feature is available. Reject unsupported features so that Linux
build system will not wrongly consider them available and cause
build/runtime failures.

Note, GCC has stricter checks that we do not implement, e.g. -fpic/-fpie
-fnop-mcount is not allowed on x86, -fpic/-fpie -mfentry is not allowed
on x86-32.

Added: 
    clang/test/Driver/mfentry.c

Modified: 
    clang/lib/Driver/ToolChains/Clang.cpp
    clang/test/Driver/mcount.c

Removed: 
    


################################################################################
diff  --git a/clang/lib/Driver/ToolChains/Clang.cpp b/clang/lib/Driver/ToolChains/Clang.cpp
index 03100948f568..1b8eca0ea0d7 100644
--- a/clang/lib/Driver/ToolChains/Clang.cpp
+++ b/clang/lib/Driver/ToolChains/Clang.cpp
@@ -4986,18 +4986,27 @@ void Clang::ConstructJob(Compilation &C, const JobAction &JA,
   const XRayArgs &XRay = TC.getXRayArgs();
   XRay.addArgs(TC, Args, CmdArgs, InputType);
 
-  if (TC.SupportsProfiling())
+  if (TC.SupportsProfiling()) {
     Args.AddLastArg(CmdArgs, options::OPT_pg);
 
-  if (TC.SupportsProfiling())
-    Args.AddLastArg(CmdArgs, options::OPT_mfentry);
-
-  if (TC.SupportsProfiling())
-    Args.AddLastArg(CmdArgs, options::OPT_mnop_mcount);
-
-  if (TC.SupportsProfiling()) {
+    llvm::Triple::ArchType Arch = TC.getArch();
+    if (Arg *A = Args.getLastArg(options::OPT_mfentry)) {
+      if (Arch == llvm::Triple::systemz || Arch == llvm::Triple::x86 ||
+          Arch == llvm::Triple::x86_64)
+        A->render(Args, CmdArgs);
+      else
+        D.Diag(diag::err_drv_unsupported_opt_for_target)
+            << A->getAsString(Args) << TripleStr;
+    }
+    if (Arg *A = Args.getLastArg(options::OPT_mnop_mcount)) {
+      if (Arch == llvm::Triple::systemz)
+        A->render(Args, CmdArgs);
+      else
+        D.Diag(diag::err_drv_unsupported_opt_for_target)
+            << A->getAsString(Args) << TripleStr;
+    }
     if (Arg *A = Args.getLastArg(options::OPT_mrecord_mcount)) {
-      if (TC.getArch() == llvm::Triple::systemz)
+      if (Arch == llvm::Triple::systemz)
         A->render(Args, CmdArgs);
       else
         D.Diag(diag::err_drv_unsupported_opt_for_target)

diff  --git a/clang/test/Driver/mcount.c b/clang/test/Driver/mcount.c
index 7086abfc74b7..a89150cb263c 100644
--- a/clang/test/Driver/mcount.c
+++ b/clang/test/Driver/mcount.c
@@ -1,8 +1,12 @@
-// RUN: %clang -target s390x -c -### %s -mrecord-mcount 2>&1 | FileCheck %s
+// RUN: %clang -target s390x -c -### %s -mnop-mcount -mrecord-mcount 2>&1 | FileCheck %s
+
+// CHECK: "-mnop-mcount"
 // CHECK: "-mrecord-mcount"
 
-// RUN: %clang -target x86_64 -c -### %s -mrecord-mcount 2>&1 | FileCheck --check-prefix=ERR1 %s
-// RUN: %clang -target aarch64 -c -### %s -mrecord-mcount 2>&1 | FileCheck --check-prefix=ERR2 %s
+// RUN: %clang -target x86_64 -c -### %s -mnop-mcount -mrecord-mcount 2>&1 | FileCheck --check-prefix=ERR1 %s
+// RUN: %clang -target aarch64 -c -### %s -mnop-mcount -mrecord-mcount 2>&1 | FileCheck --check-prefix=ERR2 %s
 
+// ERR1: error: unsupported option '-mnop-mcount' for target 'x86_64'
 // ERR1: error: unsupported option '-mrecord-mcount' for target 'x86_64'
+// ERR2: error: unsupported option '-mnop-mcount' for target 'aarch64'
 // ERR2: error: unsupported option '-mrecord-mcount' for target 'aarch64'

diff  --git a/clang/test/Driver/mfentry.c b/clang/test/Driver/mfentry.c
new file mode 100644
index 000000000000..ee402ea1b73d
--- /dev/null
+++ b/clang/test/Driver/mfentry.c
@@ -0,0 +1,9 @@
+// RUN: %clang -target s390x -c -### %s -mfentry 2>&1 | FileCheck %s
+// RUN: %clang -target i386 -c -### %s -mfentry 2>&1 | FileCheck %s
+// RUN: %clang -target x86_64 -c -### %s -mfentry 2>&1 | FileCheck %s
+
+// CHECK: "-mfentry"
+
+// RUN: %clang -target powerpc64le -c -### %s -mfentry 2>&1 | FileCheck --check-prefix=ERR %s
+
+// ERR: error: unsupported option '-mfentry' for target 'powerpc64le'


        


More information about the cfe-commits mailing list