Index: include/llvm/DebugInfo/PDB/Raw/ModStream.h =================================================================== --- /dev/null +++ include/llvm/DebugInfo/PDB/Raw/ModStream.h @@ -0,0 +1,43 @@ +//===- ModStream.h - PDB Module Info Stream Access ------------------------===// +// +// The LLVM Compiler Infrastructure +// +// This file is distributed under the University of Illinois Open Source +// License. See LICENSE.TXT for details. +// +//===----------------------------------------------------------------------===// + +#ifndef LLVM_DEBUGINFO_PDB_RAW_PDBMODSTREAM_H +#define LLVM_DEBUGINFO_PDB_RAW_PDBMODSTREAM_H + +#include "llvm/DebugInfo/PDB/Raw/ByteStream.h" +#include "llvm/DebugInfo/PDB/Raw/MappedBlockStream.h" +#include "llvm/Support/Error.h" + +namespace llvm { +namespace pdb { +class PDBFile; +class ModInfo; + +class ModStream { +public: + ModStream(PDBFile &File, const ModInfo &Module); + ~ModStream(); + + Error reload(); + +private: + PDBFile &Pdb; + const ModInfo &Mod; + + MappedBlockStream Stream; + + ByteStream SymbolsSubstream; + ByteStream LinesSubstream; + ByteStream C13LinesSubstream; + ByteStream GlobalRefsSubstream; +}; +} +} + +#endif Index: lib/DebugInfo/PDB/CMakeLists.txt =================================================================== --- lib/DebugInfo/PDB/CMakeLists.txt +++ lib/DebugInfo/PDB/CMakeLists.txt @@ -31,6 +31,7 @@ Raw/ByteStream.cpp Raw/MappedBlockStream.cpp Raw/ModInfo.cpp + Raw/ModStream.cpp Raw/PDBFile.cpp Raw/DbiStream.cpp Raw/InfoStream.cpp Index: lib/DebugInfo/PDB/Raw/ByteStream.cpp =================================================================== --- lib/DebugInfo/PDB/Raw/ByteStream.cpp +++ lib/DebugInfo/PDB/Raw/ByteStream.cpp @@ -24,7 +24,7 @@ ByteStream::~ByteStream() { reset(); } void ByteStream::reset() { - if (Owned) + if (Owned && Data.size() > 0) delete[] Data.data(); Owned = false; Data = MutableArrayRef(); @@ -38,7 +38,8 @@ void ByteStream::initialize(uint32_t Length) { reset(); - Data = MutableArrayRef(new uint8_t[Length], Length); + if (Length > 0) + Data = MutableArrayRef(new uint8_t[Length], Length); Owned = true; } Index: lib/DebugInfo/PDB/Raw/ModStream.cpp =================================================================== --- /dev/null +++ lib/DebugInfo/PDB/Raw/ModStream.cpp @@ -0,0 +1,51 @@ +//===- ModStream.cpp - PDB Module Info Stream Access ----------------------===// +// +// The LLVM Compiler Infrastructure +// +// This file is distributed under the University of Illinois Open Source +// License. See LICENSE.TXT for details. +// +//===----------------------------------------------------------------------===// + +#include "llvm/DebugInfo/PDB/Raw/ModStream.h" +#include "llvm/DebugInfo/PDB/Raw/ModInfo.h" +#include "llvm/DebugInfo/PDB/Raw/RawError.h" +#include "llvm/DebugInfo/PDB/Raw/StreamReader.h" + +using namespace llvm; +using namespace llvm::pdb; + +ModStream::ModStream(PDBFile &File, const ModInfo &Module) + : Pdb(File), Mod(Module), Stream(Module.getModuleStreamIndex(), File) {} + +ModStream::~ModStream() {} + +Error ModStream::reload() { + StreamReader Reader(Stream); + + uint32_t SymbolSize = Mod.getSymbolDebugInfoByteSize(); + uint32_t C11Size = Mod.getLineInfoByteSize(); + uint32_t C13Size = Mod.getC13LineInfoByteSize(); + + if (C11Size > 0 && C13Size > 0) + return llvm::make_error(raw_error_code::corrupt_file, + "Module has both C11 and C13 line info"); + + if (auto EC = SymbolsSubstream.initialize(Reader, SymbolSize)) + return EC; + if (auto EC = LinesSubstream.initialize(Reader, C11Size)) + return EC; + if (auto EC = C13LinesSubstream.initialize(Reader, C13Size)) + return EC; + + uint32_t GlobalRefsSize; + if (auto EC = Reader.readInteger(GlobalRefsSize)) + return EC; + if (auto EC = GlobalRefsSubstream.initialize(Reader, GlobalRefsSize)) + return EC; + if (Reader.bytesRemaining() > 0) + return llvm::make_error(raw_error_code::corrupt_file, + "Unexpected bytes in module stream."); + + return Error::success(); +} Index: tools/llvm-pdbdump/llvm-pdbdump.cpp =================================================================== --- tools/llvm-pdbdump/llvm-pdbdump.cpp +++ tools/llvm-pdbdump/llvm-pdbdump.cpp @@ -41,6 +41,7 @@ #include "llvm/DebugInfo/PDB/Raw/InfoStream.h" #include "llvm/DebugInfo/PDB/Raw/MappedBlockStream.h" #include "llvm/DebugInfo/PDB/Raw/ModInfo.h" +#include "llvm/DebugInfo/PDB/Raw/ModStream.h" #include "llvm/DebugInfo/PDB/Raw/NameHashTable.h" #include "llvm/DebugInfo/PDB/Raw/PDBFile.h" #include "llvm/DebugInfo/PDB/Raw/RawSession.h"