[llvm] a648724 - Reland "[llvm-pdbutil] Add options to only dump symbol record at specified offset and its parents or children with spcified depth."

Zequan Wu via llvm-commits llvm-commits at lists.llvm.org
Wed May 25 09:58:04 PDT 2022


Author: Zequan Wu
Date: 2022-05-25T09:57:35-07:00
New Revision: a648724921b3bf877a0f3b09ac3e32d9c8de3fe5

URL: https://github.com/llvm/llvm-project/commit/a648724921b3bf877a0f3b09ac3e32d9c8de3fe5
DIFF: https://github.com/llvm/llvm-project/commit/a648724921b3bf877a0f3b09ac3e32d9c8de3fe5.diff

LOG: Reland "[llvm-pdbutil] Add options to only dump symbol record at specified offset and its parents or children with spcified depth."

This reverts commit cfb4e782520ce59602a34732386ebbdf58136cfb.

Added: 
    llvm/test/tools/llvm-pdbutil/Inputs/symbol-offset.yaml
    llvm/test/tools/llvm-pdbutil/symbol-offset.test

Modified: 
    llvm/include/llvm/DebugInfo/CodeView/CVSymbolVisitor.h
    llvm/include/llvm/DebugInfo/PDB/Native/InputFile.h
    llvm/include/llvm/DebugInfo/PDB/Native/LinePrinter.h
    llvm/include/llvm/Support/BinaryStreamArray.h
    llvm/lib/DebugInfo/CodeView/CVSymbolVisitor.cpp
    llvm/lib/DebugInfo/PDB/Native/InputFile.cpp
    llvm/tools/llvm-pdbutil/DumpOutputStyle.cpp
    llvm/tools/llvm-pdbutil/llvm-pdbutil.cpp

Removed: 
    


################################################################################
diff  --git a/llvm/include/llvm/DebugInfo/CodeView/CVSymbolVisitor.h b/llvm/include/llvm/DebugInfo/CodeView/CVSymbolVisitor.h
index d1c06573b3980..ef44b622d955a 100644
--- a/llvm/include/llvm/DebugInfo/CodeView/CVSymbolVisitor.h
+++ b/llvm/include/llvm/DebugInfo/CodeView/CVSymbolVisitor.h
@@ -18,12 +18,20 @@ class SymbolVisitorCallbacks;
 
 class CVSymbolVisitor {
 public:
+  struct FilterOptions {
+    llvm::Optional<uint32_t> SymbolOffset;
+    llvm::Optional<uint32_t> ParentRecursiveDepth;
+    llvm::Optional<uint32_t> ChildRecursiveDepth;
+  };
+
   CVSymbolVisitor(SymbolVisitorCallbacks &Callbacks);
 
   Error visitSymbolRecord(CVSymbol &Record);
   Error visitSymbolRecord(CVSymbol &Record, uint32_t Offset);
   Error visitSymbolStream(const CVSymbolArray &Symbols);
   Error visitSymbolStream(const CVSymbolArray &Symbols, uint32_t InitialOffset);
+  Error visitSymbolStreamFiltered(const CVSymbolArray &Symbols,
+                                  const FilterOptions &Filter);
 
 private:
   SymbolVisitorCallbacks &Callbacks;

diff  --git a/llvm/include/llvm/DebugInfo/PDB/Native/InputFile.h b/llvm/include/llvm/DebugInfo/PDB/Native/InputFile.h
index 5b0f433f118af..392f183f002f8 100644
--- a/llvm/include/llvm/DebugInfo/PDB/Native/InputFile.h
+++ b/llvm/include/llvm/DebugInfo/PDB/Native/InputFile.h
@@ -180,8 +180,8 @@ Error iterateSymbolGroups(InputFile &Input, const PrintScope &HeaderScope,
   AutoIndent Indent(HeaderScope);
 
   FilterOptions Filters = HeaderScope.P.getFilters();
-  if (Filters.NumOccurrences) {
-    uint32_t Modi = Filters.DumpModi;
+  if (Filters.DumpModi) {
+    uint32_t Modi = Filters.DumpModi.getValue();
     SymbolGroup SG(&Input, Modi);
     return iterateOneModule(Input, withLabelWidth(HeaderScope, NumDigits(Modi)),
                             SG, Modi, Callback);

diff  --git a/llvm/include/llvm/DebugInfo/PDB/Native/LinePrinter.h b/llvm/include/llvm/DebugInfo/PDB/Native/LinePrinter.h
index e65bfc19fd206..0db21309f593d 100644
--- a/llvm/include/llvm/DebugInfo/PDB/Native/LinePrinter.h
+++ b/llvm/include/llvm/DebugInfo/PDB/Native/LinePrinter.h
@@ -30,8 +30,10 @@ struct FilterOptions {
   std::list<std::string> IncludeCompilands;
   uint32_t PaddingThreshold;
   uint32_t SizeThreshold;
-  uint32_t DumpModi;
-  uint32_t NumOccurrences;
+  llvm::Optional<uint32_t> DumpModi;
+  llvm::Optional<uint32_t> ParentRecurseDepth;
+  llvm::Optional<uint32_t> ChildrenRecurseDepth;
+  llvm::Optional<uint32_t> SymbolOffset;
   bool JustMyCode;
 };
 

diff  --git a/llvm/include/llvm/Support/BinaryStreamArray.h b/llvm/include/llvm/Support/BinaryStreamArray.h
index c3e0db4dcff09..ef2233c53ec2c 100644
--- a/llvm/include/llvm/Support/BinaryStreamArray.h
+++ b/llvm/include/llvm/Support/BinaryStreamArray.h
@@ -111,6 +111,8 @@ class VarStreamArray {
 
   bool valid() const { return Stream.valid(); }
 
+  bool isOffsetValid(uint32_t Offset) const { return at(Offset) != end(); }
+
   uint32_t skew() const { return Skew; }
   Iterator end() const { return Iterator(E); }
 

diff  --git a/llvm/lib/DebugInfo/CodeView/CVSymbolVisitor.cpp b/llvm/lib/DebugInfo/CodeView/CVSymbolVisitor.cpp
index 31af9a1bd848d..162f1db0189bd 100644
--- a/llvm/lib/DebugInfo/CodeView/CVSymbolVisitor.cpp
+++ b/llvm/lib/DebugInfo/CodeView/CVSymbolVisitor.cpp
@@ -10,6 +10,7 @@
 
 #include "llvm/DebugInfo/CodeView/CodeView.h"
 #include "llvm/DebugInfo/CodeView/SymbolRecord.h"
+#include "llvm/DebugInfo/CodeView/SymbolRecordHelpers.h"
 #include "llvm/DebugInfo/CodeView/SymbolVisitorCallbacks.h"
 #include "llvm/Support/BinaryStreamArray.h"
 #include "llvm/Support/ErrorHandling.h"
@@ -83,3 +84,74 @@ Error CVSymbolVisitor::visitSymbolStream(const CVSymbolArray &Symbols,
   }
   return Error::success();
 }
+
+Error CVSymbolVisitor::visitSymbolStreamFiltered(const CVSymbolArray &Symbols,
+                                                 const FilterOptions &Filter) {
+  if (!Filter.SymbolOffset)
+    return visitSymbolStream(Symbols);
+  uint32_t SymbolOffset = *Filter.SymbolOffset;
+  uint32_t ParentRecurseDepth =
+      Filter.ParentRecursiveDepth ? *Filter.ParentRecursiveDepth : 0;
+  uint32_t ChildrenRecurseDepth =
+      Filter.ChildRecursiveDepth ? *Filter.ChildRecursiveDepth : 0;
+  if (!Symbols.isOffsetValid(SymbolOffset))
+    return createStringError(inconvertibleErrorCode(), "Invalid symbol offset");
+  CVSymbol Sym = *Symbols.at(SymbolOffset);
+  uint32_t SymEndOffset =
+      symbolOpensScope(Sym.kind()) ? getScopeEndOffset(Sym) : 0;
+
+  std::vector<uint32_t> ParentOffsets;
+  std::vector<uint32_t> ParentEndOffsets;
+  uint32_t ChildrenDepth = 0;
+  for (auto Begin = Symbols.begin(), End = Symbols.end(); Begin != End;
+       ++Begin) {
+    uint32_t BeginOffset = Begin.offset();
+    CVSymbol BeginSym = *Begin;
+    if (BeginOffset < SymbolOffset) {
+      if (symbolOpensScope(Begin->kind())) {
+        uint32_t EndOffset = getScopeEndOffset(BeginSym);
+        if (SymbolOffset < EndOffset) {
+          ParentOffsets.push_back(BeginOffset);
+          ParentEndOffsets.push_back(EndOffset);
+        }
+      }
+    } else if (BeginOffset == SymbolOffset) {
+      // Found symbol at offset. Visit its parent up to ParentRecurseDepth.
+      if (ParentRecurseDepth >= ParentOffsets.size())
+        ParentRecurseDepth = ParentOffsets.size();
+      uint32_t StartIndex = ParentOffsets.size() - ParentRecurseDepth;
+      while (StartIndex < ParentOffsets.size()) {
+        if (!Symbols.isOffsetValid(ParentOffsets[StartIndex]))
+          break;
+        CVSymbol Parent = *Symbols.at(ParentOffsets[StartIndex]);
+        if (auto EC = visitSymbolRecord(Parent, ParentOffsets[StartIndex]))
+          return EC;
+        ++StartIndex;
+      }
+      if (auto EC = visitSymbolRecord(Sym, SymbolOffset))
+        return EC;
+    } else if (BeginOffset <= SymEndOffset) {
+      if (ChildrenRecurseDepth) {
+        // Visit children.
+        if (symbolEndsScope(Begin->kind()))
+          --ChildrenDepth;
+        if (ChildrenDepth < ChildrenRecurseDepth ||
+            BeginOffset == SymEndOffset) {
+          if (auto EC = visitSymbolRecord(BeginSym, BeginOffset))
+            return EC;
+        }
+        if (symbolOpensScope(Begin->kind()))
+          ++ChildrenDepth;
+      }
+    } else {
+      // Visit parents' ends.
+      if (ParentRecurseDepth && BeginOffset == ParentEndOffsets.back()) {
+        if (auto EC = visitSymbolRecord(BeginSym, BeginOffset))
+          return EC;
+        ParentEndOffsets.pop_back();
+        --ParentRecurseDepth;
+      }
+    }
+  }
+  return Error::success();
+}

diff  --git a/llvm/lib/DebugInfo/PDB/Native/InputFile.cpp b/llvm/lib/DebugInfo/PDB/Native/InputFile.cpp
index 99dd1316dd8fe..ec7c4e1e3353c 100644
--- a/llvm/lib/DebugInfo/PDB/Native/InputFile.cpp
+++ b/llvm/lib/DebugInfo/PDB/Native/InputFile.cpp
@@ -579,7 +579,7 @@ bool llvm::pdb::shouldDumpSymbolGroup(uint32_t Idx, const SymbolGroup &Group,
     return false;
 
   // If the arg was not specified on the command line, always dump all modules.
-  if (Filters.NumOccurrences == 0)
+  if (!Filters.DumpModi)
     return true;
 
   // Otherwise, only dump if this is the same module specified.

diff  --git a/llvm/test/tools/llvm-pdbutil/Inputs/symbol-offset.yaml b/llvm/test/tools/llvm-pdbutil/Inputs/symbol-offset.yaml
new file mode 100644
index 0000000000000..ca574347b07cc
--- /dev/null
+++ b/llvm/test/tools/llvm-pdbutil/Inputs/symbol-offset.yaml
@@ -0,0 +1,204 @@
+---
+DbiStream:
+  VerHeader:       V70
+  Age:             1
+  BuildNumber:     36363
+  PdbDllVersion:   0
+  PdbDllRbld:      0
+  Flags:           0
+  MachineType:     Amd64
+  Modules:
+    - Module:          '/tmp/test.obj'
+      Modi:
+        Signature:       4
+        Records:
+          - Kind:            S_GPROC32
+            ProcSym:
+              PtrParent:       0
+              PtrEnd:          468
+              PtrNext:         0
+              CodeSize:        137
+              DbgStart:        0
+              DbgEnd:          0
+              FunctionType:    4104
+              Offset:          176
+              Segment:         1
+              Flags:           [  ]
+              DisplayName:     main
+          - Kind:            S_FRAMEPROC
+            FrameProcSym:
+              TotalFrameBytes: 56
+              PaddingFrameBytes: 0
+              OffsetToPadding: 0
+              BytesOfCalleeSavedRegisters: 0
+              OffsetOfExceptionHandler: 0
+              SectionIdOfExceptionHandler: 0
+              Flags:           [  ]
+          - Kind:            S_LOCAL
+            LocalSym:
+              Type:            116
+              Flags:           [ IsParameter ]
+              VarName:         argc
+          - Kind:            S_DEFRANGE_FRAMEPOINTER_REL
+            DefRangeFramePointerRelSym:
+              Offset:          4
+              Range:
+                OffsetStart:     197
+                ISectStart:      1
+                Range:           116
+              Gaps:            []
+          - Kind:            S_LOCAL
+            LocalSym:
+              Type:            4102
+              Flags:           [ IsParameter ]
+              VarName:         argv
+          - Kind:            S_DEFRANGE_FRAMEPOINTER_REL
+            DefRangeFramePointerRelSym:
+              Offset:          8
+              Range:
+                OffsetStart:     197
+                ISectStart:      1
+                Range:           116
+              Gaps:            []
+          - Kind:            S_INLINESITE
+            InlineSiteSym:
+              PtrParent:       4
+              PtrEnd:          464
+              Inlinee:         4098
+          - Kind:            S_LOCAL
+            LocalSym:
+              Type:            116
+              Flags:           [ IsParameter ]
+              VarName:         x
+          - Kind:            S_DEFRANGE_FRAMEPOINTER_REL
+            DefRangeFramePointerRelSym:
+              Offset:          24
+              Range:
+                OffsetStart:     221
+                ISectStart:      1
+                Range:           87
+              Gaps:            []
+          - Kind:            S_LOCAL
+            LocalSym:
+              Type:            116
+              Flags:           [ IsParameter ]
+              VarName:         y
+          - Kind:            S_DEFRANGE_FRAMEPOINTER_REL
+            DefRangeFramePointerRelSym:
+              Offset:          28
+              Range:
+                OffsetStart:     221
+                ISectStart:      1
+                Range:           87
+              Gaps:            []
+          - Kind:            S_LOCAL
+            LocalSym:
+              Type:            116
+              Flags:           [ IsParameter ]
+              VarName:         z
+          - Kind:            S_DEFRANGE_FRAMEPOINTER_REL
+            DefRangeFramePointerRelSym:
+              Offset:          32
+              Range:
+                OffsetStart:     221
+                ISectStart:      1
+                Range:           87
+              Gaps:            []
+          - Kind:            S_INLINESITE
+            InlineSiteSym:
+              PtrParent:       144
+              PtrEnd:          288
+              Inlinee:         4096
+          - Kind:            S_LOCAL
+            LocalSym:
+              Type:            116
+              Flags:           [ IsParameter ]
+              VarName:         x
+          - Kind:            S_DEFRANGE_FRAMEPOINTER_REL
+            DefRangeFramePointerRelSym:
+              Offset:          40
+              Range:
+                OffsetStart:     229
+                ISectStart:      1
+                Range:           7
+              Gaps:            []
+          - Kind:            S_INLINESITE_END
+            ScopeEndSym:     {}
+          - Kind:            S_INLINESITE
+            InlineSiteSym:
+              PtrParent:       144
+              PtrEnd:          412
+              Inlinee:         4097
+          - Kind:            S_LOCAL
+            LocalSym:
+              Type:            116
+              Flags:           [ IsParameter ]
+              VarName:         x
+          - Kind:            S_DEFRANGE_FRAMEPOINTER_REL
+            DefRangeFramePointerRelSym:
+              Offset:          44
+              Range:
+                OffsetStart:     260
+                ISectStart:      1
+                Range:           19
+              Gaps:            []
+          - Kind:            S_LOCAL
+            LocalSym:
+              Type:            116
+              Flags:           [ IsParameter ]
+              VarName:         y
+          - Kind:            S_DEFRANGE_FRAMEPOINTER_REL
+            DefRangeFramePointerRelSym:
+              Offset:          48
+              Range:
+                OffsetStart:     260
+                ISectStart:      1
+                Range:           19
+              Gaps:            []
+          - Kind:            S_INLINESITE
+            InlineSiteSym:
+              PtrParent:       292
+              PtrEnd:          408
+              Inlinee:         4096
+          - Kind:            S_LOCAL
+            LocalSym:
+              Type:            116
+              Flags:           [ IsParameter ]
+              VarName:         x
+          - Kind:            S_DEFRANGE_FRAMEPOINTER_REL
+            DefRangeFramePointerRelSym:
+              Offset:          52
+              Range:
+                OffsetStart:     272
+                ISectStart:      1
+                Range:           7
+              Gaps:            []
+          - Kind:            S_INLINESITE_END
+            ScopeEndSym:     {}
+          - Kind:            S_INLINESITE_END
+            ScopeEndSym:     {}
+          - Kind:            S_INLINESITE
+            InlineSiteSym:
+              PtrParent:       144
+              PtrEnd:          460
+              Inlinee:         4096
+          - Kind:            S_LOCAL
+            LocalSym:
+              Type:            116
+              Flags:           [ IsParameter ]
+              VarName:         x
+          - Kind:            S_DEFRANGE_FRAMEPOINTER_REL
+            DefRangeFramePointerRelSym:
+              Offset:          36
+              Range:
+                OffsetStart:     299
+                ISectStart:      1
+                Range:           7
+              Gaps:            []
+          - Kind:            S_INLINESITE_END
+            ScopeEndSym:     {}
+          - Kind:            S_INLINESITE_END
+            ScopeEndSym:     {}
+          - Kind:            S_END
+            ScopeEndSym:     {}
+...

diff  --git a/llvm/test/tools/llvm-pdbutil/symbol-offset.test b/llvm/test/tools/llvm-pdbutil/symbol-offset.test
new file mode 100644
index 0000000000000..175aaaca5874d
--- /dev/null
+++ b/llvm/test/tools/llvm-pdbutil/symbol-offset.test
@@ -0,0 +1,176 @@
+; RUN: llvm-pdbutil yaml2pdb %p/Inputs/symbol-offset.yaml --pdb=%t.pdb
+
+; RUN: llvm-pdbutil dump --symbols --modi=0 --symbol-offset=80 %t.pdb \
+; RUN:    | FileCheck --check-prefix=OFFSET %s
+
+; RUN: llvm-pdbutil dump --symbols --modi=0 --symbol-offset=4 --show-parents \
+; RUN: %t.pdb  | FileCheck --check-prefix=SHOW-PARENT1 %s
+
+; RUN: llvm-pdbutil dump --symbols --modi=0 --symbol-offset=80 --show-parents \
+; RUN: %t.pdb  | FileCheck --check-prefix=SHOW-PARENT2 %s
+
+; RUN: llvm-pdbutil dump --symbols --modi=0 --symbol-offset=308 --show-parents \
+; RUN: %t.pdb  | FileCheck --check-prefix=SHOW-PARENT3 %s
+
+; RUN: llvm-pdbutil dump --symbols --modi=0 --symbol-offset=260 --show-parents \
+; RUN: --parent-recurse-depth=1 %t.pdb \
+; RUN: | FileCheck --check-prefix=SHOW-PARENT-DEPTH1 %s
+
+; RUN: llvm-pdbutil dump --symbols --modi=0 --symbol-offset=260 --show-parents \
+; RUN: --parent-recurse-depth=2 %t.pdb \
+; RUN: | FileCheck --check-prefix=SHOW-PARENT-DEPTH2 %s
+
+; RUN: llvm-pdbutil dump --symbols --modi=0 --symbol-offset=416 --show-children\
+; RUN: %t.pdb  | FileCheck --check-prefix=SHOW-CHILDREN1 %s
+
+; RUN: llvm-pdbutil dump --symbols --modi=0 --symbol-offset=292 --show-children\
+; RUN: %t.pdb  | FileCheck --check-prefix=SHOW-CHILDREN2 %s
+
+; RUN: llvm-pdbutil dump --symbols --modi=0 --symbol-offset=4 --show-children \
+; RUN: --children-recurse-depth=1 %t.pdb \
+; RUN: | FileCheck --check-prefix=SHOW-CHILDREN-DEPTH1 %s
+
+; RUN: llvm-pdbutil dump --symbols --modi=0 --symbol-offset=292 --show-children\
+; RUN: --children-recurse-depth=2 %t.pdb \
+; RUN: | FileCheck --check-prefix=SHOW-CHILDREN-DEPTH2 %s
+
+The pdb file is generate from following cpp file and use llvm-pdbutil's pdb2yaml
+functionality to convert pdb to yaml. Unrelated information was removed from the
+yaml test file.
+; [[clang::always_inline]] int func1(int x) {
+;     return x * 2;
+; }
+;
+; [[clang::always_inline]] int func2(int x, int y) {
+;     return func1(x + y);
+; }
+;
+; [[clang::always_inline]] int func3(int x, int y, int z) {
+;     y += func1(x);
+;     x += func2(y, z);
+;     return x + func1(x);
+; }
+;
+; int main(int argc, char** argv) {
+;     return func3(argc, 1, 2);
+; }
+
+
+OFFSET:      80 | S_LOCAL [size = 16] `argc`
+OFFSET-NEXT:      type=0x0074 (int), flags = param
+
+SHOW-PARENT1:      4 | S_GPROC32 [size = 44] `main`
+SHOW-PARENT1-NEXT:     parent = 0, end = 468, addr = 0001:0176, code size = 137
+SHOW-PARENT1-NEXT:     type = `0x1008 (<unknown UDT>)`, debug start = 0, debug end = 0, flags = none
+
+SHOW-PARENT2:        4 | S_GPROC32 [size = 44] `main`
+SHOW-PARENT2-NEXT:       parent = 0, end = 468, addr = 0001:0176, code size = 137
+SHOW-PARENT2-NEXT:       type = `0x1008 (<unknown UDT>)`, debug start = 0, debug end = 0, flags = none
+SHOW-PARENT2-NEXT:  80 | S_LOCAL [size = 16] `argc`
+SHOW-PARENT2-NEXT:       type=0x0074 (int), flags = param
+SHOW-PARENT2-NEXT: 468 | S_END [size = 4]
+
+SHOW-PARENT3:        4 | S_GPROC32 [size = 44] `main`
+SHOW-PARENT3-NEXT:       parent = 0, end = 468, addr = 0001:0176, code size = 137
+SHOW-PARENT3-NEXT:       type = `0x1008 (<unknown UDT>)`, debug start = 0, debug end = 0, flags = none
+SHOW-PARENT3-NEXT: 144 | S_INLINESITE [size = 16]
+SHOW-PARENT3-NEXT:       inlinee = 0x1002 (<unknown UDT>), parent = 4, end = 464
+SHOW-PARENT3-NEXT: 292 | S_INLINESITE [size = 16]
+SHOW-PARENT3-NEXT:       inlinee = 0x1001 (<unknown UDT>), parent = 144, end = 412
+SHOW-PARENT3-NEXT: 308 | S_LOCAL [size = 12] `x`
+SHOW-PARENT3-NEXT:       type=0x0074 (int), flags = param
+SHOW-PARENT3-NEXT: 412 | S_INLINESITE_END [size = 4]
+SHOW-PARENT3-NEXT: 464 | S_INLINESITE_END [size = 4]
+SHOW-PARENT3-NEXT: 468 | S_END [size = 4]
+
+
+SHOW-PARENT-DEPTH1:      244 | S_INLINESITE [size = 16]
+SHOW-PARENT-DEPTH1-NEXT:       inlinee = 0x1000 (<unknown UDT>), parent = 144, end = 288
+SHOW-PARENT-DEPTH1-NEXT: 260 | S_LOCAL [size = 12] `x`
+SHOW-PARENT-DEPTH1-NEXT:       type=0x0074 (int), flags = param
+SHOW-PARENT-DEPTH1-NEXT: 288 | S_INLINESITE_END [size = 4]
+
+SHOW-PARENT-DEPTH2:      144 | S_INLINESITE [size = 16]
+SHOW-PARENT-DEPTH2-NEXT:       inlinee = 0x1002 (<unknown UDT>), parent = 4, end = 464
+SHOW-PARENT-DEPTH2-NEXT: 244 | S_INLINESITE [size = 16]
+SHOW-PARENT-DEPTH2-NEXT:       inlinee = 0x1000 (<unknown UDT>), parent = 144, end = 288
+SHOW-PARENT-DEPTH2-NEXT: 260 | S_LOCAL [size = 12] `x`
+SHOW-PARENT-DEPTH2-NEXT:       type=0x0074 (int), flags = param
+SHOW-PARENT-DEPTH2-NEXT: 288 | S_INLINESITE_END [size = 4]
+SHOW-PARENT-DEPTH2-NEXT: 464 | S_INLINESITE_END [size = 4]
+
+SHOW-CHILDREN1:      416 | S_INLINESITE [size = 16]
+SHOW-CHILDREN1-NEXT:       inlinee = 0x1000 (<unknown UDT>), parent = 144, end = 460
+SHOW-CHILDREN1-NEXT: 432 | S_LOCAL [size = 12] `x`
+SHOW-CHILDREN1-NEXT:       type=0x0074 (int), flags = param
+SHOW-CHILDREN1-NEXT: 444 | S_DEFRANGE_FRAMEPOINTER_REL [size = 16]
+SHOW-CHILDREN1-NEXT:       offset = 36, range = [0001:0299,+7)
+SHOW-CHILDREN1-NEXT:       gaps = []
+SHOW-CHILDREN1-NEXT: 460 | S_INLINESITE_END [size = 4]
+
+SHOW-CHILDREN2:      292 | S_INLINESITE [size = 16]
+SHOW-CHILDREN2-NEXT:       inlinee = 0x1001 (<unknown UDT>), parent = 144, end = 412
+SHOW-CHILDREN2-NEXT: 308 | S_LOCAL [size = 12] `x`
+SHOW-CHILDREN2-NEXT:       type=0x0074 (int), flags = param
+SHOW-CHILDREN2-NEXT: 320 | S_DEFRANGE_FRAMEPOINTER_REL [size = 16]
+SHOW-CHILDREN2-NEXT:       offset = 44, range = [0001:0260,+19)
+SHOW-CHILDREN2-NEXT:       gaps = []
+SHOW-CHILDREN2-NEXT: 336 | S_LOCAL [size = 12] `y`
+SHOW-CHILDREN2-NEXT:       type=0x0074 (int), flags = param
+SHOW-CHILDREN2-NEXT: 348 | S_DEFRANGE_FRAMEPOINTER_REL [size = 16]
+SHOW-CHILDREN2-NEXT:       offset = 48, range = [0001:0260,+19)
+SHOW-CHILDREN2-NEXT:       gaps = []
+SHOW-CHILDREN2-NEXT: 364 | S_INLINESITE [size = 16]
+SHOW-CHILDREN2-NEXT:       inlinee = 0x1000 (<unknown UDT>), parent = 292, end = 408
+SHOW-CHILDREN2-NEXT: 380 | S_LOCAL [size = 12] `x`
+SHOW-CHILDREN2-NEXT:       type=0x0074 (int), flags = param
+SHOW-CHILDREN2-NEXT: 392 | S_DEFRANGE_FRAMEPOINTER_REL [size = 16]
+SHOW-CHILDREN2-NEXT:       offset = 52, range = [0001:0272,+7)
+SHOW-CHILDREN2-NEXT:       gaps = []
+SHOW-CHILDREN2-NEXT: 408 | S_INLINESITE_END [size = 4]
+SHOW-CHILDREN2-NEXT: 412 | S_INLINESITE_END [size = 4]
+
+SHOW-CHILDREN-DEPTH1:        4 | S_GPROC32 [size = 44] `main`
+SHOW-CHILDREN-DEPTH1-NEXT:       parent = 0, end = 468, addr = 0001:0176, code size = 137
+SHOW-CHILDREN-DEPTH1-NEXT:       type = `0x1008 (<unknown UDT>)`, debug start = 0, debug end = 0, flags = none
+SHOW-CHILDREN-DEPTH1-NEXT:  48 | S_FRAMEPROC [size = 32]
+SHOW-CHILDREN-DEPTH1-NEXT:       size = 56, padding size = 0, offset to padding = 0
+SHOW-CHILDREN-DEPTH1-NEXT:       bytes of callee saved registers = 0, exception handler addr = 0000:0000
+SHOW-CHILDREN-DEPTH1-NEXT:       local fp reg = NONE, param fp reg = NONE
+SHOW-CHILDREN-DEPTH1-NEXT:       flags = none
+SHOW-CHILDREN-DEPTH1-NEXT:  80 | S_LOCAL [size = 16] `argc`
+SHOW-CHILDREN-DEPTH1-NEXT:       type=0x0074 (int), flags = param
+SHOW-CHILDREN-DEPTH1-NEXT:  96 | S_DEFRANGE_FRAMEPOINTER_REL [size = 16]
+SHOW-CHILDREN-DEPTH1-NEXT:       offset = 4, range = [0001:0197,+116)
+SHOW-CHILDREN-DEPTH1-NEXT:       gaps = []
+SHOW-CHILDREN-DEPTH1-NEXT: 112 | S_LOCAL [size = 16] `argv`
+SHOW-CHILDREN-DEPTH1-NEXT:       type=0x1006 (<unknown UDT>), flags = param
+SHOW-CHILDREN-DEPTH1-NEXT: 128 | S_DEFRANGE_FRAMEPOINTER_REL [size = 16]
+SHOW-CHILDREN-DEPTH1-NEXT:       offset = 8, range = [0001:0197,+116)
+SHOW-CHILDREN-DEPTH1-NEXT:       gaps = []
+SHOW-CHILDREN-DEPTH1-NEXT: 144 | S_INLINESITE [size = 16]
+SHOW-CHILDREN-DEPTH1-NEXT:       inlinee = 0x1002 (<unknown UDT>), parent = 4, end = 464
+SHOW-CHILDREN-DEPTH1-NEXT: 464 | S_INLINESITE_END [size = 4]
+SHOW-CHILDREN-DEPTH1-NEXT: 468 | S_END [size = 4]
+
+SHOW-CHILDREN-DEPTH2:      292 | S_INLINESITE [size = 16]
+SHOW-CHILDREN-DEPTH2-NEXT:       inlinee = 0x1001 (<unknown UDT>), parent = 144, end = 412
+SHOW-CHILDREN-DEPTH2-NEXT: 308 | S_LOCAL [size = 12] `x`
+SHOW-CHILDREN-DEPTH2-NEXT:       type=0x0074 (int), flags = param
+SHOW-CHILDREN-DEPTH2-NEXT: 320 | S_DEFRANGE_FRAMEPOINTER_REL [size = 16]
+SHOW-CHILDREN-DEPTH2-NEXT:       offset = 44, range = [0001:0260,+19)
+SHOW-CHILDREN-DEPTH2-NEXT:       gaps = []
+SHOW-CHILDREN-DEPTH2-NEXT: 336 | S_LOCAL [size = 12] `y`
+SHOW-CHILDREN-DEPTH2-NEXT:       type=0x0074 (int), flags = param
+SHOW-CHILDREN-DEPTH2-NEXT: 348 | S_DEFRANGE_FRAMEPOINTER_REL [size = 16]
+SHOW-CHILDREN-DEPTH2-NEXT:       offset = 48, range = [0001:0260,+19)
+SHOW-CHILDREN-DEPTH2-NEXT:       gaps = []
+SHOW-CHILDREN-DEPTH2-NEXT: 364 | S_INLINESITE [size = 16]
+SHOW-CHILDREN-DEPTH2-NEXT:       inlinee = 0x1000 (<unknown UDT>), parent = 292, end = 408
+SHOW-CHILDREN-DEPTH2-NEXT: 380 | S_LOCAL [size = 12] `x`
+SHOW-CHILDREN-DEPTH2-NEXT:       type=0x0074 (int), flags = param
+SHOW-CHILDREN-DEPTH2-NEXT: 392 | S_DEFRANGE_FRAMEPOINTER_REL [size = 16]
+SHOW-CHILDREN-DEPTH2-NEXT:       offset = 52, range = [0001:0272,+7)
+SHOW-CHILDREN-DEPTH2-NEXT:       gaps = []
+SHOW-CHILDREN-DEPTH2-NEXT: 408 | S_INLINESITE_END [size = 4]
+SHOW-CHILDREN-DEPTH2-NEXT: 412 | S_INLINESITE_END [size = 4]
\ No newline at end of file

diff  --git a/llvm/tools/llvm-pdbutil/DumpOutputStyle.cpp b/llvm/tools/llvm-pdbutil/DumpOutputStyle.cpp
index 12cda106c036d..a173eb1faa627 100644
--- a/llvm/tools/llvm-pdbutil/DumpOutputStyle.cpp
+++ b/llvm/tools/llvm-pdbutil/DumpOutputStyle.cpp
@@ -1485,8 +1485,19 @@ Error DumpOutputStyle::dumpModuleSymsForPdb() {
         Pipeline.addCallbackToPipeline(Dumper);
         CVSymbolVisitor Visitor(Pipeline);
         auto SS = ModS.getSymbolsSubstream();
-        if (auto EC =
-                Visitor.visitSymbolStream(ModS.getSymbolArray(), SS.Offset)) {
+        if (opts::Filters.SymbolOffset) {
+          CVSymbolVisitor::FilterOptions Filter;
+          Filter.SymbolOffset = opts::Filters.SymbolOffset;
+          Filter.ParentRecursiveDepth = opts::Filters.ParentRecurseDepth;
+          Filter.ChildRecursiveDepth = opts::Filters.ChildrenRecurseDepth;
+          if (auto EC = Visitor.visitSymbolStreamFiltered(ModS.getSymbolArray(),
+                                                          Filter)) {
+            P.formatLine("Error while processing symbol records.  {0}",
+                         toString(std::move(EC)));
+            return EC;
+          }
+        } else if (auto EC = Visitor.visitSymbolStream(ModS.getSymbolArray(),
+                                                       SS.Offset)) {
           P.formatLine("Error while processing symbol records.  {0}",
                        toString(std::move(EC)));
           return EC;

diff  --git a/llvm/tools/llvm-pdbutil/llvm-pdbutil.cpp b/llvm/tools/llvm-pdbutil/llvm-pdbutil.cpp
index 7258a7f0ecd8d..c995c7975737b 100644
--- a/llvm/tools/llvm-pdbutil/llvm-pdbutil.cpp
+++ b/llvm/tools/llvm-pdbutil/llvm-pdbutil.cpp
@@ -562,6 +562,27 @@ cl::opt<bool>
 cl::opt<bool> DumpFpo("fpo", cl::desc("dump FPO records"),
                       cl::cat(SymbolOptions), cl::sub(DumpSubcommand));
 
+cl::opt<uint32_t> DumpSymbolOffset(
+    "symbol-offset", cl::Optional,
+    cl::desc("only dump symbol record with the specified symbol offset"),
+    cl::cat(SymbolOptions), cl::sub(DumpSubcommand));
+cl::opt<bool> DumpParents("show-parents",
+                          cl::desc("dump the symbols record's all parents."),
+                          cl::cat(SymbolOptions), cl::sub(DumpSubcommand));
+cl::opt<uint32_t>
+    DumpParentDepth("parent-recurse-depth", cl::Optional, cl::init(-1U),
+                    cl::desc("only recurse to a depth of N when displaying "
+                             "parents of a symbol record."),
+                    cl::cat(SymbolOptions), cl::sub(DumpSubcommand));
+cl::opt<bool> DumpChildren("show-children",
+                           cl::desc("dump the symbols record's all children."),
+                           cl::cat(SymbolOptions), cl::sub(DumpSubcommand));
+cl::opt<uint32_t>
+    DumpChildrenDepth("children-recurse-depth", cl::Optional, cl::init(-1U),
+                      cl::desc("only recurse to a depth of N when displaying "
+                               "children of a symbol record."),
+                      cl::cat(SymbolOptions), cl::sub(DumpSubcommand));
+
 // MODULE & FILE OPTIONS
 cl::opt<bool> DumpModules("modules", cl::desc("dump compiland information"),
                           cl::cat(FileOptions), cl::sub(DumpSubcommand));
@@ -1533,9 +1554,21 @@ int main(int Argc, const char **Argv) {
       errs().flush();
       exit(1);
     }
-    opts::Filters.NumOccurrences = opts::dump::DumpModi.getNumOccurrences();
     opts::Filters.DumpModi = opts::dump::DumpModi;
   }
+  if (opts::dump::DumpSymbolOffset) {
+    if (opts::dump::DumpModi.getNumOccurrences() != 1) {
+      errs()
+          << "need to specify argument '-modi' when using '-symbol-offset'.\n";
+      errs().flush();
+      exit(1);
+    }
+    opts::Filters.SymbolOffset = opts::dump::DumpSymbolOffset;
+    if (opts::dump::DumpParents)
+      opts::Filters.ParentRecurseDepth = opts::dump::DumpParentDepth;
+    if (opts::dump::DumpChildren)
+      opts::Filters.ChildrenRecurseDepth = opts::dump::DumpChildrenDepth;
+  }
 
   if (opts::PdbToYamlSubcommand) {
     pdb2Yaml(opts::pdb2yaml::InputFilename.front());


        


More information about the llvm-commits mailing list