From: Rafael Espindola Date: Wed, 14 Dec 2011 21:02:23 +0000 (+0000) Subject: Don't use the frame pointer on linux x86 and x86_64 if optimizing. This X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=6af27ec69560f7e4b0dac4a0b4341cd6062f6852;p=clang Don't use the frame pointer on linux x86 and x86_64 if optimizing. This matches gcc's behavior. Fixes PR8186. git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@146586 91177308-0d34-0410-b5e6-96231b3b80d8 --- diff --git a/lib/Driver/Tools.cpp b/lib/Driver/Tools.cpp index 50b9b418e1..68edd66f5f 100644 --- a/lib/Driver/Tools.cpp +++ b/lib/Driver/Tools.cpp @@ -1195,6 +1195,24 @@ static void addAsanRTLinux(const ToolChain &TC, const ArgList &Args, CmdArgs.push_back("-export-dynamic"); } +static bool shouldUseFramePointer(const ArgList &Args, + const llvm::Triple &Triple) { + 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); + + // Don't use a frame poiter on liunx 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; +} + void Clang::ConstructJob(Compilation &C, const JobAction &JA, const InputInfo &Output, const InputInfoList &Inputs, @@ -1408,8 +1426,7 @@ void Clang::ConstructJob(Compilation &C, const JobAction &JA, CmdArgs.push_back("-mrtd"); // FIXME: Set --enable-unsafe-fp-math. - if (Args.hasFlag(options::OPT_fno_omit_frame_pointer, - options::OPT_fomit_frame_pointer)) + if (shouldUseFramePointer(Args, getToolChain().getTriple())) CmdArgs.push_back("-mdisable-fp-elim"); if (!Args.hasFlag(options::OPT_fzero_initialized_in_bss, options::OPT_fno_zero_initialized_in_bss)) diff --git a/test/Driver/frame-pointer.c b/test/Driver/frame-pointer.c new file mode 100644 index 0000000000..da72ec23c7 --- /dev/null +++ b/test/Driver/frame-pointer.c @@ -0,0 +1,24 @@ +// RUN: %clang -ccc-host-triple i386-pc-linux -### -S -O0 %s -o %t.s 2>&1 | FileCheck -check-prefix=CHECK0-32 %s +// RUN: %clang -ccc-host-triple i386-pc-linux -### -S -O1 %s -o %t.s 2>&1 | FileCheck -check-prefix=CHECK1-32 %s +// RUN: %clang -ccc-host-triple i386-pc-linux -### -S -O2 %s -o %t.s 2>&1 | FileCheck -check-prefix=CHECK2-32 %s +// RUN: %clang -ccc-host-triple i386-pc-linux -### -S -O3 %s -o %t.s 2>&1 | FileCheck -check-prefix=CHECK3-32 %s +// RUN: %clang -ccc-host-triple i386-pc-linux -### -S -Os %s -o %t.s 2>&1 | FileCheck -check-prefix=CHECKs-32 %s + + +// RUN: %clang -ccc-host-triple x86_64-pc-linux -### -S -O0 %s -o %t.s 2>&1 | FileCheck -check-prefix=CHECK0-64 %s +// RUN: %clang -ccc-host-triple x86_64-pc-linux -### -S -O1 %s -o %t.s 2>&1 | FileCheck -check-prefix=CHECK1-64 %s +// RUN: %clang -ccc-host-triple x86_64-pc-linux -### -S -O2 %s -o %t.s 2>&1 | FileCheck -check-prefix=CHECK2-64 %s +// RUN: %clang -ccc-host-triple x86_64-pc-linux -### -S -O3 %s -o %t.s 2>&1 | FileCheck -check-prefix=CHECK3-64 %s +// RUN: %clang -ccc-host-triple x86_64-pc-linux -### -S -Os %s -o %t.s 2>&1 | FileCheck -check-prefix=CHECKs-64 %s + +// CHECK0-32: -mdisable-fp-elim +// CHECK1-32-NOT: -mdisable-fp-elim +// CHECK2-32-NOT: -mdisable-fp-elim +// CHECK3-32-NOT: -mdisable-fp-elim +// CHECKs-32-NOT: -mdisable-fp-elim + +// CHECK0-64: -mdisable-fp-elim +// CHECK1-64-NOT: -mdisable-fp-elim +// CHECK2-64-NOT: -mdisable-fp-elim +// CHECK3-64-NOT: -mdisable-fp-elim +// CHECKs-64-NOT: -mdisable-fp-elim