diff options
Diffstat (limited to 'lib/Serialization/ASTWriter.cpp')
| -rw-r--r-- | lib/Serialization/ASTWriter.cpp | 82 | 
1 files changed, 63 insertions, 19 deletions
diff --git a/lib/Serialization/ASTWriter.cpp b/lib/Serialization/ASTWriter.cpp index 36933a9d9b8c..b7718c4655b4 100644 --- a/lib/Serialization/ASTWriter.cpp +++ b/lib/Serialization/ASTWriter.cpp @@ -198,6 +198,8 @@ void ASTTypeWriter::VisitFunctionProtoType(const FunctionProtoType *T) {    } else if (T->getExceptionSpecType() == EST_Uninstantiated) {      Writer.AddDeclRef(T->getExceptionSpecDecl(), Record);      Writer.AddDeclRef(T->getExceptionSpecTemplate(), Record); +  } else if (T->getExceptionSpecType() == EST_Unevaluated) { +    Writer.AddDeclRef(T->getExceptionSpecDecl(), Record);    }    Code = TYPE_FUNCTION_PROTO;  } @@ -699,7 +701,7 @@ static void AddStmtsExprs(llvm::BitstreamWriter &Stream,    RECORD(EXPR_BLOCK);    RECORD(EXPR_GENERIC_SELECTION);    RECORD(EXPR_OBJC_STRING_LITERAL); -  RECORD(EXPR_OBJC_NUMERIC_LITERAL); +  RECORD(EXPR_OBJC_BOXED_EXPRESSION);    RECORD(EXPR_OBJC_ARRAY_LITERAL);    RECORD(EXPR_OBJC_DICTIONARY_LITERAL);    RECORD(EXPR_OBJC_ENCODE); @@ -1081,6 +1083,9 @@ void ASTWriter::WriteLanguageOptions(const LangOptions &LangOpts) {  #define ENUM_LANGOPT(Name, Type, Bits, Default, Description) \    Record.push_back(static_cast<unsigned>(LangOpts.get##Name()));  #include "clang/Basic/LangOptions.def"   + +  Record.push_back((unsigned) LangOpts.ObjCRuntime.getKind()); +  AddVersionTuple(LangOpts.ObjCRuntime.getVersion(), Record);    Record.push_back(LangOpts.CurrentModule.size());    Record.append(LangOpts.CurrentModule.begin(), LangOpts.CurrentModule.end()); @@ -1242,15 +1247,14 @@ namespace {    // Trait used for the on-disk hash table of header search information.    class HeaderFileInfoTrait {      ASTWriter &Writer; -    const HeaderSearch &HS;      // Keep track of the framework names we've used during serialization.      SmallVector<char, 128> FrameworkStringData;      llvm::StringMap<unsigned> FrameworkNameOffset;    public: -    HeaderFileInfoTrait(ASTWriter &Writer, const HeaderSearch &HS)  -      : Writer(Writer), HS(HS) { } +    HeaderFileInfoTrait(ASTWriter &Writer) +      : Writer(Writer) { }      typedef const char *key_type;      typedef key_type key_type_ref; @@ -1335,7 +1339,7 @@ void ASTWriter::WriteHeaderSearch(const HeaderSearch &HS, StringRef isysroot) {    if (FilesByUID.size() > HS.header_file_size())      FilesByUID.resize(HS.header_file_size()); -  HeaderFileInfoTrait GeneratorTrait(*this, HS); +  HeaderFileInfoTrait GeneratorTrait(*this);    OnDiskChainedHashTableGenerator<HeaderFileInfoTrait> Generator;      SmallVector<const char *, 4> SavedStrings;    unsigned NumHeaderSearchEntries = 0; @@ -1605,11 +1609,11 @@ void ASTWriter::WriteSourceManagerBlock(SourceManager &SourceMgr,      for (LineTableInfo::iterator L = LineTable.begin(), LEnd = LineTable.end();           L != LEnd; ++L) {        // Only emit entries for local files. -      if (L->first < 0) +      if (L->first.ID < 0)          continue;        // Emit the file ID -      Record.push_back(L->first); +      Record.push_back(L->first.ID);        // Emit the line entries        Record.push_back(L->second.size()); @@ -2241,6 +2245,23 @@ void ASTWriter::WriteFileDeclIDsMap() {    Stream.EmitRecordWithBlob(AbbrevCode, Record, data(FileSortedIDs));  } +void ASTWriter::WriteComments() { +  Stream.EnterSubblock(COMMENTS_BLOCK_ID, 3); +  ArrayRef<RawComment *> RawComments = Context->Comments.getComments(); +  RecordData Record; +  for (ArrayRef<RawComment *>::iterator I = RawComments.begin(), +                                        E = RawComments.end(); +       I != E; ++I) { +    Record.clear(); +    AddSourceRange((*I)->getSourceRange(), Record); +    Record.push_back((*I)->getKind()); +    Record.push_back((*I)->isTrailingComment()); +    Record.push_back((*I)->isAlmostTrailingComment()); +    Stream.EmitRecord(COMMENTS_RAW_COMMENT, Record); +  } +  Stream.ExitBlock(); +} +  //===----------------------------------------------------------------------===//  // Global Method Pool and Selector Serialization  //===----------------------------------------------------------------------===// @@ -3067,10 +3088,12 @@ void ASTWriter::WriteMergedDecls() {  //===----------------------------------------------------------------------===//  /// \brief Write a record containing the given attributes. -void ASTWriter::WriteAttributes(const AttrVec &Attrs, RecordDataImpl &Record) { +void ASTWriter::WriteAttributes(ArrayRef<const Attr*> Attrs, +                                RecordDataImpl &Record) {    Record.push_back(Attrs.size()); -  for (AttrVec::const_iterator i = Attrs.begin(), e = Attrs.end(); i != e; ++i){ -    const Attr * A = *i; +  for (ArrayRef<const Attr *>::iterator i = Attrs.begin(), +                                        e = Attrs.end(); i != e; ++i){ +    const Attr *A = *i;      Record.push_back(A->getKind()); // FIXME: stable encoding, target attrs      AddSourceRange(A->getRange(), Record); @@ -3121,7 +3144,8 @@ void ASTWriter::SetSelectorOffset(Selector Sel, uint32_t Offset) {  ASTWriter::ASTWriter(llvm::BitstreamWriter &Stream)    : Stream(Stream), Context(0), PP(0), Chain(0), WritingModule(0), -    WritingAST(false), ASTHasCompilerErrors(false), +    WritingAST(false), DoneWritingDeclsAndTypes(false), +    ASTHasCompilerErrors(false),      FirstDeclID(NUM_PREDEF_DECL_IDS), NextDeclID(FirstDeclID),      FirstTypeID(NUM_PREDEF_TYPE_IDS), NextTypeID(FirstTypeID),      FirstIdentID(NUM_PREDEF_IDENT_IDS), NextIdentID(FirstIdentID),  @@ -3213,7 +3237,9 @@ void ASTWriter::WriteASTCore(Sema &SemaRef, MemorizeStatCalls *StatCalls,      DeclIDs[Context.UInt128Decl] = PREDEF_DECL_UNSIGNED_INT_128_ID;    if (Context.ObjCInstanceTypeDecl)      DeclIDs[Context.ObjCInstanceTypeDecl] = PREDEF_DECL_OBJC_INSTANCETYPE_ID; -   +  if (Context.BuiltinVaListDecl) +    DeclIDs[Context.getBuiltinVaListDecl()] = PREDEF_DECL_BUILTIN_VA_LIST_ID; +    if (!Chain) {      // Make sure that we emit IdentifierInfos (and any attached      // declarations) for builtins. We don't need to do this when we're @@ -3379,13 +3405,20 @@ void ASTWriter::WriteASTCore(Sema &SemaRef, MemorizeStatCalls *StatCalls,        Record.push_back(reinterpret_cast<uint64_t>(NS));      }    } -   + +  // Make sure visible decls, added to DeclContexts previously loaded from +  // an AST file, are registered for serialization. +  for (SmallVector<const Decl *, 16>::iterator +         I = UpdatingVisibleDecls.begin(), +         E = UpdatingVisibleDecls.end(); I != E; ++I) { +    GetDeclRef(*I); +  } +    // Resolve any declaration pointers within the declaration updates block.    ResolveDeclUpdatesBlocks();    // Form the record of special types.    RecordData SpecialTypes; -  AddTypeRef(Context.getBuiltinVaListType(), SpecialTypes);    AddTypeRef(Context.getRawCFConstantStringType(), SpecialTypes);    AddTypeRef(Context.getFILEType(), SpecialTypes);    AddTypeRef(Context.getjmp_bufType(), SpecialTypes); @@ -3413,8 +3446,11 @@ void ASTWriter::WriteASTCore(Sema &SemaRef, MemorizeStatCalls *StatCalls,    }    Stream.ExitBlock(); +  DoneWritingDeclsAndTypes = true; +    WriteFileDeclIDsMap();    WriteSourceManagerBlock(Context.getSourceManager(), PP, isysroot); +  WriteComments();    if (Chain) {      // Write the mapping information describing our module dependencies and how @@ -3798,6 +3834,11 @@ TypeIdx ASTWriter::GetOrCreateTypeIdx(QualType T) {    TypeIdx &Idx = TypeIdxs[T];    if (Idx.getIndex() == 0) { +    if (DoneWritingDeclsAndTypes) { +      assert(0 && "New type seen after serializing all the types to emit!"); +      return TypeIdx(); +    } +      // We haven't seen this type before. Assign it a new ID and put it      // into the queue of types to emit.      Idx = TypeIdx(NextTypeID++); @@ -3835,6 +3876,11 @@ DeclID ASTWriter::GetDeclRef(const Decl *D) {    assert(!(reinterpret_cast<uintptr_t>(D) & 0x01) && "Invalid decl pointer");    DeclID &ID = DeclIDs[D];    if (ID == 0) { +    if (DoneWritingDeclsAndTypes) { +      assert(0 && "New decl seen after serializing all the decls to emit!"); +      return 0; +    } +      // We haven't seen this declaration before. Give it a new ID and      // enqueue it in the list of declarations to emit.      ID = NextDeclID++; @@ -4148,7 +4194,7 @@ void ASTWriter::AddTemplateArgument(const TemplateArgument &Arg,      AddDeclRef(Arg.getAsDecl(), Record);      break;    case TemplateArgument::Integral: -    AddAPSInt(*Arg.getAsIntegral(), Record); +    AddAPSInt(Arg.getAsIntegral(), Record);      AddTypeRef(Arg.getIntegralType(), Record);      break;    case TemplateArgument::Template: @@ -4310,14 +4356,11 @@ void ASTWriter::AddCXXDefinitionData(const CXXRecordDecl *D, RecordDataImpl &Rec    Record.push_back(Data.HasPublicFields);    Record.push_back(Data.HasMutableFields);    Record.push_back(Data.HasOnlyCMembers); +  Record.push_back(Data.HasInClassInitializer);    Record.push_back(Data.HasTrivialDefaultConstructor);    Record.push_back(Data.HasConstexprNonCopyMoveConstructor);    Record.push_back(Data.DefaultedDefaultConstructorIsConstexpr); -  Record.push_back(Data.DefaultedCopyConstructorIsConstexpr); -  Record.push_back(Data.DefaultedMoveConstructorIsConstexpr);    Record.push_back(Data.HasConstexprDefaultConstructor); -  Record.push_back(Data.HasConstexprCopyConstructor); -  Record.push_back(Data.HasConstexprMoveConstructor);    Record.push_back(Data.HasTrivialCopyConstructor);    Record.push_back(Data.HasTrivialMoveConstructor);    Record.push_back(Data.HasTrivialCopyAssignment); @@ -4459,6 +4502,7 @@ void ASTWriter::AddedVisibleDecl(const DeclContext *DC, const Decl *D) {      return; // Not a source decl added to a DeclContext from PCH.    AddUpdatedDeclContext(DC); +  UpdatingVisibleDecls.push_back(D);  }  void ASTWriter::AddedCXXImplicitMember(const CXXRecordDecl *RD, const Decl *D) {  | 
