From: Sebastian Redl Date: Tue, 20 Jul 2010 21:50:20 +0000 (+0000) Subject: Allow loading source locations from any file in the chain. WIP X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=190faf7c30890479925193b074571e5dc30c3f53;p=clang Allow loading source locations from any file in the chain. WIP git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@108942 91177308-0d34-0410-b5e6-96231b3b80d8 --- diff --git a/include/clang/Basic/SourceManager.h b/include/clang/Basic/SourceManager.h index 6a4be46094..5d98fb9253 100644 --- a/include/clang/Basic/SourceManager.h +++ b/include/clang/Basic/SourceManager.h @@ -435,7 +435,7 @@ public: /// createFileID - Create a new FileID that represents the specified file /// being #included from the specified IncludePosition. This returns 0 on /// error and translates NULL into standard input. - /// PreallocateID should be non-zero to specify which a pre-allocated, + /// PreallocateID should be non-zero to specify which pre-allocated, /// lazily computed source location is being filled in by this operation. FileID createFileID(const FileEntry *SourceFile, SourceLocation IncludePos, SrcMgr::CharacteristicKind FileCharacter, diff --git a/include/clang/Frontend/PCHReader.h b/include/clang/Frontend/PCHReader.h index 86a1a006bd..c3826e7a17 100644 --- a/include/clang/Frontend/PCHReader.h +++ b/include/clang/Frontend/PCHReader.h @@ -271,6 +271,7 @@ private: /// \brief The chain of PCH files. The first entry is the one named by the /// user, the last one is the one that doesn't depend on anything further. + /// That is, the entry I was created with -include-pch I+1. llvm::SmallVector Chain; /// \brief Types that have already been loaded from the PCH file. @@ -539,6 +540,7 @@ private: bool ParseLineTable(llvm::SmallVectorImpl &Record); PCHReadResult ReadSourceManagerBlock(PerFileData &F); PCHReadResult ReadSLocEntryRecord(unsigned ID); + llvm::BitstreamCursor &SLocCursorForID(unsigned ID); bool ParseLanguageOptions(const llvm::SmallVectorImpl &Record); QualType ReadTypeRecord(uint64_t Offset); diff --git a/lib/Frontend/PCHReader.cpp b/lib/Frontend/PCHReader.cpp index b12025fdb8..126036ac4e 100644 --- a/lib/Frontend/PCHReader.cpp +++ b/lib/Frontend/PCHReader.cpp @@ -953,6 +953,26 @@ PCHReader::PCHReadResult PCHReader::ReadSourceManagerBlock(PerFileData &F) { } } +/// \brief Get a cursor that's correctly positioned for reading the source +/// location entry with the given ID. +llvm::BitstreamCursor &PCHReader::SLocCursorForID(unsigned ID) { + assert(ID != 0 && ID <= TotalNumSLocEntries && + "SLocCursorForID should only be called for real IDs."); + + ID -= 1; + PerFileData *F = 0; + for (unsigned I = 0, N = Chain.size(); I != N; ++I) { + F = Chain[N - I - 1]; + if (ID < F->LocalNumSLocEntries) + break; + ID -= F->LocalNumSLocEntries; + } + assert(F && F->LocalNumSLocEntries > ID && "Chain corrupted"); + + F->SLocEntryCursor.JumpToBit(F->SLocOffsets[ID]); + return F->SLocEntryCursor; +} + /// \brief Read in the source location entry with the given ID. PCHReader::PCHReadResult PCHReader::ReadSLocEntryRecord(unsigned ID) { if (ID == 0) @@ -963,10 +983,9 @@ PCHReader::PCHReadResult PCHReader::ReadSLocEntryRecord(unsigned ID) { return Failure; } - llvm::BitstreamCursor &SLocEntryCursor = Chain[0]->SLocEntryCursor; + llvm::BitstreamCursor &SLocEntryCursor = SLocCursorForID(ID); ++NumSLocEntriesRead; - SLocEntryCursor.JumpToBit(Chain[0]->SLocOffsets[ID - 1]); unsigned Code = SLocEntryCursor.ReadCode(); if (Code == llvm::bitc::END_BLOCK || Code == llvm::bitc::ENTER_SUBBLOCK ||