[llvm-commits] [llvm] r80530 - in /llvm/trunk/lib/CodeGen: AsmPrinter/DwarfException.cpp SjLjEHPrepare.cpp
Evan Cheng
evan.cheng at apple.com
Mon Aug 31 01:31:55 PDT 2009
Test case?
Evan
On Aug 30, 2009, at 6:35 PM, Jim Grosbach wrote:
> Author: grosbach
> Date: Sun Aug 30 20:35:03 2009
> New Revision: 80530
>
> URL: http://llvm.org/viewvc/llvm-project?rev=80530&view=rev
> Log:
> PR4747
>
> Shared landing pads run into trouble with SJLJ, as the dispatch
> table is
> mapped to call sites, and merging the pads will throw that off.
> There needs
> to be a one-to-one mapping of landing pad exception table entries to
> invoke
> call points.
>
> Detecting the shared pad during lowering of SJLJ info insn't
> sufficient, as
> the dispatch function may still need separate destinations to properly
> handle phi-nodes.
>
> Modified:
> llvm/trunk/lib/CodeGen/AsmPrinter/DwarfException.cpp
> llvm/trunk/lib/CodeGen/SjLjEHPrepare.cpp
>
> Modified: llvm/trunk/lib/CodeGen/AsmPrinter/DwarfException.cpp
> URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/CodeGen/AsmPrinter/DwarfException.cpp?rev=80530&r1=80529&r2=80530&view=diff
>
> =
> =
> =
> =
> =
> =
> =
> =
> ======================================================================
> --- llvm/trunk/lib/CodeGen/AsmPrinter/DwarfException.cpp (original)
> +++ llvm/trunk/lib/CodeGen/AsmPrinter/DwarfException.cpp Sun Aug 30
> 20:35:03 2009
> @@ -468,8 +468,9 @@
> FirstActions[P.PadIndex]
> };
>
> - // Try to merge with the previous call-site.
> - if (PreviousIsInvoke) {
> + // Try to merge with the previous call-site. SJLJ doesn't
> do this
> + if (PreviousIsInvoke &&
> + MAI->getExceptionHandlingType() ==
> ExceptionHandling::Dwarf) {
> CallSiteEntry &Prev = CallSites.back();
> if (Site.PadLabel == Prev.PadLabel && Site.Action ==
> Prev.Action) {
> // Extend the range of the previous entry.
>
> Modified: llvm/trunk/lib/CodeGen/SjLjEHPrepare.cpp
> URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/CodeGen/SjLjEHPrepare.cpp?rev=80530&r1=80529&r2=80530&view=diff
>
> =
> =
> =
> =
> =
> =
> =
> =
> ======================================================================
> --- llvm/trunk/lib/CodeGen/SjLjEHPrepare.cpp (original)
> +++ llvm/trunk/lib/CodeGen/SjLjEHPrepare.cpp Sun Aug 30 20:35:03 2009
> @@ -24,7 +24,6 @@
> #include "llvm/CodeGen/Passes.h"
> #include "llvm/Transforms/Utils/BasicBlockUtils.h"
> #include "llvm/Transforms/Utils/Local.h"
> -#include "llvm/ADT/DenseMap.h"
> #include "llvm/ADT/Statistic.h"
> #include "llvm/ADT/SmallVector.h"
> #include "llvm/Support/CommandLine.h"
> @@ -70,7 +69,8 @@
>
> private:
> void markInvokeCallSite(InvokeInst *II, unsigned InvokeNo,
> - Value *CallSite);
> + Value *CallSite,
> + SwitchInst *CatchSwitch);
> void splitLiveRangesLiveAcrossInvokes(SmallVector<InvokeInst*,
> 16> &Invokes);
> bool insertSjLjEHSupport(Function &F);
> };
> @@ -126,9 +126,14 @@
>
> /// markInvokeCallSite - Insert code to mark the call_site for this
> invoke
> void SjLjEHPass::markInvokeCallSite(InvokeInst *II, unsigned InvokeNo,
> - Value *CallSite) {
> + Value *CallSite,
> + SwitchInst *CatchSwitch) {
> ConstantInt *CallSiteNoC= ConstantInt::get(Type::getInt32Ty(II-
> >getContext()),
> InvokeNo);
> + // The runtime comes back to the dispatcher with the call_site -
> 1 in
> + // the context. Odd, but there it is.
> + ConstantInt *SwitchValC = ConstantInt::get(Type::getInt32Ty(II-
> >getContext()),
> + InvokeNo - 1);
>
> // If the unwind edge has phi nodes, split the edge.
> if (isa<PHINode>(II->getUnwindDest()->begin())) {
> @@ -145,6 +150,8 @@
> // location afterward.
> new StoreInst(CallSiteNoC, CallSite, true, II); // volatile
>
> + // Add a switch case to our unwind block.
> + CatchSwitch->addCase(SwitchValC, II->getUnwindDest());
> // We still want this to look like an invoke so we emit the LSDA
> properly
> // FIXME: ??? Or will this cause strangeness with mis-matched IDs
> like
> // when it was in the front end?
> @@ -311,6 +318,13 @@
> if (!Invokes.empty()) {
> // 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.
> + splitLiveRangesLiveAcrossInvokes(Invokes);
>
> BasicBlock *EntryBB = F.begin();
> // Create an alloca for the incoming jump buffer ptr and the new
> jump buffer
> @@ -462,32 +476,11 @@
> ContBlock->getTerminator());
> Register->setDoesNotThrow();
>
> - // At this point, we are all set up. Update the invoke
> instructions
> + // At this point, we are all set up, update the invoke
> instructions
> // to mark their call_site values, and fill in the dispatch switch
> // accordingly.
> - DenseMap<BasicBlock*,unsigned> PadSites;
> - unsigned NextCallSiteValue = 1;
> - for (SmallVector<InvokeInst*,16>::iterator I = Invokes.begin(),
> - E = Invokes.end(); I < E; ++I) {
> - unsigned CallSiteValue;
> - BasicBlock *LandingPad = (*I)->getSuccessor(1);
> - // landing pads can be shared. If we see a landing pad again,
> we
> - // want to make sure to use the same call site index so the
> dispatch
> - // will go to the right place.
> - CallSiteValue = PadSites[LandingPad];
> - if (!CallSiteValue) {
> - CallSiteValue = NextCallSiteValue++;
> - PadSites[LandingPad] = CallSiteValue;
> - // Add a switch case to our unwind block. The runtime comes
> back
> - // to the dispatcher with the call_site - 1 in the context.
> Odd,
> - // but there it is.
> - ConstantInt *SwitchValC =
> - ConstantInt::get(Type::getInt32Ty((*I)->getContext()),
> - CallSiteValue - 1);
> - DispatchSwitch->addCase(SwitchValC, (*I)->getUnwindDest());
> - }
> - markInvokeCallSite(*I, CallSiteValue, CallSite);
> - }
> + for (unsigned i = 0, e = Invokes.size(); i != e; ++i)
> + markInvokeCallSite(Invokes[i], i+1, CallSite, DispatchSwitch);
>
> // The front end has likely added calls to _Unwind_Resume. We need
> // to find those calls and mark the call_site as -1 immediately
> prior.
> @@ -515,13 +508,6 @@
> Unwinds[i]->eraseFromParent();
> }
>
> - // 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.
> - splitLiveRangesLiveAcrossInvokes(Invokes);
> -
> // Finally, for any returns from this function, if this function
> contains an
> // invoke, add a call to unregister the function context.
> for (unsigned i = 0, e = Returns.size(); i != e; ++i)
>
>
> _______________________________________________
> llvm-commits mailing list
> llvm-commits at cs.uiuc.edu
> http://lists.cs.uiuc.edu/mailman/listinfo/llvm-commits
More information about the llvm-commits
mailing list