[llvm-pdbdump] Allow sorting / filtering by immediate padding

llvm-svn: 301358
diff --git a/llvm/lib/DebugInfo/PDB/UDTLayout.cpp b/llvm/lib/DebugInfo/PDB/UDTLayout.cpp
index 6c6bb26ad..aacefae 100644
--- a/llvm/lib/DebugInfo/PDB/UDTLayout.cpp
+++ b/llvm/lib/DebugInfo/PDB/UDTLayout.cpp
@@ -60,7 +60,6 @@
   return UsedBytes.size() - (Last + 1);
 }
 
-
 DataMemberLayoutItem::DataMemberLayoutItem(
     const UDTLayoutBase &Parent, std::unique_ptr<PDBSymbolData> Member)
     : LayoutItemBase(&Parent, Member.get(), Member->getName(),
@@ -126,13 +125,25 @@
 
 ClassLayout::ClassLayout(const PDBSymbolTypeUDT &UDT)
     : UDTLayoutBase(nullptr, UDT, UDT.getName(), 0, UDT.getLength(), false),
-      UDT(UDT) {}
+      UDT(UDT) {
+  ImmediateUsedBytes.resize(SizeOf, false);
+  for (auto &LI : LayoutItems) {
+    uint32_t Begin = LI->getOffsetInParent();
+    uint32_t End = Begin + LI->getLayoutSize();
+    End = std::min(SizeOf, End);
+    ImmediateUsedBytes.set(Begin, End);
+  }
+}
 
 ClassLayout::ClassLayout(std::unique_ptr<PDBSymbolTypeUDT> UDT)
     : ClassLayout(*UDT) {
   OwnedStorage = std::move(UDT);
 }
 
+uint32_t ClassLayout::immediatePadding() const {
+  return SizeOf - ImmediateUsedBytes.count();
+}
+
 BaseClassLayout::BaseClassLayout(const UDTLayoutBase &Parent,
                                  uint32_t OffsetInParent, bool Elide,
                                  std::unique_ptr<PDBSymbolTypeBaseClass> B)