diff options
Diffstat (limited to 'lib/Serialization/ASTWriterDecl.cpp')
| -rw-r--r-- | lib/Serialization/ASTWriterDecl.cpp | 83 | 
1 files changed, 57 insertions, 26 deletions
diff --git a/lib/Serialization/ASTWriterDecl.cpp b/lib/Serialization/ASTWriterDecl.cpp index ec21ca2276c1..3dac3a48297a 100644 --- a/lib/Serialization/ASTWriterDecl.cpp +++ b/lib/Serialization/ASTWriterDecl.cpp @@ -612,6 +612,7 @@ void ASTDeclWriter::VisitFunctionDecl(FunctionDecl *D) {  void ASTDeclWriter::VisitCXXDeductionGuideDecl(CXXDeductionGuideDecl *D) {    VisitFunctionDecl(D); +  Record.push_back(D->IsCopyDeductionCandidate);    Code = serialization::DECL_CXX_DEDUCTION_GUIDE;  } @@ -849,17 +850,16 @@ void ASTDeclWriter::VisitObjCPropertyImplDecl(ObjCPropertyImplDecl *D) {  void ASTDeclWriter::VisitFieldDecl(FieldDecl *D) {    VisitDeclaratorDecl(D);    Record.push_back(D->isMutable()); -  if (D->InitStorage.getInt() == FieldDecl::ISK_BitWidthOrNothing && -      D->InitStorage.getPointer() == nullptr) { -    Record.push_back(0); -  } else if (D->InitStorage.getInt() == FieldDecl::ISK_CapturedVLAType) { -    Record.push_back(D->InitStorage.getInt() + 1); -    Record.AddTypeRef( -        QualType(static_cast<Type *>(D->InitStorage.getPointer()), 0)); -  } else { -    Record.push_back(D->InitStorage.getInt() + 1); -    Record.AddStmt(static_cast<Expr *>(D->InitStorage.getPointer())); -  } + +  FieldDecl::InitStorageKind ISK = D->InitStorage.getInt(); +  Record.push_back(ISK); +  if (ISK == FieldDecl::ISK_CapturedVLAType) +    Record.AddTypeRef(QualType(D->getCapturedVLAType(), 0)); +  else if (ISK) +    Record.AddStmt(D->getInClassInitializer()); + +  Record.AddStmt(D->getBitWidth()); +    if (!D->getDeclName())      Record.AddDeclRef(Context.getInstantiatedFromUnnamedFieldDecl(D)); @@ -873,6 +873,7 @@ void ASTDeclWriter::VisitFieldDecl(FieldDecl *D) {        !D->isModulePrivate() &&        !D->getBitWidth() &&        !D->hasInClassInitializer() && +      !D->hasCapturedVLAType() &&        !D->hasExtInfo() &&        !ObjCIvarDecl::classofKind(D->getKind()) &&        !ObjCAtDefsFieldDecl::classofKind(D->getKind()) && @@ -928,6 +929,24 @@ void ASTDeclWriter::VisitVarDecl(VarDecl *D) {    } else {      Record.push_back(0);    } + +  if (D->getStorageDuration() == SD_Static) { +    bool ModulesCodegen = false; +    if (Writer.WritingModule && +        !D->getDescribedVarTemplate() && !D->getMemberSpecializationInfo() && +        !isa<VarTemplateSpecializationDecl>(D)) { +      // When building a C++ Modules TS module interface unit, a strong +      // definition in the module interface is provided by the compilation of +      // that module interface unit, not by its users. (Inline variables are +      // still emitted in module users.) +      ModulesCodegen = +          (Writer.WritingModule->Kind == Module::ModuleInterfaceUnit && +           Writer.Context->GetGVALinkageForVariable(D) == GVA_StrongExternal); +    } +    Record.push_back(ModulesCodegen); +    if (ModulesCodegen) +      Writer.ModularCodegenDecls.push_back(Writer.GetDeclRef(D)); +  }    enum {      VarNotTemplate = 0, VarTemplate, StaticDataMemberSpecialization @@ -963,6 +982,7 @@ void ASTDeclWriter::VisitVarDecl(VarDecl *D) {        !D->isConstexpr() &&        !D->isInitCapture() &&        !D->isPreviousDeclInSameBlockScope() && +      D->getStorageDuration() != SD_Static &&        !D->getMemberSpecializationInfo())      AbbrevToUse = Writer.getDeclVarAbbrev(); @@ -1247,10 +1267,8 @@ void ASTDeclWriter::VisitCXXMethodDecl(CXXMethodDecl *D) {    VisitFunctionDecl(D);    if (D->isCanonicalDecl()) {      Record.push_back(D->size_overridden_methods()); -    for (CXXMethodDecl::method_iterator -           I = D->begin_overridden_methods(), E = D->end_overridden_methods(); -           I != E; ++I) -      Record.AddDeclRef(*I); +    for (const CXXMethodDecl *MD : D->overridden_methods()) +      Record.AddDeclRef(MD);    } else {      // We only need to record overridden methods once for the canonical decl.      Record.push_back(0); @@ -1290,6 +1308,8 @@ void ASTDeclWriter::VisitCXXDestructorDecl(CXXDestructorDecl *D) {    VisitCXXMethodDecl(D);    Record.AddDeclRef(D->getOperatorDelete()); +  if (D->getOperatorDelete()) +    Record.AddStmt(D->getOperatorDeleteThisArg());    Code = serialization::DECL_CXX_DESTRUCTOR;  } @@ -1472,6 +1492,7 @@ void ASTDeclWriter::VisitVarTemplateSpecializationDecl(    Record.AddTemplateArgumentList(&D->getTemplateArgs());    Record.AddSourceLocation(D->getPointOfInstantiation());    Record.push_back(D->getSpecializationKind()); +  Record.push_back(D->IsCompleteDefinition);    Record.push_back(D->isCanonicalDecl());    if (D->isCanonicalDecl()) { @@ -1697,6 +1718,7 @@ void ASTDeclWriter::VisitOMPDeclareReductionDecl(OMPDeclareReductionDecl *D) {    Record.AddSourceLocation(D->getLocStart());    Record.AddStmt(D->getCombiner());    Record.AddStmt(D->getInitializer()); +  Record.push_back(D->getInitializerKind());    Record.AddDeclRef(D->getPrevDeclInScope());    Code = serialization::DECL_OMP_DECLARE_REDUCTION;  } @@ -1741,7 +1763,7 @@ void ASTWriter::WriteDeclAbbrevs() {    Abv->Add(BitCodeAbbrevOp(0));                       // hasExtInfo    // FieldDecl    Abv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Fixed, 1)); // isMutable -  Abv->Add(BitCodeAbbrevOp(0));                       //getBitWidth +  Abv->Add(BitCodeAbbrevOp(0));                       // InitStyle    // Type Source Info    Abv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::VBR, 6));    Abv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Array)); @@ -1774,7 +1796,7 @@ void ASTWriter::WriteDeclAbbrevs() {    Abv->Add(BitCodeAbbrevOp(0));                       // hasExtInfo    // FieldDecl    Abv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Fixed, 1)); // isMutable -  Abv->Add(BitCodeAbbrevOp(0));                       //getBitWidth +  Abv->Add(BitCodeAbbrevOp(0));                       // InitStyle    // ObjC Ivar    Abv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::VBR, 6)); // getAccessControl    Abv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::VBR, 6)); // getSynthesize @@ -2235,15 +2257,24 @@ void ASTRecordWriter::AddFunctionDefinition(const FunctionDecl *FD) {    assert(FD->doesThisDeclarationHaveABody());    bool ModulesCodegen = false;    if (Writer->WritingModule && !FD->isDependentContext()) { -    // Under -fmodules-codegen, codegen is performed for all defined functions. -    // When building a C++ Modules TS module interface unit, a strong definition -    // in the module interface is provided by the compilation of that module -    // interface unit, not by its users. (Inline functions are still emitted -    // in module users.) -    ModulesCodegen = -        Writer->Context->getLangOpts().ModulesCodegen || -        (Writer->WritingModule->Kind == Module::ModuleInterfaceUnit && -         Writer->Context->GetGVALinkageForFunction(FD) == GVA_StrongExternal); +    Optional<GVALinkage> Linkage; +    if (Writer->WritingModule->Kind == Module::ModuleInterfaceUnit) { +      // When building a C++ Modules TS module interface unit, a strong +      // definition in the module interface is provided by the compilation of +      // that module interface unit, not by its users. (Inline functions are +      // still emitted in module users.) +      Linkage = Writer->Context->GetGVALinkageForFunction(FD); +      ModulesCodegen = *Linkage == GVA_StrongExternal; +    } +    if (Writer->Context->getLangOpts().ModulesCodegen) { +      // Under -fmodules-codegen, codegen is performed for all non-internal, +      // non-always_inline functions. +      if (!FD->hasAttr<AlwaysInlineAttr>()) { +        if (!Linkage) +          Linkage = Writer->Context->GetGVALinkageForFunction(FD); +        ModulesCodegen = *Linkage != GVA_Internal; +      } +    }    }    Record->push_back(ModulesCodegen);    if (ModulesCodegen)  | 
