Skip to content

Commit 739ab8a

Browse files
committed
Revert r365860 for PR42966 (with a tweak to the test case for r365862)
> Author: maskray > Date: Thu Jul 11 19:01:51 2019 > New Revision: 365860 > > URL: http://llvm.org/viewvc/llvm-project?rev=365860&view=rev > Log: > [Driver] Refactor interaction between -f(no-)?omit-frame-pointer and -m(no-)?omit-leaf-frame-pointer > > Use a tri-state enum to represent shouldUseFramePointer() and > shouldUseLeafFramePointer(). > > This simplifies the logic and fixes PR9825: > -fno-omit-frame-pointer doesn't imply -mno-omit-leaf-frame-pointer. > > and PR24003: > /Oy- /O2 should not omit leaf frame pointer: this matches MSVC x86-32. > (/Oy- is a no-op on MSVC x86-64.) > > and: > when CC1 option -mdisable-fp-elim if absent, -momit-leaf-frame-pointer > can also be omitted. > > The new behavior matches GCC: > -fomit-frame-pointer wins over -mno-omit-leaf-frame-pointer > -fno-omit-frame-pointer loses out to -momit-leaf-frame-pointer > > The behavior makes lots of sense. We have 4 states: > > - 00) leaf retained, non-leaf retained > - 01) leaf retained, non-leaf omitted (this is invalid) > - 10) leaf omitted, non-leaf retained (what -momit-leaf-frame-pointer was designed for) > - 11) leaf omitted, non-leaf omitted > > "omit" options taking precedence over "no-omit" options is the only way > to make 3 valid states representable with -f(no-)?omit-frame-pointer and > -m(no-)?omit-leaf-pointer. > > Reviewed By: ychen > > Differential Revision: https://reviews.llvm.org/D64294 llvm-svn: 369333
1 parent 150ad31 commit 739ab8a

File tree

5 files changed

+72
-87
lines changed

5 files changed

+72
-87
lines changed

clang/lib/Driver/ToolChains/Clang.cpp

Lines changed: 31 additions & 27 deletions
Original file line numberDiff line numberDiff line change
@@ -501,8 +501,6 @@ static codegenoptions::DebugInfoKind DebugLevelToInfoKind(const Arg &A) {
501501
return codegenoptions::LimitedDebugInfo;
502502
}
503503

504-
enum class FramePointerKind { None, NonLeaf, All };
505-
506504
static bool mustUseNonLeafFramePointerForTarget(const llvm::Triple &Triple) {
507505
switch (Triple.getArch()){
508506
default:
@@ -517,9 +515,6 @@ static bool mustUseNonLeafFramePointerForTarget(const llvm::Triple &Triple) {
517515

518516
static bool useFramePointerForTargetByDefault(const ArgList &Args,
519517
const llvm::Triple &Triple) {
520-
if (Args.hasArg(options::OPT_pg))
521-
return true;
522-
523518
switch (Triple.getArch()) {
524519
case llvm::Triple::xcore:
525520
case llvm::Triple::wasm32:
@@ -579,22 +574,32 @@ static bool useFramePointerForTargetByDefault(const ArgList &Args,
579574
return true;
580575
}
581576

582-
static FramePointerKind getFramePointerKind(const ArgList &Args,
583-
const llvm::Triple &Triple) {
584-
Arg *A = Args.getLastArg(options::OPT_fomit_frame_pointer,
585-
options::OPT_fno_omit_frame_pointer);
586-
bool OmitFP = A && A->getOption().matches(options::OPT_fomit_frame_pointer);
587-
bool NoOmitFP =
588-
A && A->getOption().matches(options::OPT_fno_omit_frame_pointer);
589-
if (NoOmitFP || mustUseNonLeafFramePointerForTarget(Triple) ||
590-
(!OmitFP && useFramePointerForTargetByDefault(Args, Triple))) {
591-
if (Args.hasFlag(options::OPT_momit_leaf_frame_pointer,
592-
options::OPT_mno_omit_leaf_frame_pointer,
593-
Triple.isPS4CPU()))
594-
return FramePointerKind::NonLeaf;
595-
return FramePointerKind::All;
596-
}
597-
return FramePointerKind::None;
577+
static bool shouldUseFramePointer(const ArgList &Args,
578+
const llvm::Triple &Triple) {
579+
if (Arg *A = Args.getLastArg(options::OPT_fno_omit_frame_pointer,
580+
options::OPT_fomit_frame_pointer))
581+
return A->getOption().matches(options::OPT_fno_omit_frame_pointer) ||
582+
mustUseNonLeafFramePointerForTarget(Triple);
583+
584+
if (Args.hasArg(options::OPT_pg))
585+
return true;
586+
587+
return useFramePointerForTargetByDefault(Args, Triple);
588+
}
589+
590+
static bool shouldUseLeafFramePointer(const ArgList &Args,
591+
const llvm::Triple &Triple) {
592+
if (Arg *A = Args.getLastArg(options::OPT_mno_omit_leaf_frame_pointer,
593+
options::OPT_momit_leaf_frame_pointer))
594+
return A->getOption().matches(options::OPT_mno_omit_leaf_frame_pointer);
595+
596+
if (Args.hasArg(options::OPT_pg))
597+
return true;
598+
599+
if (Triple.isPS4CPU())
600+
return false;
601+
602+
return useFramePointerForTargetByDefault(Args, Triple);
598603
}
599604

600605
/// Add a CC1 option to specify the debug compilation directory.
@@ -3946,12 +3951,8 @@ void Clang::ConstructJob(Compilation &C, const JobAction &JA,
39463951
if (Args.hasFlag(options::OPT_mrtd, options::OPT_mno_rtd, false))
39473952
CmdArgs.push_back("-fdefault-calling-conv=stdcall");
39483953

3949-
FramePointerKind FPKeepKind = getFramePointerKind(Args, RawTriple);
3950-
if (FPKeepKind != FramePointerKind::None) {
3954+
if (shouldUseFramePointer(Args, RawTriple))
39513955
CmdArgs.push_back("-mdisable-fp-elim");
3952-
if (FPKeepKind == FramePointerKind::NonLeaf)
3953-
CmdArgs.push_back("-momit-leaf-frame-pointer");
3954-
}
39553956
if (!Args.hasFlag(options::OPT_fzero_initialized_in_bss,
39563957
options::OPT_fno_zero_initialized_in_bss))
39573958
CmdArgs.push_back("-mno-zero-initialized-in-bss");
@@ -4136,6 +4137,9 @@ void Clang::ConstructJob(Compilation &C, const JobAction &JA,
41364137
CmdArgs.push_back(A->getValue());
41374138
}
41384139

4140+
if (!shouldUseLeafFramePointer(Args, RawTriple))
4141+
CmdArgs.push_back("-momit-leaf-frame-pointer");
4142+
41394143
// Explicitly error on some things we know we don't support and can't just
41404144
// ignore.
41414145
if (!Args.hasArg(options::OPT_fallow_unsupported)) {
@@ -5489,7 +5493,7 @@ void Clang::ConstructJob(Compilation &C, const JobAction &JA,
54895493
}
54905494

54915495
if (Arg *A = Args.getLastArg(options::OPT_pg))
5492-
if (FPKeepKind == FramePointerKind::None)
5496+
if (!shouldUseFramePointer(Args, Triple))
54935497
D.Diag(diag::err_drv_argument_not_allowed_with) << "-fomit-frame-pointer"
54945498
<< A->getAsString(Args);
54955499

clang/test/Driver/cl-options.c

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -161,28 +161,28 @@
161161
// RUN: %clang_cl /Os --target=i686-pc-windows-msvc -### -- %s 2>&1 | FileCheck -check-prefix=Os %s
162162
// RUN: %clang_cl /Os --target=x86_64-pc-windows-msvc -### -- %s 2>&1 | FileCheck -check-prefix=Os %s
163163
// Os-NOT: -mdisable-fp-elim
164-
// Os-NOT: -momit-leaf-frame-pointer
164+
// Os: -momit-leaf-frame-pointer
165165
// Os: -Os
166166

167167
// RUN: %clang_cl /Ot --target=i686-pc-windows-msvc -### -- %s 2>&1 | FileCheck -check-prefix=Ot %s
168168
// RUN: %clang_cl /Ot --target=x86_64-pc-windows-msvc -### -- %s 2>&1 | FileCheck -check-prefix=Ot %s
169169
// Ot-NOT: -mdisable-fp-elim
170-
// Ot-NOT: -momit-leaf-frame-pointer
170+
// Ot: -momit-leaf-frame-pointer
171171
// Ot: -O2
172172

173173
// RUN: %clang_cl /Ox --target=i686-pc-windows-msvc -### -- %s 2>&1 | FileCheck -check-prefix=Ox %s
174174
// RUN: %clang_cl /Ox --target=x86_64-pc-windows-msvc -### -- %s 2>&1 | FileCheck -check-prefix=Ox %s
175175
// Ox-NOT: -mdisable-fp-elim
176-
// Ox-NOT: -momit-leaf-frame-pointer
176+
// Ox: -momit-leaf-frame-pointer
177177
// Ox: -O2
178178

179179
// RUN: %clang_cl --target=i686-pc-win32 /O2sy- -### -- %s 2>&1 | FileCheck -check-prefix=PR24003 %s
180180
// PR24003: -mdisable-fp-elim
181-
// PR24003-NOT: -momit-leaf-frame-pointer
181+
// PR24003: -momit-leaf-frame-pointer
182182
// PR24003: -Os
183183

184184
// RUN: %clang_cl --target=i686-pc-win32 -Werror /Oy- /O2 -### -- %s 2>&1 | FileCheck -check-prefix=Oy_2 %s
185-
// Oy_2-NOT: -momit-leaf-frame-pointer
185+
// Oy_2: -momit-leaf-frame-pointer
186186
// Oy_2: -O2
187187

188188
// RUN: %clang_cl --target=aarch64-pc-windows-msvc -Werror /Oy- /O2 -### -- %s 2>&1 | FileCheck -check-prefix=Oy_aarch64 %s

clang/test/Driver/clang_f_opts.c

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -548,6 +548,11 @@
548548
// CHECK-NO-NULL-POINTER-CHECKS: "-fno-delete-null-pointer-checks"
549549
// CHECK-NULL-POINTER-CHECKS-NOT: "-fno-delete-null-pointer-checks"
550550

551+
// RUN: %clang -### -S -fomit-frame-pointer -pg %s 2>&1 | FileCheck -check-prefix=CHECK-NO-MIX-OMIT-FP-PG %s
552+
// RUN: %clang -### -S -fomit-frame-pointer -fno-omit-frame-pointer -pg %s 2>&1 | FileCheck -check-prefix=CHECK-MIX-NO-OMIT-FP-PG %s
553+
// CHECK-NO-MIX-OMIT-FP-PG: '-fomit-frame-pointer' not allowed with '-pg'
554+
// CHECK-MIX-NO-OMIT-FP-PG-NOT: '-fomit-frame-pointer' not allowed with '-pg'
555+
551556
// RUN: %clang -### -S -target x86_64-unknown-linux -frecord-gcc-switches %s 2>&1 | FileCheck -check-prefix=CHECK-RECORD-GCC-SWITCHES %s
552557
// RUN: %clang -### -S -target x86_64-unknown-linux -fno-record-gcc-switches %s 2>&1 | FileCheck -check-prefix=CHECK-NO-RECORD-GCC-SWITCHES %s
553558
// RUN: %clang -### -S -target x86_64-unknown-linux -fno-record-gcc-switches -frecord-gcc-switches %s 2>&1 | FileCheck -check-prefix=CHECK-RECORD-GCC-SWITCHES %s
Lines changed: 30 additions & 54 deletions
Original file line numberDiff line numberDiff line change
@@ -1,74 +1,48 @@
1-
// KEEP-ALL: "-mdisable-fp-elim"
2-
// KEEP-ALL-NOT: "-momit-leaf-frame-pointer"
1+
// For these next two tests when optimized we should omit the leaf frame
2+
// pointer, for unoptimized we should have a leaf frame pointer.
3+
// RUN: %clang -### -target i386-pc-linux-gnu -S -O1 %s 2>&1 | \
4+
// RUN: FileCheck --check-prefix=LINUX-OPT %s
5+
// LINUX-OPT: "-momit-leaf-frame-pointer"
36

4-
// KEEP-NON-LEAF: "-mdisable-fp-elim"
5-
// KEEP-NON-LEAF: "-momit-leaf-frame-pointer"
6-
7-
// KEEP-NONE-NOT: "-mdisable-fp-elim"
8-
// KEEP-NONE-NOT: "-momit-leaf-frame-pointer"
9-
10-
// On Linux x86, omit frame pointer when optimization is enabled.
11-
// RUN: %clang -### -target i386-linux -S -fomit-frame-pointer %s 2>&1 | \
12-
// RUN: FileCheck --check-prefix=KEEP-NONE %s
13-
// RUN: %clang -### -target i386-linux -S -O1 %s 2>&1 | \
14-
// RUN: FileCheck --check-prefix=KEEP-NONE %s
15-
16-
// -fno-omit-frame-pointer or -pg disables frame pointer omission.
17-
// RUN: %clang -### -target i386-linux -S %s 2>&1 | \
18-
// RUN: FileCheck --check-prefix=KEEP-ALL %s
19-
// RUN: %clang -### -target i386-linux -S -O1 -fno-omit-frame-pointer %s 2>&1 | \
20-
// RUN: FileCheck --check-prefix=KEEP-ALL %s
21-
// RUN: %clang -### -target i386-linux -S -O1 -pg %s 2>&1 | \
22-
// RUN: FileCheck --check-prefix=KEEP-ALL %s
23-
24-
// -momit-leaf-frame-pointer omits leaf frame pointer.
25-
// -fno-omit-frame-pointer loses out to -momit-leaf-frame-pointer.
26-
// RUN: %clang -### -target i386 -S -momit-leaf-frame-pointer %s 2>&1 | \
27-
// RUN: FileCheck --check-prefix=KEEP-NON-LEAF %s
28-
// RUN: %clang -### -target i386-linux -S -O1 -fno-omit-frame-pointer -momit-leaf-frame-pointer %s 2>&1 | \
29-
// RUN: FileCheck --check-prefix=KEEP-NON-LEAF %s
30-
// RUN: %clang -### -target i386-linux -S -O1 -momit-leaf-frame-pointer %s 2>&1 | \
31-
// RUN: FileCheck --check-prefix=KEEP-NONE %s
32-
33-
// Explicit or default -fomit-frame-pointer wins over -mno-omit-leaf-frame-pointer.
34-
// RUN: %clang -### -target i386 -S %s -fomit-frame-pointer -mno-omit-leaf-frame-pointer 2>&1 | \
35-
// RUN: FileCheck --check-prefix=KEEP-NONE %s
36-
// RUN: %clang -### -target i386-linux -S %s -O1 -mno-omit-leaf-frame-pointer 2>&1 | \
37-
// RUN: FileCheck --check-prefix=KEEP-NONE %s
38-
39-
// -pg -fomit-frame-pointer => error.
40-
// RUN: %clang -### -S -fomit-frame-pointer -pg %s 2>&1 | FileCheck -check-prefix=CHECK-NO-MIX-OMIT-FP-PG %s
41-
// RUN: %clang -### -S -fomit-frame-pointer -fno-omit-frame-pointer -pg %s 2>&1 | FileCheck -check-prefix=CHECK-MIX-NO-OMIT-FP-PG %s
42-
// CHECK-NO-MIX-OMIT-FP-PG: '-fomit-frame-pointer' not allowed with '-pg'
43-
// CHECK-MIX-NO-OMIT-FP-PG-NOT: '-fomit-frame-pointer' not allowed with '-pg'
7+
// RUN: %clang -### -target i386-pc-linux-gnu -S %s 2>&1 | \
8+
// RUN: FileCheck --check-prefix=LINUX %s
9+
// LINUX-NOT: "-momit-leaf-frame-pointer"
4410

4511
// CloudABI follows the same rules as Linux.
4612
// RUN: %clang -### -target x86_64-unknown-cloudabi -S -O1 %s 2>&1 | \
47-
// RUN: FileCheck --check-prefix=KEEP-NONE %s
13+
// RUN: FileCheck --check-prefix=CLOUDABI-OPT %s
14+
// CLOUDABI-OPT: "-momit-leaf-frame-pointer"
4815

4916
// RUN: %clang -### -target x86_64-unknown-cloudabi -S %s 2>&1 | \
50-
// RUN: FileCheck --check-prefix=KEEP-ALL %s
17+
// RUN: FileCheck --check-prefix=CLOUDABI %s
18+
// CLOUDABI-NOT: "-momit-leaf-frame-pointer"
5119

5220
// NetBSD follows the same rules as Linux.
5321
// RUN: %clang -### -target x86_64-unknown-netbsd -S -O1 %s 2>&1 | \
54-
// RUN: FileCheck --check-prefix=KEEP-NONE %s
22+
// RUN: FileCheck --check-prefix=NETBSD-OPT %s
23+
// NETBSD-OPT: "-momit-leaf-frame-pointer"
5524

5625
// RUN: %clang -### -target x86_64-unknown-netbsd -S %s 2>&1 | \
57-
// RUN: FileCheck --check-prefix=KEEP-ALL %s
26+
// RUN: FileCheck --check-prefix=NETBSD %s
27+
// NETBSD-NOT: "-momit-leaf-frame-pointer"
5828

5929
// Darwin disables omitting the leaf frame pointer even under optimization
6030
// unless the command lines are given.
6131
// RUN: %clang -### -target i386-apple-darwin -S %s 2>&1 | \
62-
// RUN: FileCheck --check-prefix=KEEP-ALL %s
32+
// RUN: FileCheck --check-prefix=DARWIN %s
33+
// DARWIN: "-mdisable-fp-elim"
6334

6435
// RUN: %clang -### -target i386-apple-darwin -S -O1 %s 2>&1 | \
65-
// RUN: FileCheck --check-prefix=KEEP-ALL %s
36+
// RUN: FileCheck --check-prefix=DARWIN-OPT %s
37+
// DARWIN-OPT-NOT: "-momit-leaf-frame-pointer"
6638

6739
// RUN: %clang -### -target i386-darwin -S -fomit-frame-pointer %s 2>&1 | \
68-
// RUN: FileCheck --check-prefix=KEEP-NONE %s
40+
// RUN: FileCheck --check-prefix=OMIT_ALL %s
41+
// OMIT_ALL-NOT: "-mdisable-fp-elim"
6942

7043
// RUN: %clang -### -target i386-darwin -S -momit-leaf-frame-pointer %s 2>&1 | \
71-
// RUN: FileCheck --check-prefix=KEEP-NON-LEAF %s
44+
// RUN: FileCheck --check-prefix=OMIT_LEAF %s
45+
// OMIT_LEAF: "-momit-leaf-frame-pointer"
7246

7347
// RUN: %clang -### -target armv7s-apple-ios -fomit-frame-pointer %s 2>&1 | \
7448
// RUN: FileCheck --check-prefix=WARN-OMIT-7S %s
@@ -89,15 +63,17 @@
8963
// WARN-OMIT-LEAF-7S: "-momit-leaf-frame-pointer"
9064

9165
// On the PS4, we default to omitting the frame pointer on leaf functions
66+
// (OMIT_LEAF check line is above)
9267
// RUN: %clang -### -target x86_64-scei-ps4 -S %s 2>&1 | \
93-
// RUN: FileCheck --check-prefix=KEEP-NON-LEAF %s
68+
// RUN: FileCheck --check-prefix=OMIT_LEAF %s
9469
// RUN: %clang -### -target x86_64-scei-ps4 -S -O2 %s 2>&1 | \
95-
// RUN: FileCheck --check-prefix=KEEP-NON-LEAF %s
70+
// RUN: FileCheck --check-prefix=OMIT_LEAF %s
9671

9772
// RUN: %clang -### -target powerpc64 -S %s 2>&1 | \
98-
// RUN: FileCheck --check-prefix=KEEP-ALL %s
73+
// RUN: FileCheck --check-prefix=KEEP_ALL %s
74+
// KEEP_ALL: "-mdisable-fp-elim"
9975
// RUN: %clang -### -target powerpc64 -S -O1 %s 2>&1 | \
100-
// RUN: FileCheck --check-prefix=KEEP-NONE %s
76+
// RUN: FileCheck --check-prefix=OMIT_ALL %s
10177

10278
void f0() {}
10379
void f1() { f0(); }

clang/test/Driver/xcore-opts.c

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,8 +4,8 @@
44
// RUN: %clang -target xcore %s -g0 -### -o %t.o 2>&1 | FileCheck -check-prefix CHECK-G0 %s
55

66
// CHECK: "-nostdsysteminc"
7+
// CHECK: "-momit-leaf-frame-pointer"
78
// CHECK-NOT: "-mdisable-fp-elim"
8-
// CHECK-NOT: "-momit-leaf-frame-pointer"
99
// CHECK: "-fno-signed-char"
1010
// CHECK: "-fno-use-cxa-atexit"
1111
// CHECK-NOT: "-fcxx-exceptions"

0 commit comments

Comments
 (0)