Hi Richard, I fixed a regression caused by this commit in r291628.
Let me know if you see any problem! Manman > On Sep 1, 2016, at 1:15 PM, Richard Smith via cfe-commits > <cfe-commits@lists.llvm.org> wrote: > > Author: rsmith > Date: Thu Sep 1 15:15:25 2016 > New Revision: 280409 > > URL: http://llvm.org/viewvc/llvm-project?rev=280409&view=rev > Log: > When we reach the end of a #include of a header of a local submodule that we > textually included, create an ImportDecl just as we would if we reached a > #include of any other modular header. This is necessary in order to correctly > determine the set of variables to initialize for an imported module. > > This should hopefully make the modules selfhost buildbot green again. > > Added: > cfe/trunk/test/Modules/global-init.cpp > Modified: > cfe/trunk/include/clang/Sema/Sema.h > cfe/trunk/lib/Sema/SemaDecl.cpp > cfe/trunk/tools/libclang/CXIndexDataConsumer.cpp > > Modified: cfe/trunk/include/clang/Sema/Sema.h > URL: > http://llvm.org/viewvc/llvm-project/cfe/trunk/include/clang/Sema/Sema.h?rev=280409&r1=280408&r2=280409&view=diff > ============================================================================== > --- cfe/trunk/include/clang/Sema/Sema.h (original) > +++ cfe/trunk/include/clang/Sema/Sema.h Thu Sep 1 15:15:25 2016 > @@ -1884,6 +1884,7 @@ public: > /// \brief The parser has processed a module import translated from a > /// #include or similar preprocessing directive. > void ActOnModuleInclude(SourceLocation DirectiveLoc, Module *Mod); > + void BuildModuleInclude(SourceLocation DirectiveLoc, Module *Mod); > > /// \brief The parsed has entered a submodule. > void ActOnModuleBegin(SourceLocation DirectiveLoc, Module *Mod); > > Modified: cfe/trunk/lib/Sema/SemaDecl.cpp > URL: > http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Sema/SemaDecl.cpp?rev=280409&r1=280408&r2=280409&view=diff > ============================================================================== > --- cfe/trunk/lib/Sema/SemaDecl.cpp (original) > +++ cfe/trunk/lib/Sema/SemaDecl.cpp Thu Sep 1 15:15:25 2016 > @@ -15312,7 +15312,10 @@ DeclResult Sema::ActOnModuleImport(Sourc > > void Sema::ActOnModuleInclude(SourceLocation DirectiveLoc, Module *Mod) { > checkModuleImportContext(*this, Mod, DirectiveLoc, CurContext, true); > + BuildModuleInclude(DirectiveLoc, Mod); > +} > > +void Sema::BuildModuleInclude(SourceLocation DirectiveLoc, Module *Mod) { > // Determine whether we're in the #include buffer for a module. The > #includes > // in that buffer do not qualify as module imports; they're just an > // implementation detail of us building the module. > @@ -15352,20 +15355,27 @@ void Sema::ActOnModuleBegin(SourceLocati > VisibleModules.setVisible(Mod, DirectiveLoc); > } > > -void Sema::ActOnModuleEnd(SourceLocation DirectiveLoc, Module *Mod) { > - checkModuleImportContext(*this, Mod, DirectiveLoc, CurContext); > +void Sema::ActOnModuleEnd(SourceLocation EofLoc, Module *Mod) { > + checkModuleImportContext(*this, Mod, EofLoc, CurContext); > > if (getLangOpts().ModulesLocalVisibility) { > - assert(!ModuleScopes.empty() && ModuleScopes.back().Module == Mod && > - "left the wrong module scope"); > VisibleModules = std::move(ModuleScopes.back().OuterVisibleModules); > - ModuleScopes.pop_back(); > - > - VisibleModules.setVisible(Mod, DirectiveLoc); > // Leaving a module hides namespace names, so our visible namespace cache > // is now out of date. > VisibleNamespaceCache.clear(); > } > + > + assert(!ModuleScopes.empty() && ModuleScopes.back().Module == Mod && > + "left the wrong module scope"); > + ModuleScopes.pop_back(); > + > + // We got to the end of processing a #include of a local module. Create an > + // ImportDecl as we would for an imported module. > + FileID File = getSourceManager().getFileID(EofLoc); > + assert(File != getSourceManager().getMainFileID() && > + "end of submodule in main source file"); > + SourceLocation DirectiveLoc = getSourceManager().getIncludeLoc(File); > + BuildModuleInclude(DirectiveLoc, Mod); > } > > void Sema::createImplicitModuleImportForErrorRecovery(SourceLocation Loc, > > Added: cfe/trunk/test/Modules/global-init.cpp > URL: > http://llvm.org/viewvc/llvm-project/cfe/trunk/test/Modules/global-init.cpp?rev=280409&view=auto > ============================================================================== > --- cfe/trunk/test/Modules/global-init.cpp (added) > +++ cfe/trunk/test/Modules/global-init.cpp Thu Sep 1 15:15:25 2016 > @@ -0,0 +1,19 @@ > +// RUN: rm -rf %t > +// RUN: mkdir %t > +// > +// RUN: echo '#pragma once' > %t/a.h > +// RUN: echo 'struct A { A() {} int f() const; } const a;' >> %t/a.h > +// > +// RUN: echo '#include "a.h"' > %t/b.h > +// > +// RUN: echo 'module M { module b { header "b.h" export * } module a { > header "a.h" export * } }' > %t/map > +// > +// RUN: %clang_cc1 -fmodules -fmodules-cache-path=%t > -fmodule-map-file=%t/map -I%t %s -emit-llvm -o - -triple %itanium_abi_triple > | FileCheck %s > + > +#include "b.h" > + > +// CHECK: @_ZL1a = internal global > +// CHECK: call {{.*}} @_ZN1AC1Ev({{.*}}@_ZL1a > +// CHECK: call {{.*}} @_ZNK1A1fEv({{.*}}@_ZL1a > +// CHECK: store {{.*}} @x > +int x = a.f(); > > Modified: cfe/trunk/tools/libclang/CXIndexDataConsumer.cpp > URL: > http://llvm.org/viewvc/llvm-project/cfe/trunk/tools/libclang/CXIndexDataConsumer.cpp?rev=280409&r1=280408&r2=280409&view=diff > ============================================================================== > --- cfe/trunk/tools/libclang/CXIndexDataConsumer.cpp (original) > +++ cfe/trunk/tools/libclang/CXIndexDataConsumer.cpp Thu Sep 1 15:15:25 2016 > @@ -478,6 +478,14 @@ void CXIndexDataConsumer::importedModule > if (!Mod) > return; > > + // If the imported module is part of the top-level module that we're > + // indexing, it doesn't correspond to an imported AST file. > + // FIXME: This assumes that AST files and top-level modules directly > + // correspond, which is unlikely to remain true forever. > + if (Module *SrcMod = ImportD->getImportedOwningModule()) > + if (SrcMod->getTopLevelModule() == Mod->getTopLevelModule()) > + return; > + > CXIdxImportedASTFileInfo Info = { > static_cast<CXFile>( > const_cast<FileEntry > *>(Mod->getASTFile())), > > > _______________________________________________ > cfe-commits mailing list > cfe-commits@lists.llvm.org > http://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits _______________________________________________ cfe-commits mailing list cfe-commits@lists.llvm.org http://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits