Instead of hacking in custom support for Invoke/Unwind, use the LowerInvoke pass
authorChris Lattner <sabre@nondot.org>
Sun, 5 Oct 2003 19:15:47 +0000 (19:15 +0000)
committerChris Lattner <sabre@nondot.org>
Sun, 5 Oct 2003 19:15:47 +0000 (19:15 +0000)
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@8871 91177308-0d34-0410-b5e6-96231b3b80d8

lib/Target/X86/InstSelectSimple.cpp
lib/Target/X86/X86ISelSimple.cpp
lib/Target/X86/X86TargetMachine.cpp

index 85708ff2fd41c610b2137251725de05cfbbc0510..cc57b0ed4e505fc13e18ba582fdfc3bfd1c489c7 100644 (file)
@@ -131,8 +131,6 @@ namespace {
     void doCall(const ValueRecord &Ret, MachineInstr *CallMI,
                const std::vector<ValueRecord> &Args);
     void visitCallInst(CallInst &I);
-    void visitInvokeInst(InvokeInst &II);
-    void visitUnwindInst(UnwindInst &UI);
     void visitIntrinsicCall(LLVMIntrinsic::ID ID, CallInst &I);
 
     // Arithmetic operators
@@ -997,35 +995,6 @@ void ISel::visitCallInst(CallInst &CI) {
 }       
 
 
-// visitInvokeInst - For now, we don't support the llvm.unwind intrinsic, so
-// invoke's are just calls with an unconditional branch after them!
-void ISel::visitInvokeInst(InvokeInst &II) {
-  MachineInstr *TheCall;
-  if (Function *F = II.getCalledFunction()) {
-    // Emit a CALL instruction with PC-relative displacement.
-    TheCall = BuildMI(X86::CALLpcrel32, 1).addGlobalAddress(F, true);
-  } else {  // Emit an indirect call...
-    unsigned Reg = getReg(II.getCalledValue());
-    TheCall = BuildMI(X86::CALLr32, 1).addReg(Reg);
-  }
-
-  std::vector<ValueRecord> Args;
-  for (unsigned i = 3, e = II.getNumOperands(); i != e; ++i)
-    Args.push_back(ValueRecord(II.getOperand(i)));
-
-  unsigned DestReg = II.getType() != Type::VoidTy ? getReg(II) : 0;
-  doCall(ValueRecord(DestReg, II.getType()), TheCall, Args);
-
-  // If the normal destination is not the next basic block, emit a 'jmp'.
-  if (II.getNormalDest() != getBlockAfter(II.getParent()))
-    BuildMI(BB, X86::JMP, 1).addPCDisp(II.getNormalDest());
-}
-
-void ISel::visitUnwindInst(UnwindInst &UI) {
-  // unwind is not supported yet!  Just abort when the unwind inst is executed!
-  BuildMI(BB, X86::CALLpcrel32, 1).addExternalSymbol("abort", true); 
-}
-
 void ISel::visitIntrinsicCall(LLVMIntrinsic::ID ID, CallInst &CI) {
   unsigned TmpReg1, TmpReg2;
   switch (ID) {
index 85708ff2fd41c610b2137251725de05cfbbc0510..cc57b0ed4e505fc13e18ba582fdfc3bfd1c489c7 100644 (file)
@@ -131,8 +131,6 @@ namespace {
     void doCall(const ValueRecord &Ret, MachineInstr *CallMI,
                const std::vector<ValueRecord> &Args);
     void visitCallInst(CallInst &I);
-    void visitInvokeInst(InvokeInst &II);
-    void visitUnwindInst(UnwindInst &UI);
     void visitIntrinsicCall(LLVMIntrinsic::ID ID, CallInst &I);
 
     // Arithmetic operators
@@ -997,35 +995,6 @@ void ISel::visitCallInst(CallInst &CI) {
 }       
 
 
-// visitInvokeInst - For now, we don't support the llvm.unwind intrinsic, so
-// invoke's are just calls with an unconditional branch after them!
-void ISel::visitInvokeInst(InvokeInst &II) {
-  MachineInstr *TheCall;
-  if (Function *F = II.getCalledFunction()) {
-    // Emit a CALL instruction with PC-relative displacement.
-    TheCall = BuildMI(X86::CALLpcrel32, 1).addGlobalAddress(F, true);
-  } else {  // Emit an indirect call...
-    unsigned Reg = getReg(II.getCalledValue());
-    TheCall = BuildMI(X86::CALLr32, 1).addReg(Reg);
-  }
-
-  std::vector<ValueRecord> Args;
-  for (unsigned i = 3, e = II.getNumOperands(); i != e; ++i)
-    Args.push_back(ValueRecord(II.getOperand(i)));
-
-  unsigned DestReg = II.getType() != Type::VoidTy ? getReg(II) : 0;
-  doCall(ValueRecord(DestReg, II.getType()), TheCall, Args);
-
-  // If the normal destination is not the next basic block, emit a 'jmp'.
-  if (II.getNormalDest() != getBlockAfter(II.getParent()))
-    BuildMI(BB, X86::JMP, 1).addPCDisp(II.getNormalDest());
-}
-
-void ISel::visitUnwindInst(UnwindInst &UI) {
-  // unwind is not supported yet!  Just abort when the unwind inst is executed!
-  BuildMI(BB, X86::CALLpcrel32, 1).addExternalSymbol("abort", true); 
-}
-
 void ISel::visitIntrinsicCall(LLVMIntrinsic::ID ID, CallInst &CI) {
   unsigned TmpReg1, TmpReg2;
   switch (ID) {
index d511de67212a702c023366294ae9c7f47497aca7..dcc9beaf9d02bcd89cc73655a4d96695366bc57c 100644 (file)
@@ -50,6 +50,13 @@ bool X86TargetMachine::addPassesToEmitAssembly(PassManager &PM,
   // FIXME: Implement the switch instruction in the instruction selector!
   PM.add(createLowerSwitchPass());
 
+  // FIXME: Implement the invoke/unwind instructions!
+  PM.add(createLowerInvokePass());
+
+  // FIXME: The code generator does not properly handle functions with
+  // unreachable basic blocks.
+  PM.add(createCFGSimplificationPass());
+
   if (NoPatternISel)
     PM.add(createX86SimpleInstructionSelector(*this));
   else
@@ -94,6 +101,13 @@ bool X86TargetMachine::addPassesToJITCompile(FunctionPassManager &PM) {
   // FIXME: Implement the switch instruction in the instruction selector!
   PM.add(createLowerSwitchPass());
 
+  // FIXME: Implement the invoke/unwind instructions!
+  PM.add(createLowerInvokePass());
+
+  // FIXME: The code generator does not properly handle functions with
+  // unreachable basic blocks.
+  PM.add(createCFGSimplificationPass());
+
   if (NoPatternISel)
     PM.add(createX86SimpleInstructionSelector(*this));
   else