Add support for C++ exception handling.
authorAkira Hatanaka <ahatanak@gmail.com>
Thu, 26 May 2011 18:59:03 +0000 (18:59 +0000)
committerAkira Hatanaka <ahatanak@gmail.com>
Thu, 26 May 2011 18:59:03 +0000 (18:59 +0000)
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@132131 91177308-0d34-0410-b5e6-96231b3b80d8

lib/Target/Mips/MipsEmitGPRestore.cpp
lib/Target/Mips/MipsFrameLowering.cpp
lib/Target/Mips/MipsFrameLowering.h
lib/Target/Mips/MipsISelLowering.cpp
lib/Target/Mips/MipsMCAsmInfo.cpp
lib/Target/Mips/MipsRegisterInfo.cpp
test/CodeGen/Mips/blockaddr.ll

index 5b84ad8ffe80fb8d0af3062f20456a4363e6dbba..f49d490565ff64e2f809a4abef073410ce723942 100644 (file)
@@ -55,6 +55,20 @@ bool Inserter::runOnMachineFunction(MachineFunction &F) {
     MachineBasicBlock& MBB = *MFI;
     MachineBasicBlock::iterator I = MFI->begin();
 
+    // If MBB is a landing pad, insert instruction that restores $gp after
+    // EH_LABEL.
+    if (MBB.isLandingPad()) {
+      // Find EH_LABEL first.
+      for (; I->getOpcode() != TargetOpcode::EH_LABEL; ++I) ;
+      
+      // Insert lw.
+      ++I;
+      DebugLoc dl = I != MBB.end() ? I->getDebugLoc() : DebugLoc();
+      BuildMI(MBB, I, dl, TII->get(Mips::LW), Mips::GP).addImm(0)
+                                                       .addFrameIndex(FI);
+      Changed = true;
+    }
+
     while (I != MFI->end()) {
       if (I->getOpcode() != Mips::JALR) {
         ++I;
index 41ad18783aceb1b10907ff0e1c71d4dfd289d17e..45a1e71f76d7517785a079f4e99a5e09c545d840 100644 (file)
@@ -182,24 +182,49 @@ void MipsFrameLowering::emitPrologue(MachineFunction &MF) const {
   if (ATUsed)
     BuildMI(MBB, MBBI, dl, TII.get(Mips::ATMACRO));
 
-  // if framepointer enabled, set it to point to the stack pointer.
-  if (hasFP(MF)) {
-    // Find the instruction past the last instruction that saves a callee-saved
-    // register to the stack.
-    const std::vector<CalleeSavedInfo> &CSI = MFI->getCalleeSavedInfo();
+  // Find the instruction past the last instruction that saves a callee-saved
+  // register to the stack.
+  const std::vector<CalleeSavedInfo> &CSI = MFI->getCalleeSavedInfo();
   
-    for (unsigned i = 0; i < CSI.size(); ++i)
-      ++MBBI;
+  for (unsigned i = 0; i < CSI.size(); ++i)
+    ++MBBI;
  
+  // if framepointer enabled, set it to point to the stack pointer.
+  if (hasFP(MF))
     // Insert instruction "move $fp, $sp" at this location.    
     BuildMI(MBB, MBBI, dl, TII.get(Mips::ADDu), Mips::FP)
       .addReg(Mips::SP).addReg(Mips::ZERO);
-  }
 
   // Restore GP from the saved stack location
   if (MipsFI->needGPSaveRestore())
     BuildMI(MBB, MBBI, dl, TII.get(Mips::CPRESTORE))
       .addImm(MFI->getObjectOffset(MipsFI->getGPFI()));
+
+  // EH Frame infomation.
+  MachineModuleInfo &MMI = MF.getMMI();
+  std::vector<MachineMove> &Moves = MMI.getFrameMoves();
+  MCSymbol *FrameLabel = MMI.getContext().CreateTempSymbol();
+  BuildMI(MBB, MBBI, dl, TII.get(TargetOpcode::PROLOG_LABEL)).addSym(FrameLabel);
+
+  if (hasFP(MF)) {
+    MachineLocation SPDst(Mips::FP);
+    MachineLocation SPSrc(Mips::SP);
+    Moves.push_back(MachineMove(FrameLabel, SPDst, SPSrc)); 
+  }
+    
+  if (StackSize) {
+    MachineLocation SPDst(MachineLocation::VirtualFP);
+    MachineLocation SPSrc(MachineLocation::VirtualFP, -StackSize);
+    Moves.push_back(MachineMove(FrameLabel, SPDst, SPSrc)); 
+  }
+
+  for (std::vector<CalleeSavedInfo>::const_iterator I = CSI.begin(),
+       E = CSI.end(); I != E; ++I) {
+    int64_t Offset = MFI->getObjectOffset(I->getFrameIdx());
+    MachineLocation CSDst(MachineLocation::VirtualFP, Offset);
+    MachineLocation CSSrc(I->getReg());
+    Moves.push_back(MachineMove(FrameLabel, CSDst, CSSrc));
+  }        
 }
 
 void MipsFrameLowering::emitEpilogue(MachineFunction &MF,
@@ -243,6 +268,13 @@ void MipsFrameLowering::emitEpilogue(MachineFunction &MF,
   }
 }
 
+void
+MipsFrameLowering::getInitialFrameState(std::vector<MachineMove> &Moves) const {
+  MachineLocation Dst(MachineLocation::VirtualFP);
+  MachineLocation Src(Mips::SP, 0);
+  Moves.push_back(MachineMove(0, Dst, Src));
+}
+
 void MipsFrameLowering::
 processFunctionBeforeCalleeSavedScan(MachineFunction &MF,
                                      RegScavenger *RS) const {
index a778fde7a332eafa9c1e6e93fd4eef576790160f..78c78eea5b9af865313983fa96450f5719d305d0 100644 (file)
@@ -39,6 +39,8 @@ public:
 
   bool hasFP(const MachineFunction &MF) const;
 
+  void getInitialFrameState(std::vector<MachineMove> &Moves) const;
+  
   void processFunctionBeforeCalleeSavedScan(MachineFunction &MF,
                                             RegScavenger *RS) const;
 };
index 834b1bf53aff470316eca232a1ab99268b049aa4..4c425616094febba0bf0931f65cf8c87cd328696 100644 (file)
@@ -141,8 +141,9 @@ MipsTargetLowering(MipsTargetMachine &TM)
   setOperationAction(ISD::FLOG10,            MVT::f32,   Expand);
   setOperationAction(ISD::FEXP,              MVT::f32,   Expand);
 
-  setOperationAction(ISD::EH_LABEL,          MVT::Other, Expand);
-
+  setOperationAction(ISD::EXCEPTIONADDR,     MVT::i32, Expand);
+  setOperationAction(ISD::EHSELECTION,       MVT::i32, Expand);
+  
   setOperationAction(ISD::VAARG,             MVT::Other, Expand);
   setOperationAction(ISD::VACOPY,            MVT::Other, Expand);
   setOperationAction(ISD::VAEND,             MVT::Other, Expand);
@@ -176,6 +177,9 @@ MipsTargetLowering(MipsTargetMachine &TM)
 
   setStackPointerRegisterToSaveRestore(Mips::SP);
   computeRegisterProperties();
+
+  setExceptionPointerRegister(Mips::A0);
+  setExceptionSelectorRegister(Mips::A1);
 }
 
 MVT::SimpleValueType MipsTargetLowering::getSetCCResultType(EVT VT) const {
index 73da9d415e3be6d1ed713760428b76c7b956a2c8..c86bf405b8e91b5e1c5fc191d33caacb3bff0e77 100644 (file)
@@ -17,11 +17,15 @@ using namespace llvm;
 MipsMCAsmInfo::MipsMCAsmInfo(const Target &T, StringRef TT) {
   AlignmentIsInBytes          = false;
   Data16bitsDirective         = "\t.half\t";
-  Data32bitsDirective         = "\t.word\t";
+  Data32bitsDirective         = "\t.4byte\t";
   Data64bitsDirective         = 0;
   PrivateGlobalPrefix         = "$";
   CommentString               = "#";
   ZeroDirective               = "\t.space\t";
   GPRel32Directive            = "\t.gpword\t";
   WeakRefDirective            = "\t.weak\t";
+
+  SupportsDebugInformation = true;
+  ExceptionsType = ExceptionHandling::DwarfCFI;
+  HasLEB128 = true;
 }
index be6706544c2bcdd23996269577d2b5f7133dfadc..7674c6def23fa1e63fb21087e5cb7bd5810fe463 100644 (file)
@@ -283,8 +283,7 @@ getEHHandlerRegister() const {
 
 int MipsRegisterInfo::
 getDwarfRegNum(unsigned RegNum, bool isEH) const {
-  llvm_unreachable("What is the dwarf register number");
-  return -1;
+  return MipsGenRegisterInfo::getDwarfRegNumFull(RegNum, 0);
 }
 
 #include "MipsGenRegisterInfo.inc"
index e9af3045e15fd4e8f742501ac223284e29a2901e..6de6b7781b24289b1d0029ff6f535ffe5aa4e8d0 100644 (file)
@@ -8,14 +8,14 @@ entry:
   ret i8* %x
 }
 
-; CHECK-PIC: lw  $[[R0:[0-9]+]], %got($tmp1)($gp)
-; CHECK-PIC: addiu ${{[0-9]+}}, $[[R0]], %lo($tmp1)
-; CHECK-PIC: lw  $[[R1:[0-9]+]], %got($tmp2)($gp)
-; CHECK-PIC: addiu ${{[0-9]+}}, $[[R1]], %lo($tmp2)
-; CHECK-STATIC: lui  $[[R2:[0-9]+]], %hi($tmp1)
-; CHECK-STATIC: addiu ${{[0-9]+}}, $[[R2]], %lo($tmp1)
-; CHECK-STATIC: lui   $[[R3:[0-9]+]], %hi($tmp2)
-; CHECK-STATIC: addiu ${{[0-9]+}}, $[[R3]], %lo($tmp2)
+; CHECK-PIC: lw  $[[R0:[0-9]+]], %got($tmp[[T0:[0-9]+]])($gp)
+; CHECK-PIC: addiu ${{[0-9]+}}, $[[R0]], %lo($tmp[[T0]])
+; CHECK-PIC: lw  $[[R1:[0-9]+]], %got($tmp[[T1:[0-9]+]])($gp)
+; CHECK-PIC: addiu ${{[0-9]+}}, $[[R1]], %lo($tmp[[T1]])
+; CHECK-STATIC: lui  $[[R2:[0-9]+]], %hi($tmp[[T0:[0-9]+]])
+; CHECK-STATIC: addiu ${{[0-9]+}}, $[[R2]], %lo($tmp[[T0]])
+; CHECK-STATIC: lui   $[[R3:[0-9]+]], %hi($tmp[[T1:[0-9]+]])
+; CHECK-STATIC: addiu ${{[0-9]+}}, $[[R3]], %lo($tmp[[T1]])
 define void @f() nounwind {
 entry:
   %call = tail call i8* @dummy(i8* blockaddress(@f, %baz))