r178606 - From PR9121 gcc defaulted to omitting the frame pointer on linux,

Eric Christopher echristo at gmail.com
Tue Apr 2 18:58:53 PDT 2013


Author: echristo
Date: Tue Apr  2 20:58:53 2013
New Revision: 178606

URL: http://llvm.org/viewvc/llvm-project?rev=178606&view=rev
Log:
>From PR9121 gcc defaulted to omitting the frame pointer on linux,
however, it doesn't do that unless we're optimizing. Change
that and haul out to a helper function. Also make this a driver
test appropriate rather than an assembly test.

Modified:
    cfe/trunk/lib/Driver/Tools.cpp
    cfe/trunk/test/CodeGen/frame-pointer-elim.c

Modified: cfe/trunk/lib/Driver/Tools.cpp
URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Driver/Tools.cpp?rev=178606&r1=178605&r2=178606&view=diff
==============================================================================
--- cfe/trunk/lib/Driver/Tools.cpp (original)
+++ cfe/trunk/lib/Driver/Tools.cpp Tue Apr  2 20:58:53 2013
@@ -1743,6 +1743,24 @@ static bool shouldUseFramePointer(const
   return true;
 }
 
+static bool shouldUseLeafFramePointer(const ArgList &Args,
+                                      const llvm::Triple &Triple) {
+  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);
+
+  // Don't use a leaf frame pointer on linux x86 and x86_64 if optimizing.
+  if ((Triple.getArch() == llvm::Triple::x86_64 ||
+       Triple.getArch() == llvm::Triple::x86) &&
+      Triple.getOS() == llvm::Triple::Linux) {
+    if (Arg *A = Args.getLastArg(options::OPT_O_Group))
+      if (!A->getOption().matches(options::OPT_O0))
+        return false;
+  }
+
+  return true;
+}
+
 /// If the PWD environment variable is set, add a CC1 option to specify the
 /// debug compilation directory.
 static void addDebugCompDirArg(const ArgList &Args, ArgStringList &CmdArgs) {
@@ -2319,10 +2337,7 @@ void Clang::ConstructJob(Compilation &C,
     CmdArgs.push_back(A->getValue());
   }
 
-  // -mno-omit-leaf-frame-pointer is the default on Darwin.
-  if (Args.hasFlag(options::OPT_momit_leaf_frame_pointer,
-                   options::OPT_mno_omit_leaf_frame_pointer,
-                   !getToolChain().getTriple().isOSDarwin()))
+  if (!shouldUseLeafFramePointer(Args, getToolChain().getTriple()))
     CmdArgs.push_back("-momit-leaf-frame-pointer");
 
   // Explicitly error on some things we know we don't support and can't just

Modified: cfe/trunk/test/CodeGen/frame-pointer-elim.c
URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/test/CodeGen/frame-pointer-elim.c?rev=178606&r1=178605&r2=178606&view=diff
==============================================================================
--- cfe/trunk/test/CodeGen/frame-pointer-elim.c (original)
+++ cfe/trunk/test/CodeGen/frame-pointer-elim.c Tue Apr  2 20:58:53 2013
@@ -1,40 +1,30 @@
-// REQUIRES: x86-registered-target
+// For these next two tests when optimized we should omit the leaf frame
+// pointer, for unoptimized we should have a leaf frame pointer.
+// RUN: %clang -### -target i386-pc-linux-gnu -S -O1 %s 2>&1 | \
+// RUN:   FileCheck --check-prefix=LINUX-OPT %s
+// LINUX-OPT: "-momit-leaf-frame-pointer"
 
-// RUN: %clang -target i386-apple-darwin -S -o - %s | \
+// RUN: %clang -### -target i386-pc-linux-gnu -S %s 2>&1 | \
+// RUN:   FileCheck --check-prefix=LINUX %s
+// LINUX-NOT: "-momit-leaf-frame-pointer"
+
+// Darwin disables omitting the leaf frame pointer even under optimization
+// unless the command lines are given.
+// RUN: %clang -### -target i386-apple-darwin -S %s 2>&1 | \
 // RUN:   FileCheck --check-prefix=DARWIN %s
-// DARWIN: f0:
-// DARWIN: pushl %ebp
-// DARWIN: ret
-// DARWIN: f1:
-// DARWIN: pushl %ebp
-// DARWIN: ret
+// DARWIN: "-mdisable-fp-elim"
 
-// RUN: %clang -target i386-pc-linux-gnu -S -o - %s | \
-// RUN:   FileCheck --check-prefix=LINUX %s
-// LINUX: f0:
-// LINUX-NOT: pushl %ebp
-// LINUX: ret
-// LINUX: f1:
-// LINUX: pushl %ebp
-// LINUX: ret
+// RUN: %clang -### -target i386-apple-darwin -S -O1 %s 2>&1 | \
+// RUN:   FileCheck --check-prefix=DARWIN-OPT %s
+// DARWIN-OPT-NOT: "-momit-leaf-frame-pointer"
 
-// RUN: %clang -target i386-darwin -S -o - -fomit-frame-pointer %s | \
+// RUN: %clang -### -target i386-darwin -S -fomit-frame-pointer %s 2>&1 | \
 // RUN:   FileCheck --check-prefix=OMIT_ALL %s
-// OMIT_ALL: f0:
-// OMIT_ALL-NOT: pushl %ebp
-// OMIT_ALL: ret
-// OMIT_ALL: f1:
-// OMIT_ALL-NOT: pushl %ebp
-// OMIT_ALL: ret
+// OMIT_ALL-NOT: "-mdisable-fp-elim"
 
-// RUN: %clang -target i386-darwin -S -o - -momit-leaf-frame-pointer %s | \
+// RUN: %clang -### -target i386-darwin -S -momit-leaf-frame-pointer %s 2>&1 | \
 // RUN:   FileCheck --check-prefix=OMIT_LEAF %s
-// OMIT_LEAF: f0:
-// OMIT_LEAF-NOT: pushl %ebp
-// OMIT_LEAF: ret
-// OMIT_LEAF: f1:
-// OMIT_LEAF: pushl %ebp
-// OMIT_LEAF: ret
+// OMIT_LEAF: "-momit-leaf-frame-pointer"
 
 void f0() {}
 void f1() { f0(); }





More information about the cfe-commits mailing list