On 10 January 2017 at 16:48, Manman Ren via cfe-commits < cfe-commits@lists.llvm.org> wrote:
> Author: mren > Date: Tue Jan 10 18:48:19 2017 > New Revision: 291628 > > URL: http://llvm.org/viewvc/llvm-project?rev=291628&view=rev > Log: > Module: Do not create Implicit ImportDecl for module X if we > are building an implemenation of module X. > Hmm. We do actually have an include mapping to a module header in this case. Perhaps it would be better to create a faithful AST representation and handle this in CodeGen instead -- we should not add any link flags when an implementation TU of a module imports a header of that same module. > This fixes a regression caused by r280409. > rdar://problem/29930553 > > Added: > cfe/trunk/test/Modules/Inputs/module-impl-with-link/ > cfe/trunk/test/Modules/Inputs/module-impl-with-link/foo.h > cfe/trunk/test/Modules/Inputs/module-impl-with-link/module.modulemap > cfe/trunk/test/Modules/module-impl-with-link.c > Modified: > cfe/trunk/include/clang/Sema/Sema.h > cfe/trunk/lib/Sema/SemaDecl.cpp > > Modified: cfe/trunk/include/clang/Sema/Sema.h > URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/include/ > clang/Sema/Sema.h?rev=291628&r1=291627&r2=291628&view=diff > ============================================================ > ================== > --- cfe/trunk/include/clang/Sema/Sema.h (original) > +++ cfe/trunk/include/clang/Sema/Sema.h Tue Jan 10 18:48:19 2017 > @@ -1905,7 +1905,8 @@ 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); > + void BuildModuleInclude(SourceLocation DirectiveLoc, Module *Mod, > + bool NoImport); > > /// \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=291628&r1=291627&r2=291628&view=diff > ============================================================ > ================== > --- cfe/trunk/lib/Sema/SemaDecl.cpp (original) > +++ cfe/trunk/lib/Sema/SemaDecl.cpp Tue Jan 10 18:48:19 2017 > @@ -15652,10 +15652,11 @@ DeclResult Sema::ActOnModuleImport(Sourc > > void Sema::ActOnModuleInclude(SourceLocation DirectiveLoc, Module *Mod) { > checkModuleImportContext(*this, Mod, DirectiveLoc, CurContext, true); > - BuildModuleInclude(DirectiveLoc, Mod); > + BuildModuleInclude(DirectiveLoc, Mod, false/*NoImport*/); > } > > -void Sema::BuildModuleInclude(SourceLocation DirectiveLoc, Module *Mod) { > +void Sema::BuildModuleInclude(SourceLocation DirectiveLoc, Module *Mod, > + bool NoImport) { > // 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. > @@ -15665,7 +15666,7 @@ void Sema::BuildModuleInclude(SourceLoca > TUKind == TU_Module && > getSourceManager().isWrittenInMainFile(DirectiveLoc); > > - bool ShouldAddImport = !IsInModuleIncludes; > + bool ShouldAddImport = !IsInModuleIncludes && !NoImport; > > // If this module import was due to an inclusion directive, create an > // implicit import declaration to capture it in the AST. > @@ -15713,7 +15714,11 @@ void Sema::ActOnModuleEnd(SourceLocation > assert(File != getSourceManager().getMainFileID() && > "end of submodule in main source file"); > SourceLocation DirectiveLoc = getSourceManager().getIncludeLoc(File); > - BuildModuleInclude(DirectiveLoc, Mod); > + // Do not create implicit ImportDecl if we are building the > implementation > + // of a module. > + bool NoImport = Mod->getTopLevelModuleName() == > getLangOpts().CurrentModule && > + !getLangOpts().isCompilingModule(); > + BuildModuleInclude(DirectiveLoc, Mod, NoImport); > } > > void Sema::createImplicitModuleImportForErrorRecovery(SourceLocation Loc, > > Added: cfe/trunk/test/Modules/Inputs/module-impl-with-link/foo.h > URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/test/ > Modules/Inputs/module-impl-with-link/foo.h?rev=291628&view=auto > ============================================================ > ================== > --- cfe/trunk/test/Modules/Inputs/module-impl-with-link/foo.h (added) > +++ cfe/trunk/test/Modules/Inputs/module-impl-with-link/foo.h Tue Jan 10 > 18:48:19 2017 > @@ -0,0 +1 @@ > +//empty > > Added: cfe/trunk/test/Modules/Inputs/module-impl-with-link/module. > modulemap > URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/test/ > Modules/Inputs/module-impl-with-link/module.modulemap?rev=291628&view=auto > ============================================================ > ================== > --- cfe/trunk/test/Modules/Inputs/module-impl-with-link/module.modulemap > (added) > +++ cfe/trunk/test/Modules/Inputs/module-impl-with-link/module.modulemap > Tue Jan 10 18:48:19 2017 > @@ -0,0 +1,4 @@ > +module Clib { > + header "foo.h" > + link "Clib" > +} > > Added: cfe/trunk/test/Modules/module-impl-with-link.c > URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/test/ > Modules/module-impl-with-link.c?rev=291628&view=auto > ============================================================ > ================== > --- cfe/trunk/test/Modules/module-impl-with-link.c (added) > +++ cfe/trunk/test/Modules/module-impl-with-link.c Tue Jan 10 18:48:19 > 2017 > @@ -0,0 +1,7 @@ > +// RUN: rm -rf %t > +// RUN: %clang_cc1 -fmodules-cache-path=%t -fmodules > -fimplicit-module-maps -fmodule-name=Clib %s -I > %S/Inputs/module-impl-with-link > -emit-llvm -o - > +#include "foo.h" > +// CHECK: !{{[0-9]+}} = !{i32 6, !"Linker Options", > ![[LINK_OPTIONS:[0-9]+]]} > +// Make sure we don't generate linker option for module Clib since this > TU is > +// an implementation of Clib. > +// CHECK: ![[LINK_OPTIONS]] = !{} > > > _______________________________________________ > 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