Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
[pdb] Parse the module info stream for each module.
Differential Revision: http://reviews.llvm.org/D20026 Reviewed By: rnk llvm-svn: 268942
- Loading branch information
Zachary Turner
committed
May 9, 2016
1 parent
9073ed6
commit 06c2b4b
Showing
7 changed files
with
311 additions
and
27 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,46 @@ | ||
//===- 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_MODSTREAM_H | ||
#define LLVM_DEBUGINFO_PDB_RAW_MODSTREAM_H | ||
|
||
#include "llvm/ADT/iterator_range.h" | ||
#include "llvm/DebugInfo/CodeView/SymbolRecord.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(); | ||
|
||
iterator_range<codeview::SymbolIterator> symbols() const; | ||
|
||
private: | ||
const ModInfo &Mod; | ||
|
||
MappedBlockStream Stream; | ||
|
||
ByteStream SymbolsSubstream; | ||
ByteStream LinesSubstream; | ||
ByteStream C13LinesSubstream; | ||
ByteStream GlobalRefsSubstream; | ||
}; | ||
} | ||
} | ||
|
||
#endif |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,55 @@ | ||
//===- 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) | ||
: 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<RawError>(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<RawError>(raw_error_code::corrupt_file, | ||
"Unexpected bytes in module stream."); | ||
|
||
return Error::success(); | ||
} | ||
|
||
iterator_range<codeview::SymbolIterator> ModStream::symbols() const { | ||
return codeview::makeSymbolRange(SymbolsSubstream.data().slice(4)); | ||
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Oops, something went wrong.