<div dir="auto"><div><div class="gmail_quote"><div dir="ltr" class="gmail_attr">On Mon, 15 Apr 2019, 19:08 via cfe-commits, <<a href="mailto:cfe-commits@lists.llvm.org">cfe-commits@lists.llvm.org</a>> wrote:<br></div><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">Hi Richard,<br>
<br>
That helps a little bit! Our main problem is that the environment where the compiler is built and tested (using lit) does not have the external assembler installed, so all of the compiler commands which try to use "-c" fail when trying to run the external assembler. I find that if I change the test to use "-S" instead of "-c" it will pass in our build environment. Would that change defeat the purpose of the test?<br></blockquote></div></div><div dir="auto"><br></div><div dir="auto">That's fine. You could also try changing the -c tests from using -v to using -### so they don't actually run the compilation step, but we do need to run the steps that produce .pcm files or the later steps will fail.</div><div dir="auto"><br></div><div dir="auto"><div class="gmail_quote"><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">
Douglas Yung<br>
<br>
-----Original Message-----<br>
From: Richard Smith <<a href="mailto:richard@metafoo.co.uk" target="_blank" rel="noreferrer">richard@metafoo.co.uk</a>> <br>
Sent: Monday, April 15, 2019 18:44<br>
To: Yung, Douglas <<a href="mailto:douglas.yung@sony.com" target="_blank" rel="noreferrer">douglas.yung@sony.com</a>><br>
Cc: cfe-commits <<a href="mailto:cfe-commits@lists.llvm.org" target="_blank" rel="noreferrer">cfe-commits@lists.llvm.org</a>><br>
Subject: Re: r358355 - [c++20] Enable driver and frontend support for building and using<br>
<br>
On Mon, 15 Apr 2019 at 18:14, via cfe-commits <<a href="mailto:cfe-commits@lists.llvm.org" target="_blank" rel="noreferrer">cfe-commits@lists.llvm.org</a>> wrote:<br>
><br>
> Hi Richard,<br>
><br>
> The driver test you added (modules.cpp) seems to fail if the compiler configuration uses an external assembler. Is there any way that the test can be rewritten so that it works with both the integrated and an external assembler configurations?<br>
<br>
Sorry about that. r358470 fixes the test to pass if I add -fno-integrated-as to all the clang invocations. Does that resolve the problem you're seeing?<br>
<br>
> Douglas Yung<br>
><br>
> -----Original Message-----<br>
> From: cfe-commits <<a href="mailto:cfe-commits-bounces@lists.llvm.org" target="_blank" rel="noreferrer">cfe-commits-bounces@lists.llvm.org</a>> On Behalf Of <br>
> Richard Smith via cfe-commits<br>
> Sent: Sunday, April 14, 2019 4:12<br>
> To: <a href="mailto:cfe-commits@lists.llvm.org" target="_blank" rel="noreferrer">cfe-commits@lists.llvm.org</a><br>
> Subject: r358355 - [c++20] Enable driver and frontend support for <br>
> building and using<br>
><br>
> Author: rsmith<br>
> Date: Sun Apr 14 04:11:37 2019<br>
> New Revision: 358355<br>
><br>
> URL: <a href="http://llvm.org/viewvc/llvm-project?rev=358355&view=rev" rel="noreferrer noreferrer" target="_blank">http://llvm.org/viewvc/llvm-project?rev=358355&view=rev</a><br>
> Log:<br>
> [c++20] Enable driver and frontend support for building and using modules when -std=c++2a is specified.<br>
><br>
> Added:<br>
>     cfe/trunk/test/CXX/module/module.unit/p8.cpp<br>
>     cfe/trunk/test/Driver/modules.cpp<br>
> Modified:<br>
>     cfe/trunk/include/clang/Basic/DiagnosticFrontendKinds.td<br>
>     cfe/trunk/lib/Driver/ToolChains/Clang.cpp<br>
>     cfe/trunk/lib/Frontend/FrontendActions.cpp<br>
>     cfe/trunk/lib/Parse/Parser.cpp<br>
><br>
> Modified: cfe/trunk/include/clang/Basic/DiagnosticFrontendKinds.td<br>
> URL: <br>
> <a href="http://llvm.org/viewvc/llvm-project/cfe/trunk/include/clang/Basic/Diag" rel="noreferrer noreferrer" target="_blank">http://llvm.org/viewvc/llvm-project/cfe/trunk/include/clang/Basic/Diag</a><br>
> nosticFrontendKinds.td?rev=358355&r1=358354&r2=358355&view=diff<br>
> ======================================================================<br>
> ========<br>
> --- cfe/trunk/include/clang/Basic/DiagnosticFrontendKinds.td <br>
> (original)<br>
> +++ cfe/trunk/include/clang/Basic/DiagnosticFrontendKinds.td Sun Apr <br>
> +++ 14<br>
> +++ 04:11:37 2019<br>
> @@ -173,10 +173,11 @@ def note_incompatible_analyzer_plugin_ap<br>
><br>
>  def err_module_build_requires_fmodules : Error<<br>
>    "module compilation requires '-fmodules'">; -def <br>
> err_module_interface_requires_modules_ts : Error<<br>
> -  "module interface compilation requires '-fmodules-ts'">;<br>
> +def err_module_interface_requires_cpp_modules : Error<<br>
> +  "module interface compilation requires '-std=c++2a' or <br>
> +'-fmodules-ts'">;<br>
>  def err_header_module_requires_modules : Error<<br>
> -  "header module compilation requires '-fmodules' or <br>
> '-fmodules-ts'">;<br>
> +  "header module compilation requires '-fmodules', '-std=c++2a', or "<br>
> +  "'-fmodules-ts'">;<br>
>  def warn_module_config_mismatch : Warning<<br>
>    "module file %0 cannot be loaded due to a configuration mismatch with the current "<br>
>    "compilation">, InGroup<DiagGroup<"module-file-config-mismatch">>, <br>
> DefaultError;<br>
><br>
> Modified: cfe/trunk/lib/Driver/ToolChains/Clang.cpp<br>
> URL: <br>
> <a href="http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Driver/ToolChains/Cl" rel="noreferrer noreferrer" target="_blank">http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Driver/ToolChains/Cl</a><br>
> ang.cpp?rev=358355&r1=358354&r2=358355&view=diff<br>
> ======================================================================<br>
> ========<br>
> --- cfe/trunk/lib/Driver/ToolChains/Clang.cpp (original)<br>
> +++ cfe/trunk/lib/Driver/ToolChains/Clang.cpp Sun Apr 14 04:11:37 2019<br>
> @@ -2721,7 +2721,7 @@ static void RenderModulesOptions(Compila<br>
>      }<br>
>    }<br>
><br>
> -  HaveModules = HaveClangModules;<br>
> +  HaveModules |= HaveClangModules;<br>
>    if (Args.hasArg(options::OPT_fmodules_ts)) {<br>
>      CmdArgs.push_back("-fmodules-ts");<br>
>      HaveModules = true;<br>
> @@ -4259,7 +4259,8 @@ void Clang::ConstructJob(Compilation &C,<br>
>    // If a std is supplied, only add -trigraphs if it follows the<br>
>    // option.<br>
>    bool ImplyVCPPCXXVer = false;<br>
> -  if (Arg *Std = Args.getLastArg(options::OPT_std_EQ, <br>
> options::OPT_ansi)) {<br>
> +  const Arg *Std = Args.getLastArg(options::OPT_std_EQ,<br>
> + options::OPT_ansi);  if (Std) {<br>
>      if (Std->getOption().matches(options::OPT_ansi))<br>
>        if (types::isCXX(InputType))<br>
>          CmdArgs.push_back("-std=c++98"); @@ -4696,9 +4697,6 @@ void Clang::ConstructJob(Compilation &C,<br>
>    Args.AddLastArg(CmdArgs, options::OPT_fdouble_square_bracket_attributes,<br>
>                    options::OPT_fno_double_square_bracket_attributes);<br>
><br>
> -  bool HaveModules = false;<br>
> -  RenderModulesOptions(C, D, Args, Input, Output, CmdArgs, <br>
> HaveModules);<br>
> -<br>
>    // -faccess-control is default.<br>
>    if (Args.hasFlag(options::OPT_fno_access_control,<br>
>                     options::OPT_faccess_control, false)) @@ -4765,6 +4763,7 @@ void Clang::ConstructJob(Compilation &C,<br>
>    if (ImplyVCPPCXXVer) {<br>
>      StringRef LanguageStandard;<br>
>      if (const Arg *StdArg = Args.getLastArg(options::OPT__SLASH_std)) <br>
> {<br>
> +      Std = StdArg;<br>
>        LanguageStandard = llvm::StringSwitch<StringRef>(StdArg->getValue())<br>
>                               .Case("c++14", "-std=c++14")<br>
>                               .Case("c++17", "-std=c++17") @@ -4830,6 +4829,12 @@ void Clang::ConstructJob(Compilation &C,<br>
>                                         options::OPT_fno_inline_functions))<br>
>      InlineArg->render(Args, CmdArgs);<br>
><br>
> +  // FIXME: Find a better way to determine whether the language has <br>
> + modules  // support by default, or just assume that all languages do.<br>
> +  bool HaveModules =<br>
> +      Std && (Std->containsValue("c++2a") ||<br>
> + Std->containsValue("c++latest"));  RenderModulesOptions(C, D, Args,<br>
> + Input, Output, CmdArgs, HaveModules);<br>
> +<br>
>    Args.AddLastArg(CmdArgs, options::OPT_fexperimental_new_pass_manager,<br>
>                    options::OPT_fno_experimental_new_pass_manager);<br>
><br>
><br>
> Modified: cfe/trunk/lib/Frontend/FrontendActions.cpp<br>
> URL: <br>
> <a href="http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Frontend/FrontendAct" rel="noreferrer noreferrer" target="_blank">http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Frontend/FrontendAct</a><br>
> ions.cpp?rev=358355&r1=358354&r2=358355&view=diff<br>
> ======================================================================<br>
> ========<br>
> --- cfe/trunk/lib/Frontend/FrontendActions.cpp (original)<br>
> +++ cfe/trunk/lib/Frontend/FrontendActions.cpp Sun Apr 14 04:11:37 <br>
> +++ 2019<br>
> @@ -221,8 +221,8 @@ GenerateModuleFromModuleMapAction::Creat<br>
><br>
>  bool GenerateModuleInterfaceAction::BeginSourceFileAction(<br>
>      CompilerInstance &CI) {<br>
> -  if (!CI.getLangOpts().ModulesTS) {<br>
> -    CI.getDiagnostics().Report(diag::err_module_interface_requires_modules_ts);<br>
> +  if (!CI.getLangOpts().ModulesTS && <br>
> + !CI.getLangOpts().CPlusPlusModules) {<br>
> +<br>
> + CI.getDiagnostics().Report(diag::err_module_interface_requires_cpp_m<br>
> + od<br>
> + ules);<br>
>      return false;<br>
>    }<br>
><br>
> @@ -239,7 +239,7 @@ GenerateModuleInterfaceAction::CreateOut<br>
><br>
>  bool GenerateHeaderModuleAction::PrepareToExecuteAction(<br>
>      CompilerInstance &CI) {<br>
> -  if (!CI.getLangOpts().Modules && !CI.getLangOpts().ModulesTS) {<br>
> +  if (!CI.getLangOpts().Modules) {<br>
>      CI.getDiagnostics().Report(diag::err_header_module_requires_modules);<br>
>      return false;<br>
>    }<br>
><br>
> Modified: cfe/trunk/lib/Parse/Parser.cpp<br>
> URL: <br>
> <a href="http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Parse/Parser.cpp?rev" rel="noreferrer noreferrer" target="_blank">http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Parse/Parser.cpp?rev</a><br>
> =358355&r1=358354&r2=358355&view=diff<br>
> ======================================================================<br>
> ========<br>
> --- cfe/trunk/lib/Parse/Parser.cpp (original)<br>
> +++ cfe/trunk/lib/Parse/Parser.cpp Sun Apr 14 04:11:37 2019<br>
> @@ -837,7 +837,7 @@ Parser::ParseExternalDeclaration(ParsedA<br>
>      SingleDecl = ParseModuleImport(SourceLocation());<br>
>      break;<br>
>    case tok::kw_export:<br>
> -    if (getLangOpts().ModulesTS) {<br>
> +    if (getLangOpts().CPlusPlusModules || getLangOpts().ModulesTS) {<br>
>        SingleDecl = ParseExportDeclaration();<br>
>        break;<br>
>      }<br>
><br>
> Added: cfe/trunk/test/CXX/module/module.unit/p8.cpp<br>
> URL: <br>
> <a href="http://llvm.org/viewvc/llvm-project/cfe/trunk/test/CXX/module/module.u" rel="noreferrer noreferrer" target="_blank">http://llvm.org/viewvc/llvm-project/cfe/trunk/test/CXX/module/module.u</a><br>
> nit/p8.cpp?rev=358355&view=auto <br>
> ======================================================================<br>
> ========<br>
> --- cfe/trunk/test/CXX/module/module.unit/p8.cpp (added)<br>
> +++ cfe/trunk/test/CXX/module/module.unit/p8.cpp Sun Apr 14 04:11:37<br>
> +++ 2019<br>
> @@ -0,0 +1,40 @@<br>
> +// RUN: echo 'export module foo; export int n;' > %t.cppm // RUN:<br>
> +%clang_cc1 -std=c++2a %t.cppm -emit-module-interface -o %t.pcm // RUN:<br>
> +%clang_cc1 -std=c++2a -fmodule-file=%t.pcm -verify -DMODE=0 %s // RUN:<br>
> +%clang_cc1 -std=c++2a -fmodule-file=%t.pcm -verify -DMODE=1 %s // RUN:<br>
> +%clang_cc1 -std=c++2a -fmodule-file=%t.pcm -verify -DMODE=2 %s // RUN:<br>
> +%clang_cc1 -std=c++2a -fmodule-file=%t.pcm -verify -DMODE=3 %s // RUN:<br>
> +%clang_cc1 -std=c++2a -fmodule-file=%t.pcm -verify -DMODE=4 %s // RUN:<br>
> +%clang_cc1 -std=c++2a -fmodule-file=%t.pcm -verify -DMODE=5 %s<br>
> +<br>
> +#if MODE == 0<br>
> +// no module declaration<br>
> +<br>
> +#elif MODE == 1<br>
> +// expected-no-diagnostics<br>
> +module foo;<br>
> +#define IMPORTED<br>
> +<br>
> +#elif MODE == 2<br>
> +export module foo; // expected-error {{redefinition of module 'foo'}} <br>
> +// expected-note-re@* {{module loaded from '{{.*}}.pcm'}} #define <br>
> +IMPORTED<br>
> +<br>
> +#elif MODE == 3<br>
> +export module bar;<br>
> +<br>
> +#elif MODE == 4<br>
> +module foo:bar; // expected-error {{not yet supported}} #define <br>
> +IMPORTED // FIXME<br>
> +<br>
> +#elif MODE == 5<br>
> +export module foo:bar; // expected-error {{not yet supported}} <br>
> +expected-error {{redefinition}} expected-note@* {{loaded from}} <br>
> +#define IMPORTED // FIXME<br>
> +<br>
> +#endif<br>
> +<br>
> +int k = n;<br>
> +#ifndef IMPORTED<br>
> +// expected-error@-2 {{declaration of 'n' must be imported from <br>
> +module 'foo' before it is required}} // expected-note@* {{previous}} <br>
> +#endif<br>
><br>
> Added: cfe/trunk/test/Driver/modules.cpp<br>
> URL: <br>
> <a href="http://llvm.org/viewvc/llvm-project/cfe/trunk/test/Driver/modules.cpp" rel="noreferrer noreferrer" target="_blank">http://llvm.org/viewvc/llvm-project/cfe/trunk/test/Driver/modules.cpp</a>?<br>
> rev=358355&view=auto <br>
> ======================================================================<br>
> ========<br>
> --- cfe/trunk/test/Driver/modules.cpp (added)<br>
> +++ cfe/trunk/test/Driver/modules.cpp Sun Apr 14 04:11:37 2019<br>
> @@ -0,0 +1,74 @@<br>
> +// RUN: rm -rf %t<br>
> +// RUN: mkdir %t<br>
> +<br>
> +// Check compiling a module interface to a .pcm file.<br>
> +//<br>
> +// RUN: %clang -std=c++2a -x c++-module --precompile %s -o <br>
> +%t/module.pcm -v 2>&1 | FileCheck %s --check-prefix=CHECK-PRECOMPILE <br>
> +// // CHECK-PRECOMPILE: -cc1 {{.*}} -emit-module-interface //<br>
> +CHECK-PRECOMPILE-SAME: -o {{.*}}.pcm // CHECK-PRECOMPILE-SAME: -x c++ <br>
> +// CHECK-PRECOMPILE-SAME: modules.cpp<br>
> +<br>
> +// Check compiling a .pcm file to a .o file.<br>
> +//<br>
> +// RUN: %clang -std=c++2a %t/module.pcm -c -o %t/module.pcm.o -v 2>&1 <br>
> +| FileCheck %s --check-prefix=CHECK-COMPILE // // CHECK-COMPILE: -cc1 <br>
> +{{.*}} -emit-obj // CHECK-COMPILE-SAME: -o {{.*}}.pcm.o //<br>
> +CHECK-COMPILE-SAME: -x pcm // CHECK-COMPILE-SAME: {{.*}}.pcm<br>
> +<br>
> +// Check use of a .pcm file in another compilation.<br>
> +//<br>
> +// RUN: %clang -std=c++2a -fmodule-file=%t/module.pcm -Dexport= %s -c <br>
> +-o %t/module.o -v 2>&1 | FileCheck %s --check-prefix=CHECK-USE // //<br>
> +CHECK-USE: -cc1 // CHECK-USE-SAME: -emit-obj // CHECK-USE-SAME:<br>
> +-fmodule-file={{.*}}.pcm // CHECK-USE-SAME: -o {{.*}}.o{{"?}} <br>
> +{{.*}}-x<br>
> +c++ // CHECK-USE-SAME: modules.cpp<br>
> +<br>
> +// Check combining precompile and compile steps works.<br>
> +//<br>
> +// RUN: %clang -std=c++2a -x c++-module %s -c -o %t/module2.pcm.o -v<br>
> +2>&1 | FileCheck %s --check-prefix=CHECK-PRECOMPILE<br>
> +--check-prefix=CHECK-COMPILE<br>
> +<br>
> +// Check that .cppm is treated as a module implicitly.<br>
> +//<br>
> +// RUN: cp %s %t/module.cppm<br>
> +// RUN: %clang -std=c++2a --precompile %t/module.cppm -o <br>
> +%t/module.pcm -v 2>&1 | FileCheck %s --check-prefix=CHECK-PRECOMPILE<br>
> +<br>
> +// Check compiling a header unit to a .pcm file.<br>
> +//<br>
> +// RUN: echo '#define FOO BAR' > %t/foo.h // RUN: %clang -std=c++2a <br>
> +--precompile -x c++-header %t/foo.h -fmodule-name=header -o <br>
> +%t/foo.pcm -v 2>&1 | FileCheck %s --check-prefix=CHECK-HEADER-UNIT // <br>
> +//<br>
> +CHECK-HEADER-UNIT: -cc1 // CHECK-HEADER-UNIT-SAME: <br>
> +-emit-header-module // CHECK-HEADER-UNIT-SAME: -fmodule-name=header <br>
> +//<br>
> +CHECK-HEADER-UNIT-SAME: -o {{.*}}foo.pcm // CHECK-HEADER-UNIT-SAME: <br>
> +-x<br>
> +c++-header // CHECK-HEADER-UNIT-SAME: foo.h<br>
> +<br>
> +// Check use of header unit.<br>
> +//<br>
> +// RUN: %clang -std=c++2a -fmodule-file=%t/module.pcm <br>
> +-fmodule-file=%t/foo.pcm -I%t -DIMPORT -Dexport= %s -E -o - -v 2>&1 | <br>
> +FileCheck %s --check-prefix=CHECK-HEADER-UNIT-USE<br>
> +//<br>
> +// CHECK-HEADER-UNIT-USE: -cc1<br>
> +// CHECK-HEADER-UNIT-USE: -E<br>
> +// CHECK-HEADER-UNIT-USE: -fmodule-file={{.*}}module.pcm //<br>
> +CHECK-HEADER-UNIT-USE: -fmodule-file={{.*}}foo.pcm<br>
> +<br>
> +// Note, we use -Dexport= to make this a module implementation unit when building the implementation.<br>
> +export module foo;<br>
> +<br>
> +#ifdef IMPORT<br>
> +// CHECK-HEADER-UNIT-USE: FOO;<br>
> +FOO;<br>
> +<br>
> +// CHECK-HEADER-UNIT-USE: import header.{{.*}}foo.h{{.*}}; import <br>
> +"foo.h";<br>
> +<br>
> +// CHECK-HEADER-UNIT-USE: BAR;<br>
> +FOO;<br>
> +#endif<br>
><br>
><br>
> _______________________________________________<br>
> cfe-commits mailing list<br>
> <a href="mailto:cfe-commits@lists.llvm.org" target="_blank" rel="noreferrer">cfe-commits@lists.llvm.org</a><br>
> <a href="https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits" rel="noreferrer noreferrer" target="_blank">https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits</a><br>
> _______________________________________________<br>
> cfe-commits mailing list<br>
> <a href="mailto:cfe-commits@lists.llvm.org" target="_blank" rel="noreferrer">cfe-commits@lists.llvm.org</a><br>
> <a href="https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits" rel="noreferrer noreferrer" target="_blank">https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits</a><br>
_______________________________________________<br>
cfe-commits mailing list<br>
<a href="mailto:cfe-commits@lists.llvm.org" target="_blank" rel="noreferrer">cfe-commits@lists.llvm.org</a><br>
<a href="https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits" rel="noreferrer noreferrer" target="_blank">https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits</a><br>
</blockquote></div></div></div>