SjLjEHPrepare.cpp revision 8b818d7e98309125c6058c4ea72a7dc73b031db2
18b818d7e98309125c6058c4ea72a7dc73b031db2Jim Grosbach//===- SjLjEHPass.cpp - Eliminate Invoke & Unwind instructions -----------===//
28b818d7e98309125c6058c4ea72a7dc73b031db2Jim Grosbach//
38b818d7e98309125c6058c4ea72a7dc73b031db2Jim Grosbach//                     The LLVM Compiler Infrastructure
48b818d7e98309125c6058c4ea72a7dc73b031db2Jim Grosbach//
58b818d7e98309125c6058c4ea72a7dc73b031db2Jim Grosbach// This file is distributed under the University of Illinois Open Source
68b818d7e98309125c6058c4ea72a7dc73b031db2Jim Grosbach// License. See LICENSE.TXT for details.
78b818d7e98309125c6058c4ea72a7dc73b031db2Jim Grosbach//
88b818d7e98309125c6058c4ea72a7dc73b031db2Jim Grosbach//===----------------------------------------------------------------------===//
98b818d7e98309125c6058c4ea72a7dc73b031db2Jim Grosbach//
108b818d7e98309125c6058c4ea72a7dc73b031db2Jim Grosbach// This transformation is designed for use by code generators which use SjLj
118b818d7e98309125c6058c4ea72a7dc73b031db2Jim Grosbach// based exception handling.
128b818d7e98309125c6058c4ea72a7dc73b031db2Jim Grosbach//
138b818d7e98309125c6058c4ea72a7dc73b031db2Jim Grosbach//===----------------------------------------------------------------------===//
148b818d7e98309125c6058c4ea72a7dc73b031db2Jim Grosbach
158b818d7e98309125c6058c4ea72a7dc73b031db2Jim Grosbach#define DEBUG_TYPE "sjljehprepare"
168b818d7e98309125c6058c4ea72a7dc73b031db2Jim Grosbach#include "llvm/Transforms/Scalar.h"
178b818d7e98309125c6058c4ea72a7dc73b031db2Jim Grosbach#include "llvm/Constants.h"
188b818d7e98309125c6058c4ea72a7dc73b031db2Jim Grosbach#include "llvm/DerivedTypes.h"
198b818d7e98309125c6058c4ea72a7dc73b031db2Jim Grosbach#include "llvm/Instructions.h"
208b818d7e98309125c6058c4ea72a7dc73b031db2Jim Grosbach#include "llvm/Intrinsics.h"
218b818d7e98309125c6058c4ea72a7dc73b031db2Jim Grosbach#include "llvm/LLVMContext.h"
228b818d7e98309125c6058c4ea72a7dc73b031db2Jim Grosbach#include "llvm/Module.h"
238b818d7e98309125c6058c4ea72a7dc73b031db2Jim Grosbach#include "llvm/Pass.h"
248b818d7e98309125c6058c4ea72a7dc73b031db2Jim Grosbach#include "llvm/CodeGen/Passes.h"
258b818d7e98309125c6058c4ea72a7dc73b031db2Jim Grosbach#include "llvm/Transforms/Utils/BasicBlockUtils.h"
268b818d7e98309125c6058c4ea72a7dc73b031db2Jim Grosbach#include "llvm/Transforms/Utils/Local.h"
278b818d7e98309125c6058c4ea72a7dc73b031db2Jim Grosbach#include "llvm/ADT/Statistic.h"
288b818d7e98309125c6058c4ea72a7dc73b031db2Jim Grosbach#include "llvm/Support/CommandLine.h"
298b818d7e98309125c6058c4ea72a7dc73b031db2Jim Grosbach#include "llvm/Support/Compiler.h"
308b818d7e98309125c6058c4ea72a7dc73b031db2Jim Grosbach#include "llvm/Support/Debug.h"
318b818d7e98309125c6058c4ea72a7dc73b031db2Jim Grosbach#include "llvm/Support/raw_ostream.h"
328b818d7e98309125c6058c4ea72a7dc73b031db2Jim Grosbach#include "llvm/Target/TargetLowering.h"
338b818d7e98309125c6058c4ea72a7dc73b031db2Jim Grosbach#include <set>
348b818d7e98309125c6058c4ea72a7dc73b031db2Jim Grosbachusing namespace llvm;
358b818d7e98309125c6058c4ea72a7dc73b031db2Jim Grosbach
368b818d7e98309125c6058c4ea72a7dc73b031db2Jim GrosbachSTATISTIC(NumInvokes, "Number of invokes replaced");
378b818d7e98309125c6058c4ea72a7dc73b031db2Jim GrosbachSTATISTIC(NumUnwinds, "Number of unwinds replaced");
388b818d7e98309125c6058c4ea72a7dc73b031db2Jim GrosbachSTATISTIC(NumSpilled, "Number of registers live across unwind edges");
398b818d7e98309125c6058c4ea72a7dc73b031db2Jim Grosbach
408b818d7e98309125c6058c4ea72a7dc73b031db2Jim Grosbachnamespace {
418b818d7e98309125c6058c4ea72a7dc73b031db2Jim Grosbach  class VISIBILITY_HIDDEN SjLjEHPass : public FunctionPass {
428b818d7e98309125c6058c4ea72a7dc73b031db2Jim Grosbach
438b818d7e98309125c6058c4ea72a7dc73b031db2Jim Grosbach    const TargetLowering *TLI;
448b818d7e98309125c6058c4ea72a7dc73b031db2Jim Grosbach
458b818d7e98309125c6058c4ea72a7dc73b031db2Jim Grosbach    const Type *FunctionContextTy;
468b818d7e98309125c6058c4ea72a7dc73b031db2Jim Grosbach    Constant *RegisterFn;
478b818d7e98309125c6058c4ea72a7dc73b031db2Jim Grosbach    Constant *UnregisterFn;
488b818d7e98309125c6058c4ea72a7dc73b031db2Jim Grosbach    Constant *ResumeFn;
498b818d7e98309125c6058c4ea72a7dc73b031db2Jim Grosbach    Constant *BuiltinSetjmpFn;
508b818d7e98309125c6058c4ea72a7dc73b031db2Jim Grosbach    Constant *FrameAddrFn;
518b818d7e98309125c6058c4ea72a7dc73b031db2Jim Grosbach    Constant *LSDAAddrFn;
528b818d7e98309125c6058c4ea72a7dc73b031db2Jim Grosbach    Value *PersonalityFn;
538b818d7e98309125c6058c4ea72a7dc73b031db2Jim Grosbach    Constant *Selector32Fn;
548b818d7e98309125c6058c4ea72a7dc73b031db2Jim Grosbach    Constant *Selector64Fn;
558b818d7e98309125c6058c4ea72a7dc73b031db2Jim Grosbach    Constant *ExceptionFn;
568b818d7e98309125c6058c4ea72a7dc73b031db2Jim Grosbach
578b818d7e98309125c6058c4ea72a7dc73b031db2Jim Grosbach    Value *CallSite;
588b818d7e98309125c6058c4ea72a7dc73b031db2Jim Grosbach  public:
598b818d7e98309125c6058c4ea72a7dc73b031db2Jim Grosbach    static char ID; // Pass identification, replacement for typeid
608b818d7e98309125c6058c4ea72a7dc73b031db2Jim Grosbach    explicit SjLjEHPass(const TargetLowering *tli = NULL)
618b818d7e98309125c6058c4ea72a7dc73b031db2Jim Grosbach      : FunctionPass(&ID), TLI(tli) { }
628b818d7e98309125c6058c4ea72a7dc73b031db2Jim Grosbach    bool doInitialization(Module &M);
638b818d7e98309125c6058c4ea72a7dc73b031db2Jim Grosbach    bool runOnFunction(Function &F);
648b818d7e98309125c6058c4ea72a7dc73b031db2Jim Grosbach
658b818d7e98309125c6058c4ea72a7dc73b031db2Jim Grosbach    virtual void getAnalysisUsage(AnalysisUsage &AU) const { }
668b818d7e98309125c6058c4ea72a7dc73b031db2Jim Grosbach    const char *getPassName() const {
678b818d7e98309125c6058c4ea72a7dc73b031db2Jim Grosbach      return "SJLJ Exception Handling preparation";
688b818d7e98309125c6058c4ea72a7dc73b031db2Jim Grosbach    }
698b818d7e98309125c6058c4ea72a7dc73b031db2Jim Grosbach
708b818d7e98309125c6058c4ea72a7dc73b031db2Jim Grosbach  private:
718b818d7e98309125c6058c4ea72a7dc73b031db2Jim Grosbach    void markInvokeCallSite(InvokeInst *II, unsigned InvokeNo,
728b818d7e98309125c6058c4ea72a7dc73b031db2Jim Grosbach                            Value *CallSite,
738b818d7e98309125c6058c4ea72a7dc73b031db2Jim Grosbach                            SwitchInst *CatchSwitch);
748b818d7e98309125c6058c4ea72a7dc73b031db2Jim Grosbach    void splitLiveRangesLiveAcrossInvokes(std::vector<InvokeInst*> &Invokes);
758b818d7e98309125c6058c4ea72a7dc73b031db2Jim Grosbach    bool insertSjLjEHSupport(Function &F);
768b818d7e98309125c6058c4ea72a7dc73b031db2Jim Grosbach  };
778b818d7e98309125c6058c4ea72a7dc73b031db2Jim Grosbach} // end anonymous namespace
788b818d7e98309125c6058c4ea72a7dc73b031db2Jim Grosbach
798b818d7e98309125c6058c4ea72a7dc73b031db2Jim Grosbachchar SjLjEHPass::ID = 0;
808b818d7e98309125c6058c4ea72a7dc73b031db2Jim Grosbach
818b818d7e98309125c6058c4ea72a7dc73b031db2Jim Grosbach// Public Interface To the SjLjEHPass pass.
828b818d7e98309125c6058c4ea72a7dc73b031db2Jim GrosbachFunctionPass *llvm::createSjLjEHPass(const TargetLowering *TLI) {
838b818d7e98309125c6058c4ea72a7dc73b031db2Jim Grosbach  return new SjLjEHPass(TLI);
848b818d7e98309125c6058c4ea72a7dc73b031db2Jim Grosbach}
858b818d7e98309125c6058c4ea72a7dc73b031db2Jim Grosbach// doInitialization - Make sure that there is a prototype for abort in the
868b818d7e98309125c6058c4ea72a7dc73b031db2Jim Grosbach// current module.
878b818d7e98309125c6058c4ea72a7dc73b031db2Jim Grosbachbool SjLjEHPass::doInitialization(Module &M) {
888b818d7e98309125c6058c4ea72a7dc73b031db2Jim Grosbach  // Build the function context structure.
898b818d7e98309125c6058c4ea72a7dc73b031db2Jim Grosbach  // builtin_setjmp uses a five word jbuf
908b818d7e98309125c6058c4ea72a7dc73b031db2Jim Grosbach  const Type *VoidPtrTy =
918b818d7e98309125c6058c4ea72a7dc73b031db2Jim Grosbach          PointerType::getUnqual(Type::getInt8Ty(M.getContext()));
928b818d7e98309125c6058c4ea72a7dc73b031db2Jim Grosbach  const Type *Int32Ty = Type::getInt32Ty(M.getContext());
938b818d7e98309125c6058c4ea72a7dc73b031db2Jim Grosbach  FunctionContextTy =
948b818d7e98309125c6058c4ea72a7dc73b031db2Jim Grosbach    StructType::get(M.getContext(),
958b818d7e98309125c6058c4ea72a7dc73b031db2Jim Grosbach                    VoidPtrTy,                        // __prev
968b818d7e98309125c6058c4ea72a7dc73b031db2Jim Grosbach                    Int32Ty,                          // call_site
978b818d7e98309125c6058c4ea72a7dc73b031db2Jim Grosbach                    ArrayType::get(Int32Ty, 4),       // __data
988b818d7e98309125c6058c4ea72a7dc73b031db2Jim Grosbach                    VoidPtrTy,                        // __personality
998b818d7e98309125c6058c4ea72a7dc73b031db2Jim Grosbach                    VoidPtrTy,                        // __lsda
1008b818d7e98309125c6058c4ea72a7dc73b031db2Jim Grosbach                    ArrayType::get(VoidPtrTy, 5),     // __jbuf
1018b818d7e98309125c6058c4ea72a7dc73b031db2Jim Grosbach                    NULL);
1028b818d7e98309125c6058c4ea72a7dc73b031db2Jim Grosbach  RegisterFn = M.getOrInsertFunction("_Unwind_SjLj_Register",
1038b818d7e98309125c6058c4ea72a7dc73b031db2Jim Grosbach                                     Type::getVoidTy(M.getContext()),
1048b818d7e98309125c6058c4ea72a7dc73b031db2Jim Grosbach                                     PointerType::getUnqual(FunctionContextTy),
1058b818d7e98309125c6058c4ea72a7dc73b031db2Jim Grosbach                                     (Type *)0);
1068b818d7e98309125c6058c4ea72a7dc73b031db2Jim Grosbach  UnregisterFn =
1078b818d7e98309125c6058c4ea72a7dc73b031db2Jim Grosbach    M.getOrInsertFunction("_Unwind_SjLj_Unregister",
1088b818d7e98309125c6058c4ea72a7dc73b031db2Jim Grosbach                          Type::getVoidTy(M.getContext()),
1098b818d7e98309125c6058c4ea72a7dc73b031db2Jim Grosbach                          PointerType::getUnqual(FunctionContextTy),
1108b818d7e98309125c6058c4ea72a7dc73b031db2Jim Grosbach                          (Type *)0);
1118b818d7e98309125c6058c4ea72a7dc73b031db2Jim Grosbach  ResumeFn =
1128b818d7e98309125c6058c4ea72a7dc73b031db2Jim Grosbach    M.getOrInsertFunction("_Unwind_SjLj_Resume",
1138b818d7e98309125c6058c4ea72a7dc73b031db2Jim Grosbach                          Type::getVoidTy(M.getContext()),
1148b818d7e98309125c6058c4ea72a7dc73b031db2Jim Grosbach                          VoidPtrTy,
1158b818d7e98309125c6058c4ea72a7dc73b031db2Jim Grosbach                          (Type *)0);
1168b818d7e98309125c6058c4ea72a7dc73b031db2Jim Grosbach  FrameAddrFn = Intrinsic::getDeclaration(&M, Intrinsic::frameaddress);
1178b818d7e98309125c6058c4ea72a7dc73b031db2Jim Grosbach  BuiltinSetjmpFn = Intrinsic::getDeclaration(&M, Intrinsic::eh_sjlj_setjmp);
1188b818d7e98309125c6058c4ea72a7dc73b031db2Jim Grosbach  LSDAAddrFn = Intrinsic::getDeclaration(&M, Intrinsic::eh_sjlj_lsda);
1198b818d7e98309125c6058c4ea72a7dc73b031db2Jim Grosbach  Selector32Fn = Intrinsic::getDeclaration(&M, Intrinsic::eh_selector_i32);
1208b818d7e98309125c6058c4ea72a7dc73b031db2Jim Grosbach  Selector64Fn = Intrinsic::getDeclaration(&M, Intrinsic::eh_selector_i64);
1218b818d7e98309125c6058c4ea72a7dc73b031db2Jim Grosbach  ExceptionFn = Intrinsic::getDeclaration(&M, Intrinsic::eh_exception);
1228b818d7e98309125c6058c4ea72a7dc73b031db2Jim Grosbach
1238b818d7e98309125c6058c4ea72a7dc73b031db2Jim Grosbach  return true;
1248b818d7e98309125c6058c4ea72a7dc73b031db2Jim Grosbach}
1258b818d7e98309125c6058c4ea72a7dc73b031db2Jim Grosbach
1268b818d7e98309125c6058c4ea72a7dc73b031db2Jim Grosbach/// markInvokeCallSite - Insert code to mark the call_site for this invoke
1278b818d7e98309125c6058c4ea72a7dc73b031db2Jim Grosbachvoid SjLjEHPass::markInvokeCallSite(InvokeInst *II, unsigned InvokeNo,
1288b818d7e98309125c6058c4ea72a7dc73b031db2Jim Grosbach                                    Value *CallSite,
1298b818d7e98309125c6058c4ea72a7dc73b031db2Jim Grosbach                                    SwitchInst *CatchSwitch) {
1308b818d7e98309125c6058c4ea72a7dc73b031db2Jim Grosbach  ConstantInt *CallSiteNoC= ConstantInt::get(Type::getInt32Ty(II->getContext()),
1318b818d7e98309125c6058c4ea72a7dc73b031db2Jim Grosbach                                            InvokeNo);
1328b818d7e98309125c6058c4ea72a7dc73b031db2Jim Grosbach  // The runtime comes back to the dispatcher with the call_site - 1 in
1338b818d7e98309125c6058c4ea72a7dc73b031db2Jim Grosbach  // the context. Odd, but there it is.
1348b818d7e98309125c6058c4ea72a7dc73b031db2Jim Grosbach  ConstantInt *SwitchValC = ConstantInt::get(Type::getInt32Ty(II->getContext()),
1358b818d7e98309125c6058c4ea72a7dc73b031db2Jim Grosbach                                            InvokeNo - 1);
1368b818d7e98309125c6058c4ea72a7dc73b031db2Jim Grosbach
1378b818d7e98309125c6058c4ea72a7dc73b031db2Jim Grosbach  // If the unwind edge has phi nodes, split the edge.
1388b818d7e98309125c6058c4ea72a7dc73b031db2Jim Grosbach  if (isa<PHINode>(II->getUnwindDest()->begin())) {
1398b818d7e98309125c6058c4ea72a7dc73b031db2Jim Grosbach    SplitCriticalEdge(II, 1, this);
1408b818d7e98309125c6058c4ea72a7dc73b031db2Jim Grosbach
1418b818d7e98309125c6058c4ea72a7dc73b031db2Jim Grosbach    // If there are any phi nodes left, they must have a single predecessor.
1428b818d7e98309125c6058c4ea72a7dc73b031db2Jim Grosbach    while (PHINode *PN = dyn_cast<PHINode>(II->getUnwindDest()->begin())) {
1438b818d7e98309125c6058c4ea72a7dc73b031db2Jim Grosbach      PN->replaceAllUsesWith(PN->getIncomingValue(0));
1448b818d7e98309125c6058c4ea72a7dc73b031db2Jim Grosbach      PN->eraseFromParent();
1458b818d7e98309125c6058c4ea72a7dc73b031db2Jim Grosbach    }
1468b818d7e98309125c6058c4ea72a7dc73b031db2Jim Grosbach  }
1478b818d7e98309125c6058c4ea72a7dc73b031db2Jim Grosbach
1488b818d7e98309125c6058c4ea72a7dc73b031db2Jim Grosbach  // Insert a store of the invoke num before the invoke and store zero into the
1498b818d7e98309125c6058c4ea72a7dc73b031db2Jim Grosbach  // location afterward.
1508b818d7e98309125c6058c4ea72a7dc73b031db2Jim Grosbach  new StoreInst(CallSiteNoC, CallSite, true, II);  // volatile
1518b818d7e98309125c6058c4ea72a7dc73b031db2Jim Grosbach
1528b818d7e98309125c6058c4ea72a7dc73b031db2Jim Grosbach  // Add a switch case to our unwind block.
1538b818d7e98309125c6058c4ea72a7dc73b031db2Jim Grosbach  CatchSwitch->addCase(SwitchValC, II->getUnwindDest());
1548b818d7e98309125c6058c4ea72a7dc73b031db2Jim Grosbach  // We still want this to look like an invoke so we emit the LSDA properly
1558b818d7e98309125c6058c4ea72a7dc73b031db2Jim Grosbach  // FIXME: ??? Or will this cause strangeness with mis-matched IDs like
1568b818d7e98309125c6058c4ea72a7dc73b031db2Jim Grosbach  //  when it was in the front end?
1578b818d7e98309125c6058c4ea72a7dc73b031db2Jim Grosbach}
1588b818d7e98309125c6058c4ea72a7dc73b031db2Jim Grosbach
1598b818d7e98309125c6058c4ea72a7dc73b031db2Jim Grosbach/// MarkBlocksLiveIn - Insert BB and all of its predescessors into LiveBBs until
1608b818d7e98309125c6058c4ea72a7dc73b031db2Jim Grosbach/// we reach blocks we've already seen.
1618b818d7e98309125c6058c4ea72a7dc73b031db2Jim Grosbachstatic void MarkBlocksLiveIn(BasicBlock *BB, std::set<BasicBlock*> &LiveBBs) {
1628b818d7e98309125c6058c4ea72a7dc73b031db2Jim Grosbach  if (!LiveBBs.insert(BB).second) return; // already been here.
1638b818d7e98309125c6058c4ea72a7dc73b031db2Jim Grosbach
1648b818d7e98309125c6058c4ea72a7dc73b031db2Jim Grosbach  for (pred_iterator PI = pred_begin(BB), E = pred_end(BB); PI != E; ++PI)
1658b818d7e98309125c6058c4ea72a7dc73b031db2Jim Grosbach    MarkBlocksLiveIn(*PI, LiveBBs);
1668b818d7e98309125c6058c4ea72a7dc73b031db2Jim Grosbach}
1678b818d7e98309125c6058c4ea72a7dc73b031db2Jim Grosbach
1688b818d7e98309125c6058c4ea72a7dc73b031db2Jim Grosbach// live across unwind edges.  Each value that is live across an unwind edge
1698b818d7e98309125c6058c4ea72a7dc73b031db2Jim Grosbach// we spill into a stack location, guaranteeing that there is nothing live
1708b818d7e98309125c6058c4ea72a7dc73b031db2Jim Grosbach// across the unwind edge.  This process also splits all critical edges
1718b818d7e98309125c6058c4ea72a7dc73b031db2Jim Grosbach// coming out of invoke's.
1728b818d7e98309125c6058c4ea72a7dc73b031db2Jim Grosbachvoid SjLjEHPass::
1738b818d7e98309125c6058c4ea72a7dc73b031db2Jim GrosbachsplitLiveRangesLiveAcrossInvokes(std::vector<InvokeInst*> &Invokes) {
1748b818d7e98309125c6058c4ea72a7dc73b031db2Jim Grosbach  // First step, split all critical edges from invoke instructions.
1758b818d7e98309125c6058c4ea72a7dc73b031db2Jim Grosbach  for (unsigned i = 0, e = Invokes.size(); i != e; ++i) {
1768b818d7e98309125c6058c4ea72a7dc73b031db2Jim Grosbach    InvokeInst *II = Invokes[i];
1778b818d7e98309125c6058c4ea72a7dc73b031db2Jim Grosbach    SplitCriticalEdge(II, 0, this);
1788b818d7e98309125c6058c4ea72a7dc73b031db2Jim Grosbach    SplitCriticalEdge(II, 1, this);
1798b818d7e98309125c6058c4ea72a7dc73b031db2Jim Grosbach    assert(!isa<PHINode>(II->getNormalDest()) &&
1808b818d7e98309125c6058c4ea72a7dc73b031db2Jim Grosbach           !isa<PHINode>(II->getUnwindDest()) &&
1818b818d7e98309125c6058c4ea72a7dc73b031db2Jim Grosbach           "critical edge splitting left single entry phi nodes?");
1828b818d7e98309125c6058c4ea72a7dc73b031db2Jim Grosbach  }
1838b818d7e98309125c6058c4ea72a7dc73b031db2Jim Grosbach
1848b818d7e98309125c6058c4ea72a7dc73b031db2Jim Grosbach  Function *F = Invokes.back()->getParent()->getParent();
1858b818d7e98309125c6058c4ea72a7dc73b031db2Jim Grosbach
1868b818d7e98309125c6058c4ea72a7dc73b031db2Jim Grosbach  // To avoid having to handle incoming arguments specially, we lower each arg
1878b818d7e98309125c6058c4ea72a7dc73b031db2Jim Grosbach  // to a copy instruction in the entry block.  This ensures that the argument
1888b818d7e98309125c6058c4ea72a7dc73b031db2Jim Grosbach  // value itself cannot be live across the entry block.
1898b818d7e98309125c6058c4ea72a7dc73b031db2Jim Grosbach  BasicBlock::iterator AfterAllocaInsertPt = F->begin()->begin();
1908b818d7e98309125c6058c4ea72a7dc73b031db2Jim Grosbach  while (isa<AllocaInst>(AfterAllocaInsertPt) &&
1918b818d7e98309125c6058c4ea72a7dc73b031db2Jim Grosbach        isa<ConstantInt>(cast<AllocaInst>(AfterAllocaInsertPt)->getArraySize()))
1928b818d7e98309125c6058c4ea72a7dc73b031db2Jim Grosbach    ++AfterAllocaInsertPt;
1938b818d7e98309125c6058c4ea72a7dc73b031db2Jim Grosbach  for (Function::arg_iterator AI = F->arg_begin(), E = F->arg_end();
1948b818d7e98309125c6058c4ea72a7dc73b031db2Jim Grosbach       AI != E; ++AI) {
1958b818d7e98309125c6058c4ea72a7dc73b031db2Jim Grosbach    // This is always a no-op cast because we're casting AI to AI->getType() so
1968b818d7e98309125c6058c4ea72a7dc73b031db2Jim Grosbach    // src and destination types are identical. BitCast is the only possibility.
1978b818d7e98309125c6058c4ea72a7dc73b031db2Jim Grosbach    CastInst *NC = new BitCastInst(
1988b818d7e98309125c6058c4ea72a7dc73b031db2Jim Grosbach      AI, AI->getType(), AI->getName()+".tmp", AfterAllocaInsertPt);
1998b818d7e98309125c6058c4ea72a7dc73b031db2Jim Grosbach    AI->replaceAllUsesWith(NC);
2008b818d7e98309125c6058c4ea72a7dc73b031db2Jim Grosbach    // Normally its is forbidden to replace a CastInst's operand because it
2018b818d7e98309125c6058c4ea72a7dc73b031db2Jim Grosbach    // could cause the opcode to reflect an illegal conversion. However, we're
2028b818d7e98309125c6058c4ea72a7dc73b031db2Jim Grosbach    // replacing it here with the same value it was constructed with to simply
2038b818d7e98309125c6058c4ea72a7dc73b031db2Jim Grosbach    // make NC its user.
2048b818d7e98309125c6058c4ea72a7dc73b031db2Jim Grosbach    NC->setOperand(0, AI);
2058b818d7e98309125c6058c4ea72a7dc73b031db2Jim Grosbach  }
2068b818d7e98309125c6058c4ea72a7dc73b031db2Jim Grosbach
2078b818d7e98309125c6058c4ea72a7dc73b031db2Jim Grosbach  // Finally, scan the code looking for instructions with bad live ranges.
2088b818d7e98309125c6058c4ea72a7dc73b031db2Jim Grosbach  for (Function::iterator BB = F->begin(), E = F->end(); BB != E; ++BB)
2098b818d7e98309125c6058c4ea72a7dc73b031db2Jim Grosbach    for (BasicBlock::iterator II = BB->begin(), E = BB->end(); II != E; ++II) {
2108b818d7e98309125c6058c4ea72a7dc73b031db2Jim Grosbach      // Ignore obvious cases we don't have to handle.  In particular, most
2118b818d7e98309125c6058c4ea72a7dc73b031db2Jim Grosbach      // instructions either have no uses or only have a single use inside the
2128b818d7e98309125c6058c4ea72a7dc73b031db2Jim Grosbach      // current block.  Ignore them quickly.
2138b818d7e98309125c6058c4ea72a7dc73b031db2Jim Grosbach      Instruction *Inst = II;
2148b818d7e98309125c6058c4ea72a7dc73b031db2Jim Grosbach      if (Inst->use_empty()) continue;
2158b818d7e98309125c6058c4ea72a7dc73b031db2Jim Grosbach      if (Inst->hasOneUse() &&
2168b818d7e98309125c6058c4ea72a7dc73b031db2Jim Grosbach          cast<Instruction>(Inst->use_back())->getParent() == BB &&
2178b818d7e98309125c6058c4ea72a7dc73b031db2Jim Grosbach          !isa<PHINode>(Inst->use_back())) continue;
2188b818d7e98309125c6058c4ea72a7dc73b031db2Jim Grosbach
2198b818d7e98309125c6058c4ea72a7dc73b031db2Jim Grosbach      // If this is an alloca in the entry block, it's not a real register
2208b818d7e98309125c6058c4ea72a7dc73b031db2Jim Grosbach      // value.
2218b818d7e98309125c6058c4ea72a7dc73b031db2Jim Grosbach      if (AllocaInst *AI = dyn_cast<AllocaInst>(Inst))
2228b818d7e98309125c6058c4ea72a7dc73b031db2Jim Grosbach        if (isa<ConstantInt>(AI->getArraySize()) && BB == F->begin())
2238b818d7e98309125c6058c4ea72a7dc73b031db2Jim Grosbach          continue;
2248b818d7e98309125c6058c4ea72a7dc73b031db2Jim Grosbach
2258b818d7e98309125c6058c4ea72a7dc73b031db2Jim Grosbach      // Avoid iterator invalidation by copying users to a temporary vector.
2268b818d7e98309125c6058c4ea72a7dc73b031db2Jim Grosbach      std::vector<Instruction*> Users;
2278b818d7e98309125c6058c4ea72a7dc73b031db2Jim Grosbach      for (Value::use_iterator UI = Inst->use_begin(), E = Inst->use_end();
2288b818d7e98309125c6058c4ea72a7dc73b031db2Jim Grosbach           UI != E; ++UI) {
2298b818d7e98309125c6058c4ea72a7dc73b031db2Jim Grosbach        Instruction *User = cast<Instruction>(*UI);
2308b818d7e98309125c6058c4ea72a7dc73b031db2Jim Grosbach        if (User->getParent() != BB || isa<PHINode>(User))
2318b818d7e98309125c6058c4ea72a7dc73b031db2Jim Grosbach          Users.push_back(User);
2328b818d7e98309125c6058c4ea72a7dc73b031db2Jim Grosbach      }
2338b818d7e98309125c6058c4ea72a7dc73b031db2Jim Grosbach
2348b818d7e98309125c6058c4ea72a7dc73b031db2Jim Grosbach      // Scan all of the uses and see if the live range is live across an unwind
2358b818d7e98309125c6058c4ea72a7dc73b031db2Jim Grosbach      // edge.  If we find a use live across an invoke edge, create an alloca
2368b818d7e98309125c6058c4ea72a7dc73b031db2Jim Grosbach      // and spill the value.
2378b818d7e98309125c6058c4ea72a7dc73b031db2Jim Grosbach      std::set<InvokeInst*> InvokesWithStoreInserted;
2388b818d7e98309125c6058c4ea72a7dc73b031db2Jim Grosbach
2398b818d7e98309125c6058c4ea72a7dc73b031db2Jim Grosbach      // Find all of the blocks that this value is live in.
2408b818d7e98309125c6058c4ea72a7dc73b031db2Jim Grosbach      std::set<BasicBlock*> LiveBBs;
2418b818d7e98309125c6058c4ea72a7dc73b031db2Jim Grosbach      LiveBBs.insert(Inst->getParent());
2428b818d7e98309125c6058c4ea72a7dc73b031db2Jim Grosbach      while (!Users.empty()) {
2438b818d7e98309125c6058c4ea72a7dc73b031db2Jim Grosbach        Instruction *U = Users.back();
2448b818d7e98309125c6058c4ea72a7dc73b031db2Jim Grosbach        Users.pop_back();
2458b818d7e98309125c6058c4ea72a7dc73b031db2Jim Grosbach
2468b818d7e98309125c6058c4ea72a7dc73b031db2Jim Grosbach        if (!isa<PHINode>(U)) {
2478b818d7e98309125c6058c4ea72a7dc73b031db2Jim Grosbach          MarkBlocksLiveIn(U->getParent(), LiveBBs);
2488b818d7e98309125c6058c4ea72a7dc73b031db2Jim Grosbach        } else {
2498b818d7e98309125c6058c4ea72a7dc73b031db2Jim Grosbach          // Uses for a PHI node occur in their predecessor block.
2508b818d7e98309125c6058c4ea72a7dc73b031db2Jim Grosbach          PHINode *PN = cast<PHINode>(U);
2518b818d7e98309125c6058c4ea72a7dc73b031db2Jim Grosbach          for (unsigned i = 0, e = PN->getNumIncomingValues(); i != e; ++i)
2528b818d7e98309125c6058c4ea72a7dc73b031db2Jim Grosbach            if (PN->getIncomingValue(i) == Inst)
2538b818d7e98309125c6058c4ea72a7dc73b031db2Jim Grosbach              MarkBlocksLiveIn(PN->getIncomingBlock(i), LiveBBs);
2548b818d7e98309125c6058c4ea72a7dc73b031db2Jim Grosbach        }
2558b818d7e98309125c6058c4ea72a7dc73b031db2Jim Grosbach      }
2568b818d7e98309125c6058c4ea72a7dc73b031db2Jim Grosbach
2578b818d7e98309125c6058c4ea72a7dc73b031db2Jim Grosbach      // Now that we know all of the blocks that this thing is live in, see if
2588b818d7e98309125c6058c4ea72a7dc73b031db2Jim Grosbach      // it includes any of the unwind locations.
2598b818d7e98309125c6058c4ea72a7dc73b031db2Jim Grosbach      bool NeedsSpill = false;
2608b818d7e98309125c6058c4ea72a7dc73b031db2Jim Grosbach      for (unsigned i = 0, e = Invokes.size(); i != e; ++i) {
2618b818d7e98309125c6058c4ea72a7dc73b031db2Jim Grosbach        BasicBlock *UnwindBlock = Invokes[i]->getUnwindDest();
2628b818d7e98309125c6058c4ea72a7dc73b031db2Jim Grosbach        if (UnwindBlock != BB && LiveBBs.count(UnwindBlock)) {
2638b818d7e98309125c6058c4ea72a7dc73b031db2Jim Grosbach          NeedsSpill = true;
2648b818d7e98309125c6058c4ea72a7dc73b031db2Jim Grosbach        }
2658b818d7e98309125c6058c4ea72a7dc73b031db2Jim Grosbach      }
2668b818d7e98309125c6058c4ea72a7dc73b031db2Jim Grosbach
2678b818d7e98309125c6058c4ea72a7dc73b031db2Jim Grosbach      // If we decided we need a spill, do it.
2688b818d7e98309125c6058c4ea72a7dc73b031db2Jim Grosbach      if (NeedsSpill) {
2698b818d7e98309125c6058c4ea72a7dc73b031db2Jim Grosbach        ++NumSpilled;
2708b818d7e98309125c6058c4ea72a7dc73b031db2Jim Grosbach        DemoteRegToStack(*Inst, true);
2718b818d7e98309125c6058c4ea72a7dc73b031db2Jim Grosbach      }
2728b818d7e98309125c6058c4ea72a7dc73b031db2Jim Grosbach    }
2738b818d7e98309125c6058c4ea72a7dc73b031db2Jim Grosbach}
2748b818d7e98309125c6058c4ea72a7dc73b031db2Jim Grosbach
2758b818d7e98309125c6058c4ea72a7dc73b031db2Jim Grosbachbool SjLjEHPass::insertSjLjEHSupport(Function &F) {
2768b818d7e98309125c6058c4ea72a7dc73b031db2Jim Grosbach  std::vector<ReturnInst*> Returns;
2778b818d7e98309125c6058c4ea72a7dc73b031db2Jim Grosbach  std::vector<UnwindInst*> Unwinds;
2788b818d7e98309125c6058c4ea72a7dc73b031db2Jim Grosbach  std::vector<InvokeInst*> Invokes;
2798b818d7e98309125c6058c4ea72a7dc73b031db2Jim Grosbach
2808b818d7e98309125c6058c4ea72a7dc73b031db2Jim Grosbach  // Look through the terminators of the basic blocks to find invokes, returns
2818b818d7e98309125c6058c4ea72a7dc73b031db2Jim Grosbach  // and unwinds
2828b818d7e98309125c6058c4ea72a7dc73b031db2Jim Grosbach  for (Function::iterator BB = F.begin(), E = F.end(); BB != E; ++BB)
2838b818d7e98309125c6058c4ea72a7dc73b031db2Jim Grosbach    if (ReturnInst *RI = dyn_cast<ReturnInst>(BB->getTerminator())) {
2848b818d7e98309125c6058c4ea72a7dc73b031db2Jim Grosbach      // Remember all return instructions in case we insert an invoke into this
2858b818d7e98309125c6058c4ea72a7dc73b031db2Jim Grosbach      // function.
2868b818d7e98309125c6058c4ea72a7dc73b031db2Jim Grosbach      Returns.push_back(RI);
2878b818d7e98309125c6058c4ea72a7dc73b031db2Jim Grosbach    } else if (InvokeInst *II = dyn_cast<InvokeInst>(BB->getTerminator())) {
2888b818d7e98309125c6058c4ea72a7dc73b031db2Jim Grosbach      Invokes.push_back(II);
2898b818d7e98309125c6058c4ea72a7dc73b031db2Jim Grosbach    } else if (UnwindInst *UI = dyn_cast<UnwindInst>(BB->getTerminator())) {
2908b818d7e98309125c6058c4ea72a7dc73b031db2Jim Grosbach      Unwinds.push_back(UI);
2918b818d7e98309125c6058c4ea72a7dc73b031db2Jim Grosbach    }
2928b818d7e98309125c6058c4ea72a7dc73b031db2Jim Grosbach  // If we don't have any invokes or unwinds, there's nothing to do.
2938b818d7e98309125c6058c4ea72a7dc73b031db2Jim Grosbach  if (Unwinds.empty() && Invokes.empty()) return false;
2948b818d7e98309125c6058c4ea72a7dc73b031db2Jim Grosbach
2958b818d7e98309125c6058c4ea72a7dc73b031db2Jim Grosbach  NumInvokes += Invokes.size();
2968b818d7e98309125c6058c4ea72a7dc73b031db2Jim Grosbach  NumUnwinds += Unwinds.size();
2978b818d7e98309125c6058c4ea72a7dc73b031db2Jim Grosbach
2988b818d7e98309125c6058c4ea72a7dc73b031db2Jim Grosbach
2998b818d7e98309125c6058c4ea72a7dc73b031db2Jim Grosbach  if (!Invokes.empty()) {
3008b818d7e98309125c6058c4ea72a7dc73b031db2Jim Grosbach    // We have invokes, so we need to add register/unregister calls to get
3018b818d7e98309125c6058c4ea72a7dc73b031db2Jim Grosbach    // this function onto the global unwind stack.
3028b818d7e98309125c6058c4ea72a7dc73b031db2Jim Grosbach    //
3038b818d7e98309125c6058c4ea72a7dc73b031db2Jim Grosbach    // First thing we need to do is scan the whole function for values that are
3048b818d7e98309125c6058c4ea72a7dc73b031db2Jim Grosbach    // live across unwind edges.  Each value that is live across an unwind edge
3058b818d7e98309125c6058c4ea72a7dc73b031db2Jim Grosbach    // we spill into a stack location, guaranteeing that there is nothing live
3068b818d7e98309125c6058c4ea72a7dc73b031db2Jim Grosbach    // across the unwind edge.  This process also splits all critical edges
3078b818d7e98309125c6058c4ea72a7dc73b031db2Jim Grosbach    // coming out of invoke's.
3088b818d7e98309125c6058c4ea72a7dc73b031db2Jim Grosbach    splitLiveRangesLiveAcrossInvokes(Invokes);
3098b818d7e98309125c6058c4ea72a7dc73b031db2Jim Grosbach
3108b818d7e98309125c6058c4ea72a7dc73b031db2Jim Grosbach    BasicBlock *EntryBB = F.begin();
3118b818d7e98309125c6058c4ea72a7dc73b031db2Jim Grosbach    // Create an alloca for the incoming jump buffer ptr and the new jump buffer
3128b818d7e98309125c6058c4ea72a7dc73b031db2Jim Grosbach    // that needs to be restored on all exits from the function.  This is an
3138b818d7e98309125c6058c4ea72a7dc73b031db2Jim Grosbach    // alloca because the value needs to be added to the global context list.
3148b818d7e98309125c6058c4ea72a7dc73b031db2Jim Grosbach    unsigned Align = 4; // FIXME: Should be a TLI check?
3158b818d7e98309125c6058c4ea72a7dc73b031db2Jim Grosbach    AllocaInst *FunctionContext =
3168b818d7e98309125c6058c4ea72a7dc73b031db2Jim Grosbach      new AllocaInst(FunctionContextTy, 0, Align,
3178b818d7e98309125c6058c4ea72a7dc73b031db2Jim Grosbach                     "fcn_context", F.begin()->begin());
3188b818d7e98309125c6058c4ea72a7dc73b031db2Jim Grosbach
3198b818d7e98309125c6058c4ea72a7dc73b031db2Jim Grosbach    Value *Idxs[2];
3208b818d7e98309125c6058c4ea72a7dc73b031db2Jim Grosbach    const Type *Int32Ty = Type::getInt32Ty(F.getContext());
3218b818d7e98309125c6058c4ea72a7dc73b031db2Jim Grosbach    Value *Zero = ConstantInt::get(Int32Ty, 0);
3228b818d7e98309125c6058c4ea72a7dc73b031db2Jim Grosbach    // We need to also keep around a reference to the call_site field
3238b818d7e98309125c6058c4ea72a7dc73b031db2Jim Grosbach    Idxs[0] = Zero;
3248b818d7e98309125c6058c4ea72a7dc73b031db2Jim Grosbach    Idxs[1] = ConstantInt::get(Int32Ty, 1);
3258b818d7e98309125c6058c4ea72a7dc73b031db2Jim Grosbach    CallSite = GetElementPtrInst::Create(FunctionContext, Idxs, Idxs+2,
3268b818d7e98309125c6058c4ea72a7dc73b031db2Jim Grosbach                                         "call_site",
3278b818d7e98309125c6058c4ea72a7dc73b031db2Jim Grosbach                                         EntryBB->getTerminator());
3288b818d7e98309125c6058c4ea72a7dc73b031db2Jim Grosbach
3298b818d7e98309125c6058c4ea72a7dc73b031db2Jim Grosbach    // The exception selector comes back in context->data[1]
3308b818d7e98309125c6058c4ea72a7dc73b031db2Jim Grosbach    Idxs[1] = ConstantInt::get(Int32Ty, 2);
3318b818d7e98309125c6058c4ea72a7dc73b031db2Jim Grosbach    Value *FCData = GetElementPtrInst::Create(FunctionContext, Idxs, Idxs+2,
3328b818d7e98309125c6058c4ea72a7dc73b031db2Jim Grosbach                                              "fc_data",
3338b818d7e98309125c6058c4ea72a7dc73b031db2Jim Grosbach                                              EntryBB->getTerminator());
3348b818d7e98309125c6058c4ea72a7dc73b031db2Jim Grosbach    Idxs[1] = ConstantInt::get(Int32Ty, 1);
3358b818d7e98309125c6058c4ea72a7dc73b031db2Jim Grosbach    Value *SelectorAddr = GetElementPtrInst::Create(FCData, Idxs, Idxs+2,
3368b818d7e98309125c6058c4ea72a7dc73b031db2Jim Grosbach                                                    "exc_selector_gep",
3378b818d7e98309125c6058c4ea72a7dc73b031db2Jim Grosbach                                                    EntryBB->getTerminator());
3388b818d7e98309125c6058c4ea72a7dc73b031db2Jim Grosbach    // The exception value comes back in context->data[0]
3398b818d7e98309125c6058c4ea72a7dc73b031db2Jim Grosbach    Idxs[1] = Zero;
3408b818d7e98309125c6058c4ea72a7dc73b031db2Jim Grosbach    Value *ExceptionAddr = GetElementPtrInst::Create(FCData, Idxs, Idxs+2,
3418b818d7e98309125c6058c4ea72a7dc73b031db2Jim Grosbach                                                     "exception_gep",
3428b818d7e98309125c6058c4ea72a7dc73b031db2Jim Grosbach                                                     EntryBB->getTerminator());
3438b818d7e98309125c6058c4ea72a7dc73b031db2Jim Grosbach
3448b818d7e98309125c6058c4ea72a7dc73b031db2Jim Grosbach    // Find the eh.selector.*  and eh.exception calls. We'll use the first
3458b818d7e98309125c6058c4ea72a7dc73b031db2Jim Grosbach    // ex.selector to determine the right personality function to use. For
3468b818d7e98309125c6058c4ea72a7dc73b031db2Jim Grosbach    // SJLJ, we always use the same personality for the whole function,
3478b818d7e98309125c6058c4ea72a7dc73b031db2Jim Grosbach    // not on a per-selector basis.
3488b818d7e98309125c6058c4ea72a7dc73b031db2Jim Grosbach    // FIXME: That's a bit ugly. Better way?
3498b818d7e98309125c6058c4ea72a7dc73b031db2Jim Grosbach    std::vector<CallInst*> EH_Selectors;
3508b818d7e98309125c6058c4ea72a7dc73b031db2Jim Grosbach    std::vector<CallInst*> EH_Exceptions;
3518b818d7e98309125c6058c4ea72a7dc73b031db2Jim Grosbach  for (Function::iterator BB = F.begin(), E = F.end(); BB != E; ++BB) {
3528b818d7e98309125c6058c4ea72a7dc73b031db2Jim Grosbach  //  for (unsigned i = 0, e = Invokes.size(); i != e; ++i) {
3538b818d7e98309125c6058c4ea72a7dc73b031db2Jim Grosbach//      BasicBlock *Pad = Invokes[0]->getUnwindDest();
3548b818d7e98309125c6058c4ea72a7dc73b031db2Jim Grosbach      for (BasicBlock::iterator I = BB->begin(), E = BB->end(); I != E; ++I) {
3558b818d7e98309125c6058c4ea72a7dc73b031db2Jim Grosbach        if (CallInst *CI = dyn_cast<CallInst>(I)) {
3568b818d7e98309125c6058c4ea72a7dc73b031db2Jim Grosbach          if (CI->getCalledFunction() == Selector32Fn ||
3578b818d7e98309125c6058c4ea72a7dc73b031db2Jim Grosbach              CI->getCalledFunction() == Selector64Fn) {
3588b818d7e98309125c6058c4ea72a7dc73b031db2Jim Grosbach            if (!PersonalityFn) PersonalityFn = CI->getOperand(2);
3598b818d7e98309125c6058c4ea72a7dc73b031db2Jim Grosbach            EH_Selectors.push_back(CI);
3608b818d7e98309125c6058c4ea72a7dc73b031db2Jim Grosbach          } else if (CI->getCalledFunction() == ExceptionFn) {
3618b818d7e98309125c6058c4ea72a7dc73b031db2Jim Grosbach            EH_Exceptions.push_back(CI);
3628b818d7e98309125c6058c4ea72a7dc73b031db2Jim Grosbach          }
3638b818d7e98309125c6058c4ea72a7dc73b031db2Jim Grosbach        }
3648b818d7e98309125c6058c4ea72a7dc73b031db2Jim Grosbach      }
3658b818d7e98309125c6058c4ea72a7dc73b031db2Jim Grosbach    }
3668b818d7e98309125c6058c4ea72a7dc73b031db2Jim Grosbach    // The result of the eh.selector call will be replaced with a
3678b818d7e98309125c6058c4ea72a7dc73b031db2Jim Grosbach    // a reference to the selector value returned in the function
3688b818d7e98309125c6058c4ea72a7dc73b031db2Jim Grosbach    // context. We leave the selector itself so the EH analysis later
3698b818d7e98309125c6058c4ea72a7dc73b031db2Jim Grosbach    // can use it.
3708b818d7e98309125c6058c4ea72a7dc73b031db2Jim Grosbach    for (int i = 0, e = EH_Selectors.size(); i < e; ++i) {
3718b818d7e98309125c6058c4ea72a7dc73b031db2Jim Grosbach      CallInst *I = EH_Selectors[i];
3728b818d7e98309125c6058c4ea72a7dc73b031db2Jim Grosbach      Value *SelectorVal = new LoadInst(SelectorAddr, "select_val", true, I);
3738b818d7e98309125c6058c4ea72a7dc73b031db2Jim Grosbach      I->replaceAllUsesWith(SelectorVal);
3748b818d7e98309125c6058c4ea72a7dc73b031db2Jim Grosbach    }
3758b818d7e98309125c6058c4ea72a7dc73b031db2Jim Grosbach    // eh.exception calls are replaced with references to the proper
3768b818d7e98309125c6058c4ea72a7dc73b031db2Jim Grosbach    // location in the context. Unlike eh.selector, the eh.exception
3778b818d7e98309125c6058c4ea72a7dc73b031db2Jim Grosbach    // calls are removed entirely.
3788b818d7e98309125c6058c4ea72a7dc73b031db2Jim Grosbach    for (int i = 0, e = EH_Exceptions.size(); i < e; ++i) {
3798b818d7e98309125c6058c4ea72a7dc73b031db2Jim Grosbach      CallInst *I = EH_Exceptions[i];
3808b818d7e98309125c6058c4ea72a7dc73b031db2Jim Grosbach      // Possible for there to be duplicates, so check to make sure
3818b818d7e98309125c6058c4ea72a7dc73b031db2Jim Grosbach      // the instruction hasn't already been removed.
3828b818d7e98309125c6058c4ea72a7dc73b031db2Jim Grosbach      if (!I->getParent()) continue;
3838b818d7e98309125c6058c4ea72a7dc73b031db2Jim Grosbach      Value *Val = new LoadInst(ExceptionAddr, "exception", true, I);
3848b818d7e98309125c6058c4ea72a7dc73b031db2Jim Grosbach      Val = CastInst::Create(Instruction::IntToPtr, Val,
3858b818d7e98309125c6058c4ea72a7dc73b031db2Jim Grosbach                             PointerType::getUnqual(Type::getInt8Ty(F.getContext())),
3868b818d7e98309125c6058c4ea72a7dc73b031db2Jim Grosbach                             "", I);
3878b818d7e98309125c6058c4ea72a7dc73b031db2Jim Grosbach
3888b818d7e98309125c6058c4ea72a7dc73b031db2Jim Grosbach      I->replaceAllUsesWith(Val);
3898b818d7e98309125c6058c4ea72a7dc73b031db2Jim Grosbach      I->eraseFromParent();
3908b818d7e98309125c6058c4ea72a7dc73b031db2Jim Grosbach    }
3918b818d7e98309125c6058c4ea72a7dc73b031db2Jim Grosbach
3928b818d7e98309125c6058c4ea72a7dc73b031db2Jim Grosbach
3938b818d7e98309125c6058c4ea72a7dc73b031db2Jim Grosbach
3948b818d7e98309125c6058c4ea72a7dc73b031db2Jim Grosbach
3958b818d7e98309125c6058c4ea72a7dc73b031db2Jim Grosbach    // The entry block changes to have the eh.sjlj.setjmp, with a conditional
3968b818d7e98309125c6058c4ea72a7dc73b031db2Jim Grosbach    // branch to a dispatch block for non-zero returns. If we return normally,
3978b818d7e98309125c6058c4ea72a7dc73b031db2Jim Grosbach    // we're not handling an exception and just register the function context
3988b818d7e98309125c6058c4ea72a7dc73b031db2Jim Grosbach    // and continue.
3998b818d7e98309125c6058c4ea72a7dc73b031db2Jim Grosbach
4008b818d7e98309125c6058c4ea72a7dc73b031db2Jim Grosbach    // Create the dispatch block.  The dispatch block is basically a big switch
4018b818d7e98309125c6058c4ea72a7dc73b031db2Jim Grosbach    // statement that goes to all of the invoke landing pads.
4028b818d7e98309125c6058c4ea72a7dc73b031db2Jim Grosbach    BasicBlock *DispatchBlock =
4038b818d7e98309125c6058c4ea72a7dc73b031db2Jim Grosbach            BasicBlock::Create(F.getContext(), "eh.sjlj.setjmp.catch", &F);
4048b818d7e98309125c6058c4ea72a7dc73b031db2Jim Grosbach
4058b818d7e98309125c6058c4ea72a7dc73b031db2Jim Grosbach    // Insert a load in the Catch block, and a switch on its value.  By default,
4068b818d7e98309125c6058c4ea72a7dc73b031db2Jim Grosbach    // we go to a block that just does an unwind (which is the correct action
4078b818d7e98309125c6058c4ea72a7dc73b031db2Jim Grosbach    // for a standard call).
4088b818d7e98309125c6058c4ea72a7dc73b031db2Jim Grosbach    BasicBlock *UnwindBlock = BasicBlock::Create(F.getContext(), "unwindbb", &F);
4098b818d7e98309125c6058c4ea72a7dc73b031db2Jim Grosbach    Unwinds.push_back(new UnwindInst(F.getContext(), UnwindBlock));
4108b818d7e98309125c6058c4ea72a7dc73b031db2Jim Grosbach
4118b818d7e98309125c6058c4ea72a7dc73b031db2Jim Grosbach    Value *DispatchLoad = new LoadInst(CallSite, "invoke.num", true,
4128b818d7e98309125c6058c4ea72a7dc73b031db2Jim Grosbach                                       DispatchBlock);
4138b818d7e98309125c6058c4ea72a7dc73b031db2Jim Grosbach    SwitchInst *DispatchSwitch =
4148b818d7e98309125c6058c4ea72a7dc73b031db2Jim Grosbach      SwitchInst::Create(DispatchLoad, UnwindBlock, Invokes.size(), DispatchBlock);
4158b818d7e98309125c6058c4ea72a7dc73b031db2Jim Grosbach    // Split the entry block to insert the conditional branch for the setjmp.
4168b818d7e98309125c6058c4ea72a7dc73b031db2Jim Grosbach    BasicBlock *ContBlock = EntryBB->splitBasicBlock(EntryBB->getTerminator(),
4178b818d7e98309125c6058c4ea72a7dc73b031db2Jim Grosbach                                                     "eh.sjlj.setjmp.cont");
4188b818d7e98309125c6058c4ea72a7dc73b031db2Jim Grosbach
4198b818d7e98309125c6058c4ea72a7dc73b031db2Jim Grosbach    // Populate the Function Context
4208b818d7e98309125c6058c4ea72a7dc73b031db2Jim Grosbach    //   1. LSDA address
4218b818d7e98309125c6058c4ea72a7dc73b031db2Jim Grosbach    //   2. Personality function address
4228b818d7e98309125c6058c4ea72a7dc73b031db2Jim Grosbach    //   3. jmpbuf (save FP and call eh.sjlj.setjmp)
4238b818d7e98309125c6058c4ea72a7dc73b031db2Jim Grosbach
4248b818d7e98309125c6058c4ea72a7dc73b031db2Jim Grosbach    // LSDA address
4258b818d7e98309125c6058c4ea72a7dc73b031db2Jim Grosbach    Idxs[0] = Zero;
4268b818d7e98309125c6058c4ea72a7dc73b031db2Jim Grosbach    Idxs[1] = ConstantInt::get(Int32Ty, 4);
4278b818d7e98309125c6058c4ea72a7dc73b031db2Jim Grosbach    Value *LSDAFieldPtr =
4288b818d7e98309125c6058c4ea72a7dc73b031db2Jim Grosbach      GetElementPtrInst::Create(FunctionContext, Idxs, Idxs+2,
4298b818d7e98309125c6058c4ea72a7dc73b031db2Jim Grosbach                                "lsda_gep",
4308b818d7e98309125c6058c4ea72a7dc73b031db2Jim Grosbach                                EntryBB->getTerminator());
4318b818d7e98309125c6058c4ea72a7dc73b031db2Jim Grosbach    Value *LSDA = CallInst::Create(LSDAAddrFn, "lsda_addr",
4328b818d7e98309125c6058c4ea72a7dc73b031db2Jim Grosbach                                   EntryBB->getTerminator());
4338b818d7e98309125c6058c4ea72a7dc73b031db2Jim Grosbach    new StoreInst(LSDA, LSDAFieldPtr, true, EntryBB->getTerminator());
4348b818d7e98309125c6058c4ea72a7dc73b031db2Jim Grosbach
4358b818d7e98309125c6058c4ea72a7dc73b031db2Jim Grosbach    Idxs[1] = ConstantInt::get(Int32Ty, 3);
4368b818d7e98309125c6058c4ea72a7dc73b031db2Jim Grosbach    Value *PersonalityFieldPtr =
4378b818d7e98309125c6058c4ea72a7dc73b031db2Jim Grosbach      GetElementPtrInst::Create(FunctionContext, Idxs, Idxs+2,
4388b818d7e98309125c6058c4ea72a7dc73b031db2Jim Grosbach                                "lsda_gep",
4398b818d7e98309125c6058c4ea72a7dc73b031db2Jim Grosbach                                EntryBB->getTerminator());
4408b818d7e98309125c6058c4ea72a7dc73b031db2Jim Grosbach    new StoreInst(PersonalityFn, PersonalityFieldPtr, true,
4418b818d7e98309125c6058c4ea72a7dc73b031db2Jim Grosbach                  EntryBB->getTerminator());
4428b818d7e98309125c6058c4ea72a7dc73b031db2Jim Grosbach
4438b818d7e98309125c6058c4ea72a7dc73b031db2Jim Grosbach    //   Save the frame pointer.
4448b818d7e98309125c6058c4ea72a7dc73b031db2Jim Grosbach    Idxs[1] = ConstantInt::get(Int32Ty, 5);
4458b818d7e98309125c6058c4ea72a7dc73b031db2Jim Grosbach    Value *FieldPtr
4468b818d7e98309125c6058c4ea72a7dc73b031db2Jim Grosbach      = GetElementPtrInst::Create(FunctionContext, Idxs, Idxs+2,
4478b818d7e98309125c6058c4ea72a7dc73b031db2Jim Grosbach                                  "jbuf_gep",
4488b818d7e98309125c6058c4ea72a7dc73b031db2Jim Grosbach                                  EntryBB->getTerminator());
4498b818d7e98309125c6058c4ea72a7dc73b031db2Jim Grosbach    Idxs[1] = ConstantInt::get(Int32Ty, 0);
4508b818d7e98309125c6058c4ea72a7dc73b031db2Jim Grosbach    Value *ElemPtr =
4518b818d7e98309125c6058c4ea72a7dc73b031db2Jim Grosbach      GetElementPtrInst::Create(FieldPtr, Idxs, Idxs+2, "jbuf_fp_gep",
4528b818d7e98309125c6058c4ea72a7dc73b031db2Jim Grosbach                                EntryBB->getTerminator());
4538b818d7e98309125c6058c4ea72a7dc73b031db2Jim Grosbach
4548b818d7e98309125c6058c4ea72a7dc73b031db2Jim Grosbach    Value *Val = CallInst::Create(FrameAddrFn,
4558b818d7e98309125c6058c4ea72a7dc73b031db2Jim Grosbach                                  ConstantInt::get(Int32Ty, 0),
4568b818d7e98309125c6058c4ea72a7dc73b031db2Jim Grosbach                                  "fp",
4578b818d7e98309125c6058c4ea72a7dc73b031db2Jim Grosbach                                  EntryBB->getTerminator());
4588b818d7e98309125c6058c4ea72a7dc73b031db2Jim Grosbach    new StoreInst(Val, ElemPtr, true, EntryBB->getTerminator());
4598b818d7e98309125c6058c4ea72a7dc73b031db2Jim Grosbach    // Call the setjmp instrinsic. It fills in the rest of the jmpbuf
4608b818d7e98309125c6058c4ea72a7dc73b031db2Jim Grosbach    Value *SetjmpArg =
4618b818d7e98309125c6058c4ea72a7dc73b031db2Jim Grosbach      CastInst::Create(Instruction::BitCast, FieldPtr,
4628b818d7e98309125c6058c4ea72a7dc73b031db2Jim Grosbach                        Type::getInt8Ty(F.getContext())->getPointerTo(), "",
4638b818d7e98309125c6058c4ea72a7dc73b031db2Jim Grosbach                        EntryBB->getTerminator());
4648b818d7e98309125c6058c4ea72a7dc73b031db2Jim Grosbach    Value *DispatchVal = CallInst::Create(BuiltinSetjmpFn, SetjmpArg,
4658b818d7e98309125c6058c4ea72a7dc73b031db2Jim Grosbach                                          "dispatch",
4668b818d7e98309125c6058c4ea72a7dc73b031db2Jim Grosbach                                          EntryBB->getTerminator());
4678b818d7e98309125c6058c4ea72a7dc73b031db2Jim Grosbach    // check the return value of the setjmp. non-zero goes to dispatcher
4688b818d7e98309125c6058c4ea72a7dc73b031db2Jim Grosbach    Value *IsNormal = new ICmpInst(EntryBB->getTerminator(),
4698b818d7e98309125c6058c4ea72a7dc73b031db2Jim Grosbach                                   ICmpInst::ICMP_EQ, DispatchVal, Zero,
4708b818d7e98309125c6058c4ea72a7dc73b031db2Jim Grosbach                                   "notunwind");
4718b818d7e98309125c6058c4ea72a7dc73b031db2Jim Grosbach    // Nuke the uncond branch.
4728b818d7e98309125c6058c4ea72a7dc73b031db2Jim Grosbach    EntryBB->getTerminator()->eraseFromParent();
4738b818d7e98309125c6058c4ea72a7dc73b031db2Jim Grosbach
4748b818d7e98309125c6058c4ea72a7dc73b031db2Jim Grosbach    // Put in a new condbranch in its place.
4758b818d7e98309125c6058c4ea72a7dc73b031db2Jim Grosbach    BranchInst::Create(ContBlock, DispatchBlock, IsNormal, EntryBB);
4768b818d7e98309125c6058c4ea72a7dc73b031db2Jim Grosbach
4778b818d7e98309125c6058c4ea72a7dc73b031db2Jim Grosbach    // Register the function context and make sure it's known to not throw
4788b818d7e98309125c6058c4ea72a7dc73b031db2Jim Grosbach    CallInst *Register =
4798b818d7e98309125c6058c4ea72a7dc73b031db2Jim Grosbach      CallInst::Create(RegisterFn, FunctionContext, "",
4808b818d7e98309125c6058c4ea72a7dc73b031db2Jim Grosbach                       ContBlock->getTerminator());
4818b818d7e98309125c6058c4ea72a7dc73b031db2Jim Grosbach    Register->setDoesNotThrow();
4828b818d7e98309125c6058c4ea72a7dc73b031db2Jim Grosbach
4838b818d7e98309125c6058c4ea72a7dc73b031db2Jim Grosbach    // At this point, we are all set up, update the invoke instructions
4848b818d7e98309125c6058c4ea72a7dc73b031db2Jim Grosbach    // to mark their call_site values, and fill in the dispatch switch
4858b818d7e98309125c6058c4ea72a7dc73b031db2Jim Grosbach    // accordingly.
4868b818d7e98309125c6058c4ea72a7dc73b031db2Jim Grosbach    for (unsigned i = 0, e = Invokes.size(); i != e; ++i)
4878b818d7e98309125c6058c4ea72a7dc73b031db2Jim Grosbach      markInvokeCallSite(Invokes[i], i+1, CallSite, DispatchSwitch);
4888b818d7e98309125c6058c4ea72a7dc73b031db2Jim Grosbach
4898b818d7e98309125c6058c4ea72a7dc73b031db2Jim Grosbach    // The front end has likely added calls to _Unwind_Resume. We need
4908b818d7e98309125c6058c4ea72a7dc73b031db2Jim Grosbach    // to find those calls and mark the call_site as -1 immediately prior.
4918b818d7e98309125c6058c4ea72a7dc73b031db2Jim Grosbach    // resume is a noreturn function, so any block that has a call to it
4928b818d7e98309125c6058c4ea72a7dc73b031db2Jim Grosbach    // should end in an 'unreachable' instruction with the call immediately
4938b818d7e98309125c6058c4ea72a7dc73b031db2Jim Grosbach    // prior. That's how we'll search.
4948b818d7e98309125c6058c4ea72a7dc73b031db2Jim Grosbach    // ??? There's got to be a better way. this is fugly.
4958b818d7e98309125c6058c4ea72a7dc73b031db2Jim Grosbach    for (Function::iterator BB = F.begin(), E = F.end(); BB != E; ++BB)
4968b818d7e98309125c6058c4ea72a7dc73b031db2Jim Grosbach      if ((dyn_cast<UnreachableInst>(BB->getTerminator()))) {
4978b818d7e98309125c6058c4ea72a7dc73b031db2Jim Grosbach        BasicBlock::iterator I = BB->getTerminator();
4988b818d7e98309125c6058c4ea72a7dc73b031db2Jim Grosbach        // Check the previous instruction and see if it's a resume call
4998b818d7e98309125c6058c4ea72a7dc73b031db2Jim Grosbach        if (I == BB->begin()) continue;
5008b818d7e98309125c6058c4ea72a7dc73b031db2Jim Grosbach        if (CallInst *CI = dyn_cast<CallInst>(--I)) {
5018b818d7e98309125c6058c4ea72a7dc73b031db2Jim Grosbach          if (CI->getCalledFunction() == ResumeFn) {
5028b818d7e98309125c6058c4ea72a7dc73b031db2Jim Grosbach            Value *NegativeOne = ConstantInt::get(Int32Ty, -1);
5038b818d7e98309125c6058c4ea72a7dc73b031db2Jim Grosbach            new StoreInst(NegativeOne, CallSite, true, I);  // volatile
5048b818d7e98309125c6058c4ea72a7dc73b031db2Jim Grosbach          }
5058b818d7e98309125c6058c4ea72a7dc73b031db2Jim Grosbach        }
5068b818d7e98309125c6058c4ea72a7dc73b031db2Jim Grosbach      }
5078b818d7e98309125c6058c4ea72a7dc73b031db2Jim Grosbach
5088b818d7e98309125c6058c4ea72a7dc73b031db2Jim Grosbach    // Replace all unwinds with a branch to the unwind handler.
5098b818d7e98309125c6058c4ea72a7dc73b031db2Jim Grosbach    // ??? Should this ever happen with sjlj exceptions?
5108b818d7e98309125c6058c4ea72a7dc73b031db2Jim Grosbach    for (unsigned i = 0, e = Unwinds.size(); i != e; ++i) {
5118b818d7e98309125c6058c4ea72a7dc73b031db2Jim Grosbach      BranchInst::Create(UnwindBlock, Unwinds[i]);
5128b818d7e98309125c6058c4ea72a7dc73b031db2Jim Grosbach      Unwinds[i]->eraseFromParent();
5138b818d7e98309125c6058c4ea72a7dc73b031db2Jim Grosbach    }
5148b818d7e98309125c6058c4ea72a7dc73b031db2Jim Grosbach
5158b818d7e98309125c6058c4ea72a7dc73b031db2Jim Grosbach    // Finally, for any returns from this function, if this function contains an
5168b818d7e98309125c6058c4ea72a7dc73b031db2Jim Grosbach    // invoke, add a call to unregister the function context.
5178b818d7e98309125c6058c4ea72a7dc73b031db2Jim Grosbach    for (unsigned i = 0, e = Returns.size(); i != e; ++i)
5188b818d7e98309125c6058c4ea72a7dc73b031db2Jim Grosbach      CallInst::Create(UnregisterFn, FunctionContext, "", Returns[i]);
5198b818d7e98309125c6058c4ea72a7dc73b031db2Jim Grosbach  }
5208b818d7e98309125c6058c4ea72a7dc73b031db2Jim Grosbach
5218b818d7e98309125c6058c4ea72a7dc73b031db2Jim Grosbach  return true;
5228b818d7e98309125c6058c4ea72a7dc73b031db2Jim Grosbach}
5238b818d7e98309125c6058c4ea72a7dc73b031db2Jim Grosbach
5248b818d7e98309125c6058c4ea72a7dc73b031db2Jim Grosbachbool SjLjEHPass::runOnFunction(Function &F) {
5258b818d7e98309125c6058c4ea72a7dc73b031db2Jim Grosbach  bool Res = insertSjLjEHSupport(F);
5268b818d7e98309125c6058c4ea72a7dc73b031db2Jim Grosbach  return Res;
5278b818d7e98309125c6058c4ea72a7dc73b031db2Jim Grosbach}
528