diff options
| author | Dimitry Andric <dim@FreeBSD.org> | 2011-07-17 15:40:56 +0000 | 
|---|---|---|
| committer | Dimitry Andric <dim@FreeBSD.org> | 2011-07-17 15:40:56 +0000 | 
| commit | 180abc3db9ae3b4fc63cd65b15697e6ffcc8a657 (patch) | |
| tree | 2097d084eb235c0b12c0bff3445f4ec7bbaa8a12 /lib/Serialization | |
| parent | 29cafa66ad3878dbb9f82615f19fa0bded2e443c (diff) | |
Diffstat (limited to 'lib/Serialization')
| -rw-r--r-- | lib/Serialization/ASTReader.cpp | 77 | ||||
| -rw-r--r-- | lib/Serialization/ASTReaderDecl.cpp | 1 | ||||
| -rw-r--r-- | lib/Serialization/ASTReaderStmt.cpp | 263 | ||||
| -rw-r--r-- | lib/Serialization/ASTWriter.cpp | 63 | ||||
| -rw-r--r-- | lib/Serialization/ASTWriterDecl.cpp | 22 | ||||
| -rw-r--r-- | lib/Serialization/ASTWriterStmt.cpp | 228 | ||||
| -rw-r--r-- | lib/Serialization/ChainedIncludesSource.cpp | 3 | 
7 files changed, 327 insertions, 330 deletions
diff --git a/lib/Serialization/ASTReader.cpp b/lib/Serialization/ASTReader.cpp index 8fb20d22b7de..a4ed5f4da48c 100644 --- a/lib/Serialization/ASTReader.cpp +++ b/lib/Serialization/ASTReader.cpp @@ -147,9 +147,11 @@ PCHValidator::ReadLanguageOptions(const LangOptions &LangOpts) {    PARSE_LANGOPT_IMPORTANT(OpenCL, diag::warn_pch_opencl);    PARSE_LANGOPT_IMPORTANT(CUDA, diag::warn_pch_cuda);    PARSE_LANGOPT_BENIGN(CatchUndefined); +  PARSE_LANGOPT_BENIGN(DefaultFPContract);    PARSE_LANGOPT_IMPORTANT(ElideConstructors, diag::warn_pch_elide_constructors);    PARSE_LANGOPT_BENIGN(SpellChecking); -  PARSE_LANGOPT_BENIGN(DefaultFPContract); +  PARSE_LANGOPT_IMPORTANT(ObjCAutoRefCount, diag::warn_pch_auto_ref_count); +  PARSE_LANGOPT_BENIGN(ObjCInferRelatedReturnType);  #undef PARSE_LANGOPT_IMPORTANT  #undef PARSE_LANGOPT_BENIGN @@ -655,7 +657,8 @@ public:        // and associate it with the persistent ID.        IdentifierInfo *II = KnownII;        if (!II) -        II = &Reader.getIdentifierTable().getOwn(k.first, k.first + k.second); +        II = &Reader.getIdentifierTable().getOwn(llvm::StringRef(k.first, +                                                                 k.second));        Reader.SetIdentifierInfo(ID, II);        II->setIsFromAST();        return II; @@ -682,7 +685,8 @@ public:      // the new IdentifierInfo.      IdentifierInfo *II = KnownII;      if (!II) -      II = &Reader.getIdentifierTable().getOwn(k.first, k.first + k.second); +      II = &Reader.getIdentifierTable().getOwn(llvm::StringRef(k.first, +                                                               k.second));      Reader.SetIdentifierInfo(ID, II);      // Set or check the various bits in the IdentifierInfo structure. @@ -999,8 +1003,7 @@ bool ASTReader::ParseLineTable(PerFileData &F,      std::string Filename(&Record[Idx], &Record[Idx] + FilenameLen);      Idx += FilenameLen;      MaybeAddSystemRootToFilename(Filename); -    FileIDs[I] = LineTable.getLineTableFilenameID(Filename.c_str(), -                                                  Filename.size()); +    FileIDs[I] = LineTable.getLineTableFilenameID(Filename);    }    // Parse the line entries @@ -1192,7 +1195,7 @@ ASTReader::ASTReadResult ASTReader::ReadSourceManagerBlock(PerFileData &F) {      case SM_SLOC_FILE_ENTRY:      case SM_SLOC_BUFFER_ENTRY: -    case SM_SLOC_INSTANTIATION_ENTRY: +    case SM_SLOC_EXPANSION_ENTRY:        // Once we hit one of the source location entries, we're done.        return Success;      } @@ -1362,7 +1365,7 @@ ASTReader::ASTReadResult ASTReader::ReadSLocEntryRecord(unsigned ID) {      break;    } -  case SM_SLOC_INSTANTIATION_ENTRY: { +  case SM_SLOC_EXPANSION_ENTRY: {      SourceLocation SpellingLoc = ReadSourceLocation(*F, Record[1]);      SourceMgr.createInstantiationLoc(SpellingLoc,                                       ReadSourceLocation(*F, Record[2]), @@ -1553,17 +1556,17 @@ PreprocessedEntity *ASTReader::LoadPreprocessedEntity(PerFileData &F) {      (PreprocessorDetailRecordTypes)F.PreprocessorDetailCursor.ReadRecord(                                               Code, Record, BlobStart, BlobLen);    switch (RecType) { -  case PPD_MACRO_INSTANTIATION: { +  case PPD_MACRO_EXPANSION: {      if (PreprocessedEntity *PE = PPRec.getPreprocessedEntity(Record[0]))        return PE; -    MacroInstantiation *MI -      = new (PPRec) MacroInstantiation(DecodeIdentifierInfo(Record[3]), +    MacroExpansion *ME = +      new (PPRec) MacroExpansion(DecodeIdentifierInfo(Record[3]),                                   SourceRange(ReadSourceLocation(F, Record[1]),                                               ReadSourceLocation(F, Record[2])), -                                       getMacroDefinition(Record[4])); -    PPRec.SetPreallocatedEntity(Record[0], MI); -    return MI; +                                 getMacroDefinition(Record[4])); +    PPRec.SetPreallocatedEntity(Record[0], ME); +    return ME;    }    case PPD_MACRO_DEFINITION: { @@ -2366,6 +2369,15 @@ ASTReader::ReadASTBlock(PerFileData &F) {          TentativeDefinitions.insert(TentativeDefinitions.end(),                                      Record.begin(), Record.end());        break; +         +    case KNOWN_NAMESPACES: +      // Optimization for the first block. +      if (KnownNamespaces.empty()) +        KnownNamespaces.swap(Record); +      else +        KnownNamespaces.insert(KnownNamespaces.end(),  +                               Record.begin(), Record.end()); +      break;      }      First = false;    } @@ -2980,6 +2992,7 @@ bool ASTReader::ParseLanguageOptions(      PARSE_LANGOPT(ElideConstructors);      PARSE_LANGOPT(SpellChecking);      PARSE_LANGOPT(MRTD); +    PARSE_LANGOPT(ObjCAutoRefCount);    #undef PARSE_LANGOPT      return Listener->ReadLanguageOptions(LangOpts); @@ -3225,12 +3238,13 @@ QualType ASTReader::ReadTypeRecord(unsigned Index) {    }    case TYPE_FUNCTION_NO_PROTO: { -    if (Record.size() != 5) { +    if (Record.size() != 6) {        Error("incorrect encoding of no-proto function type");        return QualType();      }      QualType ResultType = GetType(Record[0]); -    FunctionType::ExtInfo Info(Record[1], Record[2], Record[3], (CallingConv)Record[4]); +    FunctionType::ExtInfo Info(Record[1], Record[2], Record[3], +                               (CallingConv)Record[4], Record[5]);      return Context->getFunctionNoProtoType(ResultType, Info);    } @@ -3241,9 +3255,10 @@ QualType ASTReader::ReadTypeRecord(unsigned Index) {      EPI.ExtInfo = FunctionType::ExtInfo(/*noreturn*/ Record[1],                                          /*hasregparm*/ Record[2],                                          /*regparm*/ Record[3], -                                        static_cast<CallingConv>(Record[4])); +                                        static_cast<CallingConv>(Record[4]), +                                        /*produces*/ Record[5]); -    unsigned Idx = 5; +    unsigned Idx = 6;      unsigned NumParams = Record[Idx++];      llvm::SmallVector<QualType, 16> ParamTypes;      for (unsigned I = 0; I != NumParams; ++I) @@ -3993,12 +4008,9 @@ Stmt *ASTReader::GetExternalDeclStmt(uint64_t Offset) {    llvm_unreachable("Broken chain");  } -bool ASTReader::FindExternalLexicalDecls(const DeclContext *DC, +ExternalLoadResult ASTReader::FindExternalLexicalDecls(const DeclContext *DC,                                           bool (*isKindWeWant)(Decl::Kind),                                           llvm::SmallVectorImpl<Decl*> &Decls) { -  assert(DC->hasExternalLexicalStorage() && -         "DeclContext has no lexical decls in storage"); -    // There might be lexical decls in multiple parts of the chain, for the TU    // at least.    // DeclContextOffsets might reallocate as we load additional decls below, @@ -4023,7 +4035,7 @@ bool ASTReader::FindExternalLexicalDecls(const DeclContext *DC,    }    ++NumLexicalDeclContextsRead; -  return false; +  return ELR_Success;  }  DeclContext::lookup_result @@ -4446,6 +4458,17 @@ ASTReader::ReadMethodPool(Selector Sel) {    return std::pair<ObjCMethodList, ObjCMethodList>();  } +void ASTReader::ReadKnownNamespaces( +                          llvm::SmallVectorImpl<NamespaceDecl *> &Namespaces) { +  Namespaces.clear(); +   +  for (unsigned I = 0, N = KnownNamespaces.size(); I != N; ++I) { +    if (NamespaceDecl *Namespace  +                = dyn_cast_or_null<NamespaceDecl>(GetDecl(KnownNamespaces[I]))) +      Namespaces.push_back(Namespace); +  } +} +  void ASTReader::LoadSelector(Selector Sel) {    // It would be complicated to avoid reading the methods anyway. So don't.    ReadMethodPool(Sel); @@ -4540,7 +4563,7 @@ IdentifierInfo *ASTReader::DecodeIdentifierInfo(unsigned ID) {      unsigned StrLen = (((unsigned) StrLenPtr[0])                         | (((unsigned) StrLenPtr[1]) << 8)) - 1;      IdentifiersLoaded[ID] -      = &PP->getIdentifierTable().get(Str, StrLen); +      = &PP->getIdentifierTable().get(llvm::StringRef(Str, StrLen));      if (DeserializationListener)        DeserializationListener->IdentifierRead(ID + 1, IdentifiersLoaded[ID]);    } @@ -4716,6 +4739,14 @@ ASTReader::ReadTemplateName(PerFileData &F, const RecordData &Record,      return Context->getDependentTemplateName(NNS,                                           (OverloadedOperatorKind)Record[Idx++]);    } + +  case TemplateName::SubstTemplateTemplateParm: { +    TemplateTemplateParmDecl *param +      = cast_or_null<TemplateTemplateParmDecl>(GetDecl(Record[Idx++])); +    if (!param) return TemplateName(); +    TemplateName replacement = ReadTemplateName(F, Record, Idx); +    return Context->getSubstTemplateTemplateParm(param, replacement); +  }    case TemplateName::SubstTemplateTemplateParmPack: {      TemplateTemplateParmDecl *Param  diff --git a/lib/Serialization/ASTReaderDecl.cpp b/lib/Serialization/ASTReaderDecl.cpp index fab2069bc5f4..24ab544dcd1c 100644 --- a/lib/Serialization/ASTReaderDecl.cpp +++ b/lib/Serialization/ASTReaderDecl.cpp @@ -710,6 +710,7 @@ void ASTDeclReader::VisitVarDecl(VarDecl *VD) {    VD->VarDeclBits.ExceptionVar = Record[Idx++];    VD->VarDeclBits.NRVOVariable = Record[Idx++];    VD->VarDeclBits.CXXForRangeDecl = Record[Idx++]; +  VD->VarDeclBits.ARCPseudoStrong = Record[Idx++];    if (Record[Idx++])      VD->setInit(Reader.ReadExpr(F)); diff --git a/lib/Serialization/ASTReaderStmt.cpp b/lib/Serialization/ASTReaderStmt.cpp index f3f67a76c4d4..14927b9e3bc8 100644 --- a/lib/Serialization/ASTReaderStmt.cpp +++ b/lib/Serialization/ASTReaderStmt.cpp @@ -60,136 +60,16 @@ namespace clang {      /// \brief The number of record fields required for the Expr class      /// itself. -    static const unsigned NumExprFields = NumStmtFields + 6; +    static const unsigned NumExprFields = NumStmtFields + 7;      /// \brief Read and initialize a ExplicitTemplateArgumentList structure.      void ReadExplicitTemplateArgumentList(ExplicitTemplateArgumentList &ArgList,                                            unsigned NumTemplateArgs);      void VisitStmt(Stmt *S); -    void VisitNullStmt(NullStmt *S); -    void VisitCompoundStmt(CompoundStmt *S); -    void VisitSwitchCase(SwitchCase *S); -    void VisitCaseStmt(CaseStmt *S); -    void VisitDefaultStmt(DefaultStmt *S); -    void VisitLabelStmt(LabelStmt *S); -    void VisitIfStmt(IfStmt *S); -    void VisitSwitchStmt(SwitchStmt *S); -    void VisitWhileStmt(WhileStmt *S); -    void VisitDoStmt(DoStmt *S); -    void VisitForStmt(ForStmt *S); -    void VisitGotoStmt(GotoStmt *S); -    void VisitIndirectGotoStmt(IndirectGotoStmt *S); -    void VisitContinueStmt(ContinueStmt *S); -    void VisitBreakStmt(BreakStmt *S); -    void VisitReturnStmt(ReturnStmt *S); -    void VisitDeclStmt(DeclStmt *S); -    void VisitAsmStmt(AsmStmt *S); -    void VisitExpr(Expr *E); -    void VisitPredefinedExpr(PredefinedExpr *E); -    void VisitDeclRefExpr(DeclRefExpr *E); -    void VisitIntegerLiteral(IntegerLiteral *E); -    void VisitFloatingLiteral(FloatingLiteral *E); -    void VisitImaginaryLiteral(ImaginaryLiteral *E); -    void VisitStringLiteral(StringLiteral *E); -    void VisitCharacterLiteral(CharacterLiteral *E); -    void VisitParenExpr(ParenExpr *E); -    void VisitParenListExpr(ParenListExpr *E); -    void VisitUnaryOperator(UnaryOperator *E); -    void VisitOffsetOfExpr(OffsetOfExpr *E); -    void VisitUnaryExprOrTypeTraitExpr(UnaryExprOrTypeTraitExpr *E); -    void VisitArraySubscriptExpr(ArraySubscriptExpr *E); -    void VisitCallExpr(CallExpr *E); -    void VisitMemberExpr(MemberExpr *E); -    void VisitCastExpr(CastExpr *E); -    void VisitBinaryOperator(BinaryOperator *E); -    void VisitCompoundAssignOperator(CompoundAssignOperator *E); -    void VisitConditionalOperator(ConditionalOperator *E); -    void VisitBinaryConditionalOperator(BinaryConditionalOperator *E); -    void VisitImplicitCastExpr(ImplicitCastExpr *E); -    void VisitExplicitCastExpr(ExplicitCastExpr *E); -    void VisitCStyleCastExpr(CStyleCastExpr *E); -    void VisitCompoundLiteralExpr(CompoundLiteralExpr *E); -    void VisitExtVectorElementExpr(ExtVectorElementExpr *E); -    void VisitInitListExpr(InitListExpr *E); -    void VisitDesignatedInitExpr(DesignatedInitExpr *E); -    void VisitImplicitValueInitExpr(ImplicitValueInitExpr *E); -    void VisitVAArgExpr(VAArgExpr *E); -    void VisitAddrLabelExpr(AddrLabelExpr *E); -    void VisitStmtExpr(StmtExpr *E); -    void VisitChooseExpr(ChooseExpr *E); -    void VisitGNUNullExpr(GNUNullExpr *E); -    void VisitShuffleVectorExpr(ShuffleVectorExpr *E); -    void VisitBlockExpr(BlockExpr *E); -    void VisitBlockDeclRefExpr(BlockDeclRefExpr *E); -    void VisitGenericSelectionExpr(GenericSelectionExpr *E); -    void VisitObjCStringLiteral(ObjCStringLiteral *E); -    void VisitObjCEncodeExpr(ObjCEncodeExpr *E); -    void VisitObjCSelectorExpr(ObjCSelectorExpr *E); -    void VisitObjCProtocolExpr(ObjCProtocolExpr *E); -    void VisitObjCIvarRefExpr(ObjCIvarRefExpr *E); -    void VisitObjCPropertyRefExpr(ObjCPropertyRefExpr *E); -    void VisitObjCMessageExpr(ObjCMessageExpr *E); -    void VisitObjCIsaExpr(ObjCIsaExpr *E); - -    void VisitObjCForCollectionStmt(ObjCForCollectionStmt *); -    void VisitObjCAtCatchStmt(ObjCAtCatchStmt *); -    void VisitObjCAtFinallyStmt(ObjCAtFinallyStmt *); -    void VisitObjCAtTryStmt(ObjCAtTryStmt *); -    void VisitObjCAtSynchronizedStmt(ObjCAtSynchronizedStmt *); -    void VisitObjCAtThrowStmt(ObjCAtThrowStmt *); - -    // C++ Statements -    void VisitCXXCatchStmt(CXXCatchStmt *S); -    void VisitCXXTryStmt(CXXTryStmt *S); -    void VisitCXXForRangeStmt(CXXForRangeStmt *); - -    void VisitCXXOperatorCallExpr(CXXOperatorCallExpr *E); -    void VisitCXXConstructExpr(CXXConstructExpr *E); -    void VisitCXXTemporaryObjectExpr(CXXTemporaryObjectExpr *E); -    void VisitCXXNamedCastExpr(CXXNamedCastExpr *E); -    void VisitCXXStaticCastExpr(CXXStaticCastExpr *E); -    void VisitCXXDynamicCastExpr(CXXDynamicCastExpr *E); -    void VisitCXXReinterpretCastExpr(CXXReinterpretCastExpr *E); -    void VisitCXXConstCastExpr(CXXConstCastExpr *E); -    void VisitCXXFunctionalCastExpr(CXXFunctionalCastExpr *E); -    void VisitCXXBoolLiteralExpr(CXXBoolLiteralExpr *E); -    void VisitCXXNullPtrLiteralExpr(CXXNullPtrLiteralExpr *E); -    void VisitCXXTypeidExpr(CXXTypeidExpr *E); -    void VisitCXXUuidofExpr(CXXUuidofExpr *E); -    void VisitCXXThisExpr(CXXThisExpr *E); -    void VisitCXXThrowExpr(CXXThrowExpr *E); -    void VisitCXXDefaultArgExpr(CXXDefaultArgExpr *E); -    void VisitCXXBindTemporaryExpr(CXXBindTemporaryExpr *E); -     -    void VisitCXXScalarValueInitExpr(CXXScalarValueInitExpr *E); -    void VisitCXXNewExpr(CXXNewExpr *E); -    void VisitCXXDeleteExpr(CXXDeleteExpr *E); -    void VisitCXXPseudoDestructorExpr(CXXPseudoDestructorExpr *E); -     -    void VisitExprWithCleanups(ExprWithCleanups *E); -     -    void VisitCXXDependentScopeMemberExpr(CXXDependentScopeMemberExpr *E); -    void VisitDependentScopeDeclRefExpr(DependentScopeDeclRefExpr *E); -    void VisitCXXUnresolvedConstructExpr(CXXUnresolvedConstructExpr *E); - -    void VisitOverloadExpr(OverloadExpr *E); -    void VisitUnresolvedMemberExpr(UnresolvedMemberExpr *E); -    void VisitUnresolvedLookupExpr(UnresolvedLookupExpr *E); - -    void VisitUnaryTypeTraitExpr(UnaryTypeTraitExpr *E); -    void VisitBinaryTypeTraitExpr(BinaryTypeTraitExpr *E); -    void VisitArrayTypeTraitExpr(ArrayTypeTraitExpr *E); -    void VisitExpressionTraitExpr(ExpressionTraitExpr *E); -    void VisitCXXNoexceptExpr(CXXNoexceptExpr *E); -    void VisitPackExpansionExpr(PackExpansionExpr *E); -    void VisitSizeOfPackExpr(SizeOfPackExpr *E); -    void VisitSubstNonTypeTemplateParmPackExpr( -                                           SubstNonTypeTemplateParmPackExpr *E); -    void VisitOpaqueValueExpr(OpaqueValueExpr *E); -     -    // CUDA Expressions -    void VisitCUDAKernelCallExpr(CUDAKernelCallExpr *E);     +#define STMT(Type, Base) \ +    void Visit##Type(Type *); +#include "clang/AST/StmtNodes.inc"    };  } @@ -410,6 +290,7 @@ void ASTStmtReader::VisitExpr(Expr *E) {    E->setType(Reader.GetType(Record[Idx++]));    E->setTypeDependent(Record[Idx++]);    E->setValueDependent(Record[Idx++]); +  E->setInstantiationDependent(Record[Idx++]);    E->ExprBits.ContainsUnexpandedParameterPack = Record[Idx++];    E->setValueKind(static_cast<ExprValueKind>(Record[Idx++]));    E->setObjectKind(static_cast<ExprObjectKind>(Record[Idx++])); @@ -589,6 +470,10 @@ void ASTStmtReader::VisitCallExpr(CallExpr *E) {      E->setArg(I, Reader.ReadSubExpr());  } +void ASTStmtReader::VisitCXXMemberCallExpr(CXXMemberCallExpr *E) { +  VisitCallExpr(E); +} +  void ASTStmtReader::VisitMemberExpr(MemberExpr *E) {    // Don't call VisitExpr, this is fully initialized at creation.    assert(E->getStmtClass() == Stmt::MemberExprClass && @@ -602,6 +487,20 @@ void ASTStmtReader::VisitObjCIsaExpr(ObjCIsaExpr *E) {    E->setArrow(Record[Idx++]);  } +void ASTStmtReader:: +VisitObjCIndirectCopyRestoreExpr(ObjCIndirectCopyRestoreExpr *E) { +  VisitExpr(E); +  E->Operand = Reader.ReadSubExpr(); +  E->setShouldCopy(Record[Idx++]); +} + +void ASTStmtReader::VisitObjCBridgedCastExpr(ObjCBridgedCastExpr *E) { +  VisitExplicitCastExpr(E); +  E->LParenLoc = ReadSourceLocation(Record, Idx); +  E->BridgeKeywordLoc = ReadSourceLocation(Record, Idx); +  E->Kind = Record[Idx++]; +} +  void ASTStmtReader::VisitCastExpr(CastExpr *E) {    VisitExpr(E);    unsigned NumBaseSpecs = Record[Idx++]; @@ -929,6 +828,7 @@ void ASTStmtReader::VisitObjCMessageExpr(ObjCMessageExpr *E) {    VisitExpr(E);    assert(Record[Idx] == E->getNumArgs());    ++Idx; +  E->setDelegateInitCall(Record[Idx++]);    ObjCMessageExpr::ReceiverKind Kind      = static_cast<ObjCMessageExpr::ReceiverKind>(Record[Idx++]);    switch (Kind) { @@ -987,6 +887,12 @@ void ASTStmtReader::VisitObjCAtFinallyStmt(ObjCAtFinallyStmt *S) {    S->setAtFinallyLoc(ReadSourceLocation(Record, Idx));  } +void ASTStmtReader::VisitObjCAutoreleasePoolStmt(ObjCAutoreleasePoolStmt *S) { +  VisitStmt(S); +  S->setSubStmt(Reader.ReadSubStmt()); +  S->setAtLoc(ReadSourceLocation(Record, Idx)); +} +  void ASTStmtReader::VisitObjCAtTryStmt(ObjCAtTryStmt *S) {    VisitStmt(S);    assert(Record[Idx] == S->getNumCatchStmts()); @@ -1125,18 +1031,6 @@ void ASTStmtReader::VisitCXXTypeidExpr(CXXTypeidExpr *E) {    // typeid(42+2)    E->setExprOperand(Reader.ReadSubExpr());  } -void ASTStmtReader::VisitCXXUuidofExpr(CXXUuidofExpr *E) { -  VisitExpr(E); -  E->setSourceRange(ReadSourceRange(Record, Idx)); -  if (E->isTypeOperand()) { // __uuidof(ComType) -    E->setTypeOperandSourceInfo( -        GetTypeSourceInfo(Record, Idx)); -    return; -  } -   -  // __uuidof(expr) -  E->setExprOperand(Reader.ReadSubExpr()); -}  void ASTStmtReader::VisitCXXThisExpr(CXXThisExpr *E) {    VisitExpr(E); @@ -1146,8 +1040,9 @@ void ASTStmtReader::VisitCXXThisExpr(CXXThisExpr *E) {  void ASTStmtReader::VisitCXXThrowExpr(CXXThrowExpr *E) {    VisitExpr(E); -  E->setThrowLoc(ReadSourceLocation(Record, Idx)); -  E->setSubExpr(Reader.ReadSubExpr()); +  E->ThrowLoc = ReadSourceLocation(Record, Idx); +  E->Op = Reader.ReadSubExpr(); +  E->IsThrownVariableInScope = Record[Idx++];  }  void ASTStmtReader::VisitCXXDefaultArgExpr(CXXDefaultArgExpr *E) { @@ -1388,6 +1283,15 @@ void ASTStmtReader::VisitSizeOfPackExpr(SizeOfPackExpr *E) {    E->Pack = cast_or_null<NamedDecl>(Reader.GetDecl(Record[Idx++]));  } +void ASTStmtReader::VisitSubstNonTypeTemplateParmExpr( +                                              SubstNonTypeTemplateParmExpr *E) { +  VisitExpr(E); +  E->Param +    = cast_or_null<NonTypeTemplateParmDecl>(Reader.GetDecl(Record[Idx++])); +  E->NameLoc = ReadSourceLocation(Record, Idx); +  E->Replacement = Reader.ReadSubExpr(); +} +  void ASTStmtReader::VisitSubstNonTypeTemplateParmPackExpr(                                            SubstNonTypeTemplateParmPackExpr *E) {    VisitExpr(E); @@ -1402,6 +1306,11 @@ void ASTStmtReader::VisitSubstNonTypeTemplateParmPackExpr(    E->NameLoc = ReadSourceLocation(Record, Idx);  } +void ASTStmtReader::VisitMaterializeTemporaryExpr(MaterializeTemporaryExpr *E) { +  VisitExpr(E); +  E->Temporary = Reader.ReadSubExpr(); +} +  void ASTStmtReader::VisitOpaqueValueExpr(OpaqueValueExpr *E) {    VisitExpr(E);    Idx++; // skip ID @@ -1409,6 +1318,43 @@ void ASTStmtReader::VisitOpaqueValueExpr(OpaqueValueExpr *E) {  }  //===----------------------------------------------------------------------===// +// Microsoft Expressions and Statements +//===----------------------------------------------------------------------===// +void ASTStmtReader::VisitCXXUuidofExpr(CXXUuidofExpr *E) { +  VisitExpr(E); +  E->setSourceRange(ReadSourceRange(Record, Idx)); +  if (E->isTypeOperand()) { // __uuidof(ComType) +    E->setTypeOperandSourceInfo( +        GetTypeSourceInfo(Record, Idx)); +    return; +  } +   +  // __uuidof(expr) +  E->setExprOperand(Reader.ReadSubExpr()); +} + +void ASTStmtReader::VisitSEHExceptStmt(SEHExceptStmt *S) { +  VisitStmt(S); +  S->Loc = ReadSourceLocation(Record, Idx); +  S->Children[SEHExceptStmt::FILTER_EXPR] = Reader.ReadSubStmt(); +  S->Children[SEHExceptStmt::BLOCK] = Reader.ReadSubStmt(); +} + +void ASTStmtReader::VisitSEHFinallyStmt(SEHFinallyStmt *S) { +  VisitStmt(S); +  S->Loc = ReadSourceLocation(Record, Idx); +  S->Block = Reader.ReadSubStmt(); +} + +void ASTStmtReader::VisitSEHTryStmt(SEHTryStmt *S) { +  VisitStmt(S); +  S->IsCXXTry = Record[Idx++]; +  S->TryLoc = ReadSourceLocation(Record, Idx); +  S->Children[SEHTryStmt::TRY] = Reader.ReadSubStmt(); +  S->Children[SEHTryStmt::HANDLER] = Reader.ReadSubStmt(); +} + +//===----------------------------------------------------------------------===//  // CUDA Expressions and Statements  //===----------------------------------------------------------------------===// @@ -1417,6 +1363,20 @@ void ASTStmtReader::VisitCUDAKernelCallExpr(CUDAKernelCallExpr *E) {    E->setConfig(cast<CallExpr>(Reader.ReadSubExpr()));  } +//===----------------------------------------------------------------------===// +// OpenCL Expressions and Statements. +//===----------------------------------------------------------------------===// +void ASTStmtReader::VisitAsTypeExpr(AsTypeExpr *E) { +  VisitExpr(E); +  E->BuiltinLoc = ReadSourceLocation(Record, Idx); +  E->RParenLoc = ReadSourceLocation(Record, Idx); +  E->SrcExpr = Reader.ReadSubExpr(); +} + +//===----------------------------------------------------------------------===// +// ASTReader Implementation +//===----------------------------------------------------------------------===// +  Stmt *ASTReader::ReadStmt(PerFileData &F) {    switch (ReadingKind) {    case Read_Decl: @@ -1784,6 +1744,12 @@ Stmt *ASTReader::ReadStmtFromStream(PerFileData &F) {      case EXPR_OBJC_ISA:        S = new (Context) ObjCIsaExpr(Empty);        break; +    case EXPR_OBJC_INDIRECT_COPY_RESTORE: +      S = new (Context) ObjCIndirectCopyRestoreExpr(Empty); +      break; +    case EXPR_OBJC_BRIDGED_CAST: +      S = new (Context) ObjCBridgedCastExpr(Empty); +      break;      case STMT_OBJC_FOR_COLLECTION:        S = new (Context) ObjCForCollectionStmt(Empty);        break; @@ -1804,7 +1770,18 @@ Stmt *ASTReader::ReadStmtFromStream(PerFileData &F) {      case STMT_OBJC_AT_THROW:        S = new (Context) ObjCAtThrowStmt(Empty);        break; - +    case STMT_OBJC_AUTORELEASE_POOL: +      S = new (Context) ObjCAutoreleasePoolStmt(Empty); +      break; +    case STMT_SEH_EXCEPT: +      S = new (Context) SEHExceptStmt(Empty); +      break; +    case STMT_SEH_FINALLY: +      S = new (Context) SEHFinallyStmt(Empty); +      break; +    case STMT_SEH_TRY: +      S = new (Context) SEHTryStmt(Empty); +      break;      case STMT_CXX_CATCH:        S = new (Context) CXXCatchStmt(Empty);        break; @@ -1978,10 +1955,18 @@ Stmt *ASTReader::ReadStmtFromStream(PerFileData &F) {        S = new (Context) SizeOfPackExpr(Empty);        break; +    case EXPR_SUBST_NON_TYPE_TEMPLATE_PARM: +      S = new (Context) SubstNonTypeTemplateParmExpr(Empty); +      break; +              case EXPR_SUBST_NON_TYPE_TEMPLATE_PARM_PACK:        S = new (Context) SubstNonTypeTemplateParmPackExpr(Empty);        break; +    case EXPR_MATERIALIZE_TEMPORARY: +      S = new (Context) MaterializeTemporaryExpr(Empty); +      break; +              case EXPR_OPAQUE_VALUE: {        unsigned key = Record[ASTStmtReader::NumExprFields];        OpaqueValueExpr *&expr = OpaqueValueExprs[key]; diff --git a/lib/Serialization/ASTWriter.cpp b/lib/Serialization/ASTWriter.cpp index ba9032e0d33e..39f2fbddf80e 100644 --- a/lib/Serialization/ASTWriter.cpp +++ b/lib/Serialization/ASTWriter.cpp @@ -170,6 +170,7 @@ void ASTTypeWriter::VisitFunctionType(const FunctionType *T) {    Record.push_back(C.getRegParm());    // FIXME: need to stabilize encoding of calling convention...    Record.push_back(C.getCC()); +  Record.push_back(C.getProducesResult());  }  void ASTTypeWriter::VisitFunctionNoProtoType(const FunctionNoProtoType *T) { @@ -780,13 +781,15 @@ void ASTWriter::WriteBlockInfoBlock() {    RECORD(FP_PRAGMA_OPTIONS);    RECORD(OPENCL_EXTENSIONS);    RECORD(DELEGATING_CTORS); +  RECORD(FILE_SOURCE_LOCATION_OFFSETS); +  RECORD(KNOWN_NAMESPACES);    // SourceManager Block.    BLOCK(SOURCE_MANAGER_BLOCK);    RECORD(SM_SLOC_FILE_ENTRY);    RECORD(SM_SLOC_BUFFER_ENTRY);    RECORD(SM_SLOC_BUFFER_BLOB); -  RECORD(SM_SLOC_INSTANTIATION_ENTRY); +  RECORD(SM_SLOC_EXPANSION_ENTRY);    RECORD(SM_LINE_TABLE);    // Preprocessor Block. @@ -893,7 +896,7 @@ void ASTWriter::WriteBlockInfoBlock() {    AddStmtsExprs(Stream, Record);    BLOCK(PREPROCESSOR_DETAIL_BLOCK); -  RECORD(PPD_MACRO_INSTANTIATION); +  RECORD(PPD_MACRO_EXPANSION);    RECORD(PPD_MACRO_DEFINITION);    RECORD(PPD_INCLUSION_DIRECTIVE); @@ -1109,6 +1112,8 @@ void ASTWriter::WriteLanguageOptions(const LangOptions &LangOpts) {    Record.push_back(LangOpts.ElideConstructors);    Record.push_back(LangOpts.SpellChecking);    Record.push_back(LangOpts.MRTD); +  Record.push_back(LangOpts.ObjCAutoRefCount); +  Record.push_back(LangOpts.ObjCInferRelatedReturnType);    Stream.EmitRecord(LANGUAGE_OPTIONS, Record);  } @@ -1169,8 +1174,8 @@ void ASTWriter::WriteStatCache(MemorizeStatCalls &StatCalls) {    for (MemorizeStatCalls::iterator Stat = StatCalls.begin(),                                  StatEnd = StatCalls.end();         Stat != StatEnd; ++Stat, ++NumStatEntries) { -    const char *Filename = Stat->first(); -    Generator.insert(Filename, Stat->second); +    llvm::StringRef Filename = Stat->first(); +    Generator.insert(Filename.data(), Stat->second);    }    // Create the on-disk hash table in a buffer. @@ -1245,12 +1250,12 @@ static unsigned CreateSLocBufferBlobAbbrev(llvm::BitstreamWriter &Stream) {    return Stream.EmitAbbrev(Abbrev);  } -/// \brief Create an abbreviation for the SLocEntry that refers to an -/// buffer. -static unsigned CreateSLocInstantiationAbbrev(llvm::BitstreamWriter &Stream) { +/// \brief Create an abbreviation for the SLocEntry that refers to a macro +/// expansion. +static unsigned CreateSLocExpansionAbbrev(llvm::BitstreamWriter &Stream) {    using namespace llvm;    BitCodeAbbrev *Abbrev = new BitCodeAbbrev(); -  Abbrev->Add(BitCodeAbbrevOp(SM_SLOC_INSTANTIATION_ENTRY)); +  Abbrev->Add(BitCodeAbbrevOp(SM_SLOC_EXPANSION_ENTRY));    Abbrev->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::VBR, 8)); // Offset    Abbrev->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::VBR, 8)); // Spelling location    Abbrev->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::VBR, 8)); // Start location @@ -1409,7 +1414,7 @@ void ASTWriter::WriteSourceManagerBlock(SourceManager &SourceMgr,    unsigned SLocFileAbbrv = CreateSLocFileAbbrev(Stream);    unsigned SLocBufferAbbrv = CreateSLocBufferAbbrev(Stream);    unsigned SLocBufferBlobAbbrv = CreateSLocBufferBlobAbbrev(Stream); -  unsigned SLocInstantiationAbbrv = CreateSLocInstantiationAbbrev(Stream); +  unsigned SLocExpansionAbbrv = CreateSLocExpansionAbbrev(Stream);    // Write the line table.    if (SourceMgr.hasLineTable()) { @@ -1474,7 +1479,7 @@ void ASTWriter::WriteSourceManagerBlock(SourceManager &SourceMgr,        } else          Code = SM_SLOC_BUFFER_ENTRY;      } else -      Code = SM_SLOC_INSTANTIATION_ENTRY; +      Code = SM_SLOC_EXPANSION_ENTRY;      Record.clear();      Record.push_back(Code); @@ -1534,7 +1539,7 @@ void ASTWriter::WriteSourceManagerBlock(SourceManager &SourceMgr,            PreloadSLocs.push_back(BaseSLocID + SLocEntryOffsets.size());        }      } else { -      // The source location entry is an instantiation. +      // The source location entry is a macro expansion.        const SrcMgr::InstantiationInfo &Inst = SLoc->getInstantiation();        Record.push_back(Inst.getSpellingLoc().getRawEncoding());        Record.push_back(Inst.getInstantiationLocStart().getRawEncoding()); @@ -1545,7 +1550,7 @@ void ASTWriter::WriteSourceManagerBlock(SourceManager &SourceMgr,        if (I + 1 != N)          NextOffset = SourceMgr.getSLocEntry(I + 1).getOffset();        Record.push_back(NextOffset - SLoc->getOffset() - 1); -      Stream.EmitRecordWithAbbrev(SLocInstantiationAbbrv, Record); +      Stream.EmitRecordWithAbbrev(SLocExpansionAbbrv, Record);      }    } @@ -1795,13 +1800,13 @@ void ASTWriter::WritePreprocessorDetail(PreprocessingRecord &PPRec) {        SerializationListener->SerializedPreprocessedEntity(*E,                                                       Stream.GetCurrentBitNo()); -    if (MacroInstantiation *MI = dyn_cast<MacroInstantiation>(*E)) {           +    if (MacroExpansion *ME = dyn_cast<MacroExpansion>(*E)) {        Record.push_back(IndexBase + NumPreprocessingRecords++); -      AddSourceLocation(MI->getSourceRange().getBegin(), Record); -      AddSourceLocation(MI->getSourceRange().getEnd(), Record); -      AddIdentifierRef(MI->getName(), Record); -      Record.push_back(getMacroDefinitionID(MI->getDefinition())); -      Stream.EmitRecord(PPD_MACRO_INSTANTIATION, Record); +      AddSourceLocation(ME->getSourceRange().getBegin(), Record); +      AddSourceLocation(ME->getSourceRange().getEnd(), Record); +      AddIdentifierRef(ME->getName(), Record); +      Record.push_back(getMacroDefinitionID(ME->getDefinition())); +      Stream.EmitRecord(PPD_MACRO_EXPANSION, Record);        continue;      } @@ -2842,6 +2847,16 @@ void ASTWriter::WriteASTCore(Sema &SemaRef, MemorizeStatCalls *StatCalls,      AddDeclRef(Context.getcudaConfigureCallDecl(), CUDASpecialDeclRefs);    } +  // Build a record containing all of the known namespaces. +  RecordData KnownNamespaces; +  for (llvm::DenseMap<NamespaceDecl*, bool>::iterator  +            I = SemaRef.KnownNamespaces.begin(), +         IEnd = SemaRef.KnownNamespaces.end(); +       I != IEnd; ++I) { +    if (!I->second) +      AddDeclRef(I->first, KnownNamespaces); +  } +      // Write the remaining AST contents.    RecordData Record;    Stream.EnterSubblock(AST_BLOCK_ID, 5); @@ -2951,6 +2966,10 @@ void ASTWriter::WriteASTCore(Sema &SemaRef, MemorizeStatCalls *StatCalls,    if (!DelegatingCtorDecls.empty())      Stream.EmitRecord(DELEGATING_CTORS, DelegatingCtorDecls); +  // Write the known namespaces. +  if (!KnownNamespaces.empty()) +    Stream.EmitRecord(KNOWN_NAMESPACES, KnownNamespaces); +      // Some simple statistics    Record.clear();    Record.push_back(NumStatements); @@ -3675,6 +3694,14 @@ void ASTWriter::AddTemplateName(TemplateName Name, RecordDataImpl &Record) {        Record.push_back(DepT->getOperator());      break;    } + +  case TemplateName::SubstTemplateTemplateParm: { +    SubstTemplateTemplateParmStorage *subst +      = Name.getAsSubstTemplateTemplateParm(); +    AddDeclRef(subst->getParameter(), Record); +    AddTemplateName(subst->getReplacement(), Record); +    break; +  }    case TemplateName::SubstTemplateTemplateParmPack: {      SubstTemplateTemplateParmPackStorage *SubstPack diff --git a/lib/Serialization/ASTWriterDecl.cpp b/lib/Serialization/ASTWriterDecl.cpp index 7c24088c65ba..2b8349495751 100644 --- a/lib/Serialization/ASTWriterDecl.cpp +++ b/lib/Serialization/ASTWriterDecl.cpp @@ -645,6 +645,7 @@ void ASTDeclWriter::VisitVarDecl(VarDecl *D) {    Record.push_back(D->isExceptionVariable());    Record.push_back(D->isNRVOVariable());    Record.push_back(D->isCXXForRangeDecl()); +  Record.push_back(D->isARCPseudoStrong());    Record.push_back(D->getInit() ? 1 : 0);    if (D->getInit())      Writer.AddStmt(D->getInit()); @@ -670,7 +671,7 @@ void ASTDeclWriter::VisitVarDecl(VarDecl *D) {        D->RedeclLink.getNext() == D &&        !D->hasCXXDirectInitializer() &&        D->getInit() == 0 && -      !ParmVarDecl::classofKind(D->getKind()) && +      !isa<ParmVarDecl>(D) &&        !SpecInfo)      AbbrevToUse = Writer.getDeclVarAbbrev(); @@ -695,6 +696,8 @@ void ASTDeclWriter::VisitParmVarDecl(ParmVarDecl *D) {      Writer.AddStmt(D->getUninstantiatedDefaultArg());    Code = serialization::DECL_PARM_VAR; +  assert(!D->isARCPseudoStrong()); // can be true of ImplicitParamDecl +    // If the assumptions about the DECL_PARM_VAR abbrev are true, use it.  Here    // we dynamically check for the properties that we optimize for, but don't    // know are true of all PARM_VAR_DECLs. @@ -1426,6 +1429,7 @@ void ASTWriter::WriteDeclsBlockAbbrevs() {    Abv->Add(BitCodeAbbrevOp(0));                       // isExceptionVariable    Abv->Add(BitCodeAbbrevOp(0));                       // isNRVOVariable    Abv->Add(BitCodeAbbrevOp(0));                       // isCXXForRangeDecl +  Abv->Add(BitCodeAbbrevOp(0));                       // isARCPseudoStrong    Abv->Add(BitCodeAbbrevOp(0));                       // HasInit    Abv->Add(BitCodeAbbrevOp(0));                   // HasMemberSpecializationInfo    // ParmVarDecl @@ -1498,6 +1502,7 @@ void ASTWriter::WriteDeclsBlockAbbrevs() {    Abv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Fixed, 1)); // isExceptionVariable    Abv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Fixed, 1)); // isNRVOVariable    Abv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Fixed, 1)); // isCXXForRangeDecl +  Abv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Fixed, 1)); // isARCPseudoStrong    Abv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Fixed, 1)); // HasInit    Abv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Fixed, 1)); // HasMemberSpecInfo    // Type Source Info @@ -1512,8 +1517,9 @@ void ASTWriter::WriteDeclsBlockAbbrevs() {    //Stmt    //Expr    Abv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::VBR, 6)); // Type -  Abv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Fixed, 1)); //IsTypeDependent -  Abv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Fixed, 1)); //IsValueDependent +  Abv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Fixed, 1)); //TypeDependent +  Abv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Fixed, 1)); //ValueDependent +  Abv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Fixed, 1)); //InstantiationDependent    Abv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Fixed, 1)); //UnexpandedParamPack    Abv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Fixed, 3)); //GetValueKind    Abv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Fixed, 3)); //GetObjectKind @@ -1531,8 +1537,9 @@ void ASTWriter::WriteDeclsBlockAbbrevs() {    //Stmt    //Expr    Abv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::VBR, 6)); // Type -  Abv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Fixed, 1)); //IsTypeDependent -  Abv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Fixed, 1)); //IsValueDependent +  Abv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Fixed, 1)); //TypeDependent +  Abv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Fixed, 1)); //ValueDependent +  Abv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Fixed, 1)); //InstantiationDependent    Abv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Fixed, 1)); //UnexpandedParamPack    Abv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Fixed, 3)); //GetValueKind    Abv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Fixed, 3)); //GetObjectKind @@ -1548,8 +1555,9 @@ void ASTWriter::WriteDeclsBlockAbbrevs() {    //Stmt    //Expr    Abv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::VBR, 6)); // Type -  Abv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Fixed, 1)); //IsTypeDependent -  Abv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Fixed, 1)); //IsValueDependent +  Abv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Fixed, 1)); //TypeDependent +  Abv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Fixed, 1)); //ValueDependent +  Abv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Fixed, 1)); //InstantiationDependent    Abv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Fixed, 1)); //UnexpandedParamPack    Abv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Fixed, 3)); //GetValueKind    Abv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Fixed, 3)); //GetObjectKind diff --git a/lib/Serialization/ASTWriterStmt.cpp b/lib/Serialization/ASTWriterStmt.cpp index 00e240494645..1d73ed447b4f 100644 --- a/lib/Serialization/ASTWriterStmt.cpp +++ b/lib/Serialization/ASTWriterStmt.cpp @@ -39,134 +39,9 @@ namespace clang {      AddExplicitTemplateArgumentList(const ExplicitTemplateArgumentList &Args);      void VisitStmt(Stmt *S); -    void VisitNullStmt(NullStmt *S); -    void VisitCompoundStmt(CompoundStmt *S); -    void VisitSwitchCase(SwitchCase *S); -    void VisitCaseStmt(CaseStmt *S); -    void VisitDefaultStmt(DefaultStmt *S); -    void VisitLabelStmt(LabelStmt *S); -    void VisitIfStmt(IfStmt *S); -    void VisitSwitchStmt(SwitchStmt *S); -    void VisitWhileStmt(WhileStmt *S); -    void VisitDoStmt(DoStmt *S); -    void VisitForStmt(ForStmt *S); -    void VisitGotoStmt(GotoStmt *S); -    void VisitIndirectGotoStmt(IndirectGotoStmt *S); -    void VisitContinueStmt(ContinueStmt *S); -    void VisitBreakStmt(BreakStmt *S); -    void VisitReturnStmt(ReturnStmt *S); -    void VisitDeclStmt(DeclStmt *S); -    void VisitAsmStmt(AsmStmt *S); -    void VisitExpr(Expr *E); -    void VisitPredefinedExpr(PredefinedExpr *E); -    void VisitDeclRefExpr(DeclRefExpr *E); -    void VisitIntegerLiteral(IntegerLiteral *E); -    void VisitFloatingLiteral(FloatingLiteral *E); -    void VisitImaginaryLiteral(ImaginaryLiteral *E); -    void VisitStringLiteral(StringLiteral *E); -    void VisitCharacterLiteral(CharacterLiteral *E); -    void VisitParenExpr(ParenExpr *E); -    void VisitParenListExpr(ParenListExpr *E); -    void VisitUnaryOperator(UnaryOperator *E); -    void VisitOffsetOfExpr(OffsetOfExpr *E); -    void VisitUnaryExprOrTypeTraitExpr(UnaryExprOrTypeTraitExpr *E); -    void VisitArraySubscriptExpr(ArraySubscriptExpr *E); -    void VisitCallExpr(CallExpr *E); -    void VisitMemberExpr(MemberExpr *E); -    void VisitCastExpr(CastExpr *E); -    void VisitBinaryOperator(BinaryOperator *E); -    void VisitCompoundAssignOperator(CompoundAssignOperator *E); -    void VisitConditionalOperator(ConditionalOperator *E); -    void VisitBinaryConditionalOperator(BinaryConditionalOperator *E); -    void VisitImplicitCastExpr(ImplicitCastExpr *E); -    void VisitExplicitCastExpr(ExplicitCastExpr *E); -    void VisitCStyleCastExpr(CStyleCastExpr *E); -    void VisitCompoundLiteralExpr(CompoundLiteralExpr *E); -    void VisitExtVectorElementExpr(ExtVectorElementExpr *E); -    void VisitInitListExpr(InitListExpr *E); -    void VisitDesignatedInitExpr(DesignatedInitExpr *E); -    void VisitImplicitValueInitExpr(ImplicitValueInitExpr *E); -    void VisitVAArgExpr(VAArgExpr *E); -    void VisitAddrLabelExpr(AddrLabelExpr *E); -    void VisitStmtExpr(StmtExpr *E); -    void VisitChooseExpr(ChooseExpr *E); -    void VisitGNUNullExpr(GNUNullExpr *E); -    void VisitShuffleVectorExpr(ShuffleVectorExpr *E); -    void VisitBlockExpr(BlockExpr *E); -    void VisitBlockDeclRefExpr(BlockDeclRefExpr *E); -    void VisitGenericSelectionExpr(GenericSelectionExpr *E); - -    // Objective-C Expressions -    void VisitObjCStringLiteral(ObjCStringLiteral *E); -    void VisitObjCEncodeExpr(ObjCEncodeExpr *E); -    void VisitObjCSelectorExpr(ObjCSelectorExpr *E); -    void VisitObjCProtocolExpr(ObjCProtocolExpr *E); -    void VisitObjCIvarRefExpr(ObjCIvarRefExpr *E); -    void VisitObjCPropertyRefExpr(ObjCPropertyRefExpr *E); -    void VisitObjCMessageExpr(ObjCMessageExpr *E); -    void VisitObjCIsaExpr(ObjCIsaExpr *E); - -    // Objective-C Statements -    void VisitObjCForCollectionStmt(ObjCForCollectionStmt *); -    void VisitObjCAtCatchStmt(ObjCAtCatchStmt *); -    void VisitObjCAtFinallyStmt(ObjCAtFinallyStmt *); -    void VisitObjCAtTryStmt(ObjCAtTryStmt *); -    void VisitObjCAtSynchronizedStmt(ObjCAtSynchronizedStmt *); -    void VisitObjCAtThrowStmt(ObjCAtThrowStmt *); - -    // C++ Statements -    void VisitCXXCatchStmt(CXXCatchStmt *S); -    void VisitCXXTryStmt(CXXTryStmt *S); -    void VisitCXXForRangeStmt(CXXForRangeStmt *); - -    void VisitCXXOperatorCallExpr(CXXOperatorCallExpr *E); -    void VisitCXXMemberCallExpr(CXXMemberCallExpr *E); -    void VisitCXXConstructExpr(CXXConstructExpr *E); -    void VisitCXXTemporaryObjectExpr(CXXTemporaryObjectExpr *E); -    void VisitCXXNamedCastExpr(CXXNamedCastExpr *E); -    void VisitCXXStaticCastExpr(CXXStaticCastExpr *E); -    void VisitCXXDynamicCastExpr(CXXDynamicCastExpr *E); -    void VisitCXXReinterpretCastExpr(CXXReinterpretCastExpr *E); -    void VisitCXXConstCastExpr(CXXConstCastExpr *E); -    void VisitCXXFunctionalCastExpr(CXXFunctionalCastExpr *E); -    void VisitCXXBoolLiteralExpr(CXXBoolLiteralExpr *E); -    void VisitCXXNullPtrLiteralExpr(CXXNullPtrLiteralExpr *E); -    void VisitCXXTypeidExpr(CXXTypeidExpr *E); -    void VisitCXXUuidofExpr(CXXUuidofExpr *E); -    void VisitCXXThisExpr(CXXThisExpr *E); -    void VisitCXXThrowExpr(CXXThrowExpr *E); -    void VisitCXXDefaultArgExpr(CXXDefaultArgExpr *E); -    void VisitCXXBindTemporaryExpr(CXXBindTemporaryExpr *E); - -    void VisitCXXScalarValueInitExpr(CXXScalarValueInitExpr *E); -    void VisitCXXNewExpr(CXXNewExpr *E); -    void VisitCXXDeleteExpr(CXXDeleteExpr *E); -    void VisitCXXPseudoDestructorExpr(CXXPseudoDestructorExpr *E); - -    void VisitExprWithCleanups(ExprWithCleanups *E); -    void VisitCXXDependentScopeMemberExpr(CXXDependentScopeMemberExpr *E); -    void VisitDependentScopeDeclRefExpr(DependentScopeDeclRefExpr *E); -    void VisitCXXUnresolvedConstructExpr(CXXUnresolvedConstructExpr *E); - -    void VisitOverloadExpr(OverloadExpr *E); -    void VisitUnresolvedMemberExpr(UnresolvedMemberExpr *E); -    void VisitUnresolvedLookupExpr(UnresolvedLookupExpr *E); - -    void VisitUnaryTypeTraitExpr(UnaryTypeTraitExpr *E); -    void VisitBinaryTypeTraitExpr(BinaryTypeTraitExpr *E); -    void VisitArrayTypeTraitExpr(ArrayTypeTraitExpr *E); -    void VisitExpressionTraitExpr(ExpressionTraitExpr *E); -    void VisitCXXNoexceptExpr(CXXNoexceptExpr *E); -    void VisitPackExpansionExpr(PackExpansionExpr *E); -    void VisitSizeOfPackExpr(SizeOfPackExpr *E); -    void VisitSubstNonTypeTemplateParmPackExpr( -                                           SubstNonTypeTemplateParmPackExpr *E); -    void VisitOpaqueValueExpr(OpaqueValueExpr *E); - -    // CUDA Expressions -    void VisitCUDAKernelCallExpr(CUDAKernelCallExpr *E); -     -    void VisitAsTypeExpr(AsTypeExpr *E); +#define STMT(Type, Base) \ +    void Visit##Type(Type *); +#include "clang/AST/StmtNodes.inc"    };  } @@ -371,6 +246,7 @@ void ASTStmtWriter::VisitExpr(Expr *E) {    Writer.AddTypeRef(E->getType(), Record);    Record.push_back(E->isTypeDependent());    Record.push_back(E->isValueDependent()); +  Record.push_back(E->isInstantiationDependent());    Record.push_back(E->containsUnexpandedParameterPack());    Record.push_back(E->getValueKind());    Record.push_back(E->getObjectKind()); @@ -606,6 +482,22 @@ void ASTStmtWriter::VisitObjCIsaExpr(ObjCIsaExpr *E) {    Code = serialization::EXPR_OBJC_ISA;  } +void ASTStmtWriter:: +VisitObjCIndirectCopyRestoreExpr(ObjCIndirectCopyRestoreExpr *E) { +  VisitExpr(E); +  Writer.AddStmt(E->getSubExpr()); +  Record.push_back(E->shouldCopy()); +  Code = serialization::EXPR_OBJC_INDIRECT_COPY_RESTORE; +} + +void ASTStmtWriter::VisitObjCBridgedCastExpr(ObjCBridgedCastExpr *E) { +  VisitExplicitCastExpr(E); +  Writer.AddSourceLocation(E->getLParenLoc(), Record); +  Writer.AddSourceLocation(E->getBridgeKeywordLoc(), Record); +  Record.push_back(E->getBridgeKind()); // FIXME: Stable encoding +  Code = serialization::EXPR_OBJC_BRIDGED_CAST; +} +  void ASTStmtWriter::VisitCastExpr(CastExpr *E) {    VisitExpr(E);    Record.push_back(E->path_size()); @@ -914,6 +806,7 @@ void ASTStmtWriter::VisitObjCPropertyRefExpr(ObjCPropertyRefExpr *E) {  void ASTStmtWriter::VisitObjCMessageExpr(ObjCMessageExpr *E) {    VisitExpr(E);    Record.push_back(E->getNumArgs()); +  Record.push_back(E->isDelegateInitCall());    Record.push_back((unsigned)E->getReceiverKind()); // FIXME: stable encoding    switch (E->getReceiverKind()) {    case ObjCMessageExpr::Instance: @@ -973,6 +866,12 @@ void ASTStmtWriter::VisitObjCAtFinallyStmt(ObjCAtFinallyStmt *S) {    Code = serialization::STMT_OBJC_FINALLY;  } +void ASTStmtWriter::VisitObjCAutoreleasePoolStmt(ObjCAutoreleasePoolStmt *S) { +  Writer.AddStmt(S->getSubStmt()); +  Writer.AddSourceLocation(S->getAtLoc(), Record); +  Code = serialization::STMT_OBJC_AUTORELEASE_POOL; +} +  void ASTStmtWriter::VisitObjCAtTryStmt(ObjCAtTryStmt *S) {    Record.push_back(S->getNumCatchStmts());    Record.push_back(S->getFinallyStmt() != 0); @@ -1123,18 +1022,6 @@ void ASTStmtWriter::VisitCXXTypeidExpr(CXXTypeidExpr *E) {    }  } -void ASTStmtWriter::VisitCXXUuidofExpr(CXXUuidofExpr *E) { -  VisitExpr(E); -  Writer.AddSourceRange(E->getSourceRange(), Record); -  if (E->isTypeOperand()) { -    Writer.AddTypeSourceInfo(E->getTypeOperandSourceInfo(), Record); -    Code = serialization::EXPR_CXX_UUIDOF_TYPE; -  } else { -    Writer.AddStmt(E->getExprOperand()); -    Code = serialization::EXPR_CXX_UUIDOF_EXPR; -  } -} -  void ASTStmtWriter::VisitCXXThisExpr(CXXThisExpr *E) {    VisitExpr(E);    Writer.AddSourceLocation(E->getLocation(), Record); @@ -1146,6 +1033,7 @@ void ASTStmtWriter::VisitCXXThrowExpr(CXXThrowExpr *E) {    VisitExpr(E);    Writer.AddSourceLocation(E->getThrowLoc(), Record);    Writer.AddStmt(E->getSubExpr()); +  Record.push_back(E->isThrownVariableInScope());    Code = serialization::EXPR_CXX_THROW;  } @@ -1408,15 +1296,30 @@ void ASTStmtWriter::VisitSizeOfPackExpr(SizeOfPackExpr *E) {    Code = serialization::EXPR_SIZEOF_PACK;  } +void ASTStmtWriter::VisitSubstNonTypeTemplateParmExpr( +                                              SubstNonTypeTemplateParmExpr *E) { +  VisitExpr(E); +  Writer.AddDeclRef(E->getParameter(), Record); +  Writer.AddSourceLocation(E->getNameLoc(), Record); +  Writer.AddStmt(E->getReplacement()); +  Code = serialization::EXPR_SUBST_NON_TYPE_TEMPLATE_PARM; +} +  void ASTStmtWriter::VisitSubstNonTypeTemplateParmPackExpr(                                            SubstNonTypeTemplateParmPackExpr *E) {    VisitExpr(E); -  Writer.AddDeclRef(E->Param, Record); +  Writer.AddDeclRef(E->getParameterPack(), Record);    Writer.AddTemplateArgument(E->getArgumentPack(), Record); -  Writer.AddSourceLocation(E->NameLoc, Record); +  Writer.AddSourceLocation(E->getParameterPackLocation(), Record);    Code = serialization::EXPR_SUBST_NON_TYPE_TEMPLATE_PARM_PACK;  } +void ASTStmtWriter::VisitMaterializeTemporaryExpr(MaterializeTemporaryExpr *E) { +  VisitExpr(E); +  Writer.AddStmt(E->Temporary); +  Code = serialization::EXPR_MATERIALIZE_TEMPORARY; +} +  void ASTStmtWriter::VisitOpaqueValueExpr(OpaqueValueExpr *E) {    VisitExpr(E);    Record.push_back(Writer.getOpaqueValueID(E)); @@ -1439,11 +1342,52 @@ void ASTStmtWriter::VisitCUDAKernelCallExpr(CUDAKernelCallExpr *E) {  //===----------------------------------------------------------------------===//  void ASTStmtWriter::VisitAsTypeExpr(AsTypeExpr *E) {    VisitExpr(E); +  Writer.AddSourceLocation(E->getBuiltinLoc(), Record); +  Writer.AddSourceLocation(E->getRParenLoc(), Record);    Writer.AddStmt(E->getSrcExpr());    Code = serialization::EXPR_ASTYPE;  }  //===----------------------------------------------------------------------===// +// Microsoft Expressions and Statements. +//===----------------------------------------------------------------------===// +void ASTStmtWriter::VisitCXXUuidofExpr(CXXUuidofExpr *E) { +  VisitExpr(E); +  Writer.AddSourceRange(E->getSourceRange(), Record); +  if (E->isTypeOperand()) { +    Writer.AddTypeSourceInfo(E->getTypeOperandSourceInfo(), Record); +    Code = serialization::EXPR_CXX_UUIDOF_TYPE; +  } else { +    Writer.AddStmt(E->getExprOperand()); +    Code = serialization::EXPR_CXX_UUIDOF_EXPR; +  } +} + +void ASTStmtWriter::VisitSEHExceptStmt(SEHExceptStmt *S) { +  VisitStmt(S); +  Writer.AddSourceLocation(S->getExceptLoc(), Record); +  Writer.AddStmt(S->getFilterExpr()); +  Writer.AddStmt(S->getBlock()); +  Code = serialization::STMT_SEH_EXCEPT; +} + +void ASTStmtWriter::VisitSEHFinallyStmt(SEHFinallyStmt *S) { +  VisitStmt(S); +  Writer.AddSourceLocation(S->getFinallyLoc(), Record); +  Writer.AddStmt(S->getBlock()); +  Code = serialization::STMT_SEH_FINALLY; +} + +void ASTStmtWriter::VisitSEHTryStmt(SEHTryStmt *S) { +  VisitStmt(S); +  Record.push_back(S->getIsCXXTry()); +  Writer.AddSourceLocation(S->getTryLoc(), Record); +  Writer.AddStmt(S->getTryBlock()); +  Writer.AddStmt(S->getHandler()); +  Code = serialization::STMT_SEH_TRY; +} + +//===----------------------------------------------------------------------===//  // ASTWriter Implementation  //===----------------------------------------------------------------------===// diff --git a/lib/Serialization/ChainedIncludesSource.cpp b/lib/Serialization/ChainedIncludesSource.cpp index da5be957a530..3b7cd23b92ae 100644 --- a/lib/Serialization/ChainedIncludesSource.cpp +++ b/lib/Serialization/ChainedIncludesSource.cpp @@ -185,7 +185,8 @@ ChainedIncludesSource::FindExternalVisibleDeclsByName(const DeclContext *DC,  void ChainedIncludesSource::MaterializeVisibleDecls(const DeclContext *DC) {    return getFinalReader().MaterializeVisibleDecls(DC);  } -bool ChainedIncludesSource::FindExternalLexicalDecls(const DeclContext *DC, +ExternalLoadResult  +ChainedIncludesSource::FindExternalLexicalDecls(const DeclContext *DC,                                        bool (*isKindWeWant)(Decl::Kind),                                        llvm::SmallVectorImpl<Decl*> &Result) {    return getFinalReader().FindExternalLexicalDecls(DC, isKindWeWant, Result);  | 
