Changes in directory llvm/lib/Target/X86:

X86ISelLowering.cpp updated: 1.397 -> 1.398
X86RegisterInfo.cpp updated: 1.218 -> 1.219
---
Log message:

Emit correct register move information in eh frames for X86. This allows 
Shootout-C++/except to pass on x86/linux 
with non-llvm-compiled (e.g. "native") unwind runtime.


---
Diffs of the changes:  (+56 -8)

 X86ISelLowering.cpp |   13 +++++++++++++
 X86RegisterInfo.cpp |   51 +++++++++++++++++++++++++++++++++++++++++++--------
 2 files changed, 56 insertions(+), 8 deletions(-)


Index: llvm/lib/Target/X86/X86ISelLowering.cpp
diff -u llvm/lib/Target/X86/X86ISelLowering.cpp:1.397 
llvm/lib/Target/X86/X86ISelLowering.cpp:1.398
--- llvm/lib/Target/X86/X86ISelLowering.cpp:1.397       Tue Apr 24 16:16:55 2007
+++ llvm/lib/Target/X86/X86ISelLowering.cpp     Wed May  2 14:53:33 2007
@@ -226,6 +226,19 @@
       !Subtarget->isTargetCygMing())
     setOperationAction(ISD::LABEL, MVT::Other, Expand);
 
+  setOperationAction(ISD::EXCEPTIONADDR, MVT::i64, Expand);
+  setOperationAction(ISD::EHSELECTION,   MVT::i64, Expand);
+  setOperationAction(ISD::EXCEPTIONADDR, MVT::i32, Expand);
+  setOperationAction(ISD::EHSELECTION,   MVT::i32, Expand);
+  if (Subtarget->is64Bit()) {
+    // FIXME: Verify
+    setExceptionPointerRegister(X86::RAX);
+    setExceptionSelectorRegister(X86::RDX);
+  } else {
+    setExceptionPointerRegister(X86::EAX);
+    setExceptionSelectorRegister(X86::EDX);
+  }
+  
   // VASTART needs to be custom lowered to use the VarArgsFrameIndex
   setOperationAction(ISD::VASTART           , MVT::Other, Custom);
   setOperationAction(ISD::VAARG             , MVT::Other, Expand);


Index: llvm/lib/Target/X86/X86RegisterInfo.cpp
diff -u llvm/lib/Target/X86/X86RegisterInfo.cpp:1.218 
llvm/lib/Target/X86/X86RegisterInfo.cpp:1.219
--- llvm/lib/Target/X86/X86RegisterInfo.cpp:1.218       Wed May  2 03:46:03 2007
+++ llvm/lib/Target/X86/X86RegisterInfo.cpp     Wed May  2 14:53:33 2007
@@ -26,6 +26,7 @@
 #include "llvm/CodeGen/MachineFunction.h"
 #include "llvm/CodeGen/MachineFrameInfo.h"
 #include "llvm/CodeGen/MachineLocation.h"
+#include "llvm/Target/TargetAsmInfo.h"
 #include "llvm/Target/TargetFrameInfo.h"
 #include "llvm/Target/TargetInstrInfo.h"
 #include "llvm/Target/TargetMachine.h"
@@ -1060,11 +1061,17 @@
   MachineModuleInfo *MMI = MFI->getMachineModuleInfo();
   
   // Prepare for frame info.
-  unsigned FrameLabelId = 0;
+  unsigned FrameLabelId = 0, StartLabelId = 0;
   
   // Get the number of bytes to allocate from the FrameInfo
   uint64_t NumBytes = MFI->getStackSize();
 
+  if (MMI && MMI->needsFrameInfo()) {
+    // Mark function start
+    StartLabelId = MMI->NextLabelID();
+    BuildMI(MBB, MBBI, TII.get(X86::LABEL)).addImm(StartLabelId);
+  }
+
   if (NumBytes) {   // adjust stack pointer: ESP -= numbytes
     if (NumBytes >= 4096 && Subtarget->isTargetCygMing()) {
       // Check, whether EAX is livein for this function
@@ -1138,17 +1145,38 @@
 
   if (MMI && MMI->needsFrameInfo()) {
     std::vector<MachineMove> &Moves = MMI->getFrameMoves();
-    
+    const TargetAsmInfo *TAI = MF.getTarget().getTargetAsmInfo();
+
+    // Calculate amount of bytes used for return address storing
+    int stackGrowth =
+      (MF.getTarget().getFrameInfo()->getStackGrowthDirection() ==
+       TargetFrameInfo::StackGrowsUp ?
+       TAI->getAddressSize() : -TAI->getAddressSize());
+
+    // Add return address to move list
+    MachineLocation CSDst(StackPtr, stackGrowth);
+    MachineLocation CSSrc(getRARegister());
+    Moves.push_back(MachineMove(StartLabelId, CSDst, CSSrc));
+
     if (NumBytes) {
       // Show update of SP.
-      MachineLocation SPDst(MachineLocation::VirtualFP);
-      MachineLocation SPSrc(MachineLocation::VirtualFP, -NumBytes);
-      Moves.push_back(MachineMove(FrameLabelId, SPDst, SPSrc));
+      if (hasFP(MF)) {
+        // Adjust SP
+        MachineLocation SPDst(MachineLocation::VirtualFP);
+        MachineLocation SPSrc(MachineLocation::VirtualFP, 2*stackGrowth);
+        Moves.push_back(MachineMove(FrameLabelId, SPDst, SPSrc));
+      } else {
+        MachineLocation SPDst(MachineLocation::VirtualFP);
+        MachineLocation SPSrc(MachineLocation::VirtualFP, 
-NumBytes+stackGrowth);
+        Moves.push_back(MachineMove(FrameLabelId, SPDst, SPSrc));
+      }
     } else {
-      MachineLocation SP(StackPtr);
-      Moves.push_back(MachineMove(FrameLabelId, SP, SP));
+      //FIXME: Verify & implement for FP
+      MachineLocation SPDst(StackPtr);
+      MachineLocation SPSrc(StackPtr, stackGrowth);
+      Moves.push_back(MachineMove(FrameLabelId, SPDst, SPSrc));
     }
-
+            
     // Add callee saved registers to move list.
     const std::vector<CalleeSavedInfo> &CSI = MFI->getCalleeSavedInfo();
     for (unsigned I = 0, E = CSI.size(); I != E; ++I) {
@@ -1162,6 +1190,13 @@
     // Mark effective beginning of when frame pointer is ready.
     unsigned ReadyLabelId = MMI->NextLabelID();
     BuildMI(MBB, MBBI, TII.get(X86::LABEL)).addImm(ReadyLabelId);
+
+    if (hasFP(MF)) {
+      // Save FP
+      MachineLocation FPDst(MachineLocation::VirtualFP, 2*stackGrowth);
+      MachineLocation FPSrc(FramePtr);
+      Moves.push_back(MachineMove(ReadyLabelId, FPDst, FPSrc));
+    }
     
     MachineLocation FPDst(hasFP(MF) ? FramePtr : StackPtr);
     MachineLocation FPSrc(MachineLocation::VirtualFP);



_______________________________________________
llvm-commits mailing list
llvm-commits@cs.uiuc.edu
http://lists.cs.uiuc.edu/mailman/listinfo/llvm-commits

Reply via email to