r280409 - When we reach the end of a #include of a header of a local submodule that we
Manman via cfe-commits
cfe-commits at lists.llvm.org
Tue Jan 10 16:59:59 PST 2017
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 at 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 at lists.llvm.org
> http://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits
More information about the cfe-commits
mailing list