Skip to content

Commit 71ffa2a

Browse files
authored
[flang] Correctly handle -mframe-pointer=reserved (#146937)
Fixes `#146802` #146582 started using the `Reserved` Frame Pointer kind for Arm64 Windows, but this revealed a bug in Flang where it copied the `-mframe-pointer=reserved` flag from Clang, but didn't correctly handle it in its own command line parser and subsequent compilation pipeline. This change adds support for `-mframe-pointer=reserved` and adds a test to make sure that functions are correctly marked when the flag is set.
1 parent c345080 commit 71ffa2a

File tree

3 files changed

+6
-1
lines changed

3 files changed

+6
-1
lines changed

flang/lib/Frontend/CompilerInvocation.cpp

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -291,13 +291,14 @@ static void parseCodeGenArgs(Fortran::frontend::CodeGenOptions &opts,
291291

292292
opts.AliasAnalysis = opts.OptimizationLevel > 0;
293293

294-
// -mframe-pointer=none/non-leaf/all option.
294+
// -mframe-pointer=none/non-leaf/reserved/all option.
295295
if (const llvm::opt::Arg *a =
296296
args.getLastArg(clang::driver::options::OPT_mframe_pointer_EQ)) {
297297
std::optional<llvm::FramePointerKind> val =
298298
llvm::StringSwitch<std::optional<llvm::FramePointerKind>>(a->getValue())
299299
.Case("none", llvm::FramePointerKind::None)
300300
.Case("non-leaf", llvm::FramePointerKind::NonLeaf)
301+
.Case("reserved", llvm::FramePointerKind::Reserved)
301302
.Case("all", llvm::FramePointerKind::All)
302303
.Default(std::nullopt);
303304

flang/lib/Optimizer/Passes/Pipelines.cpp

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -358,6 +358,8 @@ void createDefaultFIRCodeGenPassPipeline(mlir::PassManager &pm,
358358
framePointerKind = mlir::LLVM::framePointerKind::FramePointerKind::NonLeaf;
359359
else if (config.FramePointerKind == llvm::FramePointerKind::All)
360360
framePointerKind = mlir::LLVM::framePointerKind::FramePointerKind::All;
361+
else if (config.FramePointerKind == llvm::FramePointerKind::Reserved)
362+
framePointerKind = mlir::LLVM::framePointerKind::FramePointerKind::Reserved;
361363
else
362364
framePointerKind = mlir::LLVM::framePointerKind::FramePointerKind::None;
363365

flang/test/Driver/func-attr.f90

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@
44

55
! RUN: %flang_fc1 -triple aarch64-none-none -mframe-pointer=none -emit-llvm -o - %s 2>&1| FileCheck %s --check-prefix=CHECK-NONEFP
66
! RUN: %flang_fc1 -triple aarch64-none-none -mframe-pointer=non-leaf -emit-llvm -o - %s 2>&1| FileCheck %s --check-prefix=CHECK-NONLEAFFP
7+
! RUN: %flang_fc1 -triple aarch64-none-none -mframe-pointer=reserved -emit-llvm -o - %s 2>&1| FileCheck %s --check-prefix=CHECK-RESERVEDFP
78
! RUN: %flang_fc1 -triple aarch64-none-none -mframe-pointer=all -emit-llvm -o - %s 2>&1| FileCheck %s --check-prefix=CHECK-ALLFP
89
! RUN: not %flang_fc1 -triple aarch64-none-none -mframe-pointer=wrongval -emit-llvm -o - %s 2>&1| FileCheck %s --check-prefix=CHECK-WRONGVALUEFP
910

@@ -20,6 +21,7 @@ end subroutine func
2021

2122
! CHECK-NONEFP-NOT: attributes #0 = { "frame-pointer"="{{.*}}" }
2223
! CHECK-NONLEAFFP: attributes #0 = { "frame-pointer"="non-leaf" }
24+
! CHECK-RESERVEDFP: attributes #0 = { "frame-pointer"="reserved" }
2325
! CHECK-ALLFP: attributes #0 = { "frame-pointer"="all" }
2426

2527
! CHECK-WRONGVALUEFP:error: invalid value 'wrongval' in '-mframe-pointer=wrongval'

0 commit comments

Comments
 (0)