mirror of
https://github.com/intel/llvm.git
synced 2026-01-25 01:07:04 +08:00
Allow loading source locations from any file in the chain. WIP
llvm-svn: 108942
This commit is contained in:
@@ -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,
|
||||
|
||||
@@ -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<PerFileData*, 2> Chain;
|
||||
|
||||
/// \brief Types that have already been loaded from the PCH file.
|
||||
@@ -539,6 +540,7 @@ private:
|
||||
bool ParseLineTable(llvm::SmallVectorImpl<uint64_t> &Record);
|
||||
PCHReadResult ReadSourceManagerBlock(PerFileData &F);
|
||||
PCHReadResult ReadSLocEntryRecord(unsigned ID);
|
||||
llvm::BitstreamCursor &SLocCursorForID(unsigned ID);
|
||||
|
||||
bool ParseLanguageOptions(const llvm::SmallVectorImpl<uint64_t> &Record);
|
||||
QualType ReadTypeRecord(uint64_t Offset);
|
||||
|
||||
@@ -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 ||
|
||||
|
||||
Reference in New Issue
Block a user