@@ -90,6 +90,20 @@ static llvm::PointerType *createStructPointerType(IRGenModule &IGM,
90
90
return createStructType (IGM, name, types)->getPointerTo (DefaultAS);
91
91
};
92
92
93
+ static clang::CodeGenOptions::FramePointerKind
94
+ shouldUseFramePointer (const IRGenOptions &Opts) {
95
+ if (Opts.DisableFPElim ) {
96
+ // General frame pointer elimination is disabled.
97
+ // Should we at least eliminate in leaf functions?
98
+ return Opts.DisableFPElimLeaf
99
+ ? clang::CodeGenOptions::FramePointerKind::All
100
+ : clang::CodeGenOptions::FramePointerKind::NonLeaf;
101
+ }
102
+
103
+ return clang::CodeGenOptions::FramePointerKind::None;
104
+
105
+ }
106
+
93
107
static clang::CodeGenerator *createClangCodeGenerator (ASTContext &Context,
94
108
llvm::LLVMContext &LLVMContext,
95
109
const IRGenOptions &Opts,
@@ -102,9 +116,7 @@ static clang::CodeGenerator *createClangCodeGenerator(ASTContext &Context,
102
116
103
117
auto &CGO = Importer->getClangCodeGenOpts ();
104
118
CGO.OptimizationLevel = Opts.shouldOptimize () ? 3 : 0 ;
105
- CGO.setFramePointer (Opts.DisableFPElim
106
- ? clang::CodeGenOptions::FramePointerKind::All
107
- : clang::CodeGenOptions::FramePointerKind::None);
119
+ CGO.setFramePointer (shouldUseFramePointer (Opts));
108
120
CGO.DiscardValueNames = !Opts.shouldProvideValueNames ();
109
121
switch (Opts.DebugInfoLevel ) {
110
122
case IRGenDebugInfoLevel::None:
0 commit comments