[llvm-commits] [llvm] r94055 - in /llvm/trunk: include/llvm/CodeGen/MachineModuleInfo.h include/llvm/Function.h lib/CodeGen/AsmPrinter/DwarfException.cpp lib/CodeGen/MachineModuleInfo.cpp lib/CodeGen/SelectionDAG/SelectionDAGBuilder.cpp lib/CodeGen/SjLjEHPrepare.cpp
Chris Lattner
clattner at apple.com
Wed Jan 20 18:16:20 PST 2010
On Jan 20, 2010, at 4:43 PM, Jim Grosbach wrote:
> Author: grosbach
> Date: Wed Jan 20 18:43:30 2010
> New Revision: 94055
>
> URL: http://llvm.org/viewvc/llvm-project?rev=94055&view=rev
> Log:
> Make sure that landing pad entries in the EH call site table are in
> the proper
> order for SjLj style exception handling.
hi Jim,
> +++ llvm/trunk/include/llvm/Function.h Wed Jan 20 18:43:30 2010
> @@ -24,6 +24,7 @@
> #include "llvm/Argument.h"
> #include "llvm/Attributes.h"
> #include "llvm/Support/Compiler.h"
> +#include "llvm/ADT/DenseMap.h"
>
> namespace llvm {
>
> @@ -86,6 +87,8 @@
> mutable ArgumentListType ArgumentList; ///< The formal arguments
> ValueSymbolTable *SymTab; ///< Symbol table of args/
> instructions
> AttrListPtr AttributeList; ///< Parameter attributes
> + DenseMap<Instruction*, unsigned>
> + CallSiteNumbering; ///< SjLj EH call site
> numbering
Why are you adding this to llvm::Function? SjLj EH should not impact
anything that core to the entire compiler. Maybe codegen should have
a DenseMap<Instruction*, unsigned> ?
-Chris
>
> // HasLazyArguments is stored in Value::SubclassData.
> /*bool HasLazyArguments;*/
> @@ -165,7 +168,19 @@
> setValueSubclassData((getSubclassDataFromValue() & 1) |
> (static_cast<unsigned>(CC) << 1));
> }
> -
> +
> + /// setCallSiteNumber - Set the call site number mapping for an
> invoke
> + /// in the function
> + void setCallSiteNumber(Instruction *II, unsigned Num) {
> + CallSiteNumbering[II] = Num;
> + }
> +
> + /// getCallSiteNumber - Get the call site number for an invoke
> instruction
> + unsigned getCallSiteNumber(Instruction *II) {
> + if (CallSiteNumbering.count(II) == 0) return 0;
> + return CallSiteNumbering[II];
> + }
> +
> /// getAttributes - Return the attribute list for this Function.
> ///
> const AttrListPtr &getAttributes() const { return AttributeList; }
>
> Modified: llvm/trunk/lib/CodeGen/AsmPrinter/DwarfException.cpp
> URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/CodeGen/AsmPrinter/DwarfException.cpp?rev=94055&r1=94054&r2=94055&view=diff
>
> =
> =
> =
> =
> =
> =
> =
> =
> ======================================================================
> --- llvm/trunk/lib/CodeGen/AsmPrinter/DwarfException.cpp (original)
> +++ llvm/trunk/lib/CodeGen/AsmPrinter/DwarfException.cpp Wed Jan 20
> 18:43:30 2010
> @@ -590,7 +590,16 @@
> }
>
> // Otherwise, create a new call-site.
> - CallSites.push_back(Site);
> + if (MAI->getExceptionHandlingType() ==
> ExceptionHandling::Dwarf)
> + CallSites.push_back(Site);
> + else {
> + // SjLj EH must maintain the call sites in the order
> assigned
> + // to them by the SjLjPrepare pass.
> + unsigned SiteNo = MMI->getCallSiteBeginLabel(BeginLabel);
> + if (CallSites.size() < SiteNo)
> + CallSites.resize(SiteNo);
> + CallSites[SiteNo - 1] = Site;
> + }
> PreviousIsInvoke = true;
> } else {
> // Create a gap.
>
> Modified: llvm/trunk/lib/CodeGen/MachineModuleInfo.cpp
> URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/CodeGen/MachineModuleInfo.cpp?rev=94055&r1=94054&r2=94055&view=diff
>
> =
> =
> =
> =
> =
> =
> =
> =
> ======================================================================
> --- llvm/trunk/lib/CodeGen/MachineModuleInfo.cpp (original)
> +++ llvm/trunk/lib/CodeGen/MachineModuleInfo.cpp Wed Jan 20 18:43:30
> 2010
> @@ -71,6 +71,7 @@
>
> // Clean up exception info.
> LandingPads.clear();
> + CallSiteMap.clear();
> TypeInfos.clear();
> FilterIds.clear();
> FilterEnds.clear();
>
> Modified: llvm/trunk/lib/CodeGen/SelectionDAG/SelectionDAGBuilder.cpp
> URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/CodeGen/SelectionDAG/SelectionDAGBuilder.cpp?rev=94055&r1=94054&r2=94055&view=diff
>
> =
> =
> =
> =
> =
> =
> =
> =
> ======================================================================
> --- llvm/trunk/lib/CodeGen/SelectionDAG/SelectionDAGBuilder.cpp
> (original)
> +++ llvm/trunk/lib/CodeGen/SelectionDAG/SelectionDAGBuilder.cpp Wed
> Jan 20 18:43:30 2010
> @@ -5049,6 +5049,12 @@
> // used to detect deletion of the invoke via the
> MachineModuleInfo.
> BeginLabel = MMI->NextLabelID();
>
> + // Keep track of which landing pads go with which invokes. SjLj
> uses
> + // this to maintain the ordering of pads in the LSDA. Dwarf
> ignores it.
> + Function *F = LandingPad->getParent()->getFunction();
> + MMI->setCallSiteBeginLabel(BeginLabel,
> + F-
> >getCallSiteNumber(CS.getInstruction()));
> +
> // Both PendingLoads and PendingExports must be flushed here;
> // this call might not return.
> (void)getRoot();
>
> Modified: llvm/trunk/lib/CodeGen/SjLjEHPrepare.cpp
> URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/CodeGen/SjLjEHPrepare.cpp?rev=94055&r1=94054&r2=94055&view=diff
>
> =
> =
> =
> =
> =
> =
> =
> =
> ======================================================================
> --- llvm/trunk/lib/CodeGen/SjLjEHPrepare.cpp (original)
> +++ llvm/trunk/lib/CodeGen/SjLjEHPrepare.cpp Wed Jan 20 18:43:30 2010
> @@ -474,8 +474,10 @@
> // 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.
> - for (unsigned i = 0, e = Invokes.size(); i != e; ++i)
> + for (unsigned i = 0, e = Invokes.size(); i != e; ++i) {
> + F.setCallSiteNumber(Invokes[i], i+1);
> 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.
>
>
> _______________________________________________
> 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