Re-commit "[SEH] Remove the old __C_specific_handler code now that WinEHPrepare works"

This reverts commit r235617.

r235649 should have addressed the problems.

llvm-svn: 235667
diff --git a/llvm/lib/CodeGen/AsmPrinter/Win64Exception.cpp b/llvm/lib/CodeGen/AsmPrinter/Win64Exception.cpp
index 2737a53..be15989 100644
--- a/llvm/lib/CodeGen/AsmPrinter/Win64Exception.cpp
+++ b/llvm/lib/CodeGen/AsmPrinter/Win64Exception.cpp
@@ -206,12 +206,6 @@
   for (const CallSiteEntry &CSE : CallSites) {
     if (!CSE.LPad)
       continue; // Ignore gaps.
-    for (int Selector : CSE.LPad->TypeIds) {
-      // Ignore C++ filter clauses in SEH.
-      // FIXME: Implement cleanup clauses.
-      if (isCatchEHSelector(Selector))
-        ++NumEntries;
-    }
     NumEntries += CSE.LPad->SEHHandlers.size();
   }
   Asm->OutStreamer.EmitIntValue(NumEntries, 4);
@@ -267,40 +261,6 @@
       else
         Asm->OutStreamer.EmitIntValue(0, 4);
     }
-    if (!LPad->SEHHandlers.empty())
-      continue;
-
-    // These aren't really type info globals, they are actually pointers to
-    // filter functions ordered by selector. The zero selector is used for
-    // cleanups, so slot zero corresponds to selector 1.
-    const std::vector<const GlobalValue *> &SelectorToFilter = MMI->getTypeInfos();
-
-    // Do a parallel iteration across typeids and clause labels, skipping filter
-    // clauses.
-    size_t NextClauseLabel = 0;
-    for (size_t I = 0, E = LPad->TypeIds.size(); I < E; ++I) {
-      // AddLandingPadInfo stores the clauses in reverse, but there is a FIXME
-      // to change that.
-      int Selector = LPad->TypeIds[E - I - 1];
-
-      // Ignore C++ filter clauses in SEH.
-      // FIXME: Implement cleanup clauses.
-      if (!isCatchEHSelector(Selector))
-        continue;
-
-      Asm->OutStreamer.EmitValue(Begin, 4);
-      Asm->OutStreamer.EmitValue(End, 4);
-      if (isCatchEHSelector(Selector)) {
-        assert(unsigned(Selector - 1) < SelectorToFilter.size());
-        const GlobalValue *TI = SelectorToFilter[Selector - 1];
-        if (TI) // Emit the filter function pointer.
-          Asm->OutStreamer.EmitValue(createImageRel32(Asm->getSymbol(TI)), 4);
-        else  // Otherwise, this is a "catch i8* null", or catch all.
-          Asm->OutStreamer.EmitIntValue(1, 4);
-      }
-      MCSymbol *ClauseLabel = LPad->ClauseLabels[NextClauseLabel++];
-      Asm->OutStreamer.EmitValue(createImageRel32(ClauseLabel), 4);
-    }
   }
 }
 
diff --git a/llvm/lib/CodeGen/MachineModuleInfo.cpp b/llvm/lib/CodeGen/MachineModuleInfo.cpp
index e4f2aea..2352692 100644
--- a/llvm/lib/CodeGen/MachineModuleInfo.cpp
+++ b/llvm/lib/CodeGen/MachineModuleInfo.cpp
@@ -461,14 +461,6 @@
   LP.TypeIds.push_back(0);
 }
 
-MCSymbol *
-MachineModuleInfo::addClauseForLandingPad(MachineBasicBlock *LandingPad) {
-  MCSymbol *ClauseLabel = Context.CreateTempSymbol();
-  LandingPadInfo &LP = getOrCreateLandingPadInfo(LandingPad);
-  LP.ClauseLabels.push_back(ClauseLabel);
-  return ClauseLabel;
-}
-
 void MachineModuleInfo::addSEHCatchHandler(MachineBasicBlock *LandingPad,
                                            const Function *Filter,
                                            const BlockAddress *RecoverBA) {
diff --git a/llvm/lib/CodeGen/SelectionDAG/SelectionDAGISel.cpp b/llvm/lib/CodeGen/SelectionDAG/SelectionDAGISel.cpp
index 982d719..f3735cb 100644
--- a/llvm/lib/CodeGen/SelectionDAG/SelectionDAGISel.cpp
+++ b/llvm/lib/CodeGen/SelectionDAG/SelectionDAGISel.cpp
@@ -955,76 +955,20 @@
         // Mark the clause as a landing pad or MI passes will delete it.
         ClauseBB->setIsLandingPad();
       }
-    } else {
-      // Otherwise, we haven't done the preparation, and we need to invent some
-      // clause basic blocks that branch into the landingpad.
-      // FIXME: Remove this code once SEH preparation works.
-      ActionsCall = nullptr;
-
-      // Make virtual registers and a series of labels that fill in values for
-      // the clauses.
-      auto &RI = MF->getRegInfo();
-      FuncInfo->ExceptionSelectorVirtReg = RI.createVirtualRegister(PtrRC);
-
-      // Emit separate machine basic blocks with separate labels for each clause
-      // before the main landing pad block.
-      MachineInstrBuilder SelectorPHI = BuildMI(
-          *MBB, MBB->begin(), SDB->getCurDebugLoc(),
-          TII->get(TargetOpcode::PHI), FuncInfo->ExceptionSelectorVirtReg);
-      for (unsigned I = 0, E = LPadInst->getNumClauses(); I != E; ++I) {
-        // Skip filter clauses, we can't implement them.
-        if (LPadInst->isFilter(I))
-          continue;
-
-        MachineBasicBlock *ClauseBB = MF->CreateMachineBasicBlock(LLVMBB);
-        MF->insert(MBB, ClauseBB);
-
-        // Add the edge from the invoke to the clause.
-        for (MachineBasicBlock *InvokeBB : InvokeBBs)
-          InvokeBB->addSuccessor(ClauseBB);
-
-        // Mark the clause as a landing pad or MI passes will delete it.
-        ClauseBB->setIsLandingPad();
-
-        GlobalValue *ClauseGV = ExtractTypeInfo(LPadInst->getClause(I));
-
-        // Start the BB with a label.
-        MCSymbol *ClauseLabel = MF->getMMI().addClauseForLandingPad(MBB);
-        BuildMI(*ClauseBB, ClauseBB->begin(), SDB->getCurDebugLoc(), II)
-            .addSym(ClauseLabel);
-
-        // Construct a simple BB that defines a register with the typeid
-        // constant.
-        FuncInfo->MBB = ClauseBB;
-        FuncInfo->InsertPt = ClauseBB->end();
-        unsigned VReg = SDB->visitLandingPadClauseBB(ClauseGV, MBB);
-        CurDAG->setRoot(SDB->getRoot());
-        SDB->clear();
-        CodeGenAndEmitDAG();
-
-        // Add the typeid virtual register to the phi in the main landing pad.
-        SelectorPHI.addReg(VReg).addMBB(ClauseBB);
-      }
     }
 
     // Remove the edge from the invoke to the lpad.
     for (MachineBasicBlock *InvokeBB : InvokeBBs)
       InvokeBB->removeSuccessor(MBB);
 
-    // Restore FuncInfo back to its previous state and select the main landing
-    // pad block.
-    FuncInfo->MBB = MBB;
-    FuncInfo->InsertPt = MBB->end();
-
     // Transfer EH state number assigned to the IR block to the MBB.
     if (Personality == EHPersonality::MSVC_CXX) {
       WinEHFuncInfo &FI = MF->getMMI().getWinEHFuncInfo(MF->getFunction());
       MF->getMMI().addWinEHState(MBB, FI.LandingPadStateMap[LPadInst]);
     }
 
-    // Select instructions for the landingpad if there was no llvm.eh.actions
-    // call.
-    return ActionsCall == nullptr;
+    // Don't select instructions for the landingpad.
+    return false;
   }
 
   // Mark exception register as live in.
diff --git a/llvm/lib/CodeGen/WinEHPrepare.cpp b/llvm/lib/CodeGen/WinEHPrepare.cpp
index b1eea7d..09f3e13 100644
--- a/llvm/lib/CodeGen/WinEHPrepare.cpp
+++ b/llvm/lib/CodeGen/WinEHPrepare.cpp
@@ -323,11 +323,6 @@
   return new WinEHPrepare(TM);
 }
 
-// FIXME: Remove this once the backend can handle the prepared IR.
-static cl::opt<bool>
-    SEHPrepare("sehprepare", cl::Hidden,
-               cl::desc("Prepare functions with SEH personalities"));
-
 bool WinEHPrepare::runOnFunction(Function &Fn) {
   // No need to prepare outlined handlers.
   if (Fn.hasFnAttribute("wineh-parent"))
@@ -355,16 +350,6 @@
 
   DT = &getAnalysis<DominatorTreeWrapperPass>().getDomTree();
 
-  if (isAsynchronousEHPersonality(Personality) && !SEHPrepare) {
-    // Replace all resume instructions with unreachable.
-    // FIXME: Remove this once the backend can handle the prepared IR.
-    for (ResumeInst *Resume : Resumes) {
-      IRBuilder<>(Resume).CreateUnreachable();
-      Resume->eraseFromParent();
-    }
-    return true;
-  }
-
   // If there were any landing pads, prepareExceptionHandlers will make changes.
   prepareExceptionHandlers(Fn, LPads);
   return true;