@@ -91,32 +91,33 @@ static llvm::PointerType *createStructPointerType(IRGenModule &IGM,
91
91
};
92
92
93
93
static clang::CodeGenOptions::FramePointerKind
94
- shouldUseFramePointer (const IRGenOptions &Opts) {
94
+ shouldUseFramePointer (const IRGenOptions &Opts, const llvm::Triple &triple ) {
95
95
if (Opts.DisableFPElim ) {
96
96
// General frame pointer elimination is disabled.
97
97
// Should we at least eliminate in leaf functions?
98
+ // Currently we only do that on arm64 (this matches the behavior of clang).
98
99
return Opts.DisableFPElimLeaf
99
100
? clang::CodeGenOptions::FramePointerKind::All
100
- : clang::CodeGenOptions::FramePointerKind::NonLeaf;
101
+ : triple.isAArch64 ()
102
+ ? clang::CodeGenOptions::FramePointerKind::NonLeaf
103
+ : clang::CodeGenOptions::FramePointerKind::All;
101
104
}
102
105
103
106
return clang::CodeGenOptions::FramePointerKind::None;
104
-
105
107
}
106
108
107
- static clang::CodeGenerator *createClangCodeGenerator (ASTContext &Context,
108
- llvm::LLVMContext &LLVMContext,
109
- const IRGenOptions &Opts,
110
- StringRef ModuleName,
111
- StringRef PD) {
109
+ static clang::CodeGenerator *
110
+ createClangCodeGenerator (ASTContext &Context, llvm::LLVMContext &LLVMContext,
111
+ const IRGenOptions &Opts, StringRef ModuleName,
112
+ StringRef PD, const llvm::Triple &triple) {
112
113
auto Loader = Context.getClangModuleLoader ();
113
114
auto *Importer = static_cast <ClangImporter*>(&*Loader);
114
115
assert (Importer && " No clang module loader!" );
115
116
auto &ClangContext = Importer->getClangASTContext ();
116
117
117
118
auto &CGO = Importer->getClangCodeGenOpts ();
118
119
CGO.OptimizationLevel = Opts.shouldOptimize () ? 3 : 0 ;
119
- CGO.setFramePointer (shouldUseFramePointer (Opts));
120
+ CGO.setFramePointer (shouldUseFramePointer (Opts, triple ));
120
121
CGO.DiscardValueNames = !Opts.shouldProvideValueNames ();
121
122
switch (Opts.DebugInfoLevel ) {
122
123
case IRGenDebugInfoLevel::None:
@@ -206,17 +207,17 @@ static void sanityCheckStdlib(IRGenModule &IGM) {
206
207
207
208
IRGenModule::IRGenModule (IRGenerator &irgen,
208
209
std::unique_ptr<llvm::TargetMachine> &&target,
209
- SourceFile *SF,
210
- StringRef ModuleName, StringRef OutputFilename,
210
+ SourceFile *SF, StringRef ModuleName,
211
+ StringRef OutputFilename,
211
212
StringRef MainInputFilenameForDebugInfo,
212
213
StringRef PrivateDiscriminator)
213
- : LLVMContext(new llvm::LLVMContext()),
214
- IRGen(irgen), Context(irgen.SIL.getASTContext()),
214
+ : LLVMContext(new llvm::LLVMContext()), IRGen(irgen),
215
+ Context(irgen.SIL.getASTContext()),
215
216
// The LLVMContext (and the IGM itself) will get deleted by the IGMDeleter
216
217
// as long as the IGM is registered with the IRGenerator.
217
- ClangCodeGen(createClangCodeGenerator(Context, *LLVMContext,
218
- irgen.Opts ,
219
- ModuleName, PrivateDiscriminator )),
218
+ ClangCodeGen(createClangCodeGenerator(Context, *LLVMContext, irgen.Opts,
219
+ ModuleName, PrivateDiscriminator ,
220
+ irgen.getEffectiveClangTriple() )),
220
221
Module(*ClangCodeGen->GetModule ()),
221
222
DataLayout(irgen.getClangDataLayout()),
222
223
Triple(irgen.getEffectiveClangTriple()), TargetMachine(std::move(target)),
@@ -1000,8 +1001,20 @@ bool swift::irgen::shouldRemoveTargetFeature(StringRef feature) {
1000
1001
1001
1002
void IRGenModule::setHasFramePointer (llvm::AttrBuilder &Attrs,
1002
1003
bool HasFramePointer) {
1003
- auto UseFramePointer = IRGen.Opts .DisableFPElimLeaf ? " all" : " non-leaf" ;
1004
- Attrs.addAttribute (" frame-pointer" , HasFramePointer ? UseFramePointer : " none" );
1004
+ if (!HasFramePointer) {
1005
+ Attrs.addAttribute (" frame-pointer" , " none" );
1006
+ return ;
1007
+ }
1008
+ if (IRGen.Opts .DisableFPElimLeaf ) {
1009
+ Attrs.addAttribute (" frame-pointer" , " all" );
1010
+ return ;
1011
+ }
1012
+
1013
+ // We omit frame pointers for leaf functions only for arm64 for now (matching
1014
+ // clang's behavior).
1015
+ auto framePointer =
1016
+ IRGen.getEffectiveClangTriple ().isAArch64 () ? " non-leaf" : " all" ;
1017
+ Attrs.addAttribute (" frame-pointer" , framePointer);
1005
1018
}
1006
1019
1007
1020
void IRGenModule::setHasFramePointer (llvm::Function *F,
0 commit comments