diff options
| author | Dimitry Andric <dim@FreeBSD.org> | 2013-06-10 20:45:12 +0000 | 
|---|---|---|
| committer | Dimitry Andric <dim@FreeBSD.org> | 2013-06-10 20:45:12 +0000 | 
| commit | 6a0372513edbc473b538d2f724efac50405d6fef (patch) | |
| tree | 8f7776b7310bebaf415ac5b69e46e9f928c37144 /lib/Serialization/ASTWriter.cpp | |
| parent | 809500fc2c13c8173a16b052304d983864e4a1e1 (diff) | |
Notes
Diffstat (limited to 'lib/Serialization/ASTWriter.cpp')
| -rw-r--r-- | lib/Serialization/ASTWriter.cpp | 83 | 
1 files changed, 60 insertions, 23 deletions
diff --git a/lib/Serialization/ASTWriter.cpp b/lib/Serialization/ASTWriter.cpp index cf93d1cf01a7..b8ada04e5d8a 100644 --- a/lib/Serialization/ASTWriter.cpp +++ b/lib/Serialization/ASTWriter.cpp @@ -245,6 +245,9 @@ void ASTTypeWriter::VisitUnaryTransformType(const UnaryTransformType *T) {  void ASTTypeWriter::VisitAutoType(const AutoType *T) {    Writer.AddTypeRef(T->getDeducedType(), Record); +  Record.push_back(T->isDecltypeAuto()); +  if (T->getDeducedType().isNull()) +    Record.push_back(T->isDependentType());    Code = TYPE_AUTO;  } @@ -907,6 +910,7 @@ void ASTWriter::WriteBlockInfoBlock() {    RECORD(DECL_OBJC_PROPERTY);    RECORD(DECL_OBJC_PROPERTY_IMPL);    RECORD(DECL_FIELD); +  RECORD(DECL_MS_PROPERTY);    RECORD(DECL_VAR);    RECORD(DECL_IMPLICIT_PARAM);    RECORD(DECL_PARM_VAR); @@ -1069,6 +1073,7 @@ void ASTWriter::WriteControlBlock(Preprocessor &PP, ASTContext &Context,         I != IEnd; ++I) {      AddString(*I, Record);    } +  Record.push_back(LangOpts.CommentOpts.ParseAllComments);    Stream.EmitRecord(LANGUAGE_OPTIONS, Record); @@ -1167,6 +1172,8 @@ void ASTWriter::WriteControlBlock(Preprocessor &PP, ASTContext &Context,      AddString(PPOpts.MacroIncludes[I], Record);    Record.push_back(PPOpts.UsePredefines); +  // Detailed record is important since it is used for the module cache hash. +  Record.push_back(PPOpts.DetailedRecord);    AddString(PPOpts.ImplicitPCHInclude, Record);    AddString(PPOpts.ImplicitPTHInclude, Record);    Record.push_back(static_cast<unsigned>(PPOpts.ObjCXXARCStandardLibrary)); @@ -2005,18 +2012,7 @@ void ASTWriter::WritePreprocessor(const Preprocessor &PP, bool IsModule) {        // tokens in it because they are created by the parser, and thus can't        // be in a macro definition.        const Token &Tok = MI->getReplacementToken(TokNo); - -      Record.push_back(Tok.getLocation().getRawEncoding()); -      Record.push_back(Tok.getLength()); - -      // FIXME: When reading literal tokens, reconstruct the literal pointer -      // if it is needed. -      AddIdentifierRef(Tok.getIdentifierInfo(), Record); -      // FIXME: Should translate token kind to a stable encoding. -      Record.push_back(Tok.getKind()); -      // FIXME: Should translate token flags to a stable encoding. -      Record.push_back(Tok.getFlags()); - +      AddToken(Tok, Record);        Stream.EmitRecord(PP_TOKEN, Record);        Record.clear();      } @@ -2690,11 +2686,11 @@ public:      clang::io::Emit16(Out, KeyLen);      unsigned DataLen = 4 + 2 + 2; // 2 bytes for each of the method counts      for (const ObjCMethodList *Method = &Methods.Instance; Method; -         Method = Method->Next) +         Method = Method->getNext())        if (Method->Method)          DataLen += 4;      for (const ObjCMethodList *Method = &Methods.Factory; Method; -         Method = Method->Next) +         Method = Method->getNext())        if (Method->Method)          DataLen += 4;      clang::io::Emit16(Out, DataLen); @@ -2720,24 +2716,31 @@ public:      clang::io::Emit32(Out, Methods.ID);      unsigned NumInstanceMethods = 0;      for (const ObjCMethodList *Method = &Methods.Instance; Method; -         Method = Method->Next) +         Method = Method->getNext())        if (Method->Method)          ++NumInstanceMethods;      unsigned NumFactoryMethods = 0;      for (const ObjCMethodList *Method = &Methods.Factory; Method; -         Method = Method->Next) +         Method = Method->getNext())        if (Method->Method)          ++NumFactoryMethods; -    clang::io::Emit16(Out, NumInstanceMethods); -    clang::io::Emit16(Out, NumFactoryMethods); +    unsigned InstanceBits = Methods.Instance.getBits(); +    assert(InstanceBits < 4); +    unsigned NumInstanceMethodsAndBits = +        (NumInstanceMethods << 2) | InstanceBits; +    unsigned FactoryBits = Methods.Factory.getBits(); +    assert(FactoryBits < 4); +    unsigned NumFactoryMethodsAndBits = (NumFactoryMethods << 2) | FactoryBits; +    clang::io::Emit16(Out, NumInstanceMethodsAndBits); +    clang::io::Emit16(Out, NumFactoryMethodsAndBits);      for (const ObjCMethodList *Method = &Methods.Instance; Method; -         Method = Method->Next) +         Method = Method->getNext())        if (Method->Method)          clang::io::Emit32(Out, Writer.getDeclID(Method->Method));      for (const ObjCMethodList *Method = &Methods.Factory; Method; -         Method = Method->Next) +         Method = Method->getNext())        if (Method->Method)          clang::io::Emit32(Out, Writer.getDeclID(Method->Method)); @@ -2786,12 +2789,12 @@ void ASTWriter::WriteSelectors(Sema &SemaRef) {          // Selector already exists. Did it change?          bool changed = false;          for (ObjCMethodList *M = &Data.Instance; !changed && M && M->Method; -             M = M->Next) { +             M = M->getNext()) {            if (!M->Method->isFromASTFile())              changed = true;          }          for (ObjCMethodList *M = &Data.Factory; !changed && M && M->Method; -             M = M->Next) { +             M = M->getNext()) {            if (!M->Method->isFromASTFile())              changed = true;          } @@ -3096,7 +3099,28 @@ public:      for (SmallVector<Decl *, 16>::reverse_iterator D = Decls.rbegin(),                                                  DEnd = Decls.rend();           D != DEnd; ++D) -      clang::io::Emit32(Out, Writer.getDeclID(*D)); +      clang::io::Emit32(Out, Writer.getDeclID(getMostRecentLocalDecl(*D))); +  } + +  /// \brief Returns the most recent local decl or the given decl if there are +  /// no local ones. The given decl is assumed to be the most recent one. +  Decl *getMostRecentLocalDecl(Decl *Orig) { +    // The only way a "from AST file" decl would be more recent from a local one +    // is if it came from a module. +    if (!PP.getLangOpts().Modules) +      return Orig; + +    // Look for a local in the decl chain. +    for (Decl *D = Orig; D; D = D->getPreviousDecl()) { +      if (!D->isFromASTFile()) +        return D; +      // If we come up a decl from a (chained-)PCH stop since we won't find a +      // local one. +      if (D->getOwningModuleID() == 0) +        break; +    } + +    return Orig;    }  };  } // end anonymous namespace @@ -3626,6 +3650,19 @@ void ASTWriter::WriteAttributes(ArrayRef<const Attr*> Attrs,    }  } +void ASTWriter::AddToken(const Token &Tok, RecordDataImpl &Record) { +  AddSourceLocation(Tok.getLocation(), Record); +  Record.push_back(Tok.getLength()); + +  // FIXME: When reading literal tokens, reconstruct the literal pointer +  // if it is needed. +  AddIdentifierRef(Tok.getIdentifierInfo(), Record); +  // FIXME: Should translate token kind to a stable encoding. +  Record.push_back(Tok.getKind()); +  // FIXME: Should translate token flags to a stable encoding. +  Record.push_back(Tok.getFlags()); +} +  void ASTWriter::AddString(StringRef Str, RecordDataImpl &Record) {    Record.push_back(Str.size());    Record.insert(Record.end(), Str.begin(), Str.end());  | 
