diff --git a/llvm/include/llvm/DebugInfo/CodeView/CodeView.h b/llvm/include/llvm/DebugInfo/CodeView/CodeView.h index 2791c9dc3746..e599f8a19e34 100644 --- a/llvm/include/llvm/DebugInfo/CodeView/CodeView.h +++ b/llvm/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/llvm/include/llvm/DebugInfo/CodeView/ModuleSubstreamVisitor.h b/llvm/include/llvm/DebugInfo/CodeView/ModuleSubstreamVisitor.h index 1a40654a3f33..31344a9427db 100644 --- a/llvm/include/llvm/DebugInfo/CodeView/ModuleSubstreamVisitor.h +++ b/llvm/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/llvm/include/llvm/DebugInfo/PDB/Native/ModStream.h b/llvm/include/llvm/DebugInfo/PDB/Native/ModStream.h index d65e195dbb95..b12d4ff375f3 100644 --- a/llvm/include/llvm/DebugInfo/PDB/Native/ModStream.h +++ b/llvm/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/llvm/include/llvm/Support/YAMLTraits.h b/llvm/include/llvm/Support/YAMLTraits.h index 6d02e4aba48a..ffea679fab82 100644 --- a/llvm/include/llvm/Support/YAMLTraits.h +++ b/llvm/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/llvm/lib/DebugInfo/PDB/Native/ModStream.cpp b/llvm/lib/DebugInfo/PDB/Native/ModStream.cpp index 08798cf0ed28..e87e2c407593 100644 --- a/llvm/lib/DebugInfo/PDB/Native/ModStream.cpp +++ b/llvm/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/llvm/test/DebugInfo/PDB/pdbdump-yaml-lineinfo.test b/llvm/test/DebugInfo/PDB/pdbdump-yaml-lineinfo.test new file mode 100644 index 000000000000..016d52464985 --- /dev/null +++ b/llvm/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/llvm/tools/llvm-pdbdump/PdbYaml.cpp b/llvm/tools/llvm-pdbdump/PdbYaml.cpp index e2c4ee967ed3..65a5a9142d20 100644 --- a/llvm/tools/llvm-pdbdump/PdbYaml.cpp +++ b/llvm/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,9 +150,40 @@ 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) { // Create a single serialization context that will be passed through the // entire process of serializing / deserializing a Tpi Stream. This is @@ -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/llvm/tools/llvm-pdbdump/PdbYaml.h b/llvm/tools/llvm-pdbdump/PdbYaml.h index 2c4cd237f8d7..96e0583ca23d 100644 --- a/llvm/tools/llvm-pdbdump/PdbYaml.h +++ b/llvm/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/llvm/tools/llvm-pdbdump/YAMLOutputStyle.cpp b/llvm/tools/llvm-pdbdump/YAMLOutputStyle.cpp index 5b53d2137166..b329de265e72 100644 --- a/llvm/tools/llvm-pdbdump/YAMLOutputStyle.cpp +++ b/llvm/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/llvm/tools/llvm-pdbdump/YAMLOutputStyle.h b/llvm/tools/llvm-pdbdump/YAMLOutputStyle.h index db9868db4a7e..263af776fa03 100644 --- a/llvm/tools/llvm-pdbdump/YAMLOutputStyle.h +++ b/llvm/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/llvm/tools/llvm-pdbdump/llvm-pdbdump.cpp b/llvm/tools/llvm-pdbdump/llvm-pdbdump.cpp index 172e29ac7f32..e498c0187182 100644 --- a/llvm/tools/llvm-pdbdump/llvm-pdbdump.cpp +++ b/llvm/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/llvm/tools/llvm-pdbdump/llvm-pdbdump.h b/llvm/tools/llvm-pdbdump/llvm-pdbdump.h index 1bfba3518a59..d1af06fe3b45 100644 --- a/llvm/tools/llvm-pdbdump/llvm-pdbdump.h +++ b/llvm/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;