From a3ca9305b027fa4e3b64c8104ab9b246b125f46e Mon Sep 17 00:00:00 2001 From: Zachary Turner Date: Tue, 25 Apr 2017 20:22:02 +0000 Subject: [PATCH] [llvm-pdbdump] Dump File / Line Info to YAML. We were already parsing and dumping this to the human readable format, but not to the YAML format. This does so, in preparation for reading it in and reconstructing the line information from YAML. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@301357 91177308-0d34-0410-b5e6-96231b3b80d8 --- include/llvm/DebugInfo/CodeView/CodeView.h | 2 +- .../CodeView/ModuleSubstreamVisitor.h | 2 +- include/llvm/DebugInfo/PDB/Native/ModStream.h | 2 + include/llvm/Support/YAMLTraits.h | 4 +- lib/DebugInfo/PDB/Native/ModStream.cpp | 4 + test/DebugInfo/PDB/pdbdump-yaml-lineinfo.test | 59 ++++++++ tools/llvm-pdbdump/PdbYaml.cpp | 92 ++++++++++++ tools/llvm-pdbdump/PdbYaml.h | 93 ++++++++++++ tools/llvm-pdbdump/YAMLOutputStyle.cpp | 136 +++++++++++++++++- tools/llvm-pdbdump/YAMLOutputStyle.h | 5 + tools/llvm-pdbdump/llvm-pdbdump.cpp | 8 +- tools/llvm-pdbdump/llvm-pdbdump.h | 2 + 12 files changed, 397 insertions(+), 12 deletions(-) create mode 100644 test/DebugInfo/PDB/pdbdump-yaml-lineinfo.test diff --git a/include/llvm/DebugInfo/CodeView/CodeView.h b/include/llvm/DebugInfo/CodeView/CodeView.h index 2791c9dc374..e599f8a19e3 100644 --- a/include/llvm/DebugInfo/CodeView/CodeView.h +++ b/include/llvm/DebugInfo/CodeView/CodeView.h @@ -546,7 +546,7 @@ enum class TrampolineType : uint16_t { TrampIncremental, BranchIsland }; // These values correspond to the CV_SourceChksum_t enumeration. enum class FileChecksumKind : uint8_t { None, MD5, SHA1, SHA256 }; -enum LineFlags : uint32_t { +enum LineFlags : uint16_t { HaveColumns = 1, // CV_LINES_HAVE_COLUMNS }; } diff --git a/include/llvm/DebugInfo/CodeView/ModuleSubstreamVisitor.h b/include/llvm/DebugInfo/CodeView/ModuleSubstreamVisitor.h index 1a40654a3f3..31344a9427d 100644 --- a/include/llvm/DebugInfo/CodeView/ModuleSubstreamVisitor.h +++ b/include/llvm/DebugInfo/CodeView/ModuleSubstreamVisitor.h @@ -81,7 +81,7 @@ public: BinaryStreamReader Reader(Stream); if (auto EC = Reader.readObject(BlockHeader)) return EC; - bool HasColumn = Header->Flags & LineFlags::HaveColumns; + bool HasColumn = Header->Flags & uint32_t(LineFlags::HaveColumns); uint32_t LineInfoSize = BlockHeader->NumLines * (sizeof(LineNumberEntry) + (HasColumn ? sizeof(ColumnNumberEntry) : 0)); diff --git a/include/llvm/DebugInfo/PDB/Native/ModStream.h b/include/llvm/DebugInfo/PDB/Native/ModStream.h index d65e195dbb9..b12d4ff375f 100644 --- a/include/llvm/DebugInfo/PDB/Native/ModStream.h +++ b/include/llvm/DebugInfo/PDB/Native/ModStream.h @@ -40,6 +40,8 @@ public: iterator_range lines(bool *HadError) const; + bool hasLineInfo() const; + Error commit(); private: diff --git a/include/llvm/Support/YAMLTraits.h b/include/llvm/Support/YAMLTraits.h index 6d02e4aba48..ffea679fab8 100644 --- a/include/llvm/Support/YAMLTraits.h +++ b/include/llvm/Support/YAMLTraits.h @@ -606,7 +606,7 @@ public: template void bitSetCase(T &Val, const char* Str, const T ConstVal) { if ( bitSetMatch(Str, outputting() && (Val & ConstVal) == ConstVal) ) { - Val = Val | ConstVal; + Val = static_cast(Val | ConstVal); } } @@ -614,7 +614,7 @@ public: template void bitSetCase(T &Val, const char* Str, const uint32_t ConstVal) { if ( bitSetMatch(Str, outputting() && (Val & ConstVal) == ConstVal) ) { - Val = Val | ConstVal; + Val = static_cast(Val | ConstVal); } } diff --git a/lib/DebugInfo/PDB/Native/ModStream.cpp b/lib/DebugInfo/PDB/Native/ModStream.cpp index 08798cf0ed2..e87e2c40759 100644 --- a/lib/DebugInfo/PDB/Native/ModStream.cpp +++ b/lib/DebugInfo/PDB/Native/ModStream.cpp @@ -82,4 +82,8 @@ ModStream::lines(bool *HadError) const { return make_range(LineInfo.begin(HadError), LineInfo.end()); } +bool ModStream::hasLineInfo() const { + return C13LinesSubstream.getLength() > 0 || LinesSubstream.getLength() > 0; +} + Error ModStream::commit() { return Error::success(); } diff --git a/test/DebugInfo/PDB/pdbdump-yaml-lineinfo.test b/test/DebugInfo/PDB/pdbdump-yaml-lineinfo.test new file mode 100644 index 00000000000..016d5246498 --- /dev/null +++ b/test/DebugInfo/PDB/pdbdump-yaml-lineinfo.test @@ -0,0 +1,59 @@ +; RUN: llvm-pdbdump pdb2yaml -dbi-module-lines %p/Inputs/empty.pdb \ +; RUN: | FileCheck -check-prefix=YAML %s + + +YAML: --- +YAML: MSF: +YAML: SuperBlock: +YAML: BlockSize: 4096 +YAML: FreeBlockMap: 2 +YAML: NumBlocks: 25 +YAML: NumDirectoryBytes: 136 +YAML: Unknown1: 0 +YAML: BlockMapAddr: 24 +YAML: NumDirectoryBlocks: 1 +YAML: DirectoryBlocks: [ 23 ] +YAML: NumStreams: 0 +YAML: FileSize: 102400 +YAML: DbiStream: +YAML: VerHeader: V70 +YAML: Age: 1 +YAML: BuildNumber: 35840 +YAML: PdbDllVersion: 31101 +YAML: PdbDllRbld: 0 +YAML: Flags: 1 +YAML: MachineType: x86 +YAML: Modules: +YAML: - Module: 'd:\src\llvm\test\DebugInfo\PDB\Inputs\empty.obj' +YAML: ObjFile: 'd:\src\llvm\test\DebugInfo\PDB\Inputs\empty.obj' +YAML: SourceFiles: +YAML: - 'd:\src\llvm\test\debuginfo\pdb\inputs\empty.cpp' +YAML: LineInfo: +YAML: Lines: +YAML: CodeSize: 10 +YAML: Flags: [ ] +YAML: RelocOffset: 16 +YAML: RelocSegment: 1 +YAML: LineInfo: +YAML: - FileName: 'd:\src\llvm\test\debuginfo\pdb\inputs\empty.cpp' +YAML: Lines: +YAML: - Offset: 0 +YAML: LineStart: 5 +YAML: IsStatement: true +YAML: EndDelta: 5 +YAML: - Offset: 3 +YAML: LineStart: 6 +YAML: IsStatement: true +YAML: EndDelta: 6 +YAML: - Offset: 8 +YAML: LineStart: 7 +YAML: IsStatement: true +YAML: EndDelta: 7 +YAML: Columns: +YAML: Checksums: +YAML: - FileName: 'd:\src\llvm\test\debuginfo\pdb\inputs\empty.cpp' +YAML: Kind: MD5 +YAML: Checksum: A0A5BD0D3ECD93FC29D19DE826FBF4BC +YAML: - Module: '* Linker *' +YAML: ObjFile: '' +YAML: ... \ No newline at end of file diff --git a/tools/llvm-pdbdump/PdbYaml.cpp b/tools/llvm-pdbdump/PdbYaml.cpp index e2c4ee967ed..65a5a9142d2 100644 --- a/tools/llvm-pdbdump/PdbYaml.cpp +++ b/tools/llvm-pdbdump/PdbYaml.cpp @@ -13,6 +13,7 @@ #include "YamlSymbolDumper.h" #include "YamlTypeDumper.h" +#include "llvm/ADT/StringExtras.h" #include "llvm/DebugInfo/CodeView/CVSymbolVisitor.h" #include "llvm/DebugInfo/CodeView/CVTypeVisitor.h" #include "llvm/DebugInfo/CodeView/SymbolDeserializer.h" @@ -35,6 +36,10 @@ LLVM_YAML_IS_FLOW_SEQUENCE_VECTOR(uint32_t) LLVM_YAML_IS_SEQUENCE_VECTOR(llvm::StringRef) LLVM_YAML_IS_SEQUENCE_VECTOR(llvm::pdb::yaml::NamedStreamMapping) LLVM_YAML_IS_SEQUENCE_VECTOR(llvm::pdb::yaml::PdbDbiModuleInfo) +LLVM_YAML_IS_SEQUENCE_VECTOR(llvm::pdb::yaml::PdbSourceFileChecksumEntry) +LLVM_YAML_IS_SEQUENCE_VECTOR(llvm::pdb::yaml::PdbSourceLineEntry) +LLVM_YAML_IS_SEQUENCE_VECTOR(llvm::pdb::yaml::PdbSourceColumnEntry) +LLVM_YAML_IS_SEQUENCE_VECTOR(llvm::pdb::yaml::PdbSourceLineBlock) LLVM_YAML_IS_SEQUENCE_VECTOR(llvm::pdb::yaml::PdbSymbolRecord) LLVM_YAML_IS_SEQUENCE_VECTOR(llvm::pdb::yaml::PdbTpiRecord) LLVM_YAML_IS_SEQUENCE_VECTOR(llvm::pdb::yaml::StreamBlockList) @@ -145,7 +150,38 @@ template <> struct ScalarEnumerationTraits { io.enumCase(Features, "VC140", PdbRaw_FeatureSig::VC140); } }; + +template <> struct ScalarEnumerationTraits { + static void enumeration(IO &io, llvm::codeview::FileChecksumKind &Kind) { + io.enumCase(Kind, "None", llvm::codeview::FileChecksumKind::None); + io.enumCase(Kind, "MD5", llvm::codeview::FileChecksumKind::MD5); + io.enumCase(Kind, "SHA1", llvm::codeview::FileChecksumKind::SHA1); + io.enumCase(Kind, "SHA256", llvm::codeview::FileChecksumKind::SHA256); + } +}; + +template <> struct ScalarBitSetTraits { + static void bitset(IO &io, llvm::codeview::LineFlags &Flags) { + io.bitSetCase(Flags, "HasColumnInfo", + llvm::codeview::LineFlags::HaveColumns); + io.enumFallback(Flags); + } +}; +} } + +void ScalarTraits::output(const HexFormattedString &Value, + void *ctx, raw_ostream &Out) { + StringRef Bytes(reinterpret_cast(Value.Bytes.data()), + Value.Bytes.size()); + Out << toHex(Bytes); +} + +StringRef ScalarTraits::input(StringRef Scalar, void *ctxt, + HexFormattedString &Value) { + std::string H = fromHex(Scalar); + Value.Bytes.assign(H.begin(), H.end()); + return StringRef(); } void MappingTraits::mapping(IO &IO, PdbObject &Obj) { @@ -255,9 +291,65 @@ void MappingContextTraits::ma IO.mapRequired("Module", Obj.Mod); IO.mapOptional("ObjFile", Obj.Obj, Obj.Mod); IO.mapOptional("SourceFiles", Obj.SourceFiles); + IO.mapOptionalWithContext("LineInfo", Obj.FileLineInfo, Context); IO.mapOptionalWithContext("Modi", Obj.Modi, Context); } +void MappingContextTraits:: + mapping(IO &IO, PdbSourceLineEntry &Obj, + pdb::yaml::SerializationContext &Context) { + IO.mapRequired("Offset", Obj.Offset); + IO.mapRequired("LineStart", Obj.LineStart); + IO.mapRequired("IsStatement", Obj.IsStatement); + IO.mapRequired("EndDelta", Obj.EndDelta); +} + +void MappingContextTraits:: + mapping(IO &IO, PdbSourceColumnEntry &Obj, + pdb::yaml::SerializationContext &Context) { + IO.mapRequired("StartColumn", Obj.StartColumn); + IO.mapRequired("EndColumn", Obj.EndColumn); +}; + +void MappingContextTraits:: + mapping(IO &IO, PdbSourceLineBlock &Obj, + pdb::yaml::SerializationContext &Context) { + IO.mapRequired("FileName", Obj.FileName); + IO.mapRequired("Lines", Obj.Lines, Context); + IO.mapRequired("Columns", Obj.Columns, Context); +}; + +void MappingContextTraits:: + mapping(IO &IO, PdbSourceFileChecksumEntry &Obj, + pdb::yaml::SerializationContext &Context) { + IO.mapRequired("FileName", Obj.FileName); + IO.mapRequired("Kind", Obj.Kind); + IO.mapRequired("Checksum", Obj.ChecksumBytes); +}; + +void MappingContextTraits:: + mapping(IO &IO, PdbSourceLineInfo &Obj, + pdb::yaml::SerializationContext &Context) { + IO.mapRequired("CodeSize", Obj.CodeSize); + IO.mapRequired("Flags", Obj.Flags); + IO.mapRequired("RelocOffset", Obj.RelocOffset); + IO.mapRequired("RelocSegment", Obj.RelocSegment); + IO.mapRequired("LineInfo", Obj.LineInfo, Context); +}; + +void MappingContextTraits:: + mapping(IO &IO, PdbSourceFileInfo &Obj, + pdb::yaml::SerializationContext &Context) { + IO.mapOptionalWithContext("Lines", Obj.Lines, Context); + IO.mapOptionalWithContext("Checksums", Obj.FileChecksums, Context); +}; + void MappingContextTraits:: mapping(IO &IO, pdb::yaml::PdbTpiRecord &Obj, pdb::yaml::SerializationContext &Context) { diff --git a/tools/llvm-pdbdump/PdbYaml.h b/tools/llvm-pdbdump/PdbYaml.h index 2c4cd237f8d..96e0583ca23 100644 --- a/tools/llvm-pdbdump/PdbYaml.h +++ b/tools/llvm-pdbdump/PdbYaml.h @@ -65,10 +65,53 @@ struct PdbModiStream { std::vector Symbols; }; +struct PdbSourceLineEntry { + uint32_t Offset; + uint32_t LineStart; + uint32_t EndDelta; + bool IsStatement; +}; + +struct PdbSourceColumnEntry { + uint16_t StartColumn; + uint16_t EndColumn; +}; + +struct PdbSourceLineBlock { + StringRef FileName; + std::vector Lines; + std::vector Columns; +}; + +struct HexFormattedString { + std::vector Bytes; +}; + +struct PdbSourceFileChecksumEntry { + StringRef FileName; + codeview::FileChecksumKind Kind; + HexFormattedString ChecksumBytes; +}; + +struct PdbSourceLineInfo { + uint32_t RelocOffset; + uint32_t RelocSegment; + codeview::LineFlags Flags; + uint32_t CodeSize; + + std::vector LineInfo; +}; + +struct PdbSourceFileInfo { + PdbSourceLineInfo Lines; + std::vector FileChecksums; +}; + struct PdbDbiModuleInfo { StringRef Obj; StringRef Mod; std::vector SourceFiles; + Optional FileLineInfo; Optional Modi; }; @@ -165,6 +208,56 @@ template <> struct MappingContextTraits +struct MappingContextTraits { + static void mapping(IO &IO, pdb::yaml::PdbSourceLineEntry &Obj, + pdb::yaml::SerializationContext &Context); +}; + +template <> +struct MappingContextTraits { + static void mapping(IO &IO, pdb::yaml::PdbSourceColumnEntry &Obj, + pdb::yaml::SerializationContext &Context); +}; + +template <> +struct MappingContextTraits { + static void mapping(IO &IO, pdb::yaml::PdbSourceLineBlock &Obj, + pdb::yaml::SerializationContext &Context); +}; + +template <> +struct MappingContextTraits { + static void mapping(IO &IO, pdb::yaml::PdbSourceFileChecksumEntry &Obj, + pdb::yaml::SerializationContext &Context); +}; + +template <> struct ScalarTraits { + static void output(const pdb::yaml::HexFormattedString &Value, void *ctx, + llvm::raw_ostream &Out); + static StringRef input(StringRef Scalar, void *ctxt, + pdb::yaml::HexFormattedString &Value); + static bool mustQuote(StringRef) { return false; } +}; + +template <> +struct MappingContextTraits { + static void mapping(IO &IO, pdb::yaml::PdbSourceLineInfo &Obj, + pdb::yaml::SerializationContext &Context); +}; + +template <> +struct MappingContextTraits { + static void mapping(IO &IO, pdb::yaml::PdbSourceFileInfo &Obj, + pdb::yaml::SerializationContext &Context); +}; + template <> struct MappingContextTraits { diff --git a/tools/llvm-pdbdump/YAMLOutputStyle.cpp b/tools/llvm-pdbdump/YAMLOutputStyle.cpp index 5b53d213716..b329de265e7 100644 --- a/tools/llvm-pdbdump/YAMLOutputStyle.cpp +++ b/tools/llvm-pdbdump/YAMLOutputStyle.cpp @@ -12,6 +12,9 @@ #include "PdbYaml.h" #include "llvm-pdbdump.h" +#include "llvm/DebugInfo/CodeView/Line.h" +#include "llvm/DebugInfo/CodeView/ModuleSubstream.h" +#include "llvm/DebugInfo/CodeView/ModuleSubstreamVisitor.h" #include "llvm/DebugInfo/MSF/MappedBlockStream.h" #include "llvm/DebugInfo/PDB/Native/DbiStream.h" #include "llvm/DebugInfo/PDB/Native/InfoStream.h" @@ -33,8 +36,13 @@ Error YAMLOutputStyle::dump() { opts::pdb2yaml::StreamMetadata = true; if (opts::pdb2yaml::DbiModuleSyms) opts::pdb2yaml::DbiModuleInfo = true; + + if (opts::pdb2yaml::DbiModuleSourceLineInfo) + opts::pdb2yaml::DbiModuleSourceFileInfo = true; + if (opts::pdb2yaml::DbiModuleSourceFileInfo) opts::pdb2yaml::DbiModuleInfo = true; + if (opts::pdb2yaml::DbiModuleInfo) opts::pdb2yaml::DbiStream = true; @@ -66,6 +74,112 @@ Error YAMLOutputStyle::dump() { return Error::success(); } +namespace { +class C13SubstreamVisitor : public codeview::IModuleSubstreamVisitor { +public: + C13SubstreamVisitor(llvm::pdb::yaml::PdbSourceFileInfo &Info, PDBFile &F) + : Info(Info), F(F) {} + + Error visitUnknown(codeview::ModuleSubstreamKind Kind, + BinaryStreamRef Stream) override { + return Error::success(); + } + + Error + visitFileChecksums(BinaryStreamRef Data, + const codeview::FileChecksumArray &Checksums) override { + for (const auto &C : Checksums) { + llvm::pdb::yaml::PdbSourceFileChecksumEntry Entry; + if (auto Result = getGlobalString(C.FileNameOffset)) + Entry.FileName = *Result; + else + return Result.takeError(); + + Entry.Kind = C.Kind; + Entry.ChecksumBytes.Bytes = C.Checksum; + Info.FileChecksums.push_back(Entry); + } + return Error::success(); + } + + Error visitLines(BinaryStreamRef Data, + const codeview::LineSubstreamHeader *Header, + const codeview::LineInfoArray &Lines) override { + + Info.Lines.CodeSize = Header->CodeSize; + Info.Lines.Flags = + static_cast(uint16_t(Header->Flags)); + Info.Lines.RelocOffset = Header->RelocOffset; + Info.Lines.RelocSegment = Header->RelocSegment; + + for (const auto &L : Lines) { + llvm::pdb::yaml::PdbSourceLineBlock Block; + + if (auto Result = getDbiFileName(L.NameIndex)) + Block.FileName = *Result; + else + return Result.takeError(); + + for (const auto &N : L.LineNumbers) { + llvm::pdb::yaml::PdbSourceLineEntry Line; + Line.Offset = N.Offset; + codeview::LineInfo LI(N.Flags); + Line.LineStart = LI.getStartLine(); + Line.EndDelta = LI.getEndLine(); + Line.IsStatement = LI.isStatement(); + Block.Lines.push_back(Line); + } + + if (Info.Lines.Flags & codeview::LineFlags::HaveColumns) { + for (const auto &C : L.Columns) { + llvm::pdb::yaml::PdbSourceColumnEntry Column; + Column.StartColumn = C.StartColumn; + Column.EndColumn = C.EndColumn; + Block.Columns.push_back(Column); + } + } + + Info.Lines.LineInfo.push_back(Block); + } + return Error::success(); + } + +private: + Expected getGlobalString(uint32_t Offset) { + auto ST = F.getStringTable(); + if (!ST) + return ST.takeError(); + + return ST->getStringForID(Offset); + } + Expected getDbiFileName(uint32_t Offset) { + auto DS = F.getPDBDbiStream(); + if (!DS) + return DS.takeError(); + return DS->getFileNameForIndex(Offset); + } + + llvm::pdb::yaml::PdbSourceFileInfo &Info; + PDBFile &F; +}; +} + +Expected> +YAMLOutputStyle::getFileLineInfo(const pdb::ModStream &ModS) { + if (!ModS.hasLineInfo()) + return None; + + yaml::PdbSourceFileInfo Info; + bool Error = false; + C13SubstreamVisitor Visitor(Info, File); + for (auto &Substream : ModS.lines(&Error)) { + if (auto E = codeview::visitModuleSubstream(Substream, Visitor)) + return std::move(E); + } + + return Info; +} + Error YAMLOutputStyle::dumpFileHeaders() { if (opts::pdb2yaml::NoFileHeaders) return Error::success(); @@ -175,16 +289,24 @@ Error YAMLOutputStyle::dumpDbiStream() { if (opts::pdb2yaml::DbiModuleSourceFileInfo) DMI.SourceFiles = MI.SourceFiles; + auto ModStreamData = msf::MappedBlockStream::createIndexedStream( + File.getMsfLayout(), File.getMsfBuffer(), + MI.Info.getModuleStreamIndex()); + + pdb::ModStream ModS(MI.Info, std::move(ModStreamData)); + if (auto EC = ModS.reload()) + return EC; + + if (opts::pdb2yaml::DbiModuleSourceLineInfo) { + auto ExpectedInfo = getFileLineInfo(ModS); + if (!ExpectedInfo) + return ExpectedInfo.takeError(); + DMI.FileLineInfo = *ExpectedInfo; + } + if (opts::pdb2yaml::DbiModuleSyms && MI.Info.getModuleStreamIndex() != kInvalidStreamIndex) { DMI.Modi.emplace(); - auto ModStreamData = msf::MappedBlockStream::createIndexedStream( - File.getMsfLayout(), File.getMsfBuffer(), - MI.Info.getModuleStreamIndex()); - - pdb::ModStream ModS(MI.Info, std::move(ModStreamData)); - if (auto EC = ModS.reload()) - return EC; DMI.Modi->Signature = ModS.signature(); bool HadError = false; diff --git a/tools/llvm-pdbdump/YAMLOutputStyle.h b/tools/llvm-pdbdump/YAMLOutputStyle.h index db9868db4a7..263af776fa0 100644 --- a/tools/llvm-pdbdump/YAMLOutputStyle.h +++ b/tools/llvm-pdbdump/YAMLOutputStyle.h @@ -19,6 +19,8 @@ namespace llvm { namespace pdb { +class ModStream; + class YAMLOutputStyle : public OutputStyle { public: YAMLOutputStyle(PDBFile &File); @@ -26,6 +28,9 @@ public: Error dump() override; private: + Expected> + getFileLineInfo(const pdb::ModStream &ModS); + Error dumpStringTable(); Error dumpFileHeaders(); Error dumpStreamMetadata(); diff --git a/tools/llvm-pdbdump/llvm-pdbdump.cpp b/tools/llvm-pdbdump/llvm-pdbdump.cpp index 172e29ac7f3..e498c018718 100644 --- a/tools/llvm-pdbdump/llvm-pdbdump.cpp +++ b/tools/llvm-pdbdump/llvm-pdbdump.cpp @@ -375,9 +375,15 @@ cl::opt DbiModuleSyms( cl::opt DbiModuleSourceFileInfo( "dbi-module-source-info", cl::desc( - "Dump DBI Module Source File Information (implies -dbi-module-info"), + "Dump DBI Module Source File Information (implies -dbi-module-info)"), cl::sub(PdbToYamlSubcommand), cl::init(false)); +cl::opt + DbiModuleSourceLineInfo("dbi-module-lines", + cl::desc("Dump DBI Module Source Line Information " + "(implies -dbi-module-source-info)"), + cl::sub(PdbToYamlSubcommand), cl::init(false)); + cl::opt TpiStream("tpi-stream", cl::desc("Dump the TPI Stream (Stream 3)"), cl::sub(PdbToYamlSubcommand), cl::init(false)); diff --git a/tools/llvm-pdbdump/llvm-pdbdump.h b/tools/llvm-pdbdump/llvm-pdbdump.h index 1bfba3518a5..d1af06fe3b4 100644 --- a/tools/llvm-pdbdump/llvm-pdbdump.h +++ b/tools/llvm-pdbdump/llvm-pdbdump.h @@ -66,6 +66,7 @@ extern llvm::cl::opt DumpIpiRecords; extern llvm::cl::opt DumpIpiRecordBytes; extern llvm::cl::opt DumpModules; extern llvm::cl::opt DumpModuleFiles; +extern llvm::cl::opt DumpModuleLines; extern llvm::cl::opt DumpModuleSyms; extern llvm::cl::opt DumpPublics; extern llvm::cl::opt DumpSectionContribs; @@ -92,6 +93,7 @@ extern llvm::cl::opt DbiStream; extern llvm::cl::opt DbiModuleInfo; extern llvm::cl::opt DbiModuleSyms; extern llvm::cl::opt DbiModuleSourceFileInfo; +extern llvm::cl::opt DbiModuleSourceLineInfo; extern llvm::cl::opt TpiStream; extern llvm::cl::opt IpiStream; extern llvm::cl::list InputFilename; -- 2.40.0