[llvm-commits] [llvm] r40472 - /llvm/trunk/lib/Target/X86/X86RegisterInfo.cpp

Anton Korobeynikov asl at math.spbu.ru
Tue Jul 24 14:07:39 PDT 2007


Author: asl
Date: Tue Jul 24 16:07:39 2007
New Revision: 40472

URL: http://llvm.org/viewvc/llvm-project?rev=40472&view=rev
Log:
Heal EH handling stuff by emitting correct offsets to callee-saved registers.

Pretty hackish, but code itself is dirty mess, so we won't make anything worse. :)

Modified:
    llvm/trunk/lib/Target/X86/X86RegisterInfo.cpp

Modified: llvm/trunk/lib/Target/X86/X86RegisterInfo.cpp
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Target/X86/X86RegisterInfo.cpp?rev=40472&r1=40471&r2=40472&view=diff

==============================================================================
--- llvm/trunk/lib/Target/X86/X86RegisterInfo.cpp (original)
+++ llvm/trunk/lib/Target/X86/X86RegisterInfo.cpp Tue Jul 24 16:07:39 2007
@@ -1297,9 +1297,21 @@
             
     // Add callee saved registers to move list.
     const std::vector<CalleeSavedInfo> &CSI = MFI->getCalleeSavedInfo();
-    for (unsigned I = 0, E = CSI.size(); I != E; ++I) {
+
+    // FIXME: This is dirty hack. The code itself is pretty mess right now.
+    // It should be rewritten from scratch and generalized sometimes.
+    
+    // Determine maximum offset (minumum due to stack growth)
+    int64_t MaxOffset = 0;
+    for (unsigned I = 0, E = CSI.size(); I!=E; ++I)
+      MaxOffset = std::min(MaxOffset,
+                           MFI->getObjectOffset(CSI[I].getFrameIdx()));
+
+    // Calculate offsets
+    for (unsigned I = 0, E = CSI.size(); I!=E; ++I) {
       int64_t Offset = MFI->getObjectOffset(CSI[I].getFrameIdx());
       unsigned Reg = CSI[I].getReg();
+      Offset = (MaxOffset-Offset+3*stackGrowth);
       MachineLocation CSDst(MachineLocation::VirtualFP, Offset);
       MachineLocation CSSrc(Reg);
       Moves.push_back(MachineMove(FrameLabelId, CSDst, CSSrc));





More information about the llvm-commits mailing list