SjLjEHPrepare.cpp revision b01bbdcc1af27bd90b552bb1b62b48916e0d4be3
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"
28606f3d696ff78211524fa49c3ca0c4de6db37041Jim Grosbach#include "llvm/ADT/SmallVector.h"
298b818d7e98309125c6058c4ea72a7dc73b031db2Jim Grosbach#include "llvm/Support/CommandLine.h"
308b818d7e98309125c6058c4ea72a7dc73b031db2Jim Grosbach#include "llvm/Support/Compiler.h"
318b818d7e98309125c6058c4ea72a7dc73b031db2Jim Grosbach#include "llvm/Support/Debug.h"
328b818d7e98309125c6058c4ea72a7dc73b031db2Jim Grosbach#include "llvm/Support/raw_ostream.h"
338b818d7e98309125c6058c4ea72a7dc73b031db2Jim Grosbach#include "llvm/Target/TargetLowering.h"
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;
53b01bbdcc1af27bd90b552bb1b62b48916e0d4be3Duncan Sands    Constant *SelectorFn;
548b818d7e98309125c6058c4ea72a7dc73b031db2Jim Grosbach    Constant *ExceptionFn;
558b818d7e98309125c6058c4ea72a7dc73b031db2Jim Grosbach
568b818d7e98309125c6058c4ea72a7dc73b031db2Jim Grosbach    Value *CallSite;
578b818d7e98309125c6058c4ea72a7dc73b031db2Jim Grosbach  public:
588b818d7e98309125c6058c4ea72a7dc73b031db2Jim Grosbach    static char ID; // Pass identification, replacement for typeid
598b818d7e98309125c6058c4ea72a7dc73b031db2Jim Grosbach    explicit SjLjEHPass(const TargetLowering *tli = NULL)
608b818d7e98309125c6058c4ea72a7dc73b031db2Jim Grosbach      : FunctionPass(&ID), TLI(tli) { }
618b818d7e98309125c6058c4ea72a7dc73b031db2Jim Grosbach    bool doInitialization(Module &M);
628b818d7e98309125c6058c4ea72a7dc73b031db2Jim Grosbach    bool runOnFunction(Function &F);
638b818d7e98309125c6058c4ea72a7dc73b031db2Jim Grosbach
648b818d7e98309125c6058c4ea72a7dc73b031db2Jim Grosbach    virtual void getAnalysisUsage(AnalysisUsage &AU) const { }
658b818d7e98309125c6058c4ea72a7dc73b031db2Jim Grosbach    const char *getPassName() const {
668b818d7e98309125c6058c4ea72a7dc73b031db2Jim Grosbach      return "SJLJ Exception Handling preparation";
678b818d7e98309125c6058c4ea72a7dc73b031db2Jim Grosbach    }
688b818d7e98309125c6058c4ea72a7dc73b031db2Jim Grosbach
698b818d7e98309125c6058c4ea72a7dc73b031db2Jim Grosbach  private:
708b818d7e98309125c6058c4ea72a7dc73b031db2Jim Grosbach    void markInvokeCallSite(InvokeInst *II, unsigned InvokeNo,
710bb61c56bcad7a738d50f705b5966be446ef06c1Jim Grosbach                            Value *CallSite,
720bb61c56bcad7a738d50f705b5966be446ef06c1Jim Grosbach                            SwitchInst *CatchSwitch);
73606f3d696ff78211524fa49c3ca0c4de6db37041Jim Grosbach    void splitLiveRangesLiveAcrossInvokes(SmallVector<InvokeInst*,16> &Invokes);
748b818d7e98309125c6058c4ea72a7dc73b031db2Jim Grosbach    bool insertSjLjEHSupport(Function &F);
758b818d7e98309125c6058c4ea72a7dc73b031db2Jim Grosbach  };
768b818d7e98309125c6058c4ea72a7dc73b031db2Jim Grosbach} // end anonymous namespace
778b818d7e98309125c6058c4ea72a7dc73b031db2Jim Grosbach
788b818d7e98309125c6058c4ea72a7dc73b031db2Jim Grosbachchar SjLjEHPass::ID = 0;
798b818d7e98309125c6058c4ea72a7dc73b031db2Jim Grosbach
808b818d7e98309125c6058c4ea72a7dc73b031db2Jim Grosbach// Public Interface To the SjLjEHPass pass.
818b818d7e98309125c6058c4ea72a7dc73b031db2Jim GrosbachFunctionPass *llvm::createSjLjEHPass(const TargetLowering *TLI) {
828b818d7e98309125c6058c4ea72a7dc73b031db2Jim Grosbach  return new SjLjEHPass(TLI);
838b818d7e98309125c6058c4ea72a7dc73b031db2Jim Grosbach}
84a235d13217ff14621a88f3ea96a8a3b980c56d02Jim Grosbach// doInitialization - Set up decalarations and types needed to process
85a235d13217ff14621a88f3ea96a8a3b980c56d02Jim Grosbach// exceptions.
868b818d7e98309125c6058c4ea72a7dc73b031db2Jim Grosbachbool SjLjEHPass::doInitialization(Module &M) {
878b818d7e98309125c6058c4ea72a7dc73b031db2Jim Grosbach  // Build the function context structure.
888b818d7e98309125c6058c4ea72a7dc73b031db2Jim Grosbach  // builtin_setjmp uses a five word jbuf
898b818d7e98309125c6058c4ea72a7dc73b031db2Jim Grosbach  const Type *VoidPtrTy =
90ac53a0b272452013124bfc70480aea5e41b60f40Duncan Sands          Type::getInt8PtrTy(M.getContext());
918b818d7e98309125c6058c4ea72a7dc73b031db2Jim Grosbach  const Type *Int32Ty = Type::getInt32Ty(M.getContext());
928b818d7e98309125c6058c4ea72a7dc73b031db2Jim Grosbach  FunctionContextTy =
938b818d7e98309125c6058c4ea72a7dc73b031db2Jim Grosbach    StructType::get(M.getContext(),
948b818d7e98309125c6058c4ea72a7dc73b031db2Jim Grosbach                    VoidPtrTy,                        // __prev
958b818d7e98309125c6058c4ea72a7dc73b031db2Jim Grosbach                    Int32Ty,                          // call_site
968b818d7e98309125c6058c4ea72a7dc73b031db2Jim Grosbach                    ArrayType::get(Int32Ty, 4),       // __data
978b818d7e98309125c6058c4ea72a7dc73b031db2Jim Grosbach                    VoidPtrTy,                        // __personality
988b818d7e98309125c6058c4ea72a7dc73b031db2Jim Grosbach                    VoidPtrTy,                        // __lsda
998b818d7e98309125c6058c4ea72a7dc73b031db2Jim Grosbach                    ArrayType::get(VoidPtrTy, 5),     // __jbuf
1008b818d7e98309125c6058c4ea72a7dc73b031db2Jim Grosbach                    NULL);
1018b818d7e98309125c6058c4ea72a7dc73b031db2Jim Grosbach  RegisterFn = M.getOrInsertFunction("_Unwind_SjLj_Register",
1028b818d7e98309125c6058c4ea72a7dc73b031db2Jim Grosbach                                     Type::getVoidTy(M.getContext()),
1038b818d7e98309125c6058c4ea72a7dc73b031db2Jim Grosbach                                     PointerType::getUnqual(FunctionContextTy),
1048b818d7e98309125c6058c4ea72a7dc73b031db2Jim Grosbach                                     (Type *)0);
1058b818d7e98309125c6058c4ea72a7dc73b031db2Jim Grosbach  UnregisterFn =
1068b818d7e98309125c6058c4ea72a7dc73b031db2Jim Grosbach    M.getOrInsertFunction("_Unwind_SjLj_Unregister",
1078b818d7e98309125c6058c4ea72a7dc73b031db2Jim Grosbach                          Type::getVoidTy(M.getContext()),
1088b818d7e98309125c6058c4ea72a7dc73b031db2Jim Grosbach                          PointerType::getUnqual(FunctionContextTy),
1098b818d7e98309125c6058c4ea72a7dc73b031db2Jim Grosbach                          (Type *)0);
1108b818d7e98309125c6058c4ea72a7dc73b031db2Jim Grosbach  ResumeFn =
1118b818d7e98309125c6058c4ea72a7dc73b031db2Jim Grosbach    M.getOrInsertFunction("_Unwind_SjLj_Resume",
1128b818d7e98309125c6058c4ea72a7dc73b031db2Jim Grosbach                          Type::getVoidTy(M.getContext()),
1138b818d7e98309125c6058c4ea72a7dc73b031db2Jim Grosbach                          VoidPtrTy,
1148b818d7e98309125c6058c4ea72a7dc73b031db2Jim Grosbach                          (Type *)0);
1158b818d7e98309125c6058c4ea72a7dc73b031db2Jim Grosbach  FrameAddrFn = Intrinsic::getDeclaration(&M, Intrinsic::frameaddress);
1168b818d7e98309125c6058c4ea72a7dc73b031db2Jim Grosbach  BuiltinSetjmpFn = Intrinsic::getDeclaration(&M, Intrinsic::eh_sjlj_setjmp);
1178b818d7e98309125c6058c4ea72a7dc73b031db2Jim Grosbach  LSDAAddrFn = Intrinsic::getDeclaration(&M, Intrinsic::eh_sjlj_lsda);
118b01bbdcc1af27bd90b552bb1b62b48916e0d4be3Duncan Sands  SelectorFn = Intrinsic::getDeclaration(&M, Intrinsic::eh_selector);
1198b818d7e98309125c6058c4ea72a7dc73b031db2Jim Grosbach  ExceptionFn = Intrinsic::getDeclaration(&M, Intrinsic::eh_exception);
120a235d13217ff14621a88f3ea96a8a3b980c56d02Jim Grosbach  PersonalityFn = 0;
1218b818d7e98309125c6058c4ea72a7dc73b031db2Jim Grosbach
1228b818d7e98309125c6058c4ea72a7dc73b031db2Jim Grosbach  return true;
1238b818d7e98309125c6058c4ea72a7dc73b031db2Jim Grosbach}
1248b818d7e98309125c6058c4ea72a7dc73b031db2Jim Grosbach
1258b818d7e98309125c6058c4ea72a7dc73b031db2Jim Grosbach/// markInvokeCallSite - Insert code to mark the call_site for this invoke
1268b818d7e98309125c6058c4ea72a7dc73b031db2Jim Grosbachvoid SjLjEHPass::markInvokeCallSite(InvokeInst *II, unsigned InvokeNo,
1270bb61c56bcad7a738d50f705b5966be446ef06c1Jim Grosbach                                    Value *CallSite,
1280bb61c56bcad7a738d50f705b5966be446ef06c1Jim Grosbach                                    SwitchInst *CatchSwitch) {
1298b818d7e98309125c6058c4ea72a7dc73b031db2Jim Grosbach  ConstantInt *CallSiteNoC= ConstantInt::get(Type::getInt32Ty(II->getContext()),
1308b818d7e98309125c6058c4ea72a7dc73b031db2Jim Grosbach                                            InvokeNo);
1310bb61c56bcad7a738d50f705b5966be446ef06c1Jim Grosbach  // The runtime comes back to the dispatcher with the call_site - 1 in
1320bb61c56bcad7a738d50f705b5966be446ef06c1Jim Grosbach  // the context. Odd, but there it is.
1330bb61c56bcad7a738d50f705b5966be446ef06c1Jim Grosbach  ConstantInt *SwitchValC = ConstantInt::get(Type::getInt32Ty(II->getContext()),
1340bb61c56bcad7a738d50f705b5966be446ef06c1Jim Grosbach                                            InvokeNo - 1);
1358b818d7e98309125c6058c4ea72a7dc73b031db2Jim Grosbach
1368b818d7e98309125c6058c4ea72a7dc73b031db2Jim Grosbach  // If the unwind edge has phi nodes, split the edge.
1378b818d7e98309125c6058c4ea72a7dc73b031db2Jim Grosbach  if (isa<PHINode>(II->getUnwindDest()->begin())) {
1388b818d7e98309125c6058c4ea72a7dc73b031db2Jim Grosbach    SplitCriticalEdge(II, 1, this);
1398b818d7e98309125c6058c4ea72a7dc73b031db2Jim Grosbach
1408b818d7e98309125c6058c4ea72a7dc73b031db2Jim Grosbach    // If there are any phi nodes left, they must have a single predecessor.
1418b818d7e98309125c6058c4ea72a7dc73b031db2Jim Grosbach    while (PHINode *PN = dyn_cast<PHINode>(II->getUnwindDest()->begin())) {
1428b818d7e98309125c6058c4ea72a7dc73b031db2Jim Grosbach      PN->replaceAllUsesWith(PN->getIncomingValue(0));
1438b818d7e98309125c6058c4ea72a7dc73b031db2Jim Grosbach      PN->eraseFromParent();
1448b818d7e98309125c6058c4ea72a7dc73b031db2Jim Grosbach    }
1458b818d7e98309125c6058c4ea72a7dc73b031db2Jim Grosbach  }
1468b818d7e98309125c6058c4ea72a7dc73b031db2Jim Grosbach
1478b818d7e98309125c6058c4ea72a7dc73b031db2Jim Grosbach  // Insert a store of the invoke num before the invoke and store zero into the
1488b818d7e98309125c6058c4ea72a7dc73b031db2Jim Grosbach  // location afterward.
1498b818d7e98309125c6058c4ea72a7dc73b031db2Jim Grosbach  new StoreInst(CallSiteNoC, CallSite, true, II);  // volatile
1508b818d7e98309125c6058c4ea72a7dc73b031db2Jim Grosbach
1510bb61c56bcad7a738d50f705b5966be446ef06c1Jim Grosbach  // Add a switch case to our unwind block.
1520bb61c56bcad7a738d50f705b5966be446ef06c1Jim Grosbach  CatchSwitch->addCase(SwitchValC, II->getUnwindDest());
1538b818d7e98309125c6058c4ea72a7dc73b031db2Jim Grosbach  // We still want this to look like an invoke so we emit the LSDA properly
1548b818d7e98309125c6058c4ea72a7dc73b031db2Jim Grosbach  // FIXME: ??? Or will this cause strangeness with mis-matched IDs like
1558b818d7e98309125c6058c4ea72a7dc73b031db2Jim Grosbach  //  when it was in the front end?
1568b818d7e98309125c6058c4ea72a7dc73b031db2Jim Grosbach}
1578b818d7e98309125c6058c4ea72a7dc73b031db2Jim Grosbach
1588b818d7e98309125c6058c4ea72a7dc73b031db2Jim Grosbach/// MarkBlocksLiveIn - Insert BB and all of its predescessors into LiveBBs until
1598b818d7e98309125c6058c4ea72a7dc73b031db2Jim Grosbach/// we reach blocks we've already seen.
1608b818d7e98309125c6058c4ea72a7dc73b031db2Jim Grosbachstatic void MarkBlocksLiveIn(BasicBlock *BB, std::set<BasicBlock*> &LiveBBs) {
1618b818d7e98309125c6058c4ea72a7dc73b031db2Jim Grosbach  if (!LiveBBs.insert(BB).second) return; // already been here.
1628b818d7e98309125c6058c4ea72a7dc73b031db2Jim Grosbach
1638b818d7e98309125c6058c4ea72a7dc73b031db2Jim Grosbach  for (pred_iterator PI = pred_begin(BB), E = pred_end(BB); PI != E; ++PI)
1648b818d7e98309125c6058c4ea72a7dc73b031db2Jim Grosbach    MarkBlocksLiveIn(*PI, LiveBBs);
1658b818d7e98309125c6058c4ea72a7dc73b031db2Jim Grosbach}
1668b818d7e98309125c6058c4ea72a7dc73b031db2Jim Grosbach
167606f3d696ff78211524fa49c3ca0c4de6db37041Jim Grosbach/// splitLiveRangesAcrossInvokes - Each value that is live across an unwind edge
168606f3d696ff78211524fa49c3ca0c4de6db37041Jim Grosbach/// we spill into a stack location, guaranteeing that there is nothing live
169606f3d696ff78211524fa49c3ca0c4de6db37041Jim Grosbach/// across the unwind edge.  This process also splits all critical edges
170606f3d696ff78211524fa49c3ca0c4de6db37041Jim Grosbach/// coming out of invoke's.
1718b818d7e98309125c6058c4ea72a7dc73b031db2Jim Grosbachvoid SjLjEHPass::
172606f3d696ff78211524fa49c3ca0c4de6db37041Jim GrosbachsplitLiveRangesLiveAcrossInvokes(SmallVector<InvokeInst*,16> &Invokes) {
1738b818d7e98309125c6058c4ea72a7dc73b031db2Jim Grosbach  // First step, split all critical edges from invoke instructions.
1748b818d7e98309125c6058c4ea72a7dc73b031db2Jim Grosbach  for (unsigned i = 0, e = Invokes.size(); i != e; ++i) {
1758b818d7e98309125c6058c4ea72a7dc73b031db2Jim Grosbach    InvokeInst *II = Invokes[i];
1768b818d7e98309125c6058c4ea72a7dc73b031db2Jim Grosbach    SplitCriticalEdge(II, 0, this);
1778b818d7e98309125c6058c4ea72a7dc73b031db2Jim Grosbach    SplitCriticalEdge(II, 1, this);
1788b818d7e98309125c6058c4ea72a7dc73b031db2Jim Grosbach    assert(!isa<PHINode>(II->getNormalDest()) &&
1798b818d7e98309125c6058c4ea72a7dc73b031db2Jim Grosbach           !isa<PHINode>(II->getUnwindDest()) &&
1808b818d7e98309125c6058c4ea72a7dc73b031db2Jim Grosbach           "critical edge splitting left single entry phi nodes?");
1818b818d7e98309125c6058c4ea72a7dc73b031db2Jim Grosbach  }
1828b818d7e98309125c6058c4ea72a7dc73b031db2Jim Grosbach
1838b818d7e98309125c6058c4ea72a7dc73b031db2Jim Grosbach  Function *F = Invokes.back()->getParent()->getParent();
1848b818d7e98309125c6058c4ea72a7dc73b031db2Jim Grosbach
1858b818d7e98309125c6058c4ea72a7dc73b031db2Jim Grosbach  // To avoid having to handle incoming arguments specially, we lower each arg
1868b818d7e98309125c6058c4ea72a7dc73b031db2Jim Grosbach  // to a copy instruction in the entry block.  This ensures that the argument
1878b818d7e98309125c6058c4ea72a7dc73b031db2Jim Grosbach  // value itself cannot be live across the entry block.
1888b818d7e98309125c6058c4ea72a7dc73b031db2Jim Grosbach  BasicBlock::iterator AfterAllocaInsertPt = F->begin()->begin();
1898b818d7e98309125c6058c4ea72a7dc73b031db2Jim Grosbach  while (isa<AllocaInst>(AfterAllocaInsertPt) &&
1908b818d7e98309125c6058c4ea72a7dc73b031db2Jim Grosbach        isa<ConstantInt>(cast<AllocaInst>(AfterAllocaInsertPt)->getArraySize()))
1918b818d7e98309125c6058c4ea72a7dc73b031db2Jim Grosbach    ++AfterAllocaInsertPt;
1928b818d7e98309125c6058c4ea72a7dc73b031db2Jim Grosbach  for (Function::arg_iterator AI = F->arg_begin(), E = F->arg_end();
1938b818d7e98309125c6058c4ea72a7dc73b031db2Jim Grosbach       AI != E; ++AI) {
1948b818d7e98309125c6058c4ea72a7dc73b031db2Jim Grosbach    // This is always a no-op cast because we're casting AI to AI->getType() so
1958b818d7e98309125c6058c4ea72a7dc73b031db2Jim Grosbach    // src and destination types are identical. BitCast is the only possibility.
1968b818d7e98309125c6058c4ea72a7dc73b031db2Jim Grosbach    CastInst *NC = new BitCastInst(
1978b818d7e98309125c6058c4ea72a7dc73b031db2Jim Grosbach      AI, AI->getType(), AI->getName()+".tmp", AfterAllocaInsertPt);
1988b818d7e98309125c6058c4ea72a7dc73b031db2Jim Grosbach    AI->replaceAllUsesWith(NC);
1998b818d7e98309125c6058c4ea72a7dc73b031db2Jim Grosbach    // Normally its is forbidden to replace a CastInst's operand because it
2008b818d7e98309125c6058c4ea72a7dc73b031db2Jim Grosbach    // could cause the opcode to reflect an illegal conversion. However, we're
2018b818d7e98309125c6058c4ea72a7dc73b031db2Jim Grosbach    // replacing it here with the same value it was constructed with to simply
2028b818d7e98309125c6058c4ea72a7dc73b031db2Jim Grosbach    // make NC its user.
2038b818d7e98309125c6058c4ea72a7dc73b031db2Jim Grosbach    NC->setOperand(0, AI);
2048b818d7e98309125c6058c4ea72a7dc73b031db2Jim Grosbach  }
2058b818d7e98309125c6058c4ea72a7dc73b031db2Jim Grosbach
2068b818d7e98309125c6058c4ea72a7dc73b031db2Jim Grosbach  // Finally, scan the code looking for instructions with bad live ranges.
2078b818d7e98309125c6058c4ea72a7dc73b031db2Jim Grosbach  for (Function::iterator BB = F->begin(), E = F->end(); BB != E; ++BB)
2088b818d7e98309125c6058c4ea72a7dc73b031db2Jim Grosbach    for (BasicBlock::iterator II = BB->begin(), E = BB->end(); II != E; ++II) {
2098b818d7e98309125c6058c4ea72a7dc73b031db2Jim Grosbach      // Ignore obvious cases we don't have to handle.  In particular, most
2108b818d7e98309125c6058c4ea72a7dc73b031db2Jim Grosbach      // instructions either have no uses or only have a single use inside the
2118b818d7e98309125c6058c4ea72a7dc73b031db2Jim Grosbach      // current block.  Ignore them quickly.
2128b818d7e98309125c6058c4ea72a7dc73b031db2Jim Grosbach      Instruction *Inst = II;
2138b818d7e98309125c6058c4ea72a7dc73b031db2Jim Grosbach      if (Inst->use_empty()) continue;
2148b818d7e98309125c6058c4ea72a7dc73b031db2Jim Grosbach      if (Inst->hasOneUse() &&
2158b818d7e98309125c6058c4ea72a7dc73b031db2Jim Grosbach          cast<Instruction>(Inst->use_back())->getParent() == BB &&
2168b818d7e98309125c6058c4ea72a7dc73b031db2Jim Grosbach          !isa<PHINode>(Inst->use_back())) continue;
2178b818d7e98309125c6058c4ea72a7dc73b031db2Jim Grosbach
2188b818d7e98309125c6058c4ea72a7dc73b031db2Jim Grosbach      // If this is an alloca in the entry block, it's not a real register
2198b818d7e98309125c6058c4ea72a7dc73b031db2Jim Grosbach      // value.
2208b818d7e98309125c6058c4ea72a7dc73b031db2Jim Grosbach      if (AllocaInst *AI = dyn_cast<AllocaInst>(Inst))
2218b818d7e98309125c6058c4ea72a7dc73b031db2Jim Grosbach        if (isa<ConstantInt>(AI->getArraySize()) && BB == F->begin())
2228b818d7e98309125c6058c4ea72a7dc73b031db2Jim Grosbach          continue;
2238b818d7e98309125c6058c4ea72a7dc73b031db2Jim Grosbach
2248b818d7e98309125c6058c4ea72a7dc73b031db2Jim Grosbach      // Avoid iterator invalidation by copying users to a temporary vector.
225606f3d696ff78211524fa49c3ca0c4de6db37041Jim Grosbach      SmallVector<Instruction*,16> Users;
2268b818d7e98309125c6058c4ea72a7dc73b031db2Jim Grosbach      for (Value::use_iterator UI = Inst->use_begin(), E = Inst->use_end();
2278b818d7e98309125c6058c4ea72a7dc73b031db2Jim Grosbach           UI != E; ++UI) {
2288b818d7e98309125c6058c4ea72a7dc73b031db2Jim Grosbach        Instruction *User = cast<Instruction>(*UI);
2298b818d7e98309125c6058c4ea72a7dc73b031db2Jim Grosbach        if (User->getParent() != BB || isa<PHINode>(User))
2308b818d7e98309125c6058c4ea72a7dc73b031db2Jim Grosbach          Users.push_back(User);
2318b818d7e98309125c6058c4ea72a7dc73b031db2Jim Grosbach      }
2328b818d7e98309125c6058c4ea72a7dc73b031db2Jim Grosbach
2338b818d7e98309125c6058c4ea72a7dc73b031db2Jim Grosbach      // Find all of the blocks that this value is live in.
2348b818d7e98309125c6058c4ea72a7dc73b031db2Jim Grosbach      std::set<BasicBlock*> LiveBBs;
2358b818d7e98309125c6058c4ea72a7dc73b031db2Jim Grosbach      LiveBBs.insert(Inst->getParent());
2368b818d7e98309125c6058c4ea72a7dc73b031db2Jim Grosbach      while (!Users.empty()) {
2378b818d7e98309125c6058c4ea72a7dc73b031db2Jim Grosbach        Instruction *U = Users.back();
2388b818d7e98309125c6058c4ea72a7dc73b031db2Jim Grosbach        Users.pop_back();
2398b818d7e98309125c6058c4ea72a7dc73b031db2Jim Grosbach
2408b818d7e98309125c6058c4ea72a7dc73b031db2Jim Grosbach        if (!isa<PHINode>(U)) {
2418b818d7e98309125c6058c4ea72a7dc73b031db2Jim Grosbach          MarkBlocksLiveIn(U->getParent(), LiveBBs);
2428b818d7e98309125c6058c4ea72a7dc73b031db2Jim Grosbach        } else {
2438b818d7e98309125c6058c4ea72a7dc73b031db2Jim Grosbach          // Uses for a PHI node occur in their predecessor block.
2448b818d7e98309125c6058c4ea72a7dc73b031db2Jim Grosbach          PHINode *PN = cast<PHINode>(U);
2458b818d7e98309125c6058c4ea72a7dc73b031db2Jim Grosbach          for (unsigned i = 0, e = PN->getNumIncomingValues(); i != e; ++i)
2468b818d7e98309125c6058c4ea72a7dc73b031db2Jim Grosbach            if (PN->getIncomingValue(i) == Inst)
2478b818d7e98309125c6058c4ea72a7dc73b031db2Jim Grosbach              MarkBlocksLiveIn(PN->getIncomingBlock(i), LiveBBs);
2488b818d7e98309125c6058c4ea72a7dc73b031db2Jim Grosbach        }
2498b818d7e98309125c6058c4ea72a7dc73b031db2Jim Grosbach      }
2508b818d7e98309125c6058c4ea72a7dc73b031db2Jim Grosbach
2518b818d7e98309125c6058c4ea72a7dc73b031db2Jim Grosbach      // Now that we know all of the blocks that this thing is live in, see if
2528b818d7e98309125c6058c4ea72a7dc73b031db2Jim Grosbach      // it includes any of the unwind locations.
2538b818d7e98309125c6058c4ea72a7dc73b031db2Jim Grosbach      bool NeedsSpill = false;
2548b818d7e98309125c6058c4ea72a7dc73b031db2Jim Grosbach      for (unsigned i = 0, e = Invokes.size(); i != e; ++i) {
2558b818d7e98309125c6058c4ea72a7dc73b031db2Jim Grosbach        BasicBlock *UnwindBlock = Invokes[i]->getUnwindDest();
2568b818d7e98309125c6058c4ea72a7dc73b031db2Jim Grosbach        if (UnwindBlock != BB && LiveBBs.count(UnwindBlock)) {
2578b818d7e98309125c6058c4ea72a7dc73b031db2Jim Grosbach          NeedsSpill = true;
2588b818d7e98309125c6058c4ea72a7dc73b031db2Jim Grosbach        }
2598b818d7e98309125c6058c4ea72a7dc73b031db2Jim Grosbach      }
2608b818d7e98309125c6058c4ea72a7dc73b031db2Jim Grosbach
2618b818d7e98309125c6058c4ea72a7dc73b031db2Jim Grosbach      // If we decided we need a spill, do it.
2628b818d7e98309125c6058c4ea72a7dc73b031db2Jim Grosbach      if (NeedsSpill) {
2638b818d7e98309125c6058c4ea72a7dc73b031db2Jim Grosbach        ++NumSpilled;
2648b818d7e98309125c6058c4ea72a7dc73b031db2Jim Grosbach        DemoteRegToStack(*Inst, true);
2658b818d7e98309125c6058c4ea72a7dc73b031db2Jim Grosbach      }
2668b818d7e98309125c6058c4ea72a7dc73b031db2Jim Grosbach    }
2678b818d7e98309125c6058c4ea72a7dc73b031db2Jim Grosbach}
2688b818d7e98309125c6058c4ea72a7dc73b031db2Jim Grosbach
2698b818d7e98309125c6058c4ea72a7dc73b031db2Jim Grosbachbool SjLjEHPass::insertSjLjEHSupport(Function &F) {
270606f3d696ff78211524fa49c3ca0c4de6db37041Jim Grosbach  SmallVector<ReturnInst*,16> Returns;
271606f3d696ff78211524fa49c3ca0c4de6db37041Jim Grosbach  SmallVector<UnwindInst*,16> Unwinds;
272606f3d696ff78211524fa49c3ca0c4de6db37041Jim Grosbach  SmallVector<InvokeInst*,16> Invokes;
2738b818d7e98309125c6058c4ea72a7dc73b031db2Jim Grosbach
2748b818d7e98309125c6058c4ea72a7dc73b031db2Jim Grosbach  // Look through the terminators of the basic blocks to find invokes, returns
2758b818d7e98309125c6058c4ea72a7dc73b031db2Jim Grosbach  // and unwinds
2768b818d7e98309125c6058c4ea72a7dc73b031db2Jim Grosbach  for (Function::iterator BB = F.begin(), E = F.end(); BB != E; ++BB)
2778b818d7e98309125c6058c4ea72a7dc73b031db2Jim Grosbach    if (ReturnInst *RI = dyn_cast<ReturnInst>(BB->getTerminator())) {
2788b818d7e98309125c6058c4ea72a7dc73b031db2Jim Grosbach      // Remember all return instructions in case we insert an invoke into this
2798b818d7e98309125c6058c4ea72a7dc73b031db2Jim Grosbach      // function.
2808b818d7e98309125c6058c4ea72a7dc73b031db2Jim Grosbach      Returns.push_back(RI);
2818b818d7e98309125c6058c4ea72a7dc73b031db2Jim Grosbach    } else if (InvokeInst *II = dyn_cast<InvokeInst>(BB->getTerminator())) {
2828b818d7e98309125c6058c4ea72a7dc73b031db2Jim Grosbach      Invokes.push_back(II);
2838b818d7e98309125c6058c4ea72a7dc73b031db2Jim Grosbach    } else if (UnwindInst *UI = dyn_cast<UnwindInst>(BB->getTerminator())) {
2848b818d7e98309125c6058c4ea72a7dc73b031db2Jim Grosbach      Unwinds.push_back(UI);
2858b818d7e98309125c6058c4ea72a7dc73b031db2Jim Grosbach    }
2868b818d7e98309125c6058c4ea72a7dc73b031db2Jim Grosbach  // If we don't have any invokes or unwinds, there's nothing to do.
2878b818d7e98309125c6058c4ea72a7dc73b031db2Jim Grosbach  if (Unwinds.empty() && Invokes.empty()) return false;
2888b818d7e98309125c6058c4ea72a7dc73b031db2Jim Grosbach
289a235d13217ff14621a88f3ea96a8a3b980c56d02Jim Grosbach  // Find the eh.selector.*  and eh.exception calls. We'll use the first
290a235d13217ff14621a88f3ea96a8a3b980c56d02Jim Grosbach  // eh.selector to determine the right personality function to use. For
291a235d13217ff14621a88f3ea96a8a3b980c56d02Jim Grosbach  // SJLJ, we always use the same personality for the whole function,
292a235d13217ff14621a88f3ea96a8a3b980c56d02Jim Grosbach  // not on a per-selector basis.
293a235d13217ff14621a88f3ea96a8a3b980c56d02Jim Grosbach  // FIXME: That's a bit ugly. Better way?
294a235d13217ff14621a88f3ea96a8a3b980c56d02Jim Grosbach  SmallVector<CallInst*,16> EH_Selectors;
295a235d13217ff14621a88f3ea96a8a3b980c56d02Jim Grosbach  SmallVector<CallInst*,16> EH_Exceptions;
296a235d13217ff14621a88f3ea96a8a3b980c56d02Jim Grosbach  for (Function::iterator BB = F.begin(), E = F.end(); BB != E; ++BB) {
297a235d13217ff14621a88f3ea96a8a3b980c56d02Jim Grosbach    for (BasicBlock::iterator I = BB->begin(), E = BB->end(); I != E; ++I) {
298a235d13217ff14621a88f3ea96a8a3b980c56d02Jim Grosbach      if (CallInst *CI = dyn_cast<CallInst>(I)) {
299b01bbdcc1af27bd90b552bb1b62b48916e0d4be3Duncan Sands        if (CI->getCalledFunction() == SelectorFn) {
300a235d13217ff14621a88f3ea96a8a3b980c56d02Jim Grosbach          if (!PersonalityFn) PersonalityFn = CI->getOperand(2);
301a235d13217ff14621a88f3ea96a8a3b980c56d02Jim Grosbach          EH_Selectors.push_back(CI);
302a235d13217ff14621a88f3ea96a8a3b980c56d02Jim Grosbach        } else if (CI->getCalledFunction() == ExceptionFn) {
303a235d13217ff14621a88f3ea96a8a3b980c56d02Jim Grosbach          EH_Exceptions.push_back(CI);
304a235d13217ff14621a88f3ea96a8a3b980c56d02Jim Grosbach        }
305a235d13217ff14621a88f3ea96a8a3b980c56d02Jim Grosbach      }
306a235d13217ff14621a88f3ea96a8a3b980c56d02Jim Grosbach    }
307a235d13217ff14621a88f3ea96a8a3b980c56d02Jim Grosbach  }
308a235d13217ff14621a88f3ea96a8a3b980c56d02Jim Grosbach  // If we don't have any eh.selector calls, we can't determine the personality
309a235d13217ff14621a88f3ea96a8a3b980c56d02Jim Grosbach  // function. Without a personality function, we can't process exceptions.
310a235d13217ff14621a88f3ea96a8a3b980c56d02Jim Grosbach  if (!PersonalityFn) return false;
311a235d13217ff14621a88f3ea96a8a3b980c56d02Jim Grosbach
3128b818d7e98309125c6058c4ea72a7dc73b031db2Jim Grosbach  NumInvokes += Invokes.size();
3138b818d7e98309125c6058c4ea72a7dc73b031db2Jim Grosbach  NumUnwinds += Unwinds.size();
3148b818d7e98309125c6058c4ea72a7dc73b031db2Jim Grosbach
3158b818d7e98309125c6058c4ea72a7dc73b031db2Jim Grosbach  if (!Invokes.empty()) {
3168b818d7e98309125c6058c4ea72a7dc73b031db2Jim Grosbach    // We have invokes, so we need to add register/unregister calls to get
3178b818d7e98309125c6058c4ea72a7dc73b031db2Jim Grosbach    // this function onto the global unwind stack.
3180bb61c56bcad7a738d50f705b5966be446ef06c1Jim Grosbach    //
3190bb61c56bcad7a738d50f705b5966be446ef06c1Jim Grosbach    // First thing we need to do is scan the whole function for values that are
3200bb61c56bcad7a738d50f705b5966be446ef06c1Jim Grosbach    // live across unwind edges.  Each value that is live across an unwind edge
3210bb61c56bcad7a738d50f705b5966be446ef06c1Jim Grosbach    // we spill into a stack location, guaranteeing that there is nothing live
3220bb61c56bcad7a738d50f705b5966be446ef06c1Jim Grosbach    // across the unwind edge.  This process also splits all critical edges
3230bb61c56bcad7a738d50f705b5966be446ef06c1Jim Grosbach    // coming out of invoke's.
3240bb61c56bcad7a738d50f705b5966be446ef06c1Jim Grosbach    splitLiveRangesLiveAcrossInvokes(Invokes);
3258b818d7e98309125c6058c4ea72a7dc73b031db2Jim Grosbach
3268b818d7e98309125c6058c4ea72a7dc73b031db2Jim Grosbach    BasicBlock *EntryBB = F.begin();
3278b818d7e98309125c6058c4ea72a7dc73b031db2Jim Grosbach    // Create an alloca for the incoming jump buffer ptr and the new jump buffer
3288b818d7e98309125c6058c4ea72a7dc73b031db2Jim Grosbach    // that needs to be restored on all exits from the function.  This is an
3298b818d7e98309125c6058c4ea72a7dc73b031db2Jim Grosbach    // alloca because the value needs to be added to the global context list.
3308b818d7e98309125c6058c4ea72a7dc73b031db2Jim Grosbach    unsigned Align = 4; // FIXME: Should be a TLI check?
3318b818d7e98309125c6058c4ea72a7dc73b031db2Jim Grosbach    AllocaInst *FunctionContext =
3328b818d7e98309125c6058c4ea72a7dc73b031db2Jim Grosbach      new AllocaInst(FunctionContextTy, 0, Align,
3338b818d7e98309125c6058c4ea72a7dc73b031db2Jim Grosbach                     "fcn_context", F.begin()->begin());
3348b818d7e98309125c6058c4ea72a7dc73b031db2Jim Grosbach
3358b818d7e98309125c6058c4ea72a7dc73b031db2Jim Grosbach    Value *Idxs[2];
3368b818d7e98309125c6058c4ea72a7dc73b031db2Jim Grosbach    const Type *Int32Ty = Type::getInt32Ty(F.getContext());
3378b818d7e98309125c6058c4ea72a7dc73b031db2Jim Grosbach    Value *Zero = ConstantInt::get(Int32Ty, 0);
3388b818d7e98309125c6058c4ea72a7dc73b031db2Jim Grosbach    // We need to also keep around a reference to the call_site field
3398b818d7e98309125c6058c4ea72a7dc73b031db2Jim Grosbach    Idxs[0] = Zero;
3408b818d7e98309125c6058c4ea72a7dc73b031db2Jim Grosbach    Idxs[1] = ConstantInt::get(Int32Ty, 1);
3418b818d7e98309125c6058c4ea72a7dc73b031db2Jim Grosbach    CallSite = GetElementPtrInst::Create(FunctionContext, Idxs, Idxs+2,
3428b818d7e98309125c6058c4ea72a7dc73b031db2Jim Grosbach                                         "call_site",
3438b818d7e98309125c6058c4ea72a7dc73b031db2Jim Grosbach                                         EntryBB->getTerminator());
3448b818d7e98309125c6058c4ea72a7dc73b031db2Jim Grosbach
3458b818d7e98309125c6058c4ea72a7dc73b031db2Jim Grosbach    // The exception selector comes back in context->data[1]
3468b818d7e98309125c6058c4ea72a7dc73b031db2Jim Grosbach    Idxs[1] = ConstantInt::get(Int32Ty, 2);
3478b818d7e98309125c6058c4ea72a7dc73b031db2Jim Grosbach    Value *FCData = GetElementPtrInst::Create(FunctionContext, Idxs, Idxs+2,
3488b818d7e98309125c6058c4ea72a7dc73b031db2Jim Grosbach                                              "fc_data",
3498b818d7e98309125c6058c4ea72a7dc73b031db2Jim Grosbach                                              EntryBB->getTerminator());
3508b818d7e98309125c6058c4ea72a7dc73b031db2Jim Grosbach    Idxs[1] = ConstantInt::get(Int32Ty, 1);
3518b818d7e98309125c6058c4ea72a7dc73b031db2Jim Grosbach    Value *SelectorAddr = GetElementPtrInst::Create(FCData, Idxs, Idxs+2,
3528b818d7e98309125c6058c4ea72a7dc73b031db2Jim Grosbach                                                    "exc_selector_gep",
3538b818d7e98309125c6058c4ea72a7dc73b031db2Jim Grosbach                                                    EntryBB->getTerminator());
3548b818d7e98309125c6058c4ea72a7dc73b031db2Jim Grosbach    // The exception value comes back in context->data[0]
3558b818d7e98309125c6058c4ea72a7dc73b031db2Jim Grosbach    Idxs[1] = Zero;
3568b818d7e98309125c6058c4ea72a7dc73b031db2Jim Grosbach    Value *ExceptionAddr = GetElementPtrInst::Create(FCData, Idxs, Idxs+2,
3578b818d7e98309125c6058c4ea72a7dc73b031db2Jim Grosbach                                                     "exception_gep",
3588b818d7e98309125c6058c4ea72a7dc73b031db2Jim Grosbach                                                     EntryBB->getTerminator());
3598b818d7e98309125c6058c4ea72a7dc73b031db2Jim Grosbach
3608b818d7e98309125c6058c4ea72a7dc73b031db2Jim Grosbach    // The result of the eh.selector call will be replaced with a
3618b818d7e98309125c6058c4ea72a7dc73b031db2Jim Grosbach    // a reference to the selector value returned in the function
3628b818d7e98309125c6058c4ea72a7dc73b031db2Jim Grosbach    // context. We leave the selector itself so the EH analysis later
3638b818d7e98309125c6058c4ea72a7dc73b031db2Jim Grosbach    // can use it.
3648b818d7e98309125c6058c4ea72a7dc73b031db2Jim Grosbach    for (int i = 0, e = EH_Selectors.size(); i < e; ++i) {
3658b818d7e98309125c6058c4ea72a7dc73b031db2Jim Grosbach      CallInst *I = EH_Selectors[i];
3668b818d7e98309125c6058c4ea72a7dc73b031db2Jim Grosbach      Value *SelectorVal = new LoadInst(SelectorAddr, "select_val", true, I);
3678b818d7e98309125c6058c4ea72a7dc73b031db2Jim Grosbach      I->replaceAllUsesWith(SelectorVal);
3688b818d7e98309125c6058c4ea72a7dc73b031db2Jim Grosbach    }
3698b818d7e98309125c6058c4ea72a7dc73b031db2Jim Grosbach    // eh.exception calls are replaced with references to the proper
3708b818d7e98309125c6058c4ea72a7dc73b031db2Jim Grosbach    // location in the context. Unlike eh.selector, the eh.exception
3718b818d7e98309125c6058c4ea72a7dc73b031db2Jim Grosbach    // calls are removed entirely.
3728b818d7e98309125c6058c4ea72a7dc73b031db2Jim Grosbach    for (int i = 0, e = EH_Exceptions.size(); i < e; ++i) {
3738b818d7e98309125c6058c4ea72a7dc73b031db2Jim Grosbach      CallInst *I = EH_Exceptions[i];
3748b818d7e98309125c6058c4ea72a7dc73b031db2Jim Grosbach      // Possible for there to be duplicates, so check to make sure
3758b818d7e98309125c6058c4ea72a7dc73b031db2Jim Grosbach      // the instruction hasn't already been removed.
3768b818d7e98309125c6058c4ea72a7dc73b031db2Jim Grosbach      if (!I->getParent()) continue;
3778b818d7e98309125c6058c4ea72a7dc73b031db2Jim Grosbach      Value *Val = new LoadInst(ExceptionAddr, "exception", true, I);
378ac53a0b272452013124bfc70480aea5e41b60f40Duncan Sands      const Type *Ty = Type::getInt8PtrTy(F.getContext());
379606f3d696ff78211524fa49c3ca0c4de6db37041Jim Grosbach      Val = CastInst::Create(Instruction::IntToPtr, Val, Ty, "", I);
3808b818d7e98309125c6058c4ea72a7dc73b031db2Jim Grosbach
3818b818d7e98309125c6058c4ea72a7dc73b031db2Jim Grosbach      I->replaceAllUsesWith(Val);
3828b818d7e98309125c6058c4ea72a7dc73b031db2Jim Grosbach      I->eraseFromParent();
3838b818d7e98309125c6058c4ea72a7dc73b031db2Jim Grosbach    }
3848b818d7e98309125c6058c4ea72a7dc73b031db2Jim Grosbach
3858b818d7e98309125c6058c4ea72a7dc73b031db2Jim Grosbach
3868b818d7e98309125c6058c4ea72a7dc73b031db2Jim Grosbach
3878b818d7e98309125c6058c4ea72a7dc73b031db2Jim Grosbach
3888b818d7e98309125c6058c4ea72a7dc73b031db2Jim Grosbach    // The entry block changes to have the eh.sjlj.setjmp, with a conditional
3898b818d7e98309125c6058c4ea72a7dc73b031db2Jim Grosbach    // branch to a dispatch block for non-zero returns. If we return normally,
3908b818d7e98309125c6058c4ea72a7dc73b031db2Jim Grosbach    // we're not handling an exception and just register the function context
3918b818d7e98309125c6058c4ea72a7dc73b031db2Jim Grosbach    // and continue.
3928b818d7e98309125c6058c4ea72a7dc73b031db2Jim Grosbach
3938b818d7e98309125c6058c4ea72a7dc73b031db2Jim Grosbach    // Create the dispatch block.  The dispatch block is basically a big switch
3948b818d7e98309125c6058c4ea72a7dc73b031db2Jim Grosbach    // statement that goes to all of the invoke landing pads.
3958b818d7e98309125c6058c4ea72a7dc73b031db2Jim Grosbach    BasicBlock *DispatchBlock =
3968b818d7e98309125c6058c4ea72a7dc73b031db2Jim Grosbach            BasicBlock::Create(F.getContext(), "eh.sjlj.setjmp.catch", &F);
3978b818d7e98309125c6058c4ea72a7dc73b031db2Jim Grosbach
3988b818d7e98309125c6058c4ea72a7dc73b031db2Jim Grosbach    // Insert a load in the Catch block, and a switch on its value.  By default,
3998b818d7e98309125c6058c4ea72a7dc73b031db2Jim Grosbach    // we go to a block that just does an unwind (which is the correct action
4008b818d7e98309125c6058c4ea72a7dc73b031db2Jim Grosbach    // for a standard call).
4018b818d7e98309125c6058c4ea72a7dc73b031db2Jim Grosbach    BasicBlock *UnwindBlock = BasicBlock::Create(F.getContext(), "unwindbb", &F);
4028b818d7e98309125c6058c4ea72a7dc73b031db2Jim Grosbach    Unwinds.push_back(new UnwindInst(F.getContext(), UnwindBlock));
4038b818d7e98309125c6058c4ea72a7dc73b031db2Jim Grosbach
4048b818d7e98309125c6058c4ea72a7dc73b031db2Jim Grosbach    Value *DispatchLoad = new LoadInst(CallSite, "invoke.num", true,
4058b818d7e98309125c6058c4ea72a7dc73b031db2Jim Grosbach                                       DispatchBlock);
4068b818d7e98309125c6058c4ea72a7dc73b031db2Jim Grosbach    SwitchInst *DispatchSwitch =
4078b818d7e98309125c6058c4ea72a7dc73b031db2Jim Grosbach      SwitchInst::Create(DispatchLoad, UnwindBlock, Invokes.size(), DispatchBlock);
4088b818d7e98309125c6058c4ea72a7dc73b031db2Jim Grosbach    // Split the entry block to insert the conditional branch for the setjmp.
4098b818d7e98309125c6058c4ea72a7dc73b031db2Jim Grosbach    BasicBlock *ContBlock = EntryBB->splitBasicBlock(EntryBB->getTerminator(),
4108b818d7e98309125c6058c4ea72a7dc73b031db2Jim Grosbach                                                     "eh.sjlj.setjmp.cont");
4118b818d7e98309125c6058c4ea72a7dc73b031db2Jim Grosbach
4128b818d7e98309125c6058c4ea72a7dc73b031db2Jim Grosbach    // Populate the Function Context
4138b818d7e98309125c6058c4ea72a7dc73b031db2Jim Grosbach    //   1. LSDA address
4148b818d7e98309125c6058c4ea72a7dc73b031db2Jim Grosbach    //   2. Personality function address
4158b818d7e98309125c6058c4ea72a7dc73b031db2Jim Grosbach    //   3. jmpbuf (save FP and call eh.sjlj.setjmp)
4168b818d7e98309125c6058c4ea72a7dc73b031db2Jim Grosbach
4178b818d7e98309125c6058c4ea72a7dc73b031db2Jim Grosbach    // LSDA address
4188b818d7e98309125c6058c4ea72a7dc73b031db2Jim Grosbach    Idxs[0] = Zero;
4198b818d7e98309125c6058c4ea72a7dc73b031db2Jim Grosbach    Idxs[1] = ConstantInt::get(Int32Ty, 4);
4208b818d7e98309125c6058c4ea72a7dc73b031db2Jim Grosbach    Value *LSDAFieldPtr =
4218b818d7e98309125c6058c4ea72a7dc73b031db2Jim Grosbach      GetElementPtrInst::Create(FunctionContext, Idxs, Idxs+2,
4228b818d7e98309125c6058c4ea72a7dc73b031db2Jim Grosbach                                "lsda_gep",
4238b818d7e98309125c6058c4ea72a7dc73b031db2Jim Grosbach                                EntryBB->getTerminator());
4248b818d7e98309125c6058c4ea72a7dc73b031db2Jim Grosbach    Value *LSDA = CallInst::Create(LSDAAddrFn, "lsda_addr",
4258b818d7e98309125c6058c4ea72a7dc73b031db2Jim Grosbach                                   EntryBB->getTerminator());
4268b818d7e98309125c6058c4ea72a7dc73b031db2Jim Grosbach    new StoreInst(LSDA, LSDAFieldPtr, true, EntryBB->getTerminator());
4278b818d7e98309125c6058c4ea72a7dc73b031db2Jim Grosbach
4288b818d7e98309125c6058c4ea72a7dc73b031db2Jim Grosbach    Idxs[1] = ConstantInt::get(Int32Ty, 3);
4298b818d7e98309125c6058c4ea72a7dc73b031db2Jim Grosbach    Value *PersonalityFieldPtr =
4308b818d7e98309125c6058c4ea72a7dc73b031db2Jim Grosbach      GetElementPtrInst::Create(FunctionContext, Idxs, Idxs+2,
4318b818d7e98309125c6058c4ea72a7dc73b031db2Jim Grosbach                                "lsda_gep",
4328b818d7e98309125c6058c4ea72a7dc73b031db2Jim Grosbach                                EntryBB->getTerminator());
4338b818d7e98309125c6058c4ea72a7dc73b031db2Jim Grosbach    new StoreInst(PersonalityFn, PersonalityFieldPtr, true,
4348b818d7e98309125c6058c4ea72a7dc73b031db2Jim Grosbach                  EntryBB->getTerminator());
4358b818d7e98309125c6058c4ea72a7dc73b031db2Jim Grosbach
4368b818d7e98309125c6058c4ea72a7dc73b031db2Jim Grosbach    //   Save the frame pointer.
4378b818d7e98309125c6058c4ea72a7dc73b031db2Jim Grosbach    Idxs[1] = ConstantInt::get(Int32Ty, 5);
4388b818d7e98309125c6058c4ea72a7dc73b031db2Jim Grosbach    Value *FieldPtr
4398b818d7e98309125c6058c4ea72a7dc73b031db2Jim Grosbach      = GetElementPtrInst::Create(FunctionContext, Idxs, Idxs+2,
4408b818d7e98309125c6058c4ea72a7dc73b031db2Jim Grosbach                                  "jbuf_gep",
4418b818d7e98309125c6058c4ea72a7dc73b031db2Jim Grosbach                                  EntryBB->getTerminator());
4428b818d7e98309125c6058c4ea72a7dc73b031db2Jim Grosbach    Idxs[1] = ConstantInt::get(Int32Ty, 0);
4438b818d7e98309125c6058c4ea72a7dc73b031db2Jim Grosbach    Value *ElemPtr =
4448b818d7e98309125c6058c4ea72a7dc73b031db2Jim Grosbach      GetElementPtrInst::Create(FieldPtr, Idxs, Idxs+2, "jbuf_fp_gep",
4458b818d7e98309125c6058c4ea72a7dc73b031db2Jim Grosbach                                EntryBB->getTerminator());
4468b818d7e98309125c6058c4ea72a7dc73b031db2Jim Grosbach
4478b818d7e98309125c6058c4ea72a7dc73b031db2Jim Grosbach    Value *Val = CallInst::Create(FrameAddrFn,
4488b818d7e98309125c6058c4ea72a7dc73b031db2Jim Grosbach                                  ConstantInt::get(Int32Ty, 0),
4498b818d7e98309125c6058c4ea72a7dc73b031db2Jim Grosbach                                  "fp",
4508b818d7e98309125c6058c4ea72a7dc73b031db2Jim Grosbach                                  EntryBB->getTerminator());
4518b818d7e98309125c6058c4ea72a7dc73b031db2Jim Grosbach    new StoreInst(Val, ElemPtr, true, EntryBB->getTerminator());
4528b818d7e98309125c6058c4ea72a7dc73b031db2Jim Grosbach    // Call the setjmp instrinsic. It fills in the rest of the jmpbuf
4538b818d7e98309125c6058c4ea72a7dc73b031db2Jim Grosbach    Value *SetjmpArg =
4548b818d7e98309125c6058c4ea72a7dc73b031db2Jim Grosbach      CastInst::Create(Instruction::BitCast, FieldPtr,
455ac53a0b272452013124bfc70480aea5e41b60f40Duncan Sands                       Type::getInt8PtrTy(F.getContext()), "",
456ac53a0b272452013124bfc70480aea5e41b60f40Duncan Sands                       EntryBB->getTerminator());
4578b818d7e98309125c6058c4ea72a7dc73b031db2Jim Grosbach    Value *DispatchVal = CallInst::Create(BuiltinSetjmpFn, SetjmpArg,
4588b818d7e98309125c6058c4ea72a7dc73b031db2Jim Grosbach                                          "dispatch",
4598b818d7e98309125c6058c4ea72a7dc73b031db2Jim Grosbach                                          EntryBB->getTerminator());
4608b818d7e98309125c6058c4ea72a7dc73b031db2Jim Grosbach    // check the return value of the setjmp. non-zero goes to dispatcher
4618b818d7e98309125c6058c4ea72a7dc73b031db2Jim Grosbach    Value *IsNormal = new ICmpInst(EntryBB->getTerminator(),
4628b818d7e98309125c6058c4ea72a7dc73b031db2Jim Grosbach                                   ICmpInst::ICMP_EQ, DispatchVal, Zero,
4638b818d7e98309125c6058c4ea72a7dc73b031db2Jim Grosbach                                   "notunwind");
4648b818d7e98309125c6058c4ea72a7dc73b031db2Jim Grosbach    // Nuke the uncond branch.
4658b818d7e98309125c6058c4ea72a7dc73b031db2Jim Grosbach    EntryBB->getTerminator()->eraseFromParent();
4668b818d7e98309125c6058c4ea72a7dc73b031db2Jim Grosbach
4678b818d7e98309125c6058c4ea72a7dc73b031db2Jim Grosbach    // Put in a new condbranch in its place.
4688b818d7e98309125c6058c4ea72a7dc73b031db2Jim Grosbach    BranchInst::Create(ContBlock, DispatchBlock, IsNormal, EntryBB);
4698b818d7e98309125c6058c4ea72a7dc73b031db2Jim Grosbach
4708b818d7e98309125c6058c4ea72a7dc73b031db2Jim Grosbach    // Register the function context and make sure it's known to not throw
4718b818d7e98309125c6058c4ea72a7dc73b031db2Jim Grosbach    CallInst *Register =
4728b818d7e98309125c6058c4ea72a7dc73b031db2Jim Grosbach      CallInst::Create(RegisterFn, FunctionContext, "",
4738b818d7e98309125c6058c4ea72a7dc73b031db2Jim Grosbach                       ContBlock->getTerminator());
4748b818d7e98309125c6058c4ea72a7dc73b031db2Jim Grosbach    Register->setDoesNotThrow();
4758b818d7e98309125c6058c4ea72a7dc73b031db2Jim Grosbach
4760bb61c56bcad7a738d50f705b5966be446ef06c1Jim Grosbach    // At this point, we are all set up, update the invoke instructions
4778b818d7e98309125c6058c4ea72a7dc73b031db2Jim Grosbach    // to mark their call_site values, and fill in the dispatch switch
4788b818d7e98309125c6058c4ea72a7dc73b031db2Jim Grosbach    // accordingly.
4790bb61c56bcad7a738d50f705b5966be446ef06c1Jim Grosbach    for (unsigned i = 0, e = Invokes.size(); i != e; ++i)
4800bb61c56bcad7a738d50f705b5966be446ef06c1Jim Grosbach      markInvokeCallSite(Invokes[i], i+1, CallSite, DispatchSwitch);
4818b818d7e98309125c6058c4ea72a7dc73b031db2Jim Grosbach
4828b818d7e98309125c6058c4ea72a7dc73b031db2Jim Grosbach    // The front end has likely added calls to _Unwind_Resume. We need
4838b818d7e98309125c6058c4ea72a7dc73b031db2Jim Grosbach    // to find those calls and mark the call_site as -1 immediately prior.
4848b818d7e98309125c6058c4ea72a7dc73b031db2Jim Grosbach    // resume is a noreturn function, so any block that has a call to it
4858b818d7e98309125c6058c4ea72a7dc73b031db2Jim Grosbach    // should end in an 'unreachable' instruction with the call immediately
4868b818d7e98309125c6058c4ea72a7dc73b031db2Jim Grosbach    // prior. That's how we'll search.
4878b818d7e98309125c6058c4ea72a7dc73b031db2Jim Grosbach    // ??? There's got to be a better way. this is fugly.
4888b818d7e98309125c6058c4ea72a7dc73b031db2Jim Grosbach    for (Function::iterator BB = F.begin(), E = F.end(); BB != E; ++BB)
4898b818d7e98309125c6058c4ea72a7dc73b031db2Jim Grosbach      if ((dyn_cast<UnreachableInst>(BB->getTerminator()))) {
4908b818d7e98309125c6058c4ea72a7dc73b031db2Jim Grosbach        BasicBlock::iterator I = BB->getTerminator();
4918b818d7e98309125c6058c4ea72a7dc73b031db2Jim Grosbach        // Check the previous instruction and see if it's a resume call
4928b818d7e98309125c6058c4ea72a7dc73b031db2Jim Grosbach        if (I == BB->begin()) continue;
4938b818d7e98309125c6058c4ea72a7dc73b031db2Jim Grosbach        if (CallInst *CI = dyn_cast<CallInst>(--I)) {
4948b818d7e98309125c6058c4ea72a7dc73b031db2Jim Grosbach          if (CI->getCalledFunction() == ResumeFn) {
4955d17eddb0cc07c13acbb38205778db7678a65065Daniel Dunbar            Value *NegativeOne = Constant::getAllOnesValue(Int32Ty);
4968b818d7e98309125c6058c4ea72a7dc73b031db2Jim Grosbach            new StoreInst(NegativeOne, CallSite, true, I);  // volatile
4978b818d7e98309125c6058c4ea72a7dc73b031db2Jim Grosbach          }
4988b818d7e98309125c6058c4ea72a7dc73b031db2Jim Grosbach        }
4998b818d7e98309125c6058c4ea72a7dc73b031db2Jim Grosbach      }
5008b818d7e98309125c6058c4ea72a7dc73b031db2Jim Grosbach
5018b818d7e98309125c6058c4ea72a7dc73b031db2Jim Grosbach    // Replace all unwinds with a branch to the unwind handler.
5028b818d7e98309125c6058c4ea72a7dc73b031db2Jim Grosbach    // ??? Should this ever happen with sjlj exceptions?
5038b818d7e98309125c6058c4ea72a7dc73b031db2Jim Grosbach    for (unsigned i = 0, e = Unwinds.size(); i != e; ++i) {
5048b818d7e98309125c6058c4ea72a7dc73b031db2Jim Grosbach      BranchInst::Create(UnwindBlock, Unwinds[i]);
5058b818d7e98309125c6058c4ea72a7dc73b031db2Jim Grosbach      Unwinds[i]->eraseFromParent();
5068b818d7e98309125c6058c4ea72a7dc73b031db2Jim Grosbach    }
5078b818d7e98309125c6058c4ea72a7dc73b031db2Jim Grosbach
5088b818d7e98309125c6058c4ea72a7dc73b031db2Jim Grosbach    // Finally, for any returns from this function, if this function contains an
5098b818d7e98309125c6058c4ea72a7dc73b031db2Jim Grosbach    // invoke, add a call to unregister the function context.
5108b818d7e98309125c6058c4ea72a7dc73b031db2Jim Grosbach    for (unsigned i = 0, e = Returns.size(); i != e; ++i)
5118b818d7e98309125c6058c4ea72a7dc73b031db2Jim Grosbach      CallInst::Create(UnregisterFn, FunctionContext, "", Returns[i]);
5128b818d7e98309125c6058c4ea72a7dc73b031db2Jim Grosbach  }
5138b818d7e98309125c6058c4ea72a7dc73b031db2Jim Grosbach
5148b818d7e98309125c6058c4ea72a7dc73b031db2Jim Grosbach  return true;
5158b818d7e98309125c6058c4ea72a7dc73b031db2Jim Grosbach}
5168b818d7e98309125c6058c4ea72a7dc73b031db2Jim Grosbach
5178b818d7e98309125c6058c4ea72a7dc73b031db2Jim Grosbachbool SjLjEHPass::runOnFunction(Function &F) {
5188b818d7e98309125c6058c4ea72a7dc73b031db2Jim Grosbach  bool Res = insertSjLjEHSupport(F);
5198b818d7e98309125c6058c4ea72a7dc73b031db2Jim Grosbach  return Res;
5208b818d7e98309125c6058c4ea72a7dc73b031db2Jim Grosbach}
521