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(); }