[llvm-commits] CVS: llvm/lib/CodeGen/DwarfWriter.cpp MachineModuleInfo.cpp

Duncan Sands baldrick at free.fr
Sat Jun 2 09:54:13 PDT 2007



Changes in directory llvm/lib/CodeGen:

DwarfWriter.cpp updated: 1.149 -> 1.150
MachineModuleInfo.cpp updated: 1.15 -> 1.16
---
Log message:

Integrate exception filter support and exception catch support.  This
simplifies the code in DwarfWriter, allows for multiple filters and
makes it trivial to specify filters accompanied by cleanups or catch-all
specifications (see next patch).  What a deal!  Patch blessed by Anton.


---
Diffs of the changes:  (+44 -57)

 DwarfWriter.cpp       |   74 ++++++++++++++------------------------------------
 MachineModuleInfo.cpp |   27 +++++++++++++++---
 2 files changed, 44 insertions(+), 57 deletions(-)


Index: llvm/lib/CodeGen/DwarfWriter.cpp
diff -u llvm/lib/CodeGen/DwarfWriter.cpp:1.149 llvm/lib/CodeGen/DwarfWriter.cpp:1.150
--- llvm/lib/CodeGen/DwarfWriter.cpp:1.149	Wed May 23 06:08:30 2007
+++ llvm/lib/CodeGen/DwarfWriter.cpp	Sat Jun  2 11:53:42 2007
@@ -2896,13 +2896,10 @@
 
   /// EquivPads - Whether two landing pads have equivalent actions.
   static bool EquivPads(const LandingPadInfo *L, const LandingPadInfo *R) {
-    const std::vector<unsigned> &LIds = L->TypeIds;
-    const std::vector<unsigned> &RIds = R->TypeIds;
+    const std::vector<int> &LIds = L->TypeIds;
+    const std::vector<int> &RIds = R->TypeIds;
     unsigned LSize = LIds.size(), RSize = RIds.size();
 
-    if (L->IsFilter != R->IsFilter)
-      return false;
-
     if (LSize != RSize)
       return false;
 
@@ -2915,14 +2912,10 @@
 
   /// PadLT - An order on landing pads, with EquivPads as order equivalence.
   static bool PadLT(const LandingPadInfo *L, const LandingPadInfo *R) {
-    const std::vector<unsigned> &LIds = L->TypeIds;
-    const std::vector<unsigned> &RIds = R->TypeIds;
+    const std::vector<int> &LIds = L->TypeIds;
+    const std::vector<int> &RIds = R->TypeIds;
     unsigned LSize = LIds.size(), RSize = RIds.size();
 
-    if (L->IsFilter != R->IsFilter)
-      // Make filters come last
-      return L->IsFilter < R->IsFilter;
-
     if (LSize != RSize)
       return LSize < RSize;
 
@@ -2972,6 +2965,7 @@
     MMI->TidyLandingPads();
 
     const std::vector<GlobalVariable *> &TypeInfos = MMI->getTypeInfos();
+    const std::vector<unsigned> &FilterIds = MMI->getFilterIds();
     const std::vector<LandingPadInfo> &PadInfos = MMI->getLandingPads();
     if (PadInfos.empty()) return;
 
@@ -2985,11 +2979,6 @@
     // Gather first action index for each landing pad site.
     SmallVector<unsigned, 32> Actions;
 
-    // FIXME - Assume there is only one filter typeinfo list per function
-    // time being.  I.E., Each call to eh_filter will have the same list.
-    // This can change if a function is inlined. 
-    const LandingPadInfo *Filter = 0;
-
     // Compute sizes for exception table.
     unsigned SizeSites = 0;
     unsigned SizeActions = 0;
@@ -3003,24 +2992,15 @@
       unsigned SizeSiteActions = 0;
 
       if (!i || !EquivPads(LandingPad, LandingPads[i-1])) {
-        const std::vector<unsigned> &TypeIds = LandingPad->TypeIds;
+        const std::vector<int> &TypeIds = LandingPad->TypeIds;
         unsigned SizeAction = 0;
 
-        if (LandingPad->IsFilter) {
-          // FIXME - Assume there is only one filter typeinfo list per function
-          // time being.  I.E., Each call to eh_filter will have the same list.
-          // This can change if a function is inlined.
-          Filter = LandingPad;
-          SizeAction =  Asm->SizeSLEB128(-1) + Asm->SizeSLEB128(0);
-          SizeSiteActions += SizeAction;
-          // Record the first action of the landing pad site.
-          FirstAction = SizeActions + SizeSiteActions - SizeAction + 1;
-        } else if (TypeIds.empty()) {
+        if (TypeIds.empty()) {
           FirstAction = 0;
         } else {
           // Gather the action sizes
           for (unsigned j = 0, M = TypeIds.size(); j != M; ++j) {
-            unsigned TypeID = TypeIds[j];
+            int TypeID = TypeIds[j];
             unsigned SizeTypeID = Asm->SizeSLEB128(TypeID);
             signed Action = j ? -(SizeAction + SizeTypeID) : 0;
             SizeAction = SizeTypeID + Asm->SizeSLEB128(Action);
@@ -3140,25 +3120,18 @@
     for (unsigned i = 0, N = LandingPads.size(); i != N; ++i) {
       if (!i || Actions[i] != Actions[i-1]) {
         const LandingPadInfo *LandingPad = LandingPads[i];
-        const std::vector<unsigned> &TypeIds = LandingPad->TypeIds;
+        const std::vector<int> &TypeIds = LandingPad->TypeIds;
         unsigned SizeAction = 0;
 
-        if (LandingPad->IsFilter) {
-          Asm->EmitSLEB128Bytes(-1);
+        for (unsigned j = 0, M = TypeIds.size(); j < M; ++j) {
+          int TypeID = TypeIds[j];
+          unsigned SizeTypeID = Asm->SizeSLEB128(TypeID);
+          Asm->EmitSLEB128Bytes(TypeID);
           Asm->EOL("TypeInfo index");
-          Asm->EmitSLEB128Bytes(0);
+          signed Action = j ? -(SizeAction + SizeTypeID) : 0;
+          SizeAction = SizeTypeID + Asm->SizeSLEB128(Action);
+          Asm->EmitSLEB128Bytes(Action);
           Asm->EOL("Next action");
-        } else {
-          for (unsigned j = 0, M = TypeIds.size(); j < M; ++j) {
-            unsigned TypeID = TypeIds[j];
-            unsigned SizeTypeID = Asm->SizeSLEB128(TypeID);
-            Asm->EmitSLEB128Bytes(TypeID);
-            Asm->EOL("TypeInfo index");
-            signed Action = j ? -(SizeAction + SizeTypeID) : 0;
-            SizeAction = SizeTypeID + Asm->SizeSLEB128(Action);
-            Asm->EmitSLEB128Bytes(Action);
-            Asm->EOL("Next action");
-          }
         }
       }
     }
@@ -3180,16 +3153,11 @@
       Asm->EOL("TypeInfo");
     }
 
-    // Emit the filter typeinfo.
-    if (Filter) {
-      const std::vector<unsigned> &TypeIds = Filter->TypeIds;
-      for (unsigned j = 0, M = TypeIds.size(); j < M; ++j) {
-        unsigned TypeID = TypeIds[j];
-        Asm->EmitSLEB128Bytes(TypeID);
-        Asm->EOL("TypeInfo index");
-      }
-      Asm->EmitSLEB128Bytes(0);
-      Asm->EOL("End of filter typeinfo");
+    // Emit the filter typeids.
+    for (unsigned j = 0, M = FilterIds.size(); j < M; ++j) {
+      unsigned TypeID = FilterIds[j];
+      Asm->EmitSLEB128Bytes(TypeID);
+      Asm->EOL("Filter TypeInfo index");
     }
     
     Asm->EmitAlignment(2);


Index: llvm/lib/CodeGen/MachineModuleInfo.cpp
diff -u llvm/lib/CodeGen/MachineModuleInfo.cpp:1.15 llvm/lib/CodeGen/MachineModuleInfo.cpp:1.16
--- llvm/lib/CodeGen/MachineModuleInfo.cpp:1.15	Wed May 23 06:08:31 2007
+++ llvm/lib/CodeGen/MachineModuleInfo.cpp	Sat Jun  2 11:53:42 2007
@@ -1521,6 +1521,7 @@
   // Clean up exception info.
   LandingPads.clear();
   TypeInfos.clear();
+  FilterIds.clear();
 }
 
 /// getDescFor - Convert a Value to a debug information descriptor.
@@ -1708,12 +1709,16 @@
   for (unsigned N = TyInfo.size(); N; --N)
     LP.TypeIds.push_back(getTypeIDFor(TyInfo[N - 1]));
 }
-                        
-/// setIsFilterLandingPad - Indicates that the landing pad is a throw filter.
+
+/// addFilterTypeInfo - Provide the filter typeinfo for a landing pad.
 ///
-void MachineModuleInfo::setIsFilterLandingPad(MachineBasicBlock *LandingPad) {
+void MachineModuleInfo::addFilterTypeInfo(MachineBasicBlock *LandingPad,
+                                        std::vector<GlobalVariable *> &TyInfo) {
   LandingPadInfo &LP = getOrCreateLandingPadInfo(LandingPad);
-  LP.IsFilter = true;
+  std::vector<unsigned> IdsInFilter (TyInfo.size());
+  for (unsigned I = 0, E = TyInfo.size(); I != E; ++I)
+    IdsInFilter[I] = getTypeIDFor(TyInfo[I]);
+  LP.TypeIds.push_back(getFilterIDFor(IdsInFilter));
 }
 
 /// TidyLandingPads - Remap landing pad labels and remove any deleted landing
@@ -1760,6 +1765,20 @@
   return TypeInfos.size();
 }
 
+/// getFilterIDFor - Return the filter id for the specified typeinfos.  This is
+/// function wide.
+int MachineModuleInfo::getFilterIDFor(std::vector<unsigned> &TyIds) {
+  // TODO: map duplicate filters to the same filter id; a filter equal to the
+  // tail of an existing filter also need not be added; re-order filters and
+  // filter elements to maximize this kind of sharing.
+  int FilterID = -(1 + FilterIds.size());
+  FilterIds.reserve(FilterIds.size() + TyIds.size() + 1);
+  for (unsigned I = 0, N = TyIds.size(); I != N; ++I)
+    FilterIds.push_back(TyIds[I]);
+  FilterIds.push_back(0); // terminator
+  return FilterID;
+}
+
 /// getPersonality - Return the personality function for the current function.
 Function *MachineModuleInfo::getPersonality() const {
   // FIXME: Until PR1414 will be fixed, we're using 1 personality function per






More information about the llvm-commits mailing list