diff options
Diffstat (limited to 'contrib/llvm-project/clang/lib/Serialization/ASTWriterDecl.cpp')
-rw-r--r-- | contrib/llvm-project/clang/lib/Serialization/ASTWriterDecl.cpp | 59 |
1 files changed, 23 insertions, 36 deletions
diff --git a/contrib/llvm-project/clang/lib/Serialization/ASTWriterDecl.cpp b/contrib/llvm-project/clang/lib/Serialization/ASTWriterDecl.cpp index eecdf89c791a..2cb44bf9038b 100644 --- a/contrib/llvm-project/clang/lib/Serialization/ASTWriterDecl.cpp +++ b/contrib/llvm-project/clang/lib/Serialization/ASTWriterDecl.cpp @@ -96,6 +96,7 @@ namespace clang { void VisitFieldDecl(FieldDecl *D); void VisitMSPropertyDecl(MSPropertyDecl *D); void VisitMSGuidDecl(MSGuidDecl *D); + void VisitTemplateParamObjectDecl(TemplateParamObjectDecl *D); void VisitIndirectFieldDecl(IndirectFieldDecl *D); void VisitVarDecl(VarDecl *D); void VisitImplicitParamDecl(ImplicitParamDecl *D); @@ -556,7 +557,7 @@ void ASTDeclWriter::VisitFunctionDecl(FunctionDecl *D) { Record.push_back(D->isDefaulted()); Record.push_back(D->isExplicitlyDefaulted()); Record.push_back(D->hasImplicitReturnZero()); - Record.push_back(D->getConstexprKind()); + Record.push_back(static_cast<uint64_t>(D->getConstexprKind())); Record.push_back(D->usesSEHTry()); Record.push_back(D->hasSkippedBody()); Record.push_back(D->isMultiVersion()); @@ -565,7 +566,6 @@ void ASTDeclWriter::VisitFunctionDecl(FunctionDecl *D) { Record.AddSourceLocation(D->getEndLoc()); Record.push_back(D->getODRHash()); - Record.push_back(D->usesFPIntrin()); if (D->isDefaulted()) { if (auto *FDI = D->getDefaultedFunctionInfo()) { @@ -965,6 +965,12 @@ void ASTDeclWriter::VisitMSGuidDecl(MSGuidDecl *D) { Code = serialization::DECL_MS_GUID; } +void ASTDeclWriter::VisitTemplateParamObjectDecl(TemplateParamObjectDecl *D) { + VisitValueDecl(D); + Record.AddAPValue(D->getValue()); + Code = serialization::DECL_TEMPLATE_PARAM_OBJECT; +} + void ASTDeclWriter::VisitIndirectFieldDecl(IndirectFieldDecl *D) { VisitValueDecl(D); Record.push_back(D->getChainingSize()); @@ -1000,19 +1006,7 @@ void ASTDeclWriter::VisitVarDecl(VarDecl *D) { } Record.push_back(D->getLinkageInternal()); - if (D->getInit()) { - if (!D->isInitKnownICE()) - Record.push_back(1); - else { - Record.push_back( - 2 | - (D->isInitICE() ? 1 : 0) | - (D->ensureEvaluatedStmt()->HasConstantDestruction ? 4 : 0)); - } - Record.AddStmt(D->getInit()); - } else { - Record.push_back(0); - } + Record.AddVarDeclInit(D); if (D->hasAttr<BlocksAttr>() && D->getType()->getAsCXXRecordDecl()) { BlockVarCopyInit Init = Writer.Context->getBlockVarCopyInit(D); @@ -1031,8 +1025,10 @@ void ASTDeclWriter::VisitVarDecl(VarDecl *D) { // 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); + (Writer.WritingModule->Kind == Module::ModuleInterfaceUnit || + (D->hasAttr<DLLExportAttr>() && + Writer.Context->getLangOpts().BuildingPCHWithObjectFile)) && + Writer.Context->GetGVALinkageForVariable(D) == GVA_StrongExternal; } Record.push_back(ModulesCodegen); if (ModulesCodegen) @@ -1841,29 +1837,20 @@ void ASTDeclWriter::VisitRedeclarable(Redeclarable<T> *D) { } void ASTDeclWriter::VisitOMPThreadPrivateDecl(OMPThreadPrivateDecl *D) { - Record.push_back(D->varlist_size()); + Record.writeOMPChildren(D->Data); VisitDecl(D); - for (auto *I : D->varlists()) - Record.AddStmt(I); Code = serialization::DECL_OMP_THREADPRIVATE; } void ASTDeclWriter::VisitOMPAllocateDecl(OMPAllocateDecl *D) { - Record.push_back(D->varlist_size()); - Record.push_back(D->clauselist_size()); + Record.writeOMPChildren(D->Data); VisitDecl(D); - for (auto *I : D->varlists()) - Record.AddStmt(I); - for (OMPClause *C : D->clauselists()) - Record.writeOMPClause(C); Code = serialization::DECL_OMP_ALLOCATE; } void ASTDeclWriter::VisitOMPRequiresDecl(OMPRequiresDecl *D) { - Record.push_back(D->clauselist_size()); + Record.writeOMPChildren(D->Data); VisitDecl(D); - for (OMPClause *C : D->clauselists()) - Record.writeOMPClause(C); Code = serialization::DECL_OMP_REQUIRES; } @@ -1882,14 +1869,10 @@ void ASTDeclWriter::VisitOMPDeclareReductionDecl(OMPDeclareReductionDecl *D) { } void ASTDeclWriter::VisitOMPDeclareMapperDecl(OMPDeclareMapperDecl *D) { - Record.push_back(D->clauselist_size()); + Record.writeOMPChildren(D->Data); VisitValueDecl(D); - Record.AddSourceLocation(D->getBeginLoc()); - Record.AddStmt(D->getMapperVarRef()); Record.AddDeclarationName(D->getVarName()); Record.AddDeclRef(D->getPrevDeclInScope()); - for (OMPClause *C : D->clauselists()) - Record.writeOMPClause(C); Code = serialization::DECL_OMP_DECLARE_MAPPER; } @@ -2210,7 +2193,7 @@ void ASTWriter::WriteDeclAbbrevs() { Abv->Add(BitCodeAbbrevOp(0)); // ImplicitParamKind Abv->Add(BitCodeAbbrevOp(0)); // EscapingByref Abv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Fixed, 3)); // Linkage - Abv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Fixed, 3)); // IsInitICE (local) + Abv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Fixed, 3)); // HasConstant* Abv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Fixed, 2)); // VarKind (local enum) // Type Source Info Abv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Array)); @@ -2357,6 +2340,7 @@ void ASTWriter::WriteDeclAbbrevs() { Abv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Fixed, 3)); //GetObjectKind // CastExpr Abv->Add(BitCodeAbbrevOp(0)); // PathSize + Abv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Fixed, 1)); // HasFPFeatures Abv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Fixed, 6)); // CastKind Abv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Fixed, 1)); // PartOfExplicitCast // ImplicitCastExpr @@ -2469,7 +2453,10 @@ void ASTRecordWriter::AddFunctionDefinition(const FunctionDecl *FD) { Linkage = Writer->Context->GetGVALinkageForFunction(FD); ModulesCodegen = *Linkage == GVA_StrongExternal; } - if (Writer->Context->getLangOpts().ModulesCodegen) { + if (Writer->Context->getLangOpts().ModulesCodegen || + (FD->hasAttr<DLLExportAttr>() && + Writer->Context->getLangOpts().BuildingPCHWithObjectFile)) { + // Under -fmodules-codegen, codegen is performed for all non-internal, // non-always_inline functions, unless they are available elsewhere. if (!FD->hasAttr<AlwaysInlineAttr>()) { |