summaryrefslogtreecommitdiffstats
path: root/llvm/lib/DebugInfo/PDB
diff options
context:
space:
mode:
Diffstat (limited to 'llvm/lib/DebugInfo/PDB')
-rw-r--r--llvm/lib/DebugInfo/PDB/Raw/DbiStream.cpp4
-rw-r--r--llvm/lib/DebugInfo/PDB/Raw/MappedBlockStream.cpp28
2 files changed, 29 insertions, 3 deletions
diff --git a/llvm/lib/DebugInfo/PDB/Raw/DbiStream.cpp b/llvm/lib/DebugInfo/PDB/Raw/DbiStream.cpp
index 7e1811daf09..2cc2a73a0d1 100644
--- a/llvm/lib/DebugInfo/PDB/Raw/DbiStream.cpp
+++ b/llvm/lib/DebugInfo/PDB/Raw/DbiStream.cpp
@@ -188,6 +188,10 @@ uint16_t DbiStream::getPublicSymbolStreamIndex() const {
return Header->PublicSymbolStreamIndex;
}
+uint16_t DbiStream::getGlobalSymbolStreamIndex() const {
+ return Header->GlobalSymbolStreamIndex;
+}
+
bool DbiStream::isIncrementallyLinked() const {
return (Header->Flags & FlagIncrementalMask) != 0;
}
diff --git a/llvm/lib/DebugInfo/PDB/Raw/MappedBlockStream.cpp b/llvm/lib/DebugInfo/PDB/Raw/MappedBlockStream.cpp
index af047f73abd..09d71985031 100644
--- a/llvm/lib/DebugInfo/PDB/Raw/MappedBlockStream.cpp
+++ b/llvm/lib/DebugInfo/PDB/Raw/MappedBlockStream.cpp
@@ -15,8 +15,12 @@ using namespace llvm;
using namespace llvm::pdb;
MappedBlockStream::MappedBlockStream(uint32_t StreamIdx, const PDBFile &File) : Pdb(File) {
- StreamLength = Pdb.getStreamByteSize(StreamIdx);
- BlockList = Pdb.getStreamBlockList(StreamIdx);
+ if (StreamIdx >= Pdb.getNumStreams()) {
+ StreamLength = 0;
+ } else {
+ StreamLength = Pdb.getStreamByteSize(StreamIdx);
+ BlockList = Pdb.getStreamBlockList(StreamIdx);
+ }
}
Error MappedBlockStream::readBytes(uint32_t Offset,
@@ -54,5 +58,23 @@ Error MappedBlockStream::readBytes(uint32_t Offset,
Error MappedBlockStream::getArrayRef(uint32_t Offset, ArrayRef<uint8_t> &Buffer,
uint32_t Length) const {
- return make_error<RawError>(raw_error_code::feature_unsupported);
+ uint32_t BlockNum = Offset / Pdb.getBlockSize();
+ uint32_t OffsetInBlock = Offset % Pdb.getBlockSize();
+ uint32_t BytesAvailableInBlock = Pdb.getBlockSize() - OffsetInBlock;
+
+ // If this is the last block in the stream, not all of the data is valid.
+ if (BlockNum == BlockList.size() - 1) {
+ uint32_t AllocatedBytesInBlock = StreamLength % Pdb.getBlockSize();
+ if (AllocatedBytesInBlock < BytesAvailableInBlock)
+ BytesAvailableInBlock = AllocatedBytesInBlock;
+ }
+ if (BytesAvailableInBlock < Length)
+ return make_error<RawError>(raw_error_code::feature_unsupported);
+
+ uint32_t StreamBlockAddr = BlockList[BlockNum];
+ StringRef Data = Pdb.getBlockData(StreamBlockAddr, Pdb.getBlockSize());
+ Data = Data.substr(OffsetInBlock, Length);
+
+ Buffer = ArrayRef<uint8_t>(Data.bytes_begin(), Data.bytes_end());
+ return Error::success();
}
OpenPOWER on IntegriCloud