r291628 - Module: Do not create Implicit ImportDecl for module X if we

Richard Smith via cfe-commits cfe-commits at lists.llvm.org
Tue Jan 10 17:57:47 PST 2017


On 10 January 2017 at 16:48, Manman Ren via cfe-commits <
cfe-commits at 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 at lists.llvm.org
> http://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.llvm.org/pipermail/cfe-commits/attachments/20170110/0898ea31/attachment.html>


More information about the cfe-commits mailing list