[llvm] r268071 - Refactor the PDB Stream reading interface.
Zachary Turner via llvm-commits
llvm-commits at lists.llvm.org
Mon May 2 15:23:04 PDT 2016
Let's see if r268316 fixes it.
On Mon, May 2, 2016 at 3:19 PM Mehdi Amini <mehdi.amini at apple.com> wrote:
> Great! Thanks.
>
> --
> Mehdi
>
> On May 2, 2016, at 3:18 PM, Zachary Turner <zturner at google.com> wrote:
>
> Alright I see what's wrong, will have a fix shortly.
>
> On Mon, May 2, 2016 at 3:12 PM Zachary Turner <zturner at google.com> wrote:
>
>> Hmm, I'm not sure how. It looks like this bot doesn't build with line
>> information, which is unfortunate. I can try to run an ASAN build locally,
>> but it will take me a little bit as I normally work on Windows, and I will
>> have to switch to Linux or get someone to help me in that regard. I will
>> update in a little bit.
>>
>> On Mon, May 2, 2016 at 2:58 PM Mehdi Amini <mehdi.amini at apple.com> wrote:
>>
>>> Hi Zachary,
>>>
>>> Is it possible that one of your changes around this revision introduced
>>> the ASAN failure below?
>>>
>>> You can see the failing build here:
>>> http://lab.llvm.org:8080/green/job/clang-stage2-cmake-RgSan_check/1606
>>>
>>> (still failing as of r268274)
>>>
>>>
>>> ******************** TEST 'LLVM :: DebugInfo/PDB/pdbdump-headers.test'
>>> FAILED ********************
>>>
>>> Script:
>>> --
>>> llvm-pdbdump --dump-headers
>>> /Users/buildslave/jenkins/sharedspace/clang-stage2-cmake-RgSan at 2/llvm/test/DebugInfo/PDB/Inputs/empty.pdb
>>> | /Users/buildslave/jenkins/sharedspace/clang-stage2-cmake-RgSan at 2/clang-build/./bin/FileCheck
>>> -check-prefix=EMPTY
>>> /Users/buildslave/jenkins/sharedspace/clang-stage2-cmake-RgSan at 2
>>> /llvm/test/DebugInfo/PDB/pdbdump-headers.test
>>> llvm-pdbdump --dump-headers
>>> /Users/buildslave/jenkins/sharedspace/clang-stage2-cmake-RgSan at 2/llvm/test/DebugInfo/PDB/Inputs/big-read.pdb
>>> | /Users/buildslave/jenkins/sharedspace/clang-stage2-cmake-RgSan at 2/clang-build/./bin/FileCheck
>>> -check-prefix=BIG
>>> /Users/buildslave/jenkins/sharedspace/clang-stage2-cmake-RgSan at 2
>>> /llvm/test/DebugInfo/PDB/pdbdump-headers.test
>>> llvm-pdbdump --dump-headers
>>> /Users/buildslave/jenkins/sharedspace/clang-stage2-cmake-RgSan at 2/llvm/test/DebugInfo/PDB/Inputs/bad-block-size.pdb
>>> | /Users/buildslave/jenkins/sharedspace/clang-stage2-cmake-RgSan at 2/clang-build/./bin/FileCheck
>>> -check-prefix=BAD-BLOCK-SIZE
>>> /Users/buildslave/jenkins/sharedspace/clang-stage2-cmake-RgSan at 2
>>> /llvm/test/DebugInfo/PDB/pdbdump-headers.test
>>> --
>>> Exit Code: 2
>>>
>>> Command Output (stderr):
>>> --
>>> =================================================================
>>> ==32535==ERROR: AddressSanitizer: heap-buffer-overflow on address
>>> 0x60f00000f000 at pc 0x000107ede190 bp 0x7fff57de3250 sp 0x7fff57de3248
>>> READ of size 4 at 0x60f00000f000 thread T0
>>> ==32535==WARNING: Can't read from symbolizer at fd 4
>>> ==32535==WARNING: Can't read from symbolizer at fd 4
>>> ==32535==WARNING: Can't read from symbolizer at fd 4
>>> ==32535==WARNING: Can't read from symbolizer at fd 4
>>> ==32535==WARNING: Failed to use and restart external symbolizer!
>>> #0 0x107ede18f in llvm::pdb::PDBFile::parseFileHeaders()
>>> (/Users/buildslave/jenkins/sharedspace/clang-stage2-cmake-RgSan at 2
>>> /clang-build/./bin/llvm-pdbdump+0x1000c318f)
>>> #1 0x107eeb68f in
>>> llvm::pdb::RawSession::createFromPdb(llvm::StringRef,
>>> std::__1::unique_ptr<llvm::IPDBSession,
>>> std::__1::default_delete<llvm::IPDBSession> >&)
>>> (/Users/buildslave/jenkins/sharedspace/clang-stage2-cmake-RgSan at 2
>>> /clang-build/./bin/llvm-pdbdump+0x1000d068f)
>>> #2 0x107e1ed02 in main
>>> (/Users/buildslave/jenkins/sharedspace/clang-stage2-cmake-RgSan at 2
>>> /clang-build/./bin/llvm-pdbdump+0x100003d02)
>>> #3 0x7fff8ba7c5c8 in start (/usr/lib/system/libdyld.dylib+0x35c8)
>>> #4 0x2 (<unknown module>)
>>>
>>> 0x60f00000f000 is located 2 bytes to the right of 174-byte region
>>> [0x60f00000ef50,0x60f00000effe)
>>> allocated by thread T0 here:
>>> #0 0x10806f59b in wrap__ZnwmRKSt9nothrow_t
>>> (/Users/buildslave/jenkins/sharedspace/clang-stage2-cmake-RgSan at 2
>>> /host-compiler/lib/clang/3.8.0/lib/darwin/libclang_rt.asan_osx_dynamic.dylib+0x5659b)
>>> #1 0x107e84c68 in llvm::MemoryBuffer::getNewUninitMemBuffer(unsigned
>>> long, llvm::Twine const&)
>>> (/Users/buildslave/jenkins/sharedspace/clang-stage2-cmake-RgSan at 2
>>> /clang-build/./bin/llvm-pdbdump+0x100069c68)
>>> #2 0x107e85ccc in getOpenFileImpl(int, llvm::Twine const&, unsigned
>>> long long, unsigned long long, long long, bool, bool)
>>> (/Users/buildslave/jenkins/sharedspace/clang-stage2-cmake-RgSan at 2
>>> /clang-build/./bin/llvm-pdbdump+0x10006accc)
>>> #3 0x107e854f2 in getFileAux(llvm::Twine const&, long long, unsigned
>>> long long, unsigned long long, bool, bool)
>>> (/Users/buildslave/jenkins/sharedspace/clang-stage2-cmake-RgSan at 2
>>> /clang-build/./bin/llvm-pdbdump+0x10006a4f2)
>>> #4 0x107e851ca in llvm::MemoryBuffer::getFileOrSTDIN(llvm::Twine
>>> const&, long long, bool)
>>> (/Users/buildslave/jenkins/sharedspace/clang-stage2-cmake-RgSan at 2
>>> /clang-build/./bin/llvm-pdbdump+0x10006a1ca)
>>> #5 0x107eeb4e3 in
>>> llvm::pdb::RawSession::createFromPdb(llvm::StringRef,
>>> std::__1::unique_ptr<llvm::IPDBSession,
>>> std::__1::default_delete<llvm::IPDBSession> >&)
>>> (/Users/buildslave/jenkins/sharedspace/clang-stage2-cmake-RgSan at 2
>>> /clang-build/./bin/llvm-pdbdump+0x1000d04e3)
>>> #6 0x107e1ed02 in main
>>> (/Users/buildslave/jenkins/sharedspace/clang-stage2-cmake-RgSan at 2
>>> /clang-build/./bin/llvm-pdbdump+0x100003d02)
>>> #7 0x7fff8ba7c5c8 in start (/usr/lib/system/libdyld.dylib+0x35c8)
>>> #8 0x2 (<unknown module>)
>>>
>>> SUMMARY: AddressSanitizer: heap-buffer-overflow
>>> (/Users/buildslave/jenkins/sharedspace/clang-stage2-cmake-RgSan at 2/clang-build/./bin/llvm-pdbdump+0x1000c318f)
>>> in llvm::pdb::PDBFile::parseFileHeaders()
>>>
>>> Thanks,
>>>
>>> --
>>> Mehdi
>>>
>>> > On Apr 29, 2016, at 10:22 AM, Zachary Turner via llvm-commits <
>>> llvm-commits at lists.llvm.org> wrote:
>>> >
>>> > Author: zturner
>>> > Date: Fri Apr 29 12:22:58 2016
>>> > New Revision: 268071
>>> >
>>> > URL: http://llvm.org/viewvc/llvm-project?rev=268071&view=rev
>>> > Log:
>>> > Refactor the PDB Stream reading interface.
>>> >
>>> > The motivation for this change is that PDB has the notion of
>>> > streams and substreams. Substreams often consist of variable
>>> > length structures that are convenient to be able to treat as
>>> > guaranteed, contiguous byte arrays, whereas the streams they
>>> > are contained in are not necessarily so, as a single stream
>>> > could be spread across many discontiguous blocks.
>>> >
>>> > So, when processing data from a substream, we want to be able
>>> > to assume that we have a contiguous byte array so that we can
>>> > cast pointers to variable length arrays and such.
>>> >
>>> > This leads to the question of how to be able to read the same
>>> > data structure from either a stream or a substream using the
>>> > same interface, which is where this patch comes in.
>>> >
>>> > We separate out the stream's read state from the underlying
>>> > representation, and introduce a `StreamReader` class. Then
>>> > we change the name of `PDBStream` to `MappedBlockStream`, and
>>> > introduce a second kind of stream called a `ByteStream` which is
>>> > simply a sequence of contiguous bytes. Finally, we update all
>>> > of the std::vectors in `PDBDbiStream` to use `ByteStream` instead
>>> > as a proof of concept.
>>> >
>>> > Added:
>>> > llvm/trunk/include/llvm/DebugInfo/PDB/Raw/ByteStream.h
>>> > llvm/trunk/include/llvm/DebugInfo/PDB/Raw/MappedBlockStream.h
>>> > llvm/trunk/include/llvm/DebugInfo/PDB/Raw/StreamInterface.h
>>> > llvm/trunk/include/llvm/DebugInfo/PDB/Raw/StreamReader.h
>>> > llvm/trunk/lib/DebugInfo/PDB/Raw/ByteStream.cpp
>>> > llvm/trunk/lib/DebugInfo/PDB/Raw/MappedBlockStream.cpp
>>> > - copied, changed from r268069,
>>> llvm/trunk/lib/DebugInfo/PDB/Raw/PDBStream.cpp
>>> > llvm/trunk/lib/DebugInfo/PDB/Raw/StreamReader.cpp
>>> > Removed:
>>> > llvm/trunk/include/llvm/DebugInfo/PDB/Raw/PDBStream.h
>>> > llvm/trunk/lib/DebugInfo/PDB/Raw/PDBStream.cpp
>>> > Modified:
>>> > llvm/trunk/include/llvm/DebugInfo/PDB/Raw/PDBDbiStream.h
>>> > llvm/trunk/include/llvm/DebugInfo/PDB/Raw/PDBInfoStream.h
>>> > llvm/trunk/include/llvm/DebugInfo/PDB/Raw/PDBNameMap.h
>>> > llvm/trunk/lib/DebugInfo/PDB/CMakeLists.txt
>>> > llvm/trunk/lib/DebugInfo/PDB/Raw/PDBDbiStream.cpp
>>> > llvm/trunk/lib/DebugInfo/PDB/Raw/PDBInfoStream.cpp
>>> > llvm/trunk/lib/DebugInfo/PDB/Raw/PDBNameMap.cpp
>>> > llvm/trunk/tools/llvm-pdbdump/llvm-pdbdump.cpp
>>> >
>>> > Added: llvm/trunk/include/llvm/DebugInfo/PDB/Raw/ByteStream.h
>>> > URL:
>>> http://llvm.org/viewvc/llvm-project/llvm/trunk/include/llvm/DebugInfo/PDB/Raw/ByteStream.h?rev=268071&view=auto
>>> >
>>> ==============================================================================
>>> > --- llvm/trunk/include/llvm/DebugInfo/PDB/Raw/ByteStream.h (added)
>>> > +++ llvm/trunk/include/llvm/DebugInfo/PDB/Raw/ByteStream.h Fri Apr 29
>>> 12:22:58 2016
>>> > @@ -0,0 +1,47 @@
>>> > +//===- ByteStream.h - Reads stream data from a byte sequence ----*-
>>> C++ -*-===//
>>> > +//
>>> > +// 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_BYTESTREAM_H
>>> > +#define LLVM_DEBUGINFO_PDB_RAW_BYTESTREAM_H
>>> > +
>>> > +#include "llvm/ADT/ArrayRef.h"
>>> > +#include "llvm/DebugInfo/PDB/Raw/StreamInterface.h"
>>> > +
>>> > +#include <stdint.h>
>>> > +
>>> > +#include <system_error>
>>> > +#include <vector>
>>> > +
>>> > +namespace llvm {
>>> > +class StreamReader;
>>> > +class ByteStream : public StreamInterface {
>>> > +public:
>>> > + ByteStream();
>>> > + explicit ByteStream(MutableArrayRef<uint8_t> Bytes);
>>> > + explicit ByteStream(uint32_t Length);
>>> > + ~ByteStream() override;
>>> > +
>>> > + void reset();
>>> > + void initialize(MutableArrayRef<uint8_t> Bytes);
>>> > + void initialize(uint32_t Length);
>>> > + std::error_code initialize(StreamReader &Reader, uint32_t Length);
>>> > +
>>> > + std::error_code readBytes(uint32_t Offset,
>>> > + MutableArrayRef<uint8_t> Buffer) const
>>> override;
>>> > + uint32_t getLength() const override;
>>> > +
>>> > + ArrayRef<uint8_t> data() const { return Data; }
>>> > +
>>> > +private:
>>> > + MutableArrayRef<uint8_t> Data;
>>> > + bool Owned;
>>> > +};
>>> > +}
>>> > +
>>> > +#endif
>>> >
>>> > Added: llvm/trunk/include/llvm/DebugInfo/PDB/Raw/MappedBlockStream.h
>>> > URL:
>>> http://llvm.org/viewvc/llvm-project/llvm/trunk/include/llvm/DebugInfo/PDB/Raw/MappedBlockStream.h?rev=268071&view=auto
>>> >
>>> ==============================================================================
>>> > --- llvm/trunk/include/llvm/DebugInfo/PDB/Raw/MappedBlockStream.h
>>> (added)
>>> > +++ llvm/trunk/include/llvm/DebugInfo/PDB/Raw/MappedBlockStream.h Fri
>>> Apr 29 12:22:58 2016
>>> > @@ -0,0 +1,38 @@
>>> > +//===- MappedBlockStream.h - Reads stream data from a PDBFile ---*-
>>> C++ -*-===//
>>> > +//
>>> > +// 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_MAPPEDBLOCKSTREAM_H
>>> > +#define LLVM_DEBUGINFO_PDB_RAW_MAPPEDBLOCKSTREAM_H
>>> > +
>>> > +#include "llvm/DebugInfo/PDB/Raw/StreamInterface.h"
>>> > +
>>> > +#include <stdint.h>
>>> > +
>>> > +#include <system_error>
>>> > +#include <vector>
>>> > +
>>> > +namespace llvm {
>>> > +class PDBFile;
>>> > +
>>> > +class MappedBlockStream : public StreamInterface {
>>> > +public:
>>> > + MappedBlockStream(uint32_t StreamIdx, const PDBFile &File);
>>> > +
>>> > + std::error_code readBytes(uint32_t Offset,
>>> > + MutableArrayRef<uint8_t> Buffer) const
>>> override;
>>> > + uint32_t getLength() const override { return StreamLength; }
>>> > +
>>> > +private:
>>> > + uint32_t StreamLength;
>>> > + std::vector<uint32_t> BlockList;
>>> > + const PDBFile &Pdb;
>>> > +};
>>> > +}
>>> > +
>>> > +#endif
>>> >
>>> > Modified: llvm/trunk/include/llvm/DebugInfo/PDB/Raw/PDBDbiStream.h
>>> > URL:
>>> http://llvm.org/viewvc/llvm-project/llvm/trunk/include/llvm/DebugInfo/PDB/Raw/PDBDbiStream.h?rev=268071&r1=268070&r2=268071&view=diff
>>> >
>>> ==============================================================================
>>> > --- llvm/trunk/include/llvm/DebugInfo/PDB/Raw/PDBDbiStream.h (original)
>>> > +++ llvm/trunk/include/llvm/DebugInfo/PDB/Raw/PDBDbiStream.h Fri Apr
>>> 29 12:22:58 2016
>>> > @@ -11,9 +11,10 @@
>>> > #define LLVM_DEBUGINFO_PDB_RAW_PDBDBISTREAM_H
>>> >
>>> > #include "llvm/DebugInfo/PDB/PDBTypes.h"
>>> > +#include "llvm/DebugInfo/PDB/Raw/ByteStream.h"
>>> > +#include "llvm/DebugInfo/PDB/Raw/MappedBlockStream.h"
>>> > #include "llvm/DebugInfo/PDB/Raw/ModInfo.h"
>>> > #include "llvm/DebugInfo/PDB/Raw/PDBRawConstants.h"
>>> > -#include "llvm/DebugInfo/PDB/Raw/PDBStream.h"
>>> > #include "llvm/Support/Endian.h"
>>> >
>>> > namespace llvm {
>>> > @@ -46,20 +47,21 @@ public:
>>> > ArrayRef<ModuleInfoEx> modules() const;
>>> >
>>> > private:
>>> > - std::error_code readSubstream(std::vector<uint8_t> &Bytes, uint32_t
>>> Size);
>>> > std::error_code initializeFileInfo();
>>> >
>>> > PDBFile &Pdb;
>>> > - PDBStream Stream;
>>> > + MappedBlockStream Stream;
>>> >
>>> > std::vector<ModuleInfoEx> ModuleInfos;
>>> >
>>> > - std::vector<uint8_t> ModInfoSubstream;
>>> > - std::vector<uint8_t> SecContrSubstream;
>>> > - std::vector<uint8_t> SecMapSubstream;
>>> > - std::vector<uint8_t> FileInfoSubstream;
>>> > - std::vector<uint8_t> TypeServerMapSubstream;
>>> > - std::vector<uint8_t> ECSubstream;
>>> > + ByteStream ModInfoSubstream;
>>> > + ByteStream SecContrSubstream;
>>> > + ByteStream SecMapSubstream;
>>> > + ByteStream FileInfoSubstream;
>>> > + ByteStream TypeServerMapSubstream;
>>> > + ByteStream ECSubstream;
>>> > + ByteStream DbgHeader;
>>> > +
>>> > std::unique_ptr<HeaderInfo> Header;
>>> > };
>>> > }
>>> >
>>> > Modified: llvm/trunk/include/llvm/DebugInfo/PDB/Raw/PDBInfoStream.h
>>> > URL:
>>> http://llvm.org/viewvc/llvm-project/llvm/trunk/include/llvm/DebugInfo/PDB/Raw/PDBInfoStream.h?rev=268071&r1=268070&r2=268071&view=diff
>>> >
>>> ==============================================================================
>>> > --- llvm/trunk/include/llvm/DebugInfo/PDB/Raw/PDBInfoStream.h
>>> (original)
>>> > +++ llvm/trunk/include/llvm/DebugInfo/PDB/Raw/PDBInfoStream.h Fri Apr
>>> 29 12:22:58 2016
>>> > @@ -12,9 +12,9 @@
>>> >
>>> > #include "llvm/ADT/StringMap.h"
>>> > #include "llvm/DebugInfo/PDB/PDBTypes.h"
>>> > +#include "llvm/DebugInfo/PDB/Raw/MappedBlockStream.h"
>>> > #include "llvm/DebugInfo/PDB/Raw/PDBNameMap.h"
>>> > #include "llvm/DebugInfo/PDB/Raw/PDBRawConstants.h"
>>> > -#include "llvm/DebugInfo/PDB/Raw/PDBStream.h"
>>> >
>>> > #include "llvm/Support/Endian.h"
>>> >
>>> > @@ -37,7 +37,7 @@ public:
>>> >
>>> > private:
>>> > PDBFile &Pdb;
>>> > - PDBStream Stream1;
>>> > + MappedBlockStream Stream;
>>> >
>>> > // PDB file format version. We only support VC70. See the
>>> enumeration
>>> > // `PdbRaw_ImplVer` for the other possible values.
>>> >
>>> > Modified: llvm/trunk/include/llvm/DebugInfo/PDB/Raw/PDBNameMap.h
>>> > URL:
>>> http://llvm.org/viewvc/llvm-project/llvm/trunk/include/llvm/DebugInfo/PDB/Raw/PDBNameMap.h?rev=268071&r1=268070&r2=268071&view=diff
>>> >
>>> ==============================================================================
>>> > --- llvm/trunk/include/llvm/DebugInfo/PDB/Raw/PDBNameMap.h (original)
>>> > +++ llvm/trunk/include/llvm/DebugInfo/PDB/Raw/PDBNameMap.h Fri Apr 29
>>> 12:22:58 2016
>>> > @@ -17,12 +17,12 @@
>>> > #include <utility>
>>> >
>>> > namespace llvm {
>>> > -class PDBStream;
>>> > +class StreamReader;
>>> > class PDBNameMap {
>>> > public:
>>> > PDBNameMap();
>>> >
>>> > - std::error_code load(PDBStream &Stream);
>>> > + std::error_code load(StreamReader &Stream);
>>> >
>>> > bool tryGetValue(StringRef Name, uint32_t &Value) const;
>>> >
>>> >
>>> > Removed: llvm/trunk/include/llvm/DebugInfo/PDB/Raw/PDBStream.h
>>> > URL:
>>> http://llvm.org/viewvc/llvm-project/llvm/trunk/include/llvm/DebugInfo/PDB/Raw/PDBStream.h?rev=268070&view=auto
>>> >
>>> ==============================================================================
>>> > --- llvm/trunk/include/llvm/DebugInfo/PDB/Raw/PDBStream.h (original)
>>> > +++ llvm/trunk/include/llvm/DebugInfo/PDB/Raw/PDBStream.h (removed)
>>> > @@ -1,46 +0,0 @@
>>> > -//===- PDBStream.h - Low level interface to a PDB stream --------*-
>>> C++ -*-===//
>>> > -//
>>> > -// 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_PDBSTREAM_H
>>> > -#define LLVM_DEBUGINFO_PDB_RAW_PDBSTREAM_H
>>> > -
>>> > -#include "llvm/ADT/ArrayRef.h"
>>> > -#include "llvm/ADT/StringRef.h"
>>> > -
>>> > -namespace llvm {
>>> > -
>>> > -class MemoryBufferRef;
>>> > -class PDBFile;
>>> > -
>>> > -class PDBStream {
>>> > -public:
>>> > - PDBStream(uint32_t StreamIdx, const PDBFile &File);
>>> > -
>>> > - std::error_code readInteger(uint32_t &Dest);
>>> > - std::error_code readZeroString(std::string &Dest);
>>> > - std::error_code readBytes(void *Dest, uint32_t Length);
>>> > -
>>> > - void setOffset(uint32_t Off);
>>> > - uint32_t getOffset() const;
>>> > - uint32_t getLength() const;
>>> > -
>>> > - template <typename T> std::error_code readObject(T *Dest) {
>>> > - return readBytes(reinterpret_cast<void *>(Dest), sizeof(T));
>>> > - }
>>> > -
>>> > -private:
>>> > - uint32_t Offset;
>>> > -
>>> > - uint32_t StreamLength;
>>> > - std::vector<uint32_t> BlockList;
>>> > - const PDBFile &Pdb;
>>> > -};
>>> > -}
>>> > -
>>> > -#endif
>>> >
>>> > Added: llvm/trunk/include/llvm/DebugInfo/PDB/Raw/StreamInterface.h
>>> > URL:
>>> http://llvm.org/viewvc/llvm-project/llvm/trunk/include/llvm/DebugInfo/PDB/Raw/StreamInterface.h?rev=268071&view=auto
>>> >
>>> ==============================================================================
>>> > --- llvm/trunk/include/llvm/DebugInfo/PDB/Raw/StreamInterface.h (added)
>>> > +++ llvm/trunk/include/llvm/DebugInfo/PDB/Raw/StreamInterface.h Fri
>>> Apr 29 12:22:58 2016
>>> > @@ -0,0 +1,29 @@
>>> > +//===- StreamInterface.h - Base interface for a PDB stream ------*-
>>> C++ -*-===//
>>> > +//
>>> > +// 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_STREAMINTERFACE_H
>>> > +#define LLVM_DEBUGINFO_PDB_RAW_STREAMINTERFACE_H
>>> > +
>>> > +#include "llvm/ADT/ArrayRef.h"
>>> > +
>>> > +#include <stdint.h>
>>> > +#include <system_error>
>>> > +
>>> > +namespace llvm {
>>> > +class StreamInterface {
>>> > +public:
>>> > + virtual ~StreamInterface() {}
>>> > +
>>> > + virtual std::error_code readBytes(uint32_t Offset,
>>> > + MutableArrayRef<uint8_t> Buffer)
>>> const = 0;
>>> > + virtual uint32_t getLength() const = 0;
>>> > +};
>>> > +}
>>> > +
>>> > +#endif
>>> >
>>> > Added: llvm/trunk/include/llvm/DebugInfo/PDB/Raw/StreamReader.h
>>> > URL:
>>> http://llvm.org/viewvc/llvm-project/llvm/trunk/include/llvm/DebugInfo/PDB/Raw/StreamReader.h?rev=268071&view=auto
>>> >
>>> ==============================================================================
>>> > --- llvm/trunk/include/llvm/DebugInfo/PDB/Raw/StreamReader.h (added)
>>> > +++ llvm/trunk/include/llvm/DebugInfo/PDB/Raw/StreamReader.h Fri Apr
>>> 29 12:22:58 2016
>>> > @@ -0,0 +1,46 @@
>>> > +//===- StreamReader.h - Reads bytes and objects from a stream ---*-
>>> C++ -*-===//
>>> > +//
>>> > +// 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_STREAMREADER_H
>>> > +#define LLVM_DEBUGINFO_PDB_RAW_STREAMREADER_H
>>> > +
>>> > +#include "llvm/DebugInfo/PDB/Raw/StreamInterface.h"
>>> > +#include "llvm/Support/Endian.h"
>>> > +
>>> > +#include <string>
>>> > +#include <system_error>
>>> > +
>>> > +namespace llvm {
>>> > +
>>> > +class StreamReader {
>>> > +public:
>>> > + StreamReader(const StreamInterface &S);
>>> > +
>>> > + std::error_code readBytes(MutableArrayRef<uint8_t> Buffer);
>>> > + std::error_code readInteger(uint32_t &Dest);
>>> > + std::error_code readZeroString(std::string &Dest);
>>> > +
>>> > + template <typename T> std::error_code readObject(T *Dest) {
>>> > + MutableArrayRef<uint8_t> Buffer(reinterpret_cast<uint8_t *>(Dest),
>>> > + sizeof(T));
>>> > + return readBytes(Buffer);
>>> > + }
>>> > +
>>> > + void setOffset(uint32_t Off) { Offset = Off; }
>>> > + uint32_t getOffset() const { return Offset; }
>>> > + uint32_t getLength() const { return Stream.getLength(); }
>>> > + uint32_t bytesRemaining() const { return getLength() - getOffset();
>>> }
>>> > +
>>> > +private:
>>> > + const StreamInterface &Stream;
>>> > + uint32_t Offset;
>>> > +};
>>> > +}
>>> > +
>>> > +#endif
>>> >
>>> > Modified: llvm/trunk/lib/DebugInfo/PDB/CMakeLists.txt
>>> > URL:
>>> http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/DebugInfo/PDB/CMakeLists.txt?rev=268071&r1=268070&r2=268071&view=diff
>>> >
>>> ==============================================================================
>>> > --- llvm/trunk/lib/DebugInfo/PDB/CMakeLists.txt (original)
>>> > +++ llvm/trunk/lib/DebugInfo/PDB/CMakeLists.txt Fri Apr 29 12:22:58
>>> 2016
>>> > @@ -27,13 +27,15 @@ if(HAVE_DIA_SDK)
>>> > endif()
>>> >
>>> > add_pdb_impl_folder(Raw
>>> > + Raw/ByteStream.cpp
>>> > + Raw/MappedBlockStream.cpp
>>> > Raw/ModInfo.cpp
>>> > Raw/PDBFile.cpp
>>> > Raw/PDBDbiStream.cpp
>>> > Raw/PDBInfoStream.cpp
>>> > Raw/PDBNameMap.cpp
>>> > - Raw/PDBStream.cpp
>>> > - Raw/RawSession.cpp)
>>> > + Raw/RawSession.cpp
>>> > + Raw/StreamReader.cpp)
>>> >
>>> > list(APPEND LIBPDB_ADDITIONAL_HEADER_DIRS
>>> "${LLVM_MAIN_INCLUDE_DIR}/llvm/DebugInfo/PDB")
>>> >
>>> >
>>> > Added: llvm/trunk/lib/DebugInfo/PDB/Raw/ByteStream.cpp
>>> > URL:
>>> http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/DebugInfo/PDB/Raw/ByteStream.cpp?rev=268071&view=auto
>>> >
>>> ==============================================================================
>>> > --- llvm/trunk/lib/DebugInfo/PDB/Raw/ByteStream.cpp (added)
>>> > +++ llvm/trunk/lib/DebugInfo/PDB/Raw/ByteStream.cpp Fri Apr 29
>>> 12:22:58 2016
>>> > @@ -0,0 +1,60 @@
>>> > +//===- ByteStream.cpp - Reads stream data from a byte sequence
>>> ------------===//
>>> > +//
>>> > +// 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/ByteStream.h"
>>> > +#include "llvm/DebugInfo/PDB/Raw/StreamReader.h"
>>> > +
>>> > +using namespace llvm;
>>> > +
>>> > +ByteStream::ByteStream() : Owned(false) {}
>>> > +
>>> > +ByteStream::ByteStream(MutableArrayRef<uint8_t> Bytes) : Owned(false)
>>> {
>>> > + initialize(Bytes);
>>> > +}
>>> > +
>>> > +ByteStream::ByteStream(uint32_t Length) : Owned(false) {
>>> initialize(Length); }
>>> > +
>>> > +ByteStream::~ByteStream() { reset(); }
>>> > +
>>> > +void ByteStream::reset() {
>>> > + if (Owned)
>>> > + delete[] Data.data();
>>> > + Owned = false;
>>> > + Data = MutableArrayRef<uint8_t>();
>>> > +}
>>> > +
>>> > +void ByteStream::initialize(MutableArrayRef<uint8_t> Bytes) {
>>> > + reset();
>>> > + Data = Bytes;
>>> > + Owned = false;
>>> > +}
>>> > +
>>> > +void ByteStream::initialize(uint32_t Length) {
>>> > + reset();
>>> > + Data = MutableArrayRef<uint8_t>(new uint8_t[Length], Length);
>>> > + Owned = true;
>>> > +}
>>> > +
>>> > +std::error_code ByteStream::initialize(StreamReader &Reader, uint32_t
>>> Length) {
>>> > + initialize(Length);
>>> > + std::error_code EC = Reader.readBytes(Data);
>>> > + if (EC)
>>> > + reset();
>>> > + return EC;
>>> > +}
>>> > +
>>> > +std::error_code ByteStream::readBytes(uint32_t Offset,
>>> > + MutableArrayRef<uint8_t>
>>> Buffer) const {
>>> > + if (Data.size() < Buffer.size() + Offset)
>>> > + return std::make_error_code(std::errc::bad_address);
>>> > + ::memcpy(Buffer.data(), Data.data() + Offset, Buffer.size());
>>> > + return std::error_code();
>>> > +}
>>> > +
>>> > +uint32_t ByteStream::getLength() const { return Data.size(); }
>>> >
>>> > Copied: llvm/trunk/lib/DebugInfo/PDB/Raw/MappedBlockStream.cpp (from
>>> r268069, llvm/trunk/lib/DebugInfo/PDB/Raw/PDBStream.cpp)
>>> > URL:
>>> http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/DebugInfo/PDB/Raw/MappedBlockStream.cpp?p2=llvm/trunk/lib/DebugInfo/PDB/Raw/MappedBlockStream.cpp&p1=llvm/trunk/lib/DebugInfo/PDB/Raw/PDBStream.cpp&r1=268069&r2=268071&rev=268071&view=diff
>>> >
>>> ==============================================================================
>>> > --- llvm/trunk/lib/DebugInfo/PDB/Raw/PDBStream.cpp (original)
>>> > +++ llvm/trunk/lib/DebugInfo/PDB/Raw/MappedBlockStream.cpp Fri Apr 29
>>> 12:22:58 2016
>>> > @@ -1,4 +1,4 @@
>>> > -//===- PDBStream.cpp - Low level interface to a PDB stream ------*-
>>> C++ -*-===//
>>> > +//===- MappedBlockStream.cpp - Reads stream data from a PDBFile
>>> -----------===//
>>> > //
>>> > // The LLVM Compiler Infrastructure
>>> > //
>>> > @@ -7,48 +7,31 @@
>>> > //
>>> >
>>> //===----------------------------------------------------------------------===//
>>> >
>>> > -#include "llvm/DebugInfo/PDB/Raw/PDBStream.h"
>>> > +#include "llvm/DebugInfo/PDB/Raw/MappedBlockStream.h"
>>> > #include "llvm/DebugInfo/PDB/Raw/PDBFile.h"
>>> >
>>> > using namespace llvm;
>>> >
>>> > -PDBStream::PDBStream(uint32_t StreamIdx, const PDBFile &File) :
>>> Pdb(File) {
>>> > +MappedBlockStream::MappedBlockStream(uint32_t StreamIdx, const
>>> PDBFile &File) : Pdb(File) {
>>> > StreamLength = Pdb.getStreamByteSize(StreamIdx);
>>> > BlockList = Pdb.getStreamBlockList(StreamIdx);
>>> > - Offset = 0;
>>> > }
>>> >
>>> > -std::error_code PDBStream::readInteger(uint32_t &Dest) {
>>> > - support::ulittle32_t P;
>>> > - if (std::error_code EC = readObject(&P))
>>> > - return EC;
>>> > - Dest = P;
>>> > - return std::error_code();
>>> > -}
>>> > -
>>> > -std::error_code PDBStream::readZeroString(std::string &Dest) {
>>> > - char C;
>>> > - do {
>>> > - readObject(&C);
>>> > - if (C != '\0')
>>> > - Dest.push_back(C);
>>> > - } while (C != '\0');
>>> > - return std::error_code();
>>> > -}
>>> > -
>>> > -std::error_code PDBStream::readBytes(void *Dest, uint32_t Length) {
>>> > +std::error_code
>>> > +MappedBlockStream::readBytes(uint32_t Offset,
>>> > + MutableArrayRef<uint8_t> Buffer) const {
>>> > uint32_t BlockNum = Offset / Pdb.getBlockSize();
>>> > uint32_t OffsetInBlock = Offset % Pdb.getBlockSize();
>>> >
>>> > // Make sure we aren't trying to read beyond the end of the stream.
>>> > - if (Length > StreamLength)
>>> > + if (Buffer.size() > StreamLength)
>>> > return std::make_error_code(std::errc::bad_address);
>>> > - if (Offset > StreamLength - Length)
>>> > + if (Offset > StreamLength - Buffer.size())
>>> > return std::make_error_code(std::errc::bad_address);
>>> >
>>> > - uint32_t BytesLeft = Length;
>>> > + uint32_t BytesLeft = Buffer.size();
>>> > uint32_t BytesWritten = 0;
>>> > - char *WriteBuffer = static_cast<char *>(Dest);
>>> > + uint8_t *WriteBuffer = Buffer.data();
>>> > while (BytesLeft > 0) {
>>> > uint32_t StreamBlockAddr = BlockList[BlockNum];
>>> >
>>> > @@ -65,14 +48,5 @@ std::error_code PDBStream::readBytes(voi
>>> > OffsetInBlock = 0;
>>> > }
>>> >
>>> > - // Modify the offset to point to the data after the object.
>>> > - Offset += Length;
>>> > -
>>> > return std::error_code();
>>> > }
>>> > -
>>> > -void PDBStream::setOffset(uint32_t O) { Offset = O; }
>>> > -
>>> > -uint32_t PDBStream::getOffset() const { return Offset; }
>>> > -
>>> > -uint32_t PDBStream::getLength() const { return StreamLength; }
>>> >
>>> > Modified: llvm/trunk/lib/DebugInfo/PDB/Raw/PDBDbiStream.cpp
>>> > URL:
>>> http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/DebugInfo/PDB/Raw/PDBDbiStream.cpp?rev=268071&r1=268070&r2=268071&view=diff
>>> >
>>> ==============================================================================
>>> > --- llvm/trunk/lib/DebugInfo/PDB/Raw/PDBDbiStream.cpp (original)
>>> > +++ llvm/trunk/lib/DebugInfo/PDB/Raw/PDBDbiStream.cpp Fri Apr 29
>>> 12:22:58 2016
>>> > @@ -12,6 +12,7 @@
>>> > #include "llvm/DebugInfo/PDB/Raw/PDBFile.h"
>>> > #include "llvm/DebugInfo/PDB/Raw/PDBInfoStream.h"
>>> > #include "llvm/DebugInfo/PDB/Raw/PDBRawConstants.h"
>>> > +#include "llvm/DebugInfo/PDB/Raw/StreamReader.h"
>>> >
>>> > using namespace llvm;
>>> > using namespace llvm::support;
>>> > @@ -58,12 +59,12 @@ struct PDBDbiStream::HeaderInfo {
>>> > little32_t SecContrSubstreamSize; // Size of sec. contribution stream
>>> > little32_t SectionMapSize; // Size of sec. map substream
>>> > little32_t FileInfoSize; // Size of file info substream
>>> > - little32_t TypeServerSize; // Size of type server map
>>> > - ulittle32_t MFCTypeServerIndex; // Index of MFC Type Server
>>> > - little32_t OptionalDbgHdrSize; // Size of DbgHeader info
>>> > - little32_t ECSubstreamSize; // Size of EC stream (what is EC?)
>>> > - ulittle16_t Flags; // See DbiFlags enum.
>>> > - ulittle16_t MachineType; // See PDB_MachineType enum.
>>> > + little32_t TypeServerSize; // Size of type server map
>>> > + ulittle32_t MFCTypeServerIndex; // Index of MFC Type Server
>>> > + little32_t OptionalDbgHdrSize; // Size of DbgHeader info
>>> > + little32_t ECSubstreamSize; // Size of EC stream (what is EC?)
>>> > + ulittle16_t Flags; // See DbiFlags enum.
>>> > + ulittle16_t MachineType; // See PDB_MachineType enum.
>>> >
>>> > ulittle32_t Reserved; // Pad to 64 bytes
>>> > };
>>> > @@ -75,12 +76,13 @@ PDBDbiStream::PDBDbiStream(PDBFile &File
>>> > PDBDbiStream::~PDBDbiStream() {}
>>> >
>>> > std::error_code PDBDbiStream::reload() {
>>> > - Stream.setOffset(0);
>>> > + StreamReader Reader(Stream);
>>> > +
>>> > Header.reset(new HeaderInfo());
>>> >
>>> > if (Stream.getLength() < sizeof(HeaderInfo))
>>> > return std::make_error_code(std::errc::illegal_byte_sequence);
>>> > - Stream.readObject(Header.get());
>>> > + Reader.readObject(Header.get());
>>> >
>>> > if (Header->VersionSignature != -1)
>>> > return std::make_error_code(std::errc::illegal_byte_sequence);
>>> > @@ -115,30 +117,35 @@ std::error_code PDBDbiStream::reload() {
>>> > return std::make_error_code(std::errc::illegal_byte_sequence);
>>> >
>>> > std::error_code EC;
>>> > - if ((EC = readSubstream(ModInfoSubstream,
>>> Header->ModiSubstreamSize)))
>>> > - return EC;
>>> > + ModInfoSubstream.initialize(Reader, Header->ModiSubstreamSize);
>>> >
>>> > // Since each ModInfo in the stream is a variable length, we have to
>>> iterate
>>> > // them to know how many there actually are.
>>> > - auto Range =
>>> llvm::make_range(ModInfoIterator(&ModInfoSubstream.front()),
>>> > -
>>> ModInfoIterator(&ModInfoSubstream.back() + 1));
>>> > + auto Range =
>>> > +
>>> llvm::make_range(ModInfoIterator(&ModInfoSubstream.data().front()),
>>> > +
>>> ModInfoIterator(&ModInfoSubstream.data().back() + 1));
>>> > for (auto Info : Range)
>>> > ModuleInfos.push_back(ModuleInfoEx(Info));
>>> >
>>> > - if ((EC = readSubstream(SecContrSubstream,
>>> Header->SecContrSubstreamSize)))
>>> > + if ((EC = SecContrSubstream.initialize(Reader,
>>> Header->SecContrSubstreamSize)))
>>> > return EC;
>>> > - if ((EC = readSubstream(SecMapSubstream, Header->SectionMapSize)))
>>> > + if ((EC = SecMapSubstream.initialize(Reader,
>>> Header->SectionMapSize)))
>>> > return EC;
>>> > - if ((EC = readSubstream(FileInfoSubstream, Header->FileInfoSize)))
>>> > + if ((EC = FileInfoSubstream.initialize(Reader,
>>> Header->FileInfoSize)))
>>> > return EC;
>>> > - if ((EC = readSubstream(TypeServerMapSubstream,
>>> Header->TypeServerSize)))
>>> > + if ((EC = TypeServerMapSubstream.initialize(Reader,
>>> Header->TypeServerSize)))
>>> > return EC;
>>> > - if ((EC = readSubstream(ECSubstream, Header->ECSubstreamSize)))
>>> > + if ((EC = ECSubstream.initialize(Reader, Header->ECSubstreamSize)))
>>> > + return EC;
>>> > + if ((EC = DbgHeader.initialize(Reader, Header->OptionalDbgHdrSize)))
>>> > return EC;
>>> >
>>> > if ((EC = initializeFileInfo()))
>>> > return EC;
>>> >
>>> > + if (Reader.bytesRemaining() > 0)
>>> > + return std::make_error_code(std::errc::illegal_byte_sequence);
>>> > +
>>> > return std::error_code();
>>> > }
>>> >
>>> > @@ -182,15 +189,6 @@ PDB_Machine PDBDbiStream::getMachineType
>>> >
>>> > ArrayRef<ModuleInfoEx> PDBDbiStream::modules() const { return
>>> ModuleInfos; }
>>> >
>>> > -std::error_code PDBDbiStream::readSubstream(std::vector<uint8_t>
>>> &Bytes, uint32_t Size) {
>>> > - Bytes.clear();
>>> > - if (Size == 0)
>>> > - return std::error_code();
>>> > -
>>> > - Bytes.resize(Size);
>>> > - return Stream.readBytes(&Bytes[0], Size);
>>> > -}
>>> > -
>>> > std::error_code PDBDbiStream::initializeFileInfo() {
>>> > struct FileInfoSubstreamHeader {
>>> > ulittle16_t NumModules; // Total # of modules, should match
>>> number of
>>> > @@ -213,7 +211,7 @@ std::error_code PDBDbiStream::initialize
>>> > // with the caveat that `NumSourceFiles` cannot be trusted, so
>>> > // it is computed by summing `ModFileCounts`.
>>> > //
>>> > - const uint8_t *Buf = &FileInfoSubstream[0];
>>> > + const uint8_t *Buf = &FileInfoSubstream.data().front();
>>> > auto FI = reinterpret_cast<const FileInfoSubstreamHeader *>(Buf);
>>> > Buf += sizeof(FileInfoSubstreamHeader);
>>> > // The number of modules in the stream should be the same as
>>> reported by
>>> >
>>> > Modified: llvm/trunk/lib/DebugInfo/PDB/Raw/PDBInfoStream.cpp
>>> > URL:
>>> http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/DebugInfo/PDB/Raw/PDBInfoStream.cpp?rev=268071&r1=268070&r2=268071&view=diff
>>> >
>>> ==============================================================================
>>> > --- llvm/trunk/lib/DebugInfo/PDB/Raw/PDBInfoStream.cpp (original)
>>> > +++ llvm/trunk/lib/DebugInfo/PDB/Raw/PDBInfoStream.cpp Fri Apr 29
>>> 12:22:58 2016
>>> > @@ -10,28 +10,30 @@
>>> > #include "llvm/DebugInfo/PDB/Raw/PDBInfoStream.h"
>>> > #include "llvm/ADT/BitVector.h"
>>> > #include "llvm/ADT/SmallVector.h"
>>> > +#include "llvm/DebugInfo/PDB/Raw/StreamReader.h"
>>> >
>>> > using namespace llvm;
>>> >
>>> > -PDBInfoStream::PDBInfoStream(PDBFile &File) : Pdb(File), Stream1(1,
>>> File) {}
>>> > +PDBInfoStream::PDBInfoStream(PDBFile &File) : Pdb(File), Stream(1,
>>> File) {}
>>> >
>>> > std::error_code PDBInfoStream::reload() {
>>> > - Stream1.setOffset(0);
>>> > + StreamReader Reader(Stream);
>>> > +
>>> > support::ulittle32_t Value;
>>> >
>>> > - Stream1.readObject(&Value);
>>> > + Reader.readObject(&Value);
>>> > Version = Value;
>>> > if (Version < PdbRaw_ImplVer::PdbImplVC70)
>>> > return std::make_error_code(std::errc::not_supported);
>>> >
>>> > - Stream1.readObject(&Value);
>>> > + Reader.readObject(&Value);
>>> > Signature = Value;
>>> >
>>> > - Stream1.readObject(&Value);
>>> > + Reader.readObject(&Value);
>>> > Age = Value;
>>> >
>>> > - Stream1.readObject(&Guid);
>>> > - NamedStreams.load(Stream1);
>>> > + Reader.readObject(&Guid);
>>> > + NamedStreams.load(Reader);
>>> >
>>> > return std::error_code();
>>> > }
>>> >
>>> > Modified: llvm/trunk/lib/DebugInfo/PDB/Raw/PDBNameMap.cpp
>>> > URL:
>>> http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/DebugInfo/PDB/Raw/PDBNameMap.cpp?rev=268071&r1=268070&r2=268071&view=diff
>>> >
>>> ==============================================================================
>>> > --- llvm/trunk/lib/DebugInfo/PDB/Raw/PDBNameMap.cpp (original)
>>> > +++ llvm/trunk/lib/DebugInfo/PDB/Raw/PDBNameMap.cpp Fri Apr 29
>>> 12:22:58 2016
>>> > @@ -9,13 +9,14 @@
>>> >
>>> > #include "llvm/DebugInfo/PDB/Raw/PDBNameMap.h"
>>> > #include "llvm/ADT/BitVector.h"
>>> > -#include "llvm/DebugInfo/PDB/Raw/PDBStream.h"
>>> > +#include "llvm/DebugInfo/PDB/Raw/StreamReader.h"
>>> >
>>> > using namespace llvm;
>>> >
>>> > PDBNameMap::PDBNameMap() {}
>>> >
>>> > -std::error_code PDBNameMap::load(PDBStream &Stream) {
>>> > +std::error_code PDBNameMap::load(StreamReader &Stream) {
>>> > +
>>> > // This is some sort of weird string-set/hash table encoded in the
>>> stream.
>>> > // It starts with the number of bytes in the table.
>>> > uint32_t NumberOfBytes;
>>> >
>>> > Removed: llvm/trunk/lib/DebugInfo/PDB/Raw/PDBStream.cpp
>>> > URL:
>>> http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/DebugInfo/PDB/Raw/PDBStream.cpp?rev=268070&view=auto
>>> >
>>> ==============================================================================
>>> > --- llvm/trunk/lib/DebugInfo/PDB/Raw/PDBStream.cpp (original)
>>> > +++ llvm/trunk/lib/DebugInfo/PDB/Raw/PDBStream.cpp (removed)
>>> > @@ -1,78 +0,0 @@
>>> > -//===- PDBStream.cpp - Low level interface to a PDB stream ------*-
>>> C++ -*-===//
>>> > -//
>>> > -// 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/PDBStream.h"
>>> > -#include "llvm/DebugInfo/PDB/Raw/PDBFile.h"
>>> > -
>>> > -using namespace llvm;
>>> > -
>>> > -PDBStream::PDBStream(uint32_t StreamIdx, const PDBFile &File) :
>>> Pdb(File) {
>>> > - StreamLength = Pdb.getStreamByteSize(StreamIdx);
>>> > - BlockList = Pdb.getStreamBlockList(StreamIdx);
>>> > - Offset = 0;
>>> > -}
>>> > -
>>> > -std::error_code PDBStream::readInteger(uint32_t &Dest) {
>>> > - support::ulittle32_t P;
>>> > - if (std::error_code EC = readObject(&P))
>>> > - return EC;
>>> > - Dest = P;
>>> > - return std::error_code();
>>> > -}
>>> > -
>>> > -std::error_code PDBStream::readZeroString(std::string &Dest) {
>>> > - char C;
>>> > - do {
>>> > - readObject(&C);
>>> > - if (C != '\0')
>>> > - Dest.push_back(C);
>>> > - } while (C != '\0');
>>> > - return std::error_code();
>>> > -}
>>> > -
>>> > -std::error_code PDBStream::readBytes(void *Dest, uint32_t Length) {
>>> > - uint32_t BlockNum = Offset / Pdb.getBlockSize();
>>> > - uint32_t OffsetInBlock = Offset % Pdb.getBlockSize();
>>> > -
>>> > - // Make sure we aren't trying to read beyond the end of the stream.
>>> > - if (Length > StreamLength)
>>> > - return std::make_error_code(std::errc::bad_address);
>>> > - if (Offset > StreamLength - Length)
>>> > - return std::make_error_code(std::errc::bad_address);
>>> > -
>>> > - uint32_t BytesLeft = Length;
>>> > - uint32_t BytesWritten = 0;
>>> > - char *WriteBuffer = static_cast<char *>(Dest);
>>> > - while (BytesLeft > 0) {
>>> > - uint32_t StreamBlockAddr = BlockList[BlockNum];
>>> > -
>>> > - StringRef Data = Pdb.getBlockData(StreamBlockAddr,
>>> Pdb.getBlockSize());
>>> > -
>>> > - const char *ChunkStart = Data.data() + OffsetInBlock;
>>> > - uint32_t BytesInChunk =
>>> > - std::min(BytesLeft, Pdb.getBlockSize() - OffsetInBlock);
>>> > - ::memcpy(WriteBuffer + BytesWritten, ChunkStart, BytesInChunk);
>>> > -
>>> > - BytesWritten += BytesInChunk;
>>> > - BytesLeft -= BytesInChunk;
>>> > - ++BlockNum;
>>> > - OffsetInBlock = 0;
>>> > - }
>>> > -
>>> > - // Modify the offset to point to the data after the object.
>>> > - Offset += Length;
>>> > -
>>> > - return std::error_code();
>>> > -}
>>> > -
>>> > -void PDBStream::setOffset(uint32_t O) { Offset = O; }
>>> > -
>>> > -uint32_t PDBStream::getOffset() const { return Offset; }
>>> > -
>>> > -uint32_t PDBStream::getLength() const { return StreamLength; }
>>> >
>>> > Added: llvm/trunk/lib/DebugInfo/PDB/Raw/StreamReader.cpp
>>> > URL:
>>> http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/DebugInfo/PDB/Raw/StreamReader.cpp?rev=268071&view=auto
>>> >
>>> ==============================================================================
>>> > --- llvm/trunk/lib/DebugInfo/PDB/Raw/StreamReader.cpp (added)
>>> > +++ llvm/trunk/lib/DebugInfo/PDB/Raw/StreamReader.cpp Fri Apr 29
>>> 12:22:58 2016
>>> > @@ -0,0 +1,40 @@
>>> > +//===- StreamReader.cpp - Reads bytes and objects from a stream
>>> -----------===//
>>> > +//
>>> > +// 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/StreamReader.h"
>>> > +
>>> > +using namespace llvm;
>>> > +
>>> > +StreamReader::StreamReader(const StreamInterface &S) : Stream(S),
>>> Offset(0) {}
>>> > +
>>> > +std::error_code StreamReader::readBytes(MutableArrayRef<uint8_t>
>>> Buffer) {
>>> > + if (auto EC = Stream.readBytes(Offset, Buffer))
>>> > + return EC;
>>> > + Offset += Buffer.size();
>>> > + return std::error_code();
>>> > +}
>>> > +
>>> > +std::error_code StreamReader::readInteger(uint32_t &Dest) {
>>> > + support::ulittle32_t P;
>>> > + if (std::error_code EC = readObject(&P))
>>> > + return EC;
>>> > + Dest = P;
>>> > + return std::error_code();
>>> > +}
>>> > +
>>> > +std::error_code StreamReader::readZeroString(std::string &Dest) {
>>> > + Dest.clear();
>>> > + char C;
>>> > + do {
>>> > + readObject(&C);
>>> > + if (C != '\0')
>>> > + Dest.push_back(C);
>>> > + } while (C != '\0');
>>> > + return std::error_code();
>>> > +}
>>> >
>>> > Modified: llvm/trunk/tools/llvm-pdbdump/llvm-pdbdump.cpp
>>> > URL:
>>> http://llvm.org/viewvc/llvm-project/llvm/trunk/tools/llvm-pdbdump/llvm-pdbdump.cpp?rev=268071&r1=268070&r2=268071&view=diff
>>> >
>>> ==============================================================================
>>> > --- llvm/trunk/tools/llvm-pdbdump/llvm-pdbdump.cpp (original)
>>> > +++ llvm/trunk/tools/llvm-pdbdump/llvm-pdbdump.cpp Fri Apr 29 12:22:58
>>> 2016
>>> > @@ -35,12 +35,13 @@
>>> > #include "llvm/DebugInfo/PDB/PDBSymbolExe.h"
>>> > #include "llvm/DebugInfo/PDB/PDBSymbolFunc.h"
>>> > #include "llvm/DebugInfo/PDB/PDBSymbolThunk.h"
>>> > +#include "llvm/DebugInfo/PDB/Raw/MappedBlockStream.h"
>>> > #include "llvm/DebugInfo/PDB/Raw/ModInfo.h"
>>> > #include "llvm/DebugInfo/PDB/Raw/PDBDbiStream.h"
>>> > #include "llvm/DebugInfo/PDB/Raw/PDBFile.h"
>>> > #include "llvm/DebugInfo/PDB/Raw/PDBInfoStream.h"
>>> > -#include "llvm/DebugInfo/PDB/Raw/PDBStream.h"
>>> > #include "llvm/DebugInfo/PDB/Raw/RawSession.h"
>>> > +#include "llvm/DebugInfo/PDB/Raw/StreamReader.h"
>>> > #include "llvm/Support/CommandLine.h"
>>> > #include "llvm/Support/ConvertUTF.h"
>>> > #include "llvm/Support/FileSystem.h"
>>> > @@ -246,17 +247,19 @@ static void dumpStructure(RawSession &RS
>>> > // Let's try to dump out the named stream "/names".
>>> > uint32_t NameStreamIndex = InfoStream.getNamedStreamIndex("/names");
>>> > if (NameStreamIndex != 0) {
>>> > - PDBStream NameStream(NameStreamIndex, File);
>>> > + MappedBlockStream NameStream(NameStreamIndex, File);
>>> > + StreamReader Reader(NameStream);
>>> > +
>>> > outs() << "NameStream: " << NameStreamIndex << '\n';
>>> >
>>> > // The name stream appears to start with a signature and version.
>>> > uint32_t NameStreamSignature;
>>> > - NameStream.readInteger(NameStreamSignature);
>>> > + Reader.readInteger(NameStreamSignature);
>>> > outs() << "NameStreamSignature: ";
>>> > outs().write_hex(NameStreamSignature) << '\n';
>>> >
>>> > uint32_t NameStreamVersion;
>>> > - NameStream.readInteger(NameStreamVersion);
>>> > + Reader.readInteger(NameStreamVersion);
>>> > outs() << "NameStreamVersion: " << NameStreamVersion << '\n';
>>> >
>>> > // We only support this particular version of the name stream.
>>> >
>>> >
>>> > _______________________________________________
>>> > llvm-commits mailing list
>>> > llvm-commits at lists.llvm.org
>>> > http://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-commits
>>>
>>>
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.llvm.org/pipermail/llvm-commits/attachments/20160502/c86b3b83/attachment.html>
More information about the llvm-commits
mailing list