This patch disables frame pointer elimination and leaf frame pointer 
elimination when mcount instrumentation is requested ("-pg").

Currently we catch the case when -fomit-frame-pointer and -pg are explicitly 
used together, but we miss: 
 * Explicit use of -momit-leaf-frame-pointer.
 * Defaults enabling mentioned optimizations on given optimization level or 
triple.

This also emits unused argument warnings when -fno-omit-frame-pointer or 
-mno-omit-leaf-frame-pointer are combined with -pg. It can be changed very 
simply, but I am not sure if this is desirable or not?

clang -fno-omit-frame-pointer -mno-omit-leaf-frame-pointer -pg
clang: warning: argument unused during compilation: '-fno-omit-frame-pointer'
clang: warning: argument unused during compilation: 
'-mno-omit-leaf-frame-pointer'

http://reviews.llvm.org/D6370

Files:
  lib/Driver/Tools.cpp
  test/Driver/frame-pointer-elim.c
Index: lib/Driver/Tools.cpp
===================================================================
--- lib/Driver/Tools.cpp
+++ lib/Driver/Tools.cpp
@@ -2339,6 +2339,8 @@
 
 static bool shouldUseFramePointer(const ArgList &Args,
                                   const llvm::Triple &Triple) {
+  if (Args.hasArg(options::OPT_pg))
+    return true;
   if (Arg *A = Args.getLastArg(options::OPT_fno_omit_frame_pointer,
                                options::OPT_fomit_frame_pointer))
     return A->getOption().matches(options::OPT_fno_omit_frame_pointer);
@@ -2348,6 +2350,8 @@
 
 static bool shouldUseLeafFramePointer(const ArgList &Args,
                                       const llvm::Triple &Triple) {
+  if (Args.hasArg(options::OPT_pg))
+    return true;
   if (Arg *A = Args.getLastArg(options::OPT_mno_omit_leaf_frame_pointer,
                                options::OPT_momit_leaf_frame_pointer))
     return A->getOption().matches(options::OPT_mno_omit_leaf_frame_pointer);
@@ -4512,9 +4516,10 @@
     SplitDebugInfo(getToolChain(), C, *this, JA, Args, Output, SplitDwarfOut);
 
   if (Arg *A = Args.getLastArg(options::OPT_pg))
-    if (Args.hasArg(options::OPT_fomit_frame_pointer))
+    if (Arg *Conflict = Args.getLastArg(options::OPT_fomit_frame_pointer,
+                                        options::OPT_momit_leaf_frame_pointer))
       D.Diag(diag::err_drv_argument_not_allowed_with)
-        << "-fomit-frame-pointer" << A->getAsString(Args);
+          << Conflict->getAsString(Args) << A->getAsString(Args);
 
   // Claim some arguments which clang supports automatically.
 
Index: test/Driver/frame-pointer-elim.c
===================================================================
--- test/Driver/frame-pointer-elim.c
+++ test/Driver/frame-pointer-elim.c
@@ -26,5 +26,21 @@
 // RUN:   FileCheck --check-prefix=OMIT_LEAF %s
 // OMIT_LEAF: "-momit-leaf-frame-pointer"
 
+// Disable frame-pointer elimination when -pg is used.
+// RUN: %clang -### -target i386-pc-linux-gnu -S -O2 -pg %s 2>&1 | \
+// RUN:   FileCheck --check-prefix=PG %s
+// RUN: %clang -### -target x86-64-pc-linux-gnu -S -O2 -pg %s 2>&1 | \
+// RUN:   FileCheck --check-prefix=PG %s
+// PG-NOT: "-momit-leaf-frame-pointer"
+// PG:     "-mdisable-fp-elim"
+
+// RUN: %clang -### -target i386-pc-linux-gnu -S -fomit-frame-pointer -pg %s 2>&1 | \
+// RUN:   FileCheck --check-prefix=FOMIT-FRAME-POINTER-PG %s
+// FOMIT-FRAME-POINTER-PG: '-fomit-frame-pointer' not allowed with '-pg'
+
+// RUN: %clang -### -target i386-pc-linux-gnu -S -momit-leaf-frame-pointer -pg %s 2>&1 | \
+// RUN:   FileCheck --check-prefix=MOMIT-LEAF-FRAME-POINTER-PG %s
+// MOMIT-LEAF-FRAME-POINTER-PG: '-momit-leaf-frame-pointer' not allowed with '-pg'
+
 void f0() {}
 void f1() { f0(); }
_______________________________________________
cfe-commits mailing list
[email protected]
http://lists.cs.uiuc.edu/mailman/listinfo/cfe-commits

Reply via email to