diff options
| author | Zachary Turner <zturner@google.com> | 2016-08-03 16:53:21 +0000 |
|---|---|---|
| committer | Zachary Turner <zturner@google.com> | 2016-08-03 16:53:21 +0000 |
| commit | 8cf51c340dcb0c150a5dcb8c820c758c781404d9 (patch) | |
| tree | 4e150eb266514d423f1b0ff099f9f531431263a0 /llvm/lib/DebugInfo | |
| parent | 9d83de42f02b95f8ffa919e797676200fbb45f0f (diff) | |
| download | bcm5719-llvm-8cf51c340dcb0c150a5dcb8c820c758c781404d9.tar.gz bcm5719-llvm-8cf51c340dcb0c150a5dcb8c820c758c781404d9.zip | |
[msf] Make FPM reader use MappedBlockStream.
MappedBlockSTream can work with any sequence of block data where
the ordering is specified by a list of block numbers. So rather
than manually stitch them together in the case of the FPM, reuse
this functionality so that we can treat the FPM as if it were
contiguous.
Reviewed By: ruiu
Differential Revision: https://reviews.llvm.org/D23066
llvm-svn: 277609
Diffstat (limited to 'llvm/lib/DebugInfo')
| -rw-r--r-- | llvm/lib/DebugInfo/MSF/MappedBlockStream.cpp | 29 | ||||
| -rw-r--r-- | llvm/lib/DebugInfo/PDB/Raw/PDBFile.cpp | 30 |
2 files changed, 42 insertions, 17 deletions
diff --git a/llvm/lib/DebugInfo/MSF/MappedBlockStream.cpp b/llvm/lib/DebugInfo/MSF/MappedBlockStream.cpp index 0a3b2b96ab4..bbcfbfca810 100644 --- a/llvm/lib/DebugInfo/MSF/MappedBlockStream.cpp +++ b/llvm/lib/DebugInfo/MSF/MappedBlockStream.cpp @@ -26,6 +26,19 @@ public: }; } +static void initializeFpmStreamLayout(const MSFLayout &Layout, + MSFStreamLayout &FpmLayout) { + uint32_t NumFpmIntervals = msf::getNumFpmIntervals(Layout); + support::ulittle32_t FpmBlock = Layout.SB->FreeBlockMapBlock; + assert(FpmBlock == 1 || FpmBlock == 2); + while (NumFpmIntervals > 0) { + FpmLayout.Blocks.push_back(FpmBlock); + FpmBlock += msf::getFpmIntervalLength(Layout); + --NumFpmIntervals; + } + FpmLayout.Length = msf::getFullFpmByteSize(Layout); +} + typedef std::pair<uint32_t, uint32_t> Interval; static Interval intersect(const Interval &I1, const Interval &I2) { return std::make_pair(std::max(I1.first, I2.first), @@ -66,6 +79,14 @@ MappedBlockStream::createDirectoryStream(const MSFLayout &Layout, return createStream(Layout.SB->BlockSize, Layout.SB->NumBlocks, SL, MsfData); } +std::unique_ptr<MappedBlockStream> +MappedBlockStream::createFpmStream(const MSFLayout &Layout, + const ReadableStream &MsfData) { + MSFStreamLayout SL; + initializeFpmStreamLayout(Layout, SL); + return createStream(Layout.SB->BlockSize, Layout.SB->NumBlocks, SL, MsfData); +} + Error MappedBlockStream::readBytes(uint32_t Offset, uint32_t Size, ArrayRef<uint8_t> &Buffer) const { // Make sure we aren't trying to read beyond the end of the stream. @@ -324,6 +345,14 @@ WritableMappedBlockStream::createDirectoryStream( return createStream(Layout.SB->BlockSize, Layout.SB->NumBlocks, SL, MsfData); } +std::unique_ptr<WritableMappedBlockStream> +WritableMappedBlockStream::createFpmStream(const MSFLayout &Layout, + const WritableStream &MsfData) { + MSFStreamLayout SL; + initializeFpmStreamLayout(Layout, SL); + return createStream(Layout.SB->BlockSize, Layout.SB->NumBlocks, SL, MsfData); +} + Error WritableMappedBlockStream::readBytes(uint32_t Offset, uint32_t Size, ArrayRef<uint8_t> &Buffer) const { return ReadInterface.readBytes(Offset, Size, Buffer); diff --git a/llvm/lib/DebugInfo/PDB/Raw/PDBFile.cpp b/llvm/lib/DebugInfo/PDB/Raw/PDBFile.cpp index 8520408ebd3..75840b0e776 100644 --- a/llvm/lib/DebugInfo/PDB/Raw/PDBFile.cpp +++ b/llvm/lib/DebugInfo/PDB/Raw/PDBFile.cpp @@ -122,7 +122,6 @@ Error PDBFile::parseFileHeaders() { // Initialize Free Page Map. ContainerLayout.FreePageMap.resize(SB->NumBlocks); - ArrayRef<uint8_t> FpmBytes; // The Fpm exists either at block 1 or block 2 of the MSF. However, this // allows for a maximum of getBlockSize() * 8 blocks bits in the Fpm, and // thusly an equal number of total blocks in the file. For a block size @@ -136,25 +135,22 @@ Error PDBFile::parseFileHeaders() { // at getBlockSize() intervals, so we have to be compatible. // See the function fpmPn() for more information: // https://github.com/Microsoft/microsoft-pdb/blob/master/PDB/msf/msf.cpp#L489 - - uint32_t BlocksPerSection = getBlockSize(); - uint64_t FpmBlockOffset = SB->FreeBlockMapBlock; + auto FpmStream = MappedBlockStream::createFpmStream(ContainerLayout, *Buffer); + StreamReader FpmReader(*FpmStream); + ArrayRef<uint8_t> FpmBytes; + if (auto EC = FpmReader.readBytes(FpmBytes, + msf::getFullFpmByteSize(ContainerLayout))) + return EC; uint32_t BlocksRemaining = getBlockCount(); - for (uint32_t SI = 0; BlocksRemaining > 0; ++SI) { - uint32_t FpmFileOffset = FpmBlockOffset * getBlockSize(); - - if (auto EC = Buffer->readBytes(FpmFileOffset, getBlockSize(), FpmBytes)) - return EC; - - uint32_t BlocksThisSection = std::min(BlocksRemaining, BlocksPerSection); - for (uint32_t I = 0; I < BlocksThisSection; ++I) { - uint32_t BI = I + BlocksPerSection * SI; - - if (FpmBytes[I / 8] & (1 << (I % 8))) + uint32_t BI = 0; + for (auto Byte : FpmBytes) { + uint32_t BlocksThisByte = std::min(BlocksRemaining, 8U); + for (uint32_t I = 0; I < BlocksThisByte; ++I) { + if (Byte & (1 << I)) ContainerLayout.FreePageMap[BI] = true; + --BlocksRemaining; + ++BI; } - BlocksRemaining -= BlocksThisSection; - FpmBlockOffset += BlocksPerSection; } Reader.setOffset(getBlockMapOffset()); |

