Skip to content

Commit 2346b92

Browse files
committed
clang: Don't warn on unused momit-leaf-frame-pointer when frame pointers are off.
This fixes a regression from r365860: As that commit message states, there are 3 valid states targeted by the combination of -f(no-)omit-frame-pointer and -m(no-)omit-leaf-frame-pointer. After r365860 it's impossible to get from state 10 (omit just leaf frame pointers) to state 11 (omit all frame pointers) in a single command line without getting a warning. This change restores that functionality. Fixes PR42966. Differential Revision: https://reviews.llvm.org/D66142 llvm-svn: 368728
1 parent 64517a6 commit 2346b92

File tree

2 files changed

+24
-3
lines changed

2 files changed

+24
-3
lines changed

clang/lib/Driver/ToolChains/Clang.cpp

Lines changed: 14 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -580,16 +580,27 @@ static bool useFramePointerForTargetByDefault(const ArgList &Args,
580580

581581
static CodeGenOptions::FramePointerKind
582582
getFramePointerKind(const ArgList &Args, const llvm::Triple &Triple) {
583+
// We have 4 states:
584+
//
585+
// 00) leaf retained, non-leaf retained
586+
// 01) leaf retained, non-leaf omitted (this is invalid)
587+
// 10) leaf omitted, non-leaf retained
588+
// (what -momit-leaf-frame-pointer was designed for)
589+
// 11) leaf omitted, non-leaf omitted
590+
//
591+
// "omit" options taking precedence over "no-omit" options is the only way
592+
// to make 3 valid states representable
583593
Arg *A = Args.getLastArg(options::OPT_fomit_frame_pointer,
584594
options::OPT_fno_omit_frame_pointer);
585595
bool OmitFP = A && A->getOption().matches(options::OPT_fomit_frame_pointer);
586596
bool NoOmitFP =
587597
A && A->getOption().matches(options::OPT_fno_omit_frame_pointer);
598+
bool KeepLeaf =
599+
Args.hasFlag(options::OPT_momit_leaf_frame_pointer,
600+
options::OPT_mno_omit_leaf_frame_pointer, Triple.isPS4CPU());
588601
if (NoOmitFP || mustUseNonLeafFramePointerForTarget(Triple) ||
589602
(!OmitFP && useFramePointerForTargetByDefault(Args, Triple))) {
590-
if (Args.hasFlag(options::OPT_momit_leaf_frame_pointer,
591-
options::OPT_mno_omit_leaf_frame_pointer,
592-
Triple.isPS4CPU()))
603+
if (KeepLeaf)
593604
return CodeGenOptions::FramePointerKind::NonLeaf;
594605
return CodeGenOptions::FramePointerKind::All;
595606
}

clang/test/Driver/frame-pointer-elim.c

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,8 @@
1+
// KEEP-ALL-NOT: warning:
12
// KEEP-ALL: "-mframe-pointer=all"
3+
// KEEP-NON-LEAF-NOT: warning:
24
// KEEP-NON-LEAF: "-mframe-pointer=non-leaf"
5+
// KEEP-NONE-NOT: warning:
36
// KEEP-NONE: "-mframe-pointer=none"
47

58
// On Linux x86, omit frame pointer when optimization is enabled.
@@ -25,6 +28,13 @@
2528
// RUN: %clang -### -target i386-linux -S -O1 -momit-leaf-frame-pointer %s 2>&1 | \
2629
// RUN: FileCheck --check-prefix=KEEP-NONE %s
2730

31+
// fno-omit-frame-pointer -momit-leaf-frame-pointer can be overwritten by
32+
// fomit-frame-pointer later on the command without warning
33+
// RUN: %clang -### -target i386-linux -S -O1 -fno-omit-frame-pointer -momit-leaf-frame-pointer -fomit-frame-pointer %s 2>&1 | \
34+
// RUN: FileCheck --check-prefix=KEEP-NONE %s
35+
36+
// RUN: %clang -### -target i386-linux -S -O1 -fno-omit-frame-pointer -momit-leaf-frame-pointer %s 2>&1 | \
37+
// RUN: FileCheck --check-prefix=KEEP-NON-LEAF %s
2838
// Explicit or default -fomit-frame-pointer wins over -mno-omit-leaf-frame-pointer.
2939
// RUN: %clang -### -target i386 -S %s -fomit-frame-pointer -mno-omit-leaf-frame-pointer 2>&1 | \
3040
// RUN: FileCheck --check-prefix=KEEP-NONE %s

0 commit comments

Comments
 (0)