Skip to content

Commit 109813f

Browse files
committed
Add option to disable leaf frame pointer elimination
1 parent e155f03 commit 109813f

File tree

6 files changed

+27
-1
lines changed

6 files changed

+27
-1
lines changed

include/swift/AST/IRGenOptions.h

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -191,6 +191,7 @@ class IRGenOptions {
191191
unsigned DisableLLVMSLPVectorizer : 1;
192192

193193
/// Disable frame pointer elimination?
194+
unsigned DisableFPElimLeaf : 1;
194195
unsigned DisableFPElim : 1;
195196

196197
/// Special codegen for playgrounds.
@@ -319,6 +320,7 @@ class IRGenOptions {
319320
DisableClangModuleSkeletonCUs(false), UseJIT(false),
320321
DisableLLVMOptzns(false),
321322
DisableSwiftSpecificLLVMOptzns(false), DisableLLVMSLPVectorizer(false),
323+
DisableFPElimLeaf(false),
322324
DisableFPElim(true), Playground(false), EmitStackPromotionChecks(false),
323325
FunctionSections(false), PrintInlineTree(false), EmbedMode(IRGenEmbedMode::None),
324326
HasValueNamesSetting(false), ValueNames(false),

include/swift/Option/Options.td

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1010,6 +1010,10 @@ def enable_private_imports : Flag<["-"], "enable-private-imports">,
10101010
Flags<[FrontendOption, NoInteractiveOption, HelpHidden]>,
10111011
HelpText<"Allows this module's internal and private API to be accessed">;
10121012

1013+
def disable_leaf_frame_pointer_elim : Flag<["-"], "no-omit-leaf-frame-pointer">,
1014+
Flags<[FrontendOption, NoInteractiveOption, HelpHidden]>,
1015+
HelpText<"Don't omit the frame pointer for leaf functions">;
1016+
10131017
def sanitize_EQ : CommaJoined<["-"], "sanitize=">,
10141018
Flags<[FrontendOption, NoInteractiveOption]>, MetaVarName<"<check>">,
10151019
HelpText<"Turn on runtime checks for erroneous behavior.">;

lib/Driver/ToolChains.cpp

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -287,6 +287,8 @@ void ToolChain::addCommonFrontendArgs(const OutputInfo &OI,
287287
arguments.push_back("-enable-anonymous-context-mangled-names");
288288
}
289289

290+
inputArgs.AddLastArg(arguments, options::OPT_disable_leaf_frame_pointer_elim);
291+
290292
// Pass through any subsystem flags.
291293
inputArgs.AddAllArgs(arguments, options::OPT_Xllvm);
292294
inputArgs.AddAllArgs(arguments, options::OPT_Xcc);

lib/Frontend/CompilerInvocation.cpp

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1511,6 +1511,9 @@ static bool ParseIRGenArgs(IRGenOptions &Opts, ArgList &Args,
15111511
getRuntimeCompatVersion();
15121512
}
15131513

1514+
if (Args.hasArg(OPT_disable_leaf_frame_pointer_elim))
1515+
Opts.DisableFPElimLeaf = true;
1516+
15141517
return false;
15151518
}
15161519

lib/IRGen/IRGenModule.cpp

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -988,7 +988,8 @@ bool swift::irgen::shouldRemoveTargetFeature(StringRef feature) {
988988

989989
void IRGenModule::setHasFramePointer(llvm::AttrBuilder &Attrs,
990990
bool HasFramePointer) {
991-
Attrs.addAttribute("frame-pointer", HasFramePointer ? "non-leaf" : "none");
991+
auto UseFramePointer = IRGen.Opts.DisableFPElimLeaf ? "all" : "non-leaf";
992+
Attrs.addAttribute("frame-pointer", HasFramePointer ? UseFramePointer : "none");
992993
}
993994

994995
void IRGenModule::setHasFramePointer(llvm::Function *F,

test/IRGen/framepointer.sil

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
11
// RUN: %target-swift-frontend -primary-file %s -emit-ir | %FileCheck %s --check-prefix=CHECK
2+
// RUN: %target-swift-frontend -primary-file %s -emit-ir -no-omit-leaf-frame-pointer| %FileCheck %s --check-prefix=CHECK-ALL
23
// RUN: %target-swift-frontend -primary-file %s -S | %FileCheck %s --check-prefix=CHECKASM --check-prefix=CHECKASM-%target-os-%target-cpu
34

45
sil_stage canonical
@@ -30,6 +31,19 @@ entry(%i : $Int32):
3031

3132
// CHECK: attributes [[ATTR]] = {{{.*}}"frame-pointer"="non-leaf"
3233

34+
// CHECK-ALL: define{{.*}} swiftcc i32 @leaf_function_no_frame_pointer(i32 %0) [[ATTR:#.*]] {
35+
// CHECK-ALL: entry:
36+
// CHECK-ALL: ret i32 %0
37+
// CHECK-ALL: }
38+
39+
// CHECK-ALL: define{{.*}} swiftcc i32 @non_leaf_function_with_frame_pointer(i32 %0) [[ATTR]] {
40+
// CHECK-ALL: entry:
41+
// CHECK-ALL: %1 = call swiftcc i32 @leaf_function_no_frame_pointer(i32 %0)
42+
// CHECK-ALL: ret i32 %1
43+
// CHECK-ALL: }
44+
45+
// CHECK-ALL: attributes [[ATTR]] = {{{.*}}"frame-pointer"="all"
46+
3347
// Silence other os-archs.
3448
// CHECKASM: {{.*}}
3549

0 commit comments

Comments
 (0)