From b7cef81fd36c85e52b115b9ed6d1fb92d63781d6 Mon Sep 17 00:00:00 2001 From: Francis Visoiu Mistrih Date: Mon, 14 Jan 2019 10:55:55 +0000 Subject: Replace "no-frame-pointer-*" function attributes with "frame-pointer" MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Part of the effort to refactoring frame pointer code generation. We used to use two function attributes "no-frame-pointer-elim" and "no-frame-pointer-elim-non-leaf" to represent three kinds of frame pointer usage: (all) frames use frame pointer, (non-leaf) frames use frame pointer, (none) frame use frame pointer. This CL makes the idea explicit by using only one enum function attribute "frame-pointer" Option "-frame-pointer=" replaces "-disable-fp-elim" for tools such as llc. "no-frame-pointer-elim" and "no-frame-pointer-elim-non-leaf" are still supported for easy migration to "frame-pointer". tests are mostly updated with // replace command line args ‘-disable-fp-elim=false’ with ‘-frame-pointer=none’ grep -iIrnl '\-disable-fp-elim=false' * | xargs sed -i '' -e "s/-disable-fp-elim=false/-frame-pointer=none/g" // replace command line args ‘-disable-fp-elim’ with ‘-frame-pointer=all’ grep -iIrnl '\-disable-fp-elim' * | xargs sed -i '' -e "s/-disable-fp-elim/-frame-pointer=all/g" Patch by Yuanfang Chen (tabloid.adroit)! Differential Revision: https://reviews.llvm.org/D56351 llvm-svn: 351049 --- llvm/lib/CodeGen/TargetOptionsImpl.cpp | 31 +++++++++++++++++++++++++------ 1 file changed, 25 insertions(+), 6 deletions(-) (limited to 'llvm/lib/CodeGen/TargetOptionsImpl.cpp') diff --git a/llvm/lib/CodeGen/TargetOptionsImpl.cpp b/llvm/lib/CodeGen/TargetOptionsImpl.cpp index 853e71d0efa..3c133fb8594 100644 --- a/llvm/lib/CodeGen/TargetOptionsImpl.cpp +++ b/llvm/lib/CodeGen/TargetOptionsImpl.cpp @@ -23,15 +23,34 @@ using namespace llvm; /// DisableFramePointerElim - This returns true if frame pointer elimination /// optimization should be disabled for the given machine function. bool TargetOptions::DisableFramePointerElim(const MachineFunction &MF) const { - // Check to see if we should eliminate all frame pointers. - if (MF.getSubtarget().getFrameLowering()->noFramePointerElim(MF)) + // Check to see if the target want to forcably keep frame pointer. + if (MF.getSubtarget().getFrameLowering()->keepFramePointer(MF)) return true; - // Check to see if we should eliminate non-leaf frame pointers. - if (MF.getFunction().hasFnAttribute("no-frame-pointer-elim-non-leaf")) - return MF.getFrameInfo().hasCalls(); + const Function &F = MF.getFunction(); + + // TODO: Remove support for old `fp elim` function attributes after fully + // migrate to use "frame-pointer" + if (!F.hasFnAttribute("frame-pointer")) { + // Check to see if we should eliminate all frame pointers. + if (F.getFnAttribute("no-frame-pointer-elim").getValueAsString() == "true") + return true; + + // Check to see if we should eliminate non-leaf frame pointers. + if (F.hasFnAttribute("no-frame-pointer-elim-non-leaf")) + return MF.getFrameInfo().hasCalls(); - return false; + return false; + } + + StringRef FP = F.getFnAttribute("frame-pointer").getValueAsString(); + if (FP == "all") + return true; + if (FP == "non-leaf") + return MF.getFrameInfo().hasCalls(); + if (FP == "none") + return false; + llvm_unreachable("unknown frame pointer flag"); } /// HonorSignDependentRoundingFPMath - Return true if the codegen must assume -- cgit v1.2.3