From 2350d0f399261deebea5ad6c30f3f579968d23a1 Mon Sep 17 00:00:00 2001 From: KAWASHIMA Takahiro Date: Thu, 12 Feb 2026 10:24:47 +0900 Subject: [PATCH] [flang] Fix -fno-omit-frame-pointer (#180507) The PR #163775 added `FramePointerKind::NonLeafNoReserve`. However it seems it forgot to update some codes in Flang. By this bug, `frame-pointer` attribute in IR was not set even if `-fno-omit-frame-pointer` is specified. Fixes #180118 (cherry picked from commit e2297da21660a0c9f3db90c3effd18f6c17e38e9) --- flang/include/flang/Optimizer/Transforms/Passes.td | 3 ++- flang/lib/Optimizer/Passes/Pipelines.cpp | 3 +++ flang/test/Driver/func-attr.f90 | 5 +++++ 3 files changed, 10 insertions(+), 1 deletion(-) diff --git a/flang/include/flang/Optimizer/Transforms/Passes.td b/flang/include/flang/Optimizer/Transforms/Passes.td index b40ef0aa0b319..d9f52025fe104 100644 --- a/flang/include/flang/Optimizer/Transforms/Passes.td +++ b/flang/include/flang/Optimizer/Transforms/Passes.td @@ -417,7 +417,8 @@ def FunctionAttr : Pass<"function-attr", "mlir::func::FuncOp"> { clEnumValN(mlir::LLVM::framePointerKind::FramePointerKind::None, "None", ""), clEnumValN(mlir::LLVM::framePointerKind::FramePointerKind::NonLeaf, "NonLeaf", ""), clEnumValN(mlir::LLVM::framePointerKind::FramePointerKind::All, "All", ""), - clEnumValN(mlir::LLVM::framePointerKind::FramePointerKind::Reserved, "Reserved", "") + clEnumValN(mlir::LLVM::framePointerKind::FramePointerKind::Reserved, "Reserved", ""), + clEnumValN(mlir::LLVM::framePointerKind::FramePointerKind::NonLeafNoReserve, "NonLeafNoReserve", "") )}]>, Option<"instrumentFunctionEntry", "instrument-function-entry", "std::string", /*default=*/"", diff --git a/flang/lib/Optimizer/Passes/Pipelines.cpp b/flang/lib/Optimizer/Passes/Pipelines.cpp index cdac494c97e3a..1682890115c64 100644 --- a/flang/lib/Optimizer/Passes/Pipelines.cpp +++ b/flang/lib/Optimizer/Passes/Pipelines.cpp @@ -387,6 +387,9 @@ void createDefaultFIRCodeGenPassPipeline(mlir::PassManager &pm, framePointerKind = mlir::LLVM::framePointerKind::FramePointerKind::All; else if (config.FramePointerKind == llvm::FramePointerKind::Reserved) framePointerKind = mlir::LLVM::framePointerKind::FramePointerKind::Reserved; + else if (config.FramePointerKind == llvm::FramePointerKind::NonLeafNoReserve) + framePointerKind = + mlir::LLVM::framePointerKind::FramePointerKind::NonLeafNoReserve; else framePointerKind = mlir::LLVM::framePointerKind::FramePointerKind::None; diff --git a/flang/test/Driver/func-attr.f90 b/flang/test/Driver/func-attr.f90 index e8cab4fca2226..78bde6d46b1f7 100644 --- a/flang/test/Driver/func-attr.f90 +++ b/flang/test/Driver/func-attr.f90 @@ -4,6 +4,7 @@ ! RUN: %flang_fc1 -triple aarch64-none-none -mframe-pointer=none -emit-llvm -o - %s 2>&1| FileCheck %s --check-prefix=CHECK-NONEFP ! RUN: %flang_fc1 -triple aarch64-none-none -mframe-pointer=non-leaf -emit-llvm -o - %s 2>&1| FileCheck %s --check-prefix=CHECK-NONLEAFFP +! RUN: %flang_fc1 -triple aarch64-none-none -mframe-pointer=non-leaf-no-reserve -emit-llvm -o - %s 2>&1| FileCheck %s --check-prefix=CHECK-NONLEAFNORESERVEFP ! RUN: %flang_fc1 -triple aarch64-none-none -mframe-pointer=reserved -emit-llvm -o - %s 2>&1| FileCheck %s --check-prefix=CHECK-RESERVEDFP ! RUN: %flang_fc1 -triple aarch64-none-none -mframe-pointer=all -emit-llvm -o - %s 2>&1| FileCheck %s --check-prefix=CHECK-ALLFP ! RUN: not %flang_fc1 -triple aarch64-none-none -mframe-pointer=wrongval -emit-llvm -o - %s 2>&1| FileCheck %s --check-prefix=CHECK-WRONGVALUEFP @@ -13,6 +14,9 @@ ! CHECK-NONLEAFFP-LABEL: @func_() ! CHECK-NONLEAFFP-SAME: #0 +! CHECK-NONLEAFNORESERVEFP-LABEL: @func_() +! CHECK-NONLEAFNORESERVEFP-SAME: #0 + ! CHECK-ALLFP-LABEL: @func_() ! CHECK-ALLFP-SAME: #0 @@ -21,6 +25,7 @@ end subroutine func ! CHECK-NONEFP-NOT: attributes #0 = { "frame-pointer"="{{.*}}" } ! CHECK-NONLEAFFP: attributes #0 = { "frame-pointer"="non-leaf" } +! CHECK-NONLEAFNORESERVEFP: attributes #0 = { "frame-pointer"="non-leaf-no-reserve" } ! CHECK-RESERVEDFP: attributes #0 = { "frame-pointer"="reserved" } ! CHECK-ALLFP: attributes #0 = { "frame-pointer"="all" }