Skip to content

Commit 72c5b64

Browse files
author
Zachary Turner
committed
[pdb] Add command line options for dumping individual streams and blocks
I ran into a situation where I wanted to print out the contents of page 6 of a PDB as a binary blob, and there was no straightforward way to do that. In addition to adding that, this patch also adds the ability to dump a stream by index as a binary blob, and it will stitch together all the blocks and dump the whole thing as one seemingly contiguous sequence of bytes. llvm-svn: 281070
1 parent 47320da commit 72c5b64

File tree

7 files changed

+148
-193
lines changed

7 files changed

+148
-193
lines changed

llvm/test/DebugInfo/PDB/pdbdump-headers.test

Lines changed: 2 additions & 112 deletions
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,10 @@
11
; RUN: llvm-pdbdump raw -headers -tpi-records -tpi-record-bytes -module-syms \
2-
; RUN: -sym-record-bytes -publics -module-files -stream-name=/names \
2+
; RUN: -sym-record-bytes -publics -module-files \
33
; RUN: -stream-summary -stream-blocks -ipi-records -ipi-record-bytes \
44
; RUN: -section-contribs -section-map -section-headers -line-info \
55
; RUN: -tpi-hash -fpo -page-stats %p/Inputs/empty.pdb | FileCheck -check-prefix=EMPTY %s
66
; RUN: llvm-pdbdump raw -all %p/Inputs/empty.pdb | FileCheck -check-prefix=ALL %s
7-
; RUN: llvm-pdbdump raw -headers -stream-name=/names -modules -module-files \
7+
; RUN: llvm-pdbdump raw -headers -modules -module-files \
88
; RUN: %p/Inputs/big-read.pdb | FileCheck -check-prefix=BIG %s
99
; RUN: not llvm-pdbdump raw -headers %p/Inputs/bad-block-size.pdb 2>&1 | FileCheck -check-prefix=BAD-BLOCK-SIZE %s
1010

@@ -67,17 +67,6 @@
6767
; EMPTY-NEXT: Age: 1
6868
; EMPTY-NEXT: Guid: {0B355641-86A0-A249-896F-9988FAE52FF0}
6969
; EMPTY-NEXT: }
70-
; EMPTY-NEXT: Stream '/names' {
71-
; EMPTY-NEXT: Index: 13
72-
; EMPTY-NEXT: Signature: 0xEFFEEFFE
73-
; EMPTY-NEXT: Version: 1
74-
; EMPTY-NEXT: Name Count: 4
75-
; EMPTY-NEXT: Names [
76-
; EMPTY-NEXT: 1: d:\src\llvm\test\debuginfo\pdb\inputs\predefined c++ attributes (compiler internal)
77-
; EMPTY-NEXT: 86: d:\src\llvm\test\debuginfo\pdb\inputs\empty.cpp
78-
; EMPTY-NEXT: 134: $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + =
79-
; EMPTY-NEXT: ]
80-
; EMPTY-NEXT: }
8170
; EMPTY-NEXT: Type Info Stream (TPI) {
8271
; EMPTY-NEXT: TPI Version: 20040203
8372
; EMPTY-NEXT: Record count: 75
@@ -1688,105 +1677,6 @@
16881677
; BIG-NEXT: Age: 1
16891678
; BIG-NEXT: Guid: {880ECC89-DF81-0B4F-839C-58CBD052E937}
16901679
; BIG-NEXT: }
1691-
; BIG-NEXT: Stream '/names' {
1692-
; BIG-NEXT: Index: 13
1693-
; BIG-NEXT: Signature: 0xEFFEEFFE
1694-
; BIG-NEXT: Version: 1
1695-
; BIG-NEXT: Name Count: 92
1696-
; BIG-NEXT: Names [
1697-
; BIG-NEXT: 2938: f:\dd\vctools\crt\vcruntime\inc\vcruntime_startup.h
1698-
; BIG-NEXT: 2569: f:\dd\vctools\crt\vcstartup\src\misc\checkcfg.c
1699-
; BIG-NEXT: 261: f:\dd\vctools\langapi\include\isa_availability.h
1700-
; BIG-NEXT: 4526: $T0 $ebp = $T2 $esp = $T1 .raSearchStart = $eip $T1 ^ = $ebp $T0 = $esp $T1 4 + =
1701-
; BIG-NEXT: 4129: f:\dd\vctools\crt\vcstartup\src\startup\exe_common.inl
1702-
; BIG-NEXT: 4415: $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $20 $T0 40 - ^ = $23 $T0 44 - ^ = $24 $T0 48 - ^ =
1703-
; BIG-NEXT: 4921: $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $23 $T0 16 - ^ = $24 $T0 20 - ^ =
1704-
; BIG-NEXT: 310: f:\dd\externalapis\windows\8.1\sdk\inc\wingdi.h
1705-
; BIG-NEXT: 3880: f:\dd\vctools\crt\vcstartup\build\md\msvcrt_kernel32\predefined c++ types (compiler internal)
1706-
; BIG-NEXT: 2401: $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $23 $T0 24 - ^ =
1707-
; BIG-NEXT: 635: f:\dd\externalapis\unifiedcrt\inc\corecrt_memcpy_s.h
1708-
; BIG-NEXT: 5014: f:\dd\vctools\crt\vcstartup\src\utility\ucrt_stubs.cpp
1709-
; BIG-NEXT: 157: $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + =
1710-
; BIG-NEXT: 2766: f:\dd\vctools\crt\vcstartup\src\utility\dyn_tls_init.c
1711-
; BIG-NEXT: 3196: f:\dd\externalapis\unifiedcrt\inc\corecrt_wstdio.h
1712-
; BIG-NEXT: 4274: $T0 .raSearch = $eip $T0 ^ = $esp $T0 4 + = $23 $T0 4 - ^ =
1713-
; BIG-NEXT: 5322: f:\dd\vctools\crt\vcstartup\src\defaults\default_precision.cpp
1714-
; BIG-NEXT: 3768: f:\dd\vctools\crt\vcstartup\src\defaults\thread_locale.cpp
1715-
; BIG-NEXT: 592: f:\dd\externalapis\unifiedcrt\inc\string.h
1716-
; BIG-NEXT: 887: f:\dd\externalapis\unifiedcrt\inc\corecrt_wstring.h
1717-
; BIG-NEXT: 1898: $T0 .raSearch = $eip $T0 ^ = $esp $T0 4 + = $20 $T0 4 - ^ = $23 $T0 8 - ^ =
1718-
; BIG-NEXT: 1: d:\src\llvm\test\tools\llvm-symbolizer\pdb\inputs\test.cpp
1719-
; BIG-NEXT: 3362: f:\dd\externalapis\unifiedcrt\inc\corecrt_stdio_config.h
1720-
; BIG-NEXT: 1692: f:\dd\vctools\crt\vcruntime\inc\vcruntime_new.h
1721-
; BIG-NEXT: 4077: f:\dd\externalapis\unifiedcrt\inc\corecrt_startup.h
1722-
; BIG-NEXT: 5108: f:\dd\externalapis\windows\8.1\sdk\inc\processthreadsapi.h
1723-
; BIG-NEXT: 2353: f:\dd\vctools\crt\vcstartup\src\gs\gs_support.c
1724-
; BIG-NEXT: 5167: f:\dd\vctools\crt\vcstartup\src\utility\utility_desktop.cpp
1725-
; BIG-NEXT: 2881: f:\dd\vctools\crt\vcstartup\src\utility\ucrt_detection.c
1726-
; BIG-NEXT: 3714: f:\dd\vctools\crt\vcstartup\src\defaults\new_mode.cpp
1727-
; BIG-NEXT: 2206: f:\dd\vctools\crt\vcstartup\src\eh\i386\secchk.c
1728-
; BIG-NEXT: 3661: f:\dd\vctools\crt\vcstartup\src\defaults\matherr.cpp
1729-
; BIG-NEXT: 457: f:\dd\externalapis\unifiedcrt\inc\corecrt.h
1730-
; BIG-NEXT: 3481: f:\dd\vctools\crt\vcstartup\src\defaults\env_mode.cpp
1731-
; BIG-NEXT: 992: f:\dd\externalapis\windows\8.1\sdk\inc\winbase.h
1732-
; BIG-NEXT: 1791: $T0 .raSearch = $eip $T0 ^ = $esp $T0 4 + =
1733-
; BIG-NEXT: 4028: f:\dd\vctools\crt\vcstartup\src\eh\tncleanup.cpp
1734-
; BIG-NEXT: 1977: $T0 .raSearch = $eip $T0 ^ = $esp $T0 4 + = $20 $T0 4 - ^ = $23 $T0 8 - ^ = $24 $T0 12 - ^ =
1735-
; BIG-NEXT: 688: f:\dd\vctools\crt\vcruntime\inc\internal_shared.h
1736-
; BIG-NEXT: 2074: f:\dd\vctools\crt\vcstartup\src\eh\i386\sehprolg4.asm
1737-
; BIG-NEXT: 214: f:\dd\externalapis\windows\8.1\sdk\inc\winnt.h
1738-
; BIG-NEXT: 939: f:\dd\vctools\crt\vcstartup\src\misc\i386\cpu_disp.c
1739-
; BIG-NEXT: 2617: f:\dd\vctools\crt\vcstartup\src\misc\guard_support.c
1740-
; BIG-NEXT: 3827: f:\dd\vctools\crt\vcruntime\inc\vcruntime_typeinfo.h
1741-
; BIG-NEXT: 407: f:\dd\externalapis\windows\8.1\sdk\inc\evntprov.h
1742-
; BIG-NEXT: 2476: $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $23 $T0 24 - ^ = $24 $T0 28 - ^ =
1743-
; BIG-NEXT: 4609: f:\dd\vctools\crt\vcstartup\src\utility\utility.cpp
1744-
; BIG-NEXT: 4184: f:\dd\vctools\crt\vcruntime\inc\eh.h
1745-
; BIG-NEXT: 5227: $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $20 $T0 808 - ^ = $23 $T0 812 - ^ =
1746-
; BIG-NEXT: 1403: f:\dd\vctools\crt\vcstartup\build\md\msvcrt_kernel32\predefined c++ attributes (compiler internal)
1747-
; BIG-NEXT: 60: d:\src\llvm\test\tools\llvm-symbolizer\pdb\inputs\predefined c++ attributes (compiler internal)
1748-
; BIG-NEXT: 2990: f:\dd\vctools\crt\vcstartup\src\defaults\argv_mode.cpp
1749-
; BIG-NEXT: 3045: f:\dd\vctools\crt\vcstartup\src\defaults\commit_mode.cpp
1750-
; BIG-NEXT: 4221: f:\dd\vctools\crt\vcstartup\src\startup\exe_main.cpp
1751-
; BIG-NEXT: 3320: f:\dd\externalapis\unifiedcrt\inc\stdio.h
1752-
; BIG-NEXT: 3974: f:\dd\vctools\crt\vcruntime\inc\vcruntime_exception.h
1753-
; BIG-NEXT: 1551: f:\dd\externalapis\windows\8.1\sdk\inc\guiddef.h
1754-
; BIG-NEXT: 2711: f:\dd\vctools\crt\vcstartup\src\utility\dyn_tls_dtor.c
1755-
; BIG-NEXT: 501: f:\dd\vctools\crt\vcruntime\inc\i386\mmintrin.h
1756-
; BIG-NEXT: 4661: $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $23 $T0 4 - ^ =
1757-
; BIG-NEXT: 4735: $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $20 $T0 28 - ^ = $23 $T0 32 - ^ = $24 $T0 36 - ^ =
1758-
; BIG-NEXT: 358: f:\dd\vctools\crt\vcruntime\inc\i386\xmmintrin.h
1759-
; BIG-NEXT: 1362: f:\dd\vctools\crt\vcruntime\inc\rtcapi.h
1760-
; BIG-NEXT: 3419: f:\dd\vctools\crt\vcstartup\src\defaults\denormal_control.cpp
1761-
; BIG-NEXT: 2255: f:\dd\vctools\crt\vcstartup\src\gs\gs_report.c
1762-
; BIG-NEXT: 2302: f:\dd\externalapis\windows\8.1\sdk\inc\minwindef.h
1763-
; BIG-NEXT: 3102: f:\dd\vctools\crt\vcruntime\inc\vadefs.h
1764-
; BIG-NEXT: 2128: _TP_CALLBACK_ENVIRON_V3
1765-
; BIG-NEXT: 4336: $T0 .raSearch = $eip $T0 ^ = $esp $T0 4 + = $23 $T0 4 - ^ = $24 $T0 8 - ^ =
1766-
; BIG-NEXT: 3143: f:\dd\vctools\crt\vcstartup\inc\vcstartup_internal.h
1767-
; BIG-NEXT: 1643: f:\dd\vctools\crt\vcstartup\src\rtc\initsect.cpp
1768-
; BIG-NEXT: 1041: f:\dd\externalapis\unifiedcrt\inc\ctype.h
1769-
; BIG-NEXT: 2821: f:\dd\vctools\crt\vcstartup\src\utility\matherr_detection.c
1770-
; BIG-NEXT: 3590: f:\dd\vctools\crt\vcstartup\src\defaults\invalid_parameter_handler.cpp
1771-
; BIG-NEXT: 788: f:\dd\externalapis\windows\8.1\sdk\inc\basetsd.h
1772-
; BIG-NEXT: 2152: f:\dd\vctools\crt\vcstartup\src\eh\i386\chandler4gs.c
1773-
; BIG-NEXT: 5069: f:\dd\vctools\langapi\include\ehdata.h
1774-
; BIG-NEXT: 3535: f:\dd\vctools\crt\vcstartup\src\defaults\file_mode.cpp
1775-
; BIG-NEXT: 2670: f:\dd\externalapis\unifiedcrt\inc\math.h
1776-
; BIG-NEXT: 1502: f:\dd\externalapis\windows\8.1\sdk\inc\winuser.h
1777-
; BIG-NEXT: 1158: $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $20 $T0 48 - ^ = $23 $T0 52 - ^ =
1778-
; BIG-NEXT: 1251: $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $20 $T0 48 - ^ = $23 $T0 52 - ^ = $24 $T0 56 - ^ =
1779-
; BIG-NEXT: 1600: f:\dd\externalapis\unifiedcrt\inc\stdlib.h
1780-
; BIG-NEXT: 3247: f:\dd\vctools\crt\vcstartup\src\defaults\default_local_stdio_options.cpp
1781-
; BIG-NEXT: 738: f:\dd\externalapis\windows\8.1\sdk\inc\stralign.h
1782-
; BIG-NEXT: 549: f:\dd\externalapis\unifiedcrt\inc\malloc.h
1783-
; BIG-NEXT: 837: f:\dd\externalapis\windows\8.1\sdk\inc\winerror.h
1784-
; BIG-NEXT: 1836: $T0 .raSearch = $eip $T0 ^ = $esp $T0 4 + = $20 $T0 4 - ^ =
1785-
; BIG-NEXT: 1083: $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $20 $T0 48 - ^ =
1786-
; BIG-NEXT: 4846: $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $23 $T0 16 - ^ =
1787-
; BIG-NEXT: 1740: f:\dd\externalapis\unifiedcrt\inc\corecrt_memory.h
1788-
; BIG-NEXT: ]
1789-
; BIG-NEXT: }
17901680
; BIG-NEXT: DBI Stream {
17911681
; BIG-NEXT: Dbi Version: 19990903
17921682
; BIG-NEXT: Age: 1
Lines changed: 35 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,35 @@
1+
; RUN: llvm-pdbdump raw -block-data=0 %p/Inputs/empty.pdb | FileCheck --check-prefix=BLOCK0 %s
2+
; RUN: llvm-pdbdump raw -block-data=0-1 %p/Inputs/empty.pdb | FileCheck --check-prefix=BLOCK01 %s
3+
; RUN: not llvm-pdbdump raw -block-data=0,1 %p/Inputs/empty.pdb 2>&1 | FileCheck --check-prefix=BADSYNTAX %s
4+
; RUN: not llvm-pdbdump raw -block-data=0a1 %p/Inputs/empty.pdb 2>&1 | FileCheck --check-prefix=BADSYNTAX %s
5+
; RUN: not llvm-pdbdump raw -block-data=0- %p/Inputs/empty.pdb 2>&1 | FileCheck --check-prefix=BADSYNTAX %s
6+
7+
BLOCK0: Block Data {
8+
BLOCK0-NEXT: Block 0 (
9+
BLOCK0-NEXT: 0000: 4D696372 6F736F66 7420432F 432B2B20 |Microsoft C/C++ |
10+
BLOCK0-NEXT: 0010: 4D534620 372E3030 0D0A1A44 53000000 |MSF 7.00...DS...|
11+
BLOCK0-NEXT: 0020: 00100000 02000000 19000000 88000000 |................|
12+
BLOCK0-NEXT: 0030: 00000000 18000000 00000000 00000000 |................|
13+
BLOCK0: 0FE0: 00000000 00000000 00000000 00000000 |................|
14+
BLOCK0-NEXT: 0FF0: 00000000 00000000 00000000 00000000 |................|
15+
BLOCK0-NEXT: )
16+
BLOCK0-NEXT: }
17+
18+
BLOCK01: Block Data {
19+
BLOCK01-NEXT: Block 0 (
20+
BLOCK01-NEXT: 0000: 4D696372 6F736F66 7420432F 432B2B20 |Microsoft C/C++ |
21+
BLOCK01-NEXT: 0010: 4D534620 372E3030 0D0A1A44 53000000 |MSF 7.00...DS...|
22+
BLOCK01-NEXT: 0020: 00100000 02000000 19000000 88000000 |................|
23+
BLOCK01-NEXT: 0030: 00000000 18000000 00000000 00000000 |................|
24+
BLOCK01: 0FE0: 00000000 00000000 00000000 00000000 |................|
25+
BLOCK01-NEXT: 0FF0: 00000000 00000000 00000000 00000000 |................|
26+
BLOCK01-NEXT: )
27+
BLOCK01-NEXT: Block 1 (
28+
BLOCK01-NEXT: 0000: C0FCFFFF FFFFFFFF FFFFFFFF FFFFFFFF |................|
29+
BLOCK01-NEXT: 0010: FFFFFFFF FFFFFFFF FFFFFFFF FFFFFFFF |................|
30+
BLOCK01: 0FE0: FFFFFFFF FFFFFFFF FFFFFFFF FFFFFFFF |................|
31+
BLOCK01-NEXT: 0FF0: FFFFFFFF FFFFFFFF FFFFFFFF FFFFFFFF |................|
32+
BLOCK01-NEXT: )
33+
BLOCK01-NEXT: }
34+
35+
BADSYNTAX: Argument '{{.*}}' invalid format.
Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,17 @@
1+
; RUN: llvm-pdbdump raw -stream-data=1 %p/Inputs/empty.pdb | FileCheck --check-prefix=STREAM1 %s
2+
; RUN: not llvm-pdbdump raw -stream-data=100 %p/Inputs/empty.pdb 2>&1 | FileCheck --check-prefix=INVALIDSTREAM %s
3+
4+
STREAM1: Stream Data {
5+
STREAM1-NEXT: Stream 1 (
6+
STREAM1-NEXT: 0000: 942E3101 E207E554 01000000 0B355641 |..1....T.....5VA|
7+
STREAM1-NEXT: 0010: 86A0A249 896F9988 FAE52FF0 22000000 |...I.o..../."...|
8+
STREAM1-NEXT: 0020: 2F4C696E 6B496E66 6F002F6E 616D6573 |/LinkInfo./names|
9+
STREAM1-NEXT: 0030: 002F7372 632F6865 61646572 626C6F63 |./src/headerbloc|
10+
STREAM1-NEXT: 0040: 6B000300 00000600 00000100 00001A00 |k...............|
11+
STREAM1-NEXT: 0050: 00000000 00001100 00000900 00000A00 |................|
12+
STREAM1-NEXT: 0060: 00000D00 00000000 00000500 00000000 |................|
13+
STREAM1-NEXT: 0070: 00004191 3201 |..A.2.|
14+
STREAM1-NEXT: )
15+
STREAM1-NEXT: }
16+
17+
INVALIDSTREAM: Native PDB Error: The specified stream could not be loaded.

llvm/tools/llvm-pdbdump/LLVMOutputStyle.cpp

Lines changed: 52 additions & 63 deletions
Original file line numberDiff line numberDiff line change
@@ -98,13 +98,13 @@ Error LLVMOutputStyle::dump() {
9898
if (auto EC = dumpStreamBlocks())
9999
return EC;
100100

101-
if (auto EC = dumpStreamData())
101+
if (auto EC = dumpBlockRanges())
102102
return EC;
103103

104-
if (auto EC = dumpInfoStream())
104+
if (auto EC = dumpStreamBytes())
105105
return EC;
106106

107-
if (auto EC = dumpNamedStream())
107+
if (auto EC = dumpInfoStream())
108108
return EC;
109109

110110
if (auto EC = dumpTpiStream(StreamTPI))
@@ -343,28 +343,58 @@ Error LLVMOutputStyle::dumpStreamBlocks() {
343343
return Error::success();
344344
}
345345

346-
Error LLVMOutputStyle::dumpStreamData() {
347-
uint32_t StreamCount = File.getNumStreams();
348-
StringRef DumpStreamStr = opts::raw::DumpStreamDataIdx;
349-
uint32_t DumpStreamNum;
350-
if (DumpStreamStr.getAsInteger(/*Radix=*/0U, DumpStreamNum))
346+
Error LLVMOutputStyle::dumpBlockRanges() {
347+
if (!opts::raw::DumpBlockRange.hasValue())
351348
return Error::success();
349+
auto &R = *opts::raw::DumpBlockRange;
350+
uint32_t Max = R.Max.getValueOr(R.Min);
351+
352+
if (Max < R.Min)
353+
return make_error<StringError>(
354+
"Invalid block range specified. Max < Min",
355+
std::make_error_code(std::errc::bad_address));
356+
if (Max >= File.getBlockCount())
357+
return make_error<StringError>(
358+
"Invalid block range specified. Requested block out of bounds",
359+
std::make_error_code(std::errc::bad_address));
360+
361+
DictScope D(P, "Block Data");
362+
for (uint32_t I = R.Min; I <= Max; ++I) {
363+
auto ExpectedData = File.getBlockData(I, File.getBlockSize());
364+
if (!ExpectedData)
365+
return ExpectedData.takeError();
366+
std::string Label;
367+
llvm::raw_string_ostream S(Label);
368+
S << "Block " << I;
369+
S.flush();
370+
P.printBinaryBlock(Label, *ExpectedData);
371+
}
372+
373+
return Error::success();
374+
}
352375

353-
if (DumpStreamNum >= StreamCount)
354-
return make_error<RawError>(raw_error_code::no_stream);
355-
356-
auto S = MappedBlockStream::createIndexedStream(
357-
File.getMsfLayout(), File.getMsfBuffer(), DumpStreamNum);
358-
StreamReader R(*S);
359-
while (R.bytesRemaining() > 0) {
360-
ArrayRef<uint8_t> Data;
361-
uint32_t BytesToReadInBlock = std::min(
362-
R.bytesRemaining(), static_cast<uint32_t>(File.getBlockSize()));
363-
if (auto EC = R.readBytes(Data, BytesToReadInBlock))
376+
Error LLVMOutputStyle::dumpStreamBytes() {
377+
if (opts::raw::DumpStreamData.empty())
378+
return Error::success();
379+
380+
DictScope D(P, "Stream Data");
381+
for (uint32_t SI : opts::raw::DumpStreamData) {
382+
if (SI >= File.getNumStreams())
383+
return make_error<RawError>(raw_error_code::no_stream);
384+
385+
auto S = MappedBlockStream::createIndexedStream(File.getMsfLayout(),
386+
File.getMsfBuffer(), SI);
387+
if (!S)
388+
continue;
389+
StreamReader R(*S);
390+
ArrayRef<uint8_t> StreamData;
391+
if (auto EC = R.readBytes(StreamData, S->getLength()))
364392
return EC;
365-
P.printBinaryBlock(
366-
"Data",
367-
StringRef(reinterpret_cast<const char *>(Data.begin()), Data.size()));
393+
std::string Label;
394+
llvm::raw_string_ostream Stream(Label);
395+
Stream << "Stream " << SI;
396+
Stream.flush();
397+
P.printBinaryBlock(Label, StreamData);
368398
}
369399
return Error::success();
370400
}
@@ -384,47 +414,6 @@ Error LLVMOutputStyle::dumpInfoStream() {
384414
return Error::success();
385415
}
386416

387-
Error LLVMOutputStyle::dumpNamedStream() {
388-
if (opts::raw::DumpStreamDataName.empty())
389-
return Error::success();
390-
391-
auto IS = File.getPDBInfoStream();
392-
if (!IS)
393-
return IS.takeError();
394-
395-
uint32_t NameStreamIndex =
396-
IS->getNamedStreamIndex(opts::raw::DumpStreamDataName);
397-
if (NameStreamIndex == 0 || NameStreamIndex >= File.getNumStreams())
398-
return make_error<RawError>(raw_error_code::no_stream);
399-
400-
if (NameStreamIndex != 0) {
401-
std::string Name("Stream '");
402-
Name += opts::raw::DumpStreamDataName;
403-
Name += "'";
404-
DictScope D(P, Name);
405-
P.printNumber("Index", NameStreamIndex);
406-
407-
auto NameStream = MappedBlockStream::createIndexedStream(
408-
File.getMsfLayout(), File.getMsfBuffer(), NameStreamIndex);
409-
StreamReader Reader(*NameStream);
410-
411-
NameHashTable NameTable;
412-
if (auto EC = NameTable.load(Reader))
413-
return EC;
414-
415-
P.printHex("Signature", NameTable.getSignature());
416-
P.printNumber("Version", NameTable.getHashVersion());
417-
P.printNumber("Name Count", NameTable.getNameCount());
418-
ListScope L(P, "Names");
419-
for (uint32_t ID : NameTable.name_ids()) {
420-
StringRef Str = NameTable.getStringForID(ID);
421-
if (!Str.empty())
422-
P.printString(to_string(ID), Str);
423-
}
424-
}
425-
return Error::success();
426-
}
427-
428417
static void printTypeIndexOffset(raw_ostream &OS,
429418
const TypeIndexOffset &TIOff) {
430419
OS << "{" << TIOff.Type.getIndex() << ", " << TIOff.Offset << "}";

llvm/tools/llvm-pdbdump/LLVMOutputStyle.h

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -28,10 +28,10 @@ class LLVMOutputStyle : public OutputStyle {
2828
Error dumpFileHeaders();
2929
Error dumpStreamSummary();
3030
Error dumpFreePageMap();
31+
Error dumpBlockRanges();
32+
Error dumpStreamBytes();
3133
Error dumpStreamBlocks();
32-
Error dumpStreamData();
3334
Error dumpInfoStream();
34-
Error dumpNamedStream();
3535
Error dumpTpiStream(uint32_t StreamIdx);
3636
Error dumpDbiStream();
3737
Error dumpSectionContribs();

0 commit comments

Comments
 (0)