aboutsummaryrefslogtreecommitdiff
path: root/lib/Frontend/PCHReader.cpp
diff options
context:
space:
mode:
authorSebastian Redl <sebastian.redl@getdesigned.at>2010-07-20 22:37:49 +0000
committerSebastian Redl <sebastian.redl@getdesigned.at>2010-07-20 22:37:49 +0000
commitaaec0aa844781dc7c3462ba140e004e589ccd355 (patch)
tree3f6baad583e0cb1c9c111732bbcc10c6c8f6f757 /lib/Frontend/PCHReader.cpp
parentec5ea2bc6d81c2e896ffff64821c7993ee74060e (diff)
Allow loading types from any file in the chain. WIP
git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@108954 91177308-0d34-0410-b5e6-96231b3b80d8
Diffstat (limited to 'lib/Frontend/PCHReader.cpp')
-rw-r--r--lib/Frontend/PCHReader.cpp33
1 files changed, 24 insertions, 9 deletions
diff --git a/lib/Frontend/PCHReader.cpp b/lib/Frontend/PCHReader.cpp
index 126036ac4e..3abee83661 100644
--- a/lib/Frontend/PCHReader.cpp
+++ b/lib/Frontend/PCHReader.cpp
@@ -2150,13 +2150,28 @@ void PCHReader::ReadPreprocessedEntities() {
ReadDefinedMacros();
}
-/// \brief Read and return the type at the given offset.
+/// \brief Get the correct cursor and offset for loading a type.
+PCHReader::RecordLocation PCHReader::TypeCursorForIndex(unsigned Index) {
+ PerFileData *F = 0;
+ for (unsigned I = 0, N = Chain.size(); I != N; ++I) {
+ F = Chain[N - I - 1];
+ if (Index < F->LocalNumTypes)
+ break;
+ Index -= F->LocalNumTypes;
+ }
+ assert(F && F->LocalNumTypes > Index && "Broken chain");
+ return RecordLocation(F->DeclsCursor, F->TypeOffsets[Index]);
+}
+
+/// \brief Read and return the type with the given index..
///
-/// This routine actually reads the record corresponding to the type
-/// at the given offset in the bitstream. It is a helper routine for
-/// GetType, which deals with reading type IDs.
-QualType PCHReader::ReadTypeRecord(uint64_t Offset) {
- llvm::BitstreamCursor &DeclsCursor = Chain[0]->DeclsCursor;
+/// The index is the type ID, shifted and minus the number of predefs. This
+/// routine actually reads the record corresponding to the type at the given
+/// location. It is a helper routine for GetType, which deals with reading type
+/// IDs.
+QualType PCHReader::ReadTypeRecord(unsigned Index) {
+ RecordLocation Loc = TypeCursorForIndex(Index);
+ llvm::BitstreamCursor &DeclsCursor = Loc.first;
// Keep track of where we are in the stream, then jump back there
// after reading this type.
@@ -2167,7 +2182,7 @@ QualType PCHReader::ReadTypeRecord(uint64_t Offset) {
// Note that we are loading a type record.
LoadingTypeOrDecl Loading(*this);
- DeclsCursor.JumpToBit(Offset);
+ DeclsCursor.JumpToBit(Loc.second);
RecordData Record;
unsigned Code = DeclsCursor.ReadCode();
switch ((pch::TypeCode)DeclsCursor.ReadRecord(Code, Record)) {
@@ -2736,9 +2751,9 @@ QualType PCHReader::GetType(pch::TypeID ID) {
}
Index -= pch::NUM_PREDEF_TYPE_IDS;
- //assert(Index < TypesLoaded.size() && "Type index out-of-range");
+ assert(Index < TypesLoaded.size() && "Type index out-of-range");
if (TypesLoaded[Index].isNull()) {
- TypesLoaded[Index] = ReadTypeRecord(Chain[0]->TypeOffsets[Index]);
+ TypesLoaded[Index] = ReadTypeRecord(Index);
TypesLoaded[Index]->setFromPCH();
if (DeserializationListener)
DeserializationListener->TypeRead(ID >> Qualifiers::FastWidth,