diff options
author | Jim Grosbach <grosbach@apple.com> | 2010-01-21 00:43:30 +0000 |
---|---|---|
committer | Jim Grosbach <grosbach@apple.com> | 2010-01-21 00:43:30 +0000 |
commit | d0a0c382ea51d36dc7e5938291763da73b4262dc (patch) | |
tree | 7915691c3b9bc343921177c6faac70d7ea9b600e | |
parent | fd0b0288e2ee5ccf3f1d47090542710c67a77cf7 (diff) | |
download | external_llvm-d0a0c382ea51d36dc7e5938291763da73b4262dc.zip external_llvm-d0a0c382ea51d36dc7e5938291763da73b4262dc.tar.gz external_llvm-d0a0c382ea51d36dc7e5938291763da73b4262dc.tar.bz2 |
Make sure that landing pad entries in the EH call site table are in the proper
order for SjLj style exception handling.
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@94055 91177308-0d34-0410-b5e6-96231b3b80d8
-rw-r--r-- | include/llvm/CodeGen/MachineModuleInfo.h | 20 | ||||
-rw-r--r-- | include/llvm/Function.h | 17 | ||||
-rw-r--r-- | lib/CodeGen/AsmPrinter/DwarfException.cpp | 11 | ||||
-rw-r--r-- | lib/CodeGen/MachineModuleInfo.cpp | 1 | ||||
-rw-r--r-- | lib/CodeGen/SelectionDAG/SelectionDAGBuilder.cpp | 6 | ||||
-rw-r--r-- | lib/CodeGen/SjLjEHPrepare.cpp | 4 |
6 files changed, 54 insertions, 5 deletions
diff --git a/include/llvm/CodeGen/MachineModuleInfo.h b/include/llvm/CodeGen/MachineModuleInfo.h index e9b645b..192f37d 100644 --- a/include/llvm/CodeGen/MachineModuleInfo.h +++ b/include/llvm/CodeGen/MachineModuleInfo.h @@ -113,7 +113,11 @@ class MachineModuleInfo : public ImmutablePass { // LandingPads - List of LandingPadInfo describing the landing pad information // in the current function. std::vector<LandingPadInfo> LandingPads; - + + // Map of invoke call site index values to associated begin EH_LABEL for + // the current function. + DenseMap<unsigned, unsigned> CallSiteMap; + // TypeInfos - List of C++ TypeInfo used in the current function. // std::vector<GlobalVariable *> TypeInfos; @@ -301,7 +305,19 @@ public: const std::vector<LandingPadInfo> &getLandingPads() const { return LandingPads; } - + + /// setCallSiteBeginLabel - Map the begin label for a call site + void setCallSiteBeginLabel(unsigned BeginLabel, unsigned Site) { + CallSiteMap[BeginLabel] = Site; + } + + /// getCallSiteBeginLabel - Get the call site number for a begin label + unsigned getCallSiteBeginLabel(unsigned BeginLabel) { + assert(CallSiteMap.count(BeginLabel) && + "Missing call site number for EH_LABEL!"); + return CallSiteMap[BeginLabel]; + } + /// getTypeInfos - Return a reference to the C++ typeinfo for the current /// function. const std::vector<GlobalVariable *> &getTypeInfos() const { diff --git a/include/llvm/Function.h b/include/llvm/Function.h index 3882233..72cb267 100644 --- a/include/llvm/Function.h +++ b/include/llvm/Function.h @@ -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 @@ private: 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 // HasLazyArguments is stored in Value::SubclassData. /*bool HasLazyArguments;*/ @@ -165,7 +168,19 @@ public: 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; } diff --git a/lib/CodeGen/AsmPrinter/DwarfException.cpp b/lib/CodeGen/AsmPrinter/DwarfException.cpp index 615be0e..d09f9d9 100644 --- a/lib/CodeGen/AsmPrinter/DwarfException.cpp +++ b/lib/CodeGen/AsmPrinter/DwarfException.cpp @@ -590,7 +590,16 @@ ComputeCallSiteTable(SmallVectorImpl<CallSiteEntry> &CallSites, } // 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. diff --git a/lib/CodeGen/MachineModuleInfo.cpp b/lib/CodeGen/MachineModuleInfo.cpp index ed5bb5e..dc26d91 100644 --- a/lib/CodeGen/MachineModuleInfo.cpp +++ b/lib/CodeGen/MachineModuleInfo.cpp @@ -71,6 +71,7 @@ void MachineModuleInfo::EndFunction() { // Clean up exception info. LandingPads.clear(); + CallSiteMap.clear(); TypeInfos.clear(); FilterIds.clear(); FilterEnds.clear(); diff --git a/lib/CodeGen/SelectionDAG/SelectionDAGBuilder.cpp b/lib/CodeGen/SelectionDAG/SelectionDAGBuilder.cpp index a3fb345..5b733a8 100644 --- a/lib/CodeGen/SelectionDAG/SelectionDAGBuilder.cpp +++ b/lib/CodeGen/SelectionDAG/SelectionDAGBuilder.cpp @@ -5049,6 +5049,12 @@ void SelectionDAGBuilder::LowerCallTo(CallSite CS, SDValue Callee, // 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(); diff --git a/lib/CodeGen/SjLjEHPrepare.cpp b/lib/CodeGen/SjLjEHPrepare.cpp index 9558933..95b94e6 100644 --- a/lib/CodeGen/SjLjEHPrepare.cpp +++ b/lib/CodeGen/SjLjEHPrepare.cpp @@ -474,8 +474,10 @@ bool SjLjEHPass::insertSjLjEHSupport(Function &F) { // 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. |