- // Find the eh.selector.*, eh.exception and alloca calls.
- //
- // Remember any allocas() that aren't in the entry block, as the
- // jmpbuf saved SP will need to be updated for them.
- //
- // We'll use the first eh.selector to determine the right personality
- // function to use. For SJLJ, we always use the same personality for the
- // whole function, not on a per-selector basis.
- // FIXME: That's a bit ugly. Better way?
- SmallVector<CallInst*,16> EH_Selectors;
- SmallVector<CallInst*,16> EH_Exceptions;
- SmallVector<Instruction*,16> JmpbufUpdatePoints;
-
- for (Function::iterator BB = F.begin(), E = F.end(); BB != E; ++BB) {
- // Note: Skip the entry block since there's nothing there that interests
- // us. eh.selector and eh.exception shouldn't ever be there, and we
- // want to disregard any allocas that are there.
- //
- // FIXME: This is awkward. The new EH scheme won't need to skip the entry
- // block.
- if (BB == F.begin()) {
- if (InvokeInst *II = dyn_cast<InvokeInst>(F.begin()->getTerminator())) {
- // FIXME: This will be always non-NULL in the new EH.
- if (LandingPadInst *LPI = II->getUnwindDest()->getLandingPadInst())
- if (!PersonalityFn) PersonalityFn = LPI->getPersonalityFn();
- }
-
- continue;
- }
-
- for (BasicBlock::iterator I = BB->begin(), E = BB->end(); I != E; ++I) {
- if (CallInst *CI = dyn_cast<CallInst>(I)) {
- if (CI->getCalledFunction() == SelectorFn) {
- if (!PersonalityFn) PersonalityFn = CI->getArgOperand(1);
- EH_Selectors.push_back(CI);
- } else if (CI->getCalledFunction() == ExceptionFn) {
- EH_Exceptions.push_back(CI);
- } else if (CI->getCalledFunction() == StackRestoreFn) {
- JmpbufUpdatePoints.push_back(CI);
- }
- } else if (AllocaInst *AI = dyn_cast<AllocaInst>(I)) {
- JmpbufUpdatePoints.push_back(AI);
- } else if (InvokeInst *II = dyn_cast<InvokeInst>(I)) {
- // FIXME: This will be always non-NULL in the new EH.
- if (LandingPadInst *LPI = II->getUnwindDest()->getLandingPadInst())
- if (!PersonalityFn) PersonalityFn = LPI->getPersonalityFn();
- }
- }
- }
-
- // If we don't have any eh.selector calls, we can't determine the personality
- // function. Without a personality function, we can't process exceptions.
- if (!PersonalityFn) return false;
-
- // We have invokes, so we need to add register/unregister calls to get this
- // function onto the global unwind stack.
- //
- // First thing we need to do is scan the whole function for values that are
- // live across unwind edges. Each value that is live across an unwind edge we
- // spill into a stack location, guaranteeing that there is nothing live across
- // the unwind edge. This process also splits all critical edges coming out of
- // invoke's.
- splitLiveRangesAcrossInvokes(Invokes);
-
-
- SmallVector<LandingPadInst*, 16> LandingPads;
- for (Function::iterator BB = F.begin(), E = F.end(); BB != E; ++BB) {
- if (InvokeInst *II = dyn_cast<InvokeInst>(BB->getTerminator()))
- // FIXME: This will be always non-NULL in the new EH.
- if (LandingPadInst *LPI = II->getUnwindDest()->getLandingPadInst())
- LandingPads.push_back(LPI);
- }