diff options
Diffstat (limited to 'clang/lib/Frontend')
| -rw-r--r-- | clang/lib/Frontend/PCHReader.cpp | 126 | ||||
| -rw-r--r-- | clang/lib/Frontend/PCHWriter.cpp | 20 | 
2 files changed, 38 insertions, 108 deletions
diff --git a/clang/lib/Frontend/PCHReader.cpp b/clang/lib/Frontend/PCHReader.cpp index 01a79b44d98..0e5b6ee8aa2 100644 --- a/clang/lib/Frontend/PCHReader.cpp +++ b/clang/lib/Frontend/PCHReader.cpp @@ -192,129 +192,63 @@ bool PCHReader::ReadSourceManagerBlock() {    }  } -/// \brief Read the type-offsets block. -bool PCHReader::ReadTypeOffsets() { -  if (Stream.EnterSubBlock(pch::TYPE_OFFSETS_BLOCK_ID)) +bool PCHReader::ReadPCHBlock() { +  if (Stream.EnterSubBlock(pch::PCH_BLOCK_ID))      return Error("Malformed block record"); +  // Read all of the records and blocks for the PCH file.    RecordData Record; -  while (true) { +  while (!Stream.AtEndOfStream()) {      unsigned Code = Stream.ReadCode();      if (Code == llvm::bitc::END_BLOCK) {        if (Stream.ReadBlockEnd()) -        return Error("Error at end of TYPE_OFFSETS block"); +        return Error("Error at end of module block");        return false;      } -     +      if (Code == llvm::bitc::ENTER_SUBBLOCK) { -      // No known subblocks, always skip them. -      Stream.ReadSubBlockID(); -      if (Stream.SkipBlock()) -        return Error("Malformed block record"); +      switch (Stream.ReadSubBlockID()) { +      case pch::DECLS_BLOCK_ID: // Skip decls block (lazily loaded) +      case pch::TYPES_BLOCK_ID: // Skip types block (lazily loaded) +      default:  // Skip unknown content. +        if (Stream.SkipBlock()) +          return Error("Malformed block record"); +        break; + +      case pch::SOURCE_MANAGER_BLOCK_ID: +        if (ReadSourceManagerBlock()) +          return Error("Malformed source manager block"); +        break; +      }        continue;      } -     +      if (Code == llvm::bitc::DEFINE_ABBREV) {        Stream.ReadAbbrevRecord();        continue;      } -     -    // Read a record. + +    // Read and process a record.      Record.clear(); -    switch (Stream.ReadRecord(Code, Record)) { +    switch ((pch::PCHRecordTypes)Stream.ReadRecord(Code, Record)) {      default:  // Default behavior: ignore.        break; +      case pch::TYPE_OFFSET:        if (!TypeOffsets.empty()) -        return Error("Duplicate TYPE_OFFSETS block"); +        return Error("Duplicate TYPE_OFFSET record in PCH file");        TypeOffsets.swap(Record);        TypeAlreadyLoaded.resize(TypeOffsets.size(), false);        break; -    } -  } -} - -/// \brief Read the decl-offsets block. -bool PCHReader::ReadDeclOffsets() { -  if (Stream.EnterSubBlock(pch::DECL_OFFSETS_BLOCK_ID)) -    return Error("Malformed block record"); -  RecordData Record; -  while (true) { -    unsigned Code = Stream.ReadCode(); -    if (Code == llvm::bitc::END_BLOCK) { -      if (Stream.ReadBlockEnd()) -        return Error("Error at end of DECL_OFFSETS block"); -      return false; -    } -     -    if (Code == llvm::bitc::ENTER_SUBBLOCK) { -      // No known subblocks, always skip them. -      Stream.ReadSubBlockID(); -      if (Stream.SkipBlock()) -        return Error("Malformed block record"); -      continue; -    } -     -    if (Code == llvm::bitc::DEFINE_ABBREV) { -      Stream.ReadAbbrevRecord(); -      continue; -    } -     -    // Read a record. -    Record.clear(); -    switch (Stream.ReadRecord(Code, Record)) { -    default:  // Default behavior: ignore. -      break;      case pch::DECL_OFFSET:        if (!DeclOffsets.empty()) -        return Error("Duplicate DECL_OFFSETS block"); +        return Error("Duplicate DECL_OFFSET record in PCH file");        DeclOffsets.swap(Record);        DeclAlreadyLoaded.resize(DeclOffsets.size(), false);        break;      }    } -} - -bool PCHReader::ReadPCHBlock() { -  if (Stream.EnterSubBlock(pch::PCH_BLOCK_ID)) -    return Error("Malformed block record"); - -  // Read all of the records and blocks for the PCH file. -  while (!Stream.AtEndOfStream()) { -    unsigned Code = Stream.ReadCode(); -    if (Code == llvm::bitc::END_BLOCK) { -      if (Stream.ReadBlockEnd()) -        return Error("Error at end of module block"); -      return false; -    } - -    if (Code == llvm::bitc::ENTER_SUBBLOCK) { -      switch (Stream.ReadSubBlockID()) { -      case pch::DECLS_BLOCK_ID: // Skip decls block (lazily loaded) -      case pch::TYPES_BLOCK_ID: // Skip types block (lazily loaded) -      default:  // Skip unknown content. -        if (Stream.SkipBlock()) -          return Error("Malformed block record"); -        break; - -      case pch::SOURCE_MANAGER_BLOCK_ID: -        if (ReadSourceManagerBlock()) -          return Error("Malformed source manager block"); -        break; - -      case pch::TYPE_OFFSETS_BLOCK_ID: -        if (ReadTypeOffsets()) -          return Error("Malformed type-offsets block"); -        break; - -      case pch::DECL_OFFSETS_BLOCK_ID: -        if (ReadDeclOffsets()) -          return Error("Malformed decl-offsets block"); -        break; -      } -    } -  }    return Error("Premature end of bitstream");  } @@ -426,7 +360,7 @@ QualType PCHReader::ReadTypeRecord(uint64_t Offset) {      // FIXME: Several other kinds of types to deserialize here!    default: -    assert("Unable to deserialize this type"); +    assert(false && "Unable to deserialize this type");      break;    } @@ -500,7 +434,7 @@ Decl *PCHReader::ReadDeclRecord(uint64_t Offset, unsigned Index) {    return D;  } -QualType PCHReader::GetType(unsigned ID) { +QualType PCHReader::GetType(pch::TypeID ID) {    unsigned Quals = ID & 0x07;     unsigned Index = ID >> 3; @@ -550,7 +484,7 @@ QualType PCHReader::GetType(unsigned ID) {    return QualType(reinterpret_cast<Type *>(TypeOffsets[Index]), Quals);  } -Decl *PCHReader::GetDecl(unsigned ID) { +Decl *PCHReader::GetDecl(pch::DeclID ID) {    if (ID == 0)      return 0; @@ -563,7 +497,7 @@ Decl *PCHReader::GetDecl(unsigned ID) {  }  bool PCHReader::ReadDeclsLexicallyInContext(DeclContext *DC, -                                     llvm::SmallVectorImpl<unsigned> &Decls) { +                                  llvm::SmallVectorImpl<pch::DeclID> &Decls) {    assert(DC->hasExternalLexicalStorage() &&            "DeclContext has no lexical decls in storage");    uint64_t Offset = DeclContextOffsets[DC].first; diff --git a/clang/lib/Frontend/PCHWriter.cpp b/clang/lib/Frontend/PCHWriter.cpp index 1986b5945fb..f80d46ab5d9 100644 --- a/clang/lib/Frontend/PCHWriter.cpp +++ b/clang/lib/Frontend/PCHWriter.cpp @@ -490,7 +490,7 @@ void PCHWriter::WritePreprocessor(Preprocessor &PP) {  /// \brief Write the representation of a type to the PCH stream.  void PCHWriter::WriteType(const Type *T) { -  pch::ID &ID = TypeIDs[T]; +  pch::TypeID &ID = TypeIDs[T];    if (ID == 0) // we haven't seen this type before.      ID = NextTypeID++; @@ -547,10 +547,8 @@ void PCHWriter::WriteTypesBlock(ASTContext &Context) {    // Exit the types block    S.ExitBlock(); -  // Write the type offsets block -  S.EnterSubblock(pch::TYPE_OFFSETS_BLOCK_ID, 2); +  // Write the type offsets record    S.EmitRecord(pch::TYPE_OFFSET, TypeOffsets); -  S.ExitBlock();  }  /// \brief Write the block containing all of the declaration IDs @@ -560,7 +558,7 @@ void PCHWriter::WriteTypesBlock(ASTContext &Context) {  /// bistream, or 0 if no block was written.  uint64_t PCHWriter::WriteDeclContextLexicalBlock(ASTContext &Context,                                                    DeclContext *DC) { -  if (DC->decls_begin(Context) == DC->decls_end(Context)) +  if (DC->decls_empty(Context))      return 0;    uint64_t Offset = S.GetCurrentBitNo(); @@ -638,7 +636,7 @@ void PCHWriter::WriteDeclsBlock(ASTContext &Context) {      }      // Determine the ID for this declaration -    pch::ID ID = DeclIDs[D]; +    pch::DeclID ID = DeclIDs[D];      if (ID == 0)        ID = DeclIDs.size(); @@ -664,10 +662,8 @@ void PCHWriter::WriteDeclsBlock(ASTContext &Context) {    // Exit the declarations block    S.ExitBlock(); -  // Write the declaration offsets block -  S.EnterSubblock(pch::DECL_OFFSETS_BLOCK_ID, 2); +  // Write the declaration offsets record    S.EmitRecord(pch::DECL_OFFSET, DeclOffsets); -  S.ExitBlock();  }  PCHWriter::PCHWriter(llvm::BitstreamWriter &S)  @@ -720,7 +716,7 @@ void PCHWriter::AddTypeRef(QualType T, RecordData &Record) {    }    if (const BuiltinType *BT = dyn_cast<BuiltinType>(T.getTypePtr())) { -    pch::ID ID; +    pch::TypeID ID;      switch (BT->getKind()) {      case BuiltinType::Void:       ID = pch::PREDEF_TYPE_VOID_ID;       break;      case BuiltinType::Bool:       ID = pch::PREDEF_TYPE_BOOL_ID;       break; @@ -748,7 +744,7 @@ void PCHWriter::AddTypeRef(QualType T, RecordData &Record) {      return;    } -  pch::ID &ID = TypeIDs[T.getTypePtr()]; +  pch::TypeID &ID = TypeIDs[T.getTypePtr()];    if (ID == 0) // we haven't seen this type before      ID = NextTypeID++; @@ -762,7 +758,7 @@ void PCHWriter::AddDeclRef(const Decl *D, RecordData &Record) {      return;    } -  pch::ID &ID = DeclIDs[D]; +  pch::DeclID &ID = DeclIDs[D];    if (ID == 0) {       // We haven't seen this declaration before. Give it a new ID and      // enqueue it in the list of declarations to emit.  | 

