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

2007-05-02 Thread Anton Korobeynikov


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::vectorMachineMove 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::vectorCalleeSavedInfo 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);
+
+  

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

2007-02-21 Thread Jim Laskey


Changes in directory llvm/lib/Target/X86:

X86ISelLowering.cpp updated: 1.321 - 1.322
X86RegisterInfo.cpp updated: 1.203 - 1.204
X86RegisterInfo.h updated: 1.48 - 1.49
---
Log message:

Support to provide exception and selector registers.

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

 X86ISelLowering.cpp |4 
 X86RegisterInfo.cpp |   10 ++
 X86RegisterInfo.h   |4 
 3 files changed, 18 insertions(+)


Index: llvm/lib/Target/X86/X86ISelLowering.cpp
diff -u llvm/lib/Target/X86/X86ISelLowering.cpp:1.321 
llvm/lib/Target/X86/X86ISelLowering.cpp:1.322
--- llvm/lib/Target/X86/X86ISelLowering.cpp:1.321   Wed Feb 21 15:18:14 2007
+++ llvm/lib/Target/X86/X86ISelLowering.cpp Wed Feb 21 16:54:50 2007
@@ -4675,7 +4675,11 @@
   case ISD::INTRINSIC_WO_CHAIN: return LowerINTRINSIC_WO_CHAIN(Op, DAG);
   case ISD::RETURNADDR: return LowerRETURNADDR(Op, DAG);
   case ISD::FRAMEADDR:  return LowerFRAMEADDR(Op, DAG);
+  // Exception address and exception selector.  Currently unimplemented.
+  case ISD::EXCEPTIONADDR: break;
+  case ISD::EHSELECTION:   break;
   }
+  return SDOperand();
 }
 
 const char *X86TargetLowering::getTargetNodeName(unsigned Opcode) const {


Index: llvm/lib/Target/X86/X86RegisterInfo.cpp
diff -u llvm/lib/Target/X86/X86RegisterInfo.cpp:1.203 
llvm/lib/Target/X86/X86RegisterInfo.cpp:1.204
--- llvm/lib/Target/X86/X86RegisterInfo.cpp:1.203   Mon Feb 19 15:49:54 2007
+++ llvm/lib/Target/X86/X86RegisterInfo.cpp Wed Feb 21 16:54:50 2007
@@ -1193,6 +1193,16 @@
   Moves.push_back(MachineMove(0, Dst, Src));
 }
 
+unsigned X86RegisterInfo::getEHExceptionRegister() const {
+  assert(0  What is the exception register);
+  return 0;
+}
+
+unsigned X86RegisterInfo::getEHHandlerRegister() const {
+  assert(0  What is the exception handler register);
+  return 0;
+}
+
 namespace llvm {
 unsigned getX86SubSuperRegister(unsigned Reg, MVT::ValueType VT, bool High) {
   switch (VT) {


Index: llvm/lib/Target/X86/X86RegisterInfo.h
diff -u llvm/lib/Target/X86/X86RegisterInfo.h:1.48 
llvm/lib/Target/X86/X86RegisterInfo.h:1.49
--- llvm/lib/Target/X86/X86RegisterInfo.h:1.48  Mon Feb 19 15:49:54 2007
+++ llvm/lib/Target/X86/X86RegisterInfo.h   Wed Feb 21 16:54:50 2007
@@ -101,6 +101,10 @@
   unsigned getRARegister() const;
   unsigned getFrameRegister(MachineFunction MF) const;
   void getInitialFrameState(std::vectorMachineMove Moves) const;
+
+  // Exception handling queries.
+  unsigned getEHExceptionRegister() const;
+  unsigned getEHHandlerRegister() const;
 };
 
 // getX86SubSuperRegister - X86 utility function. It returns the sub or super



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