diff options
Diffstat (limited to 'llvm/lib/DebugInfo/PDB')
| -rw-r--r-- | llvm/lib/DebugInfo/PDB/Raw/DbiStream.cpp | 4 | ||||
| -rw-r--r-- | llvm/lib/DebugInfo/PDB/Raw/MappedBlockStream.cpp | 28 | 
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();  } | 

