diff options
Diffstat (limited to 'lib/Serialization/ASTWriterDecl.cpp')
| -rw-r--r-- | lib/Serialization/ASTWriterDecl.cpp | 75 | 
1 files changed, 56 insertions, 19 deletions
diff --git a/lib/Serialization/ASTWriterDecl.cpp b/lib/Serialization/ASTWriterDecl.cpp index 23d18540e822d..ee220f00a81ff 100644 --- a/lib/Serialization/ASTWriterDecl.cpp +++ b/lib/Serialization/ASTWriterDecl.cpp @@ -11,7 +11,6 @@  //  //===----------------------------------------------------------------------===// -#include "clang/Serialization/ASTWriter.h"  #include "ASTCommon.h"  #include "clang/AST/DeclCXX.h"  #include "clang/AST/DeclContextInternals.h" @@ -20,7 +19,7 @@  #include "clang/AST/Expr.h"  #include "clang/Basic/SourceManager.h"  #include "clang/Serialization/ASTReader.h" -#include "llvm/ADT/Twine.h" +#include "clang/Serialization/ASTWriter.h"  #include "llvm/Bitcode/BitstreamWriter.h"  #include "llvm/Support/ErrorHandling.h"  using namespace clang; @@ -97,6 +96,8 @@ namespace clang {      void VisitVarDecl(VarDecl *D);      void VisitImplicitParamDecl(ImplicitParamDecl *D);      void VisitParmVarDecl(ParmVarDecl *D); +    void VisitDecompositionDecl(DecompositionDecl *D); +    void VisitBindingDecl(BindingDecl *D);      void VisitNonTypeTemplateParmDecl(NonTypeTemplateParmDecl *D);      void VisitTemplateDecl(TemplateDecl *D);      void VisitRedeclarableTemplateDecl(RedeclarableTemplateDecl *D); @@ -106,9 +107,11 @@ namespace clang {      void VisitTemplateTemplateParmDecl(TemplateTemplateParmDecl *D);      void VisitTypeAliasTemplateDecl(TypeAliasTemplateDecl *D);      void VisitUsingDecl(UsingDecl *D); +    void VisitUsingPackDecl(UsingPackDecl *D);      void VisitUsingShadowDecl(UsingShadowDecl *D);      void VisitConstructorUsingShadowDecl(ConstructorUsingShadowDecl *D);      void VisitLinkageSpecDecl(LinkageSpecDecl *D); +    void VisitExportDecl(ExportDecl *D);      void VisitFileScopeAsmDecl(FileScopeAsmDecl *D);      void VisitImportDecl(ImportDecl *D);      void VisitAccessSpecDecl(AccessSpecDecl *D); @@ -892,6 +895,7 @@ void ASTDeclWriter::VisitVarDecl(VarDecl *D) {    Record.push_back(D->getTSCSpec());    Record.push_back(D->getInitStyle());    if (!isa<ParmVarDecl>(D)) { +    Record.push_back(D->isThisDeclarationADemotedDefinition());      Record.push_back(D->isExceptionVariable());      Record.push_back(D->isNRVOVariable());      Record.push_back(D->isCXXForRangeDecl()); @@ -940,10 +944,7 @@ void ASTDeclWriter::VisitVarDecl(VarDecl *D) {        D->getDeclName().getNameKind() == DeclarationName::Identifier &&        !D->hasExtInfo() &&        D->getFirstDecl() == D->getMostRecentDecl() && -      D->getInitStyle() == VarDecl::CInit && -      D->getInit() == nullptr && -      !isa<ParmVarDecl>(D) && -      !isa<VarTemplateSpecializationDecl>(D) && +      D->getKind() == Decl::Var &&        !D->isInline() &&        !D->isConstexpr() &&        !D->isInitCapture() && @@ -999,6 +1000,8 @@ void ASTDeclWriter::VisitParmVarDecl(ParmVarDecl *D) {    // Check things we know are true of *every* PARM_VAR_DECL, which is more than    // just us assuming it.    assert(!D->getTSCSpec() && "PARM_VAR_DECL can't use TLS"); +  assert(!D->isThisDeclarationADemotedDefinition() +         && "PARM_VAR_DECL can't be demoted definition.");    assert(D->getAccess() == AS_none && "PARM_VAR_DECL can't be public/private");    assert(!D->isExceptionVariable() && "PARM_VAR_DECL can't be exception var");    assert(D->getPreviousDecl() == nullptr && "PARM_VAR_DECL can't be redecl"); @@ -1006,6 +1009,22 @@ void ASTDeclWriter::VisitParmVarDecl(ParmVarDecl *D) {           "PARM_VAR_DECL can't be static data member");  } +void ASTDeclWriter::VisitDecompositionDecl(DecompositionDecl *D) { +  // Record the number of bindings first to simplify deserialization. +  Record.push_back(D->bindings().size()); + +  VisitVarDecl(D); +  for (auto *B : D->bindings()) +    Record.AddDeclRef(B); +  Code = serialization::DECL_DECOMPOSITION; +} + +void ASTDeclWriter::VisitBindingDecl(BindingDecl *D) { +  VisitValueDecl(D); +  Record.AddStmt(D->getBinding()); +  Code = serialization::DECL_BINDING; +} +  void ASTDeclWriter::VisitFileScopeAsmDecl(FileScopeAsmDecl *D) {    VisitDecl(D);    Record.AddStmt(D->getAsmString()); @@ -1064,6 +1083,12 @@ void ASTDeclWriter::VisitLinkageSpecDecl(LinkageSpecDecl *D) {    Code = serialization::DECL_LINKAGE_SPEC;  } +void ASTDeclWriter::VisitExportDecl(ExportDecl *D) { +  VisitDecl(D); +  Record.AddSourceLocation(D->getRBraceLoc()); +  Code = serialization::DECL_EXPORT; +} +  void ASTDeclWriter::VisitLabelDecl(LabelDecl *D) {    VisitNamedDecl(D);    Record.AddSourceLocation(D->getLocStart()); @@ -1118,6 +1143,15 @@ void ASTDeclWriter::VisitUsingDecl(UsingDecl *D) {    Code = serialization::DECL_USING;  } +void ASTDeclWriter::VisitUsingPackDecl(UsingPackDecl *D) { +  Record.push_back(D->NumExpansions); +  VisitNamedDecl(D); +  Record.AddDeclRef(D->getInstantiatedFromUsingDecl()); +  for (auto *E : D->expansions()) +    Record.AddDeclRef(E); +  Code = serialization::DECL_USING_PACK; +} +  void ASTDeclWriter::VisitUsingShadowDecl(UsingShadowDecl *D) {    VisitRedeclarable(D);    VisitNamedDecl(D); @@ -1151,6 +1185,7 @@ void ASTDeclWriter::VisitUnresolvedUsingValueDecl(UnresolvedUsingValueDecl *D) {    Record.AddSourceLocation(D->getUsingLoc());    Record.AddNestedNameSpecifierLoc(D->getQualifierLoc());    Record.AddDeclarationNameLoc(D->DNLoc, D->getDeclName()); +  Record.AddSourceLocation(D->getEllipsisLoc());    Code = serialization::DECL_UNRESOLVED_USING_VALUE;  } @@ -1159,6 +1194,7 @@ void ASTDeclWriter::VisitUnresolvedUsingTypenameDecl(    VisitTypeDecl(D);    Record.AddSourceLocation(D->getTypenameLoc());    Record.AddNestedNameSpecifierLoc(D->getQualifierLoc()); +  Record.AddSourceLocation(D->getEllipsisLoc());    Code = serialization::DECL_UNRESOLVED_USING_TYPENAME;  } @@ -1857,9 +1893,9 @@ void ASTWriter::WriteDeclAbbrevs() {    Abv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::VBR, 6)); // InnerStartLoc    Abv->Add(BitCodeAbbrevOp(0));                       // hasExtInfo    // VarDecl -  Abv->Add(BitCodeAbbrevOp(0));                       // StorageClass -  Abv->Add(BitCodeAbbrevOp(0));                       // getTSCSpec -  Abv->Add(BitCodeAbbrevOp(0));                       // hasCXXDirectInitializer +  Abv->Add(BitCodeAbbrevOp(0));                       // SClass +  Abv->Add(BitCodeAbbrevOp(0));                       // TSCSpec +  Abv->Add(BitCodeAbbrevOp(0));                       // InitStyle    Abv->Add(BitCodeAbbrevOp(0));                       // Linkage    Abv->Add(BitCodeAbbrevOp(0));                       // HasInit    Abv->Add(BitCodeAbbrevOp(0));                   // HasMemberSpecializationInfo @@ -1933,9 +1969,10 @@ void ASTWriter::WriteDeclAbbrevs() {    Abv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::VBR, 6)); // InnerStartLoc    Abv->Add(BitCodeAbbrevOp(0));                       // hasExtInfo    // VarDecl -  Abv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::VBR, 6)); // StorageClass -  Abv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Fixed, 2)); // getTSCSpec -  Abv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Fixed, 1)); // CXXDirectInitializer +  Abv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Fixed, 3)); // SClass +  Abv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Fixed, 2)); // TSCSpec +  Abv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Fixed, 2)); // InitStyle +  Abv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Fixed, 1)); // IsThisDeclarationADemotedDefinition    Abv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Fixed, 1)); // isExceptionVariable    Abv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Fixed, 1)); // isNRVOVariable    Abv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Fixed, 1)); // isCXXForRangeDecl @@ -1946,8 +1983,8 @@ void ASTWriter::WriteDeclAbbrevs() {    Abv->Add(BitCodeAbbrevOp(0));                         // isInitCapture    Abv->Add(BitCodeAbbrevOp(0));                         // isPrevDeclInSameScope    Abv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Fixed, 3)); // Linkage -  Abv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Fixed, 1)); // HasInit -  Abv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Fixed, 1)); // HasMemberSpecInfo +  Abv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Fixed, 2)); // IsInitICE (local) +  Abv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Fixed, 2)); // VarKind (local enum)    // Type Source Info    Abv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::VBR, 6));    Abv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Array)); @@ -2123,11 +2160,11 @@ static bool isRequiredDecl(const Decl *D, ASTContext &Context,        D->hasAttr<OMPDeclareTargetDeclAttr>())      return true; -  // ImportDecl is used by codegen to determine the set of imported modules to -  // search for inputs for automatic linking; include it if it has a semantic -  // effect. -  if (isa<ImportDecl>(D) && !WritingModule) -    return true; +  if (WritingModule && (isa<VarDecl>(D) || isa<ImportDecl>(D))) { +    // These declarations are part of the module initializer, and are emitted +    // if and when the module is imported, rather than being emitted eagerly. +    return false; +  }    return Context.DeclMustBeEmitted(D);  }  | 
