OSDN Git Service

Added a MRegisterInfo hook that tells PEI the target is responsible for
authorEvan Cheng <evan.cheng@apple.com>
Thu, 25 Jan 2007 22:12:41 +0000 (22:12 +0000)
committerEvan Cheng <evan.cheng@apple.com>
Thu, 25 Jan 2007 22:12:41 +0000 (22:12 +0000)
rounding the stack frame to a multiple of stack alignment.

git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@33504 91177308-0d34-0410-b5e6-96231b3b80d8

include/llvm/Target/MRegisterInfo.h
lib/CodeGen/PrologEpilogInserter.cpp

index e0f0cd4..aac932e 100644 (file)
@@ -367,6 +367,12 @@ public:
     return 0;
   }
 
+  /// targetHandlesStackFrameRounding - Returns true if the target is responsible
+  /// for rounding up the stack frame (probably at emitPrologue time).
+  virtual bool targetHandlesStackFrameRounding() const {
+    return false;
+  }
+
   /// hasFP - Return true if the specified function should have a dedicated frame
   /// pointer register. For most targets this is true only if the function has
   /// variable sized allocas or if frame pointer elimination is disabled.
index 915fbc2..6c3e2d0 100644 (file)
@@ -389,11 +389,12 @@ void PEI::calculateFrameObjectOffsets(MachineFunction &Fn) {
   // Round up the size to a multiple of the alignment, but only if there are
   // calls or alloca's in the function.  This ensures that any calls to
   // subroutines have their stack frames suitable aligned.
-  if (FFI->hasCalls() || FFI->hasVarSizedObjects()) {
+  const MRegisterInfo *RegInfo = Fn.getTarget().getRegisterInfo();
+  if (!RegInfo->targetHandlesStackFrameRounding() &&
+      (FFI->hasCalls() || FFI->hasVarSizedObjects())) {
     // When we have no frame pointer, we reserve argument space for call sites
     // in the function immediately on entry to the current function. This
     // eliminates the need for add/sub sp brackets around call sites.
-    const MRegisterInfo *RegInfo = Fn.getTarget().getRegisterInfo();
     if (!RegInfo->hasFP(Fn))
       Offset += FFI->getMaxCallFrameSize();