[llvm-commits] CVS: llvm/lib/Target/X86/X86RegisterInfo.h X86RegisterInfo.cpp

Jim Laskey jlaskey at apple.com
Wed Jan 24 11:15:40 PST 2007



Changes in directory llvm/lib/Target/X86:

X86RegisterInfo.h updated: 1.44 -> 1.45
X86RegisterInfo.cpp updated: 1.195 -> 1.196
---
Log message:

Call frames for intel.

---
Diffs of the changes:  (+52 -0)

 X86RegisterInfo.cpp |   51 +++++++++++++++++++++++++++++++++++++++++++++++++++
 X86RegisterInfo.h   |    1 +
 2 files changed, 52 insertions(+)


Index: llvm/lib/Target/X86/X86RegisterInfo.h
diff -u llvm/lib/Target/X86/X86RegisterInfo.h:1.44 llvm/lib/Target/X86/X86RegisterInfo.h:1.45
--- llvm/lib/Target/X86/X86RegisterInfo.h:1.44	Mon Jan 22 18:57:47 2007
+++ llvm/lib/Target/X86/X86RegisterInfo.h	Wed Jan 24 13:15:24 2007
@@ -94,6 +94,7 @@
   // Debug information queries.
   unsigned getRARegister() const;
   unsigned getFrameRegister(MachineFunction &MF) const;
+  void getInitialFrameState(std::vector<MachineMove> &Moves) const;
 };
 
 // getX86SubSuperRegister - X86 utility function. It returns the sub or super


Index: llvm/lib/Target/X86/X86RegisterInfo.cpp
diff -u llvm/lib/Target/X86/X86RegisterInfo.cpp:1.195 llvm/lib/Target/X86/X86RegisterInfo.cpp:1.196
--- llvm/lib/Target/X86/X86RegisterInfo.cpp:1.195	Wed Jan 24 12:50:57 2007
+++ llvm/lib/Target/X86/X86RegisterInfo.cpp	Wed Jan 24 13:15:24 2007
@@ -995,6 +995,11 @@
   const Function* Fn = MF.getFunction();
   const X86Subtarget* Subtarget = &MF.getTarget().getSubtarget<X86Subtarget>();
   MachineInstr *MI;
+  MachineDebugInfo *DebugInfo = MFI->getMachineDebugInfo();
+  
+  // Prepare for debug frame info.
+  bool hasInfo = DebugInfo && DebugInfo->hasInfo();
+  unsigned FrameLabelId = 0;
   
   // Get the number of bytes to allocate from the FrameInfo
   unsigned NumBytes = MFI->getStackSize();
@@ -1018,6 +1023,12 @@
     }
   }
 
+  if (hasInfo) {
+    // Mark effective beginning of when frame pointer becomes valid.
+    FrameLabelId = DebugInfo->NextLabelID();
+    BuildMI(MBB, MBBI, TII.get(X86::DWARF_LABEL)).addImm(FrameLabelId);
+  }
+  
   if (hasFP(MF)) {
     // Get the offset of the stack slot for the EBP register... which is
     // guaranteed to be the last slot by processFunctionBeforeFrameFinalized.
@@ -1042,6 +1053,38 @@
     MBB.insert(MBBI, MI);
   }
 
+  if (hasInfo) {
+    std::vector<MachineMove> &Moves = DebugInfo->getFrameMoves();
+    
+    if (NumBytes) {
+      // Show update of SP.
+      MachineLocation SPDst(MachineLocation::VirtualFP);
+      MachineLocation SPSrc(MachineLocation::VirtualFP, -NumBytes);
+      Moves.push_back(MachineMove(FrameLabelId, SPDst, SPSrc));
+    } else {
+      MachineLocation SP(StackPtr);
+      Moves.push_back(MachineMove(FrameLabelId, SP, SP));
+    }
+
+    // Add callee saved registers to move list.
+    const std::vector<CalleeSavedInfo> &CSI = MFI->getCalleeSavedInfo();
+    for (unsigned I = 0, E = CSI.size(); I != E; ++I) {
+      int Offset = MFI->getObjectOffset(CSI[I].getFrameIdx());
+      unsigned Reg = CSI[I].getReg();
+      MachineLocation CSDst(MachineLocation::VirtualFP, Offset);
+      MachineLocation CSSrc(Reg);
+      Moves.push_back(MachineMove(FrameLabelId, CSDst, CSSrc));
+    }
+    
+    // Mark effective beginning of when frame pointer is ready.
+    unsigned ReadyLabelId = DebugInfo->NextLabelID();
+    BuildMI(MBB, MBBI, TII.get(X86::DWARF_LABEL)).addImm(ReadyLabelId);
+    
+    MachineLocation FPDst(hasFP(MF) ? FramePtr : StackPtr);
+    MachineLocation FPSrc(MachineLocation::VirtualFP);
+    Moves.push_back(MachineMove(ReadyLabelId, FPDst, FPSrc));
+  }
+
   // If it's main() on Cygwin\Mingw32 we should align stack as well
   if (Fn->hasExternalLinkage() && Fn->getName() == "main" &&
       Subtarget->isTargetCygMing()) {
@@ -1127,6 +1170,14 @@
   return hasFP(MF) ? FramePtr : StackPtr;
 }
 
+void X86RegisterInfo::getInitialFrameState(std::vector<MachineMove> &Moves)
+                                                                         const {
+  // Initial state of the frame pointer is esp.
+  MachineLocation Dst(MachineLocation::VirtualFP);
+  MachineLocation Src(StackPtr, 0);
+  Moves.push_back(MachineMove(0, Dst, Src));
+}
+
 namespace llvm {
 unsigned getX86SubSuperRegister(unsigned Reg, MVT::ValueType VT, bool High) {
   switch (VT) {






More information about the llvm-commits mailing list