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

Duncan Sands baldrick at free.fr
Wed Jun 6 08:37:56 PDT 2007



Changes in directory llvm/lib/CodeGen:

DwarfWriter.cpp updated: 1.150 -> 1.151
---
Log message:

Fold the exception actions table harder: if two typeid lists start the
same, only output one copy of the common part.


---
Diffs of the changes:  (+68 -56)

 DwarfWriter.cpp |  124 ++++++++++++++++++++++++++++++--------------------------
 1 files changed, 68 insertions(+), 56 deletions(-)


Index: llvm/lib/CodeGen/DwarfWriter.cpp
diff -u llvm/lib/CodeGen/DwarfWriter.cpp:1.150 llvm/lib/CodeGen/DwarfWriter.cpp:1.151
--- llvm/lib/CodeGen/DwarfWriter.cpp:1.150	Sat Jun  2 11:53:42 2007
+++ llvm/lib/CodeGen/DwarfWriter.cpp	Wed Jun  6 10:37:31 2007
@@ -2894,36 +2894,32 @@
       O << UsedDirective << EHFrameInfo.FnName << ".eh\n\n";
   }
 
-  /// EquivPads - Whether two landing pads have equivalent actions.
-  static bool EquivPads(const LandingPadInfo *L, const LandingPadInfo *R) {
-    const std::vector<int> &LIds = L->TypeIds;
-    const std::vector<int> &RIds = R->TypeIds;
+  /// SharedTypeIds - How many leading type ids two landing pads have in common.
+  static unsigned SharedTypeIds(const LandingPadInfo *L,
+                                const LandingPadInfo *R) {
+    const std::vector<int> &LIds = L->TypeIds, &RIds = R->TypeIds;
     unsigned LSize = LIds.size(), RSize = RIds.size();
+    unsigned MinSize = LSize < RSize ? LSize : RSize;
+    unsigned Count = 0;
 
-    if (LSize != RSize)
-      return false;
+    for (; Count != MinSize; ++Count)
+      if (LIds[Count] != RIds[Count])
+        return Count;
 
-    for (unsigned i = 0; i != LSize; ++i)
-      if (LIds[i] != RIds[i])
-        return false;
-
-    return true;
+    return Count;
   }
 
-  /// PadLT - An order on landing pads, with EquivPads as order equivalence.
+  /// PadLT - Order landing pads lexicographically by type id.
   static bool PadLT(const LandingPadInfo *L, const LandingPadInfo *R) {
-    const std::vector<int> &LIds = L->TypeIds;
-    const std::vector<int> &RIds = R->TypeIds;
+    const std::vector<int> &LIds = L->TypeIds, &RIds = R->TypeIds;
     unsigned LSize = LIds.size(), RSize = RIds.size();
+    unsigned MinSize = LSize < RSize ? LSize : RSize;
 
-    if (LSize != RSize)
-      return LSize < RSize;
-
-    for (unsigned i = 0; i != LSize; ++i)
+    for (unsigned i = 0; i != MinSize; ++i)
       if (LIds[i] != RIds[i])
         return LIds[i] < RIds[i];
 
-    return false; // Equivalent
+    return LSize < RSize;
   }
 
   /// EmitExceptionTable - Emit landpads and actions.
@@ -2960,6 +2956,12 @@
 
   typedef DenseMap<unsigned, PadSite, KeyInfo> PadMapType;
 
+  struct ActionEntry {
+    int TypeID;
+    int NextAction;
+    struct ActionEntry *Previous;
+  };
+
   void EmitExceptionTable() {
     // Map all labels and get rid of any dead landing pads.
     MMI->TidyLandingPads();
@@ -2977,7 +2979,10 @@
     std::sort(LandingPads.begin(), LandingPads.end(), PadLT);
 
     // Gather first action index for each landing pad site.
-    SmallVector<unsigned, 32> Actions;
+    SmallVector<unsigned, 32> FirstActions;
+
+    // The actions table.
+    SmallVector<ActionEntry, 64> Actions;
 
     // Compute sizes for exception table.
     unsigned SizeSites = 0;
@@ -2985,38 +2990,55 @@
 
     // Look at each landing pad site to compute size.  We need the size of each
     // landing pad site info and the size of the landing pad's actions.
-    signed FirstAction = 0;
+    int FirstAction = 0;
 
     for (unsigned i = 0, N = LandingPads.size(); i != N; ++i) {
-      const LandingPadInfo *LandingPad = LandingPads[i];
+      const LandingPadInfo *LP = LandingPads[i];
+      const std::vector<int> &TypeIds = LP->TypeIds;
+      const unsigned NumShared = i ? SharedTypeIds(LP, LandingPads[i-1]) : 0;
       unsigned SizeSiteActions = 0;
 
-      if (!i || !EquivPads(LandingPad, LandingPads[i-1])) {
-        const std::vector<int> &TypeIds = LandingPad->TypeIds;
+      if (NumShared < TypeIds.size()) {
         unsigned SizeAction = 0;
+        ActionEntry *PrevAction = 0;
 
-        if (TypeIds.empty()) {
-          FirstAction = 0;
-        } else {
-          // Gather the action sizes
-          for (unsigned j = 0, M = TypeIds.size(); j != M; ++j) {
-            int TypeID = TypeIds[j];
-            unsigned SizeTypeID = Asm->SizeSLEB128(TypeID);
-            signed Action = j ? -(SizeAction + SizeTypeID) : 0;
-            SizeAction = SizeTypeID + Asm->SizeSLEB128(Action);
-            SizeSiteActions += SizeAction;
+        if (NumShared) {
+          const unsigned SizePrevIds = LandingPads[i-1]->TypeIds.size();
+          assert(Actions.size());
+          PrevAction = &Actions.back();
+          SizeAction = Asm->SizeSLEB128(PrevAction->NextAction) +
+            Asm->SizeSLEB128(PrevAction->TypeID);
+          for (unsigned j = NumShared; j != SizePrevIds; ++j) {
+            SizeAction -= Asm->SizeSLEB128(PrevAction->TypeID);
+            SizeAction += -PrevAction->NextAction;
+            PrevAction = PrevAction->Previous;
           }
+        }
 
-          // Record the first action of the landing pad site.
-          FirstAction = SizeActions + SizeSiteActions - SizeAction + 1;
+        // Compute the actions.
+        for (unsigned I = NumShared, M = TypeIds.size(); I != M; ++I) {
+          int TypeID = TypeIds[I];
+          unsigned SizeTypeID = Asm->SizeSLEB128(TypeID);
+
+          int NextAction = SizeAction ? -(SizeAction + SizeTypeID) : 0;
+          SizeAction = SizeTypeID + Asm->SizeSLEB128(NextAction);
+          SizeSiteActions += SizeAction;
+
+          ActionEntry Action = {TypeID, NextAction, PrevAction};
+          Actions.push_back(Action);
+
+          PrevAction = &Actions.back();
         }
-      } // else re-use previous FirstAction
 
-      Actions.push_back(FirstAction);
+        // Record the first action of the landing pad site.
+        FirstAction = SizeActions + SizeSiteActions - SizeAction + 1;
+      } // else identical - re-use previous FirstAction
+
+      FirstActions.push_back(FirstAction);
 
       // Compute this sites contribution to size.
       SizeActions += SizeSiteActions;
-      unsigned M = LandingPad->BeginLabels.size();
+      unsigned M = LP->BeginLabels.size();
       SizeSites += M*(sizeof(int32_t) +               // Site start.
                       sizeof(int32_t) +               // Site length.
                       sizeof(int32_t) +               // Landing pad.
@@ -3111,29 +3133,19 @@
         }
         Asm->EOL("Landing pad");
 
-        Asm->EmitULEB128Bytes(Actions[P.PadIndex]);
+        Asm->EmitULEB128Bytes(FirstActions[P.PadIndex]);
         Asm->EOL("Action");
       }
     }
 
     // Emit the actions.
-    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<int> &TypeIds = LandingPad->TypeIds;
-        unsigned SizeAction = 0;
+    for (unsigned I = 0, N = Actions.size(); I != N; ++I) {
+      ActionEntry &Action = Actions[I];
 
-        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");
-          signed Action = j ? -(SizeAction + SizeTypeID) : 0;
-          SizeAction = SizeTypeID + Asm->SizeSLEB128(Action);
-          Asm->EmitSLEB128Bytes(Action);
-          Asm->EOL("Next action");
-        }
-      }
+      Asm->EmitSLEB128Bytes(Action.TypeID);
+      Asm->EOL("TypeInfo index");
+      Asm->EmitSLEB128Bytes(Action.NextAction);
+      Asm->EOL("Next action");
     }
 
     // Emit the type ids.






More information about the llvm-commits mailing list