Bigcheese updated this revision to Diff 247755. Bigcheese added a comment. Cleaned up the test to not reference unused paths.
Repository: rG LLVM Github Monorepo CHANGES SINCE LAST ACTION https://reviews.llvm.org/D75395/new/ https://reviews.llvm.org/D75395 Files: clang/include/clang/Driver/Options.td clang/include/clang/Frontend/FrontendOptions.h clang/lib/Frontend/CompilerInvocation.cpp clang/test/Modules/fsystem-module.m Index: clang/test/Modules/fsystem-module.m =================================================================== --- /dev/null +++ clang/test/Modules/fsystem-module.m @@ -0,0 +1,18 @@ +// RUN: rm -rf %t.dir +// RUN: mkdir %t.dir + +// -fsystem-module requires -emit-module +// RUN: not %clang_cc1 -fsyntax-only -fsystem-module %s 2>&1 | grep "-emit-module" + +// RUN: not %clang_cc1 -fmodules -I %S/Inputs \ +// RUN: -emit-module -fmodule-name=warning -pedantic -Werror \ +// RUN: %S/Inputs/module.map -o %t.dir/warning.pcm + +// RUN: %clang_cc1 -fmodules -I %S/Inputs \ +// RUN: -emit-module -fmodule-name=warning -pedantic -Werror \ +// RUN: %S/Inputs/module.map -o %t.dir/warning-system.pcm -fsystem-module + +// RUN: not %clang_cc1 -fmodules -I %S/Inputs \ +// RUN: -emit-module -fmodule-name=warning -pedantic -Werror \ +// RUN: %S/Inputs/module.map -o %t.dir/warning-system.pcm -fsystem-module \ +// RUN: -Wsystem-headers Index: clang/lib/Frontend/CompilerInvocation.cpp =================================================================== --- clang/lib/Frontend/CompilerInvocation.cpp +++ clang/lib/Frontend/CompilerInvocation.cpp @@ -1905,6 +1905,11 @@ Opts.ModulesEmbedAllFiles = Args.hasArg(OPT_fmodules_embed_all_files); Opts.IncludeTimestamps = !Args.hasArg(OPT_fno_pch_timestamp); Opts.UseTemporary = !Args.hasArg(OPT_fno_temp_file); + Opts.IsSystemModule = Args.hasArg(OPT_fsystem_module); + + if (Opts.ProgramAction != frontend::GenerateModule && Opts.IsSystemModule) + Diags.Report(diag::err_drv_argument_only_allowed_with) << "-fsystem-module" + << "-emit-module"; Opts.CodeCompleteOpts.IncludeMacros = Args.hasArg(OPT_code_completion_macros); @@ -2061,12 +2066,16 @@ DashX = IK; } + bool IsSystem = false; + // The -emit-module action implicitly takes a module map. if (Opts.ProgramAction == frontend::GenerateModule && - IK.getFormat() == InputKind::Source) + IK.getFormat() == InputKind::Source) { IK = IK.withFormat(InputKind::ModuleMap); + IsSystem = Opts.IsSystemModule; + } - Opts.Inputs.emplace_back(std::move(Inputs[i]), IK); + Opts.Inputs.emplace_back(std::move(Inputs[i]), IK, IsSystem); } return DashX; Index: clang/include/clang/Frontend/FrontendOptions.h =================================================================== --- clang/include/clang/Frontend/FrontendOptions.h +++ clang/include/clang/Frontend/FrontendOptions.h @@ -297,6 +297,9 @@ /// Should a temporary file be used during compilation. unsigned UseTemporary : 1; + /// When using -emit-module, treat the modulemap as a system module. + unsigned IsSystemModule : 1; + CodeCompleteOptions CodeCompleteOpts; /// Specifies the output format of the AST. Index: clang/include/clang/Driver/Options.td =================================================================== --- clang/include/clang/Driver/Options.td +++ clang/include/clang/Driver/Options.td @@ -1445,6 +1445,8 @@ def fmodule_name : Separate<["-"], "fmodule-name">, Alias<fmodule_name_EQ>; def fmodule_implementation_of : Separate<["-"], "fmodule-implementation-of">, Flags<[CC1Option]>, Alias<fmodule_name_EQ>; +def fsystem_module : Flag<["-"], "fsystem-module">, Flags<[CC1Option]>, + HelpText<"Build this module as a system module. Only used with -emit-module">; def fmodule_map_file : Joined<["-"], "fmodule-map-file=">, Group<f_Group>, Flags<[DriverOption,CC1Option]>, MetaVarName<"<file>">, HelpText<"Load this module map file">;
Index: clang/test/Modules/fsystem-module.m =================================================================== --- /dev/null +++ clang/test/Modules/fsystem-module.m @@ -0,0 +1,18 @@ +// RUN: rm -rf %t.dir +// RUN: mkdir %t.dir + +// -fsystem-module requires -emit-module +// RUN: not %clang_cc1 -fsyntax-only -fsystem-module %s 2>&1 | grep "-emit-module" + +// RUN: not %clang_cc1 -fmodules -I %S/Inputs \ +// RUN: -emit-module -fmodule-name=warning -pedantic -Werror \ +// RUN: %S/Inputs/module.map -o %t.dir/warning.pcm + +// RUN: %clang_cc1 -fmodules -I %S/Inputs \ +// RUN: -emit-module -fmodule-name=warning -pedantic -Werror \ +// RUN: %S/Inputs/module.map -o %t.dir/warning-system.pcm -fsystem-module + +// RUN: not %clang_cc1 -fmodules -I %S/Inputs \ +// RUN: -emit-module -fmodule-name=warning -pedantic -Werror \ +// RUN: %S/Inputs/module.map -o %t.dir/warning-system.pcm -fsystem-module \ +// RUN: -Wsystem-headers Index: clang/lib/Frontend/CompilerInvocation.cpp =================================================================== --- clang/lib/Frontend/CompilerInvocation.cpp +++ clang/lib/Frontend/CompilerInvocation.cpp @@ -1905,6 +1905,11 @@ Opts.ModulesEmbedAllFiles = Args.hasArg(OPT_fmodules_embed_all_files); Opts.IncludeTimestamps = !Args.hasArg(OPT_fno_pch_timestamp); Opts.UseTemporary = !Args.hasArg(OPT_fno_temp_file); + Opts.IsSystemModule = Args.hasArg(OPT_fsystem_module); + + if (Opts.ProgramAction != frontend::GenerateModule && Opts.IsSystemModule) + Diags.Report(diag::err_drv_argument_only_allowed_with) << "-fsystem-module" + << "-emit-module"; Opts.CodeCompleteOpts.IncludeMacros = Args.hasArg(OPT_code_completion_macros); @@ -2061,12 +2066,16 @@ DashX = IK; } + bool IsSystem = false; + // The -emit-module action implicitly takes a module map. if (Opts.ProgramAction == frontend::GenerateModule && - IK.getFormat() == InputKind::Source) + IK.getFormat() == InputKind::Source) { IK = IK.withFormat(InputKind::ModuleMap); + IsSystem = Opts.IsSystemModule; + } - Opts.Inputs.emplace_back(std::move(Inputs[i]), IK); + Opts.Inputs.emplace_back(std::move(Inputs[i]), IK, IsSystem); } return DashX; Index: clang/include/clang/Frontend/FrontendOptions.h =================================================================== --- clang/include/clang/Frontend/FrontendOptions.h +++ clang/include/clang/Frontend/FrontendOptions.h @@ -297,6 +297,9 @@ /// Should a temporary file be used during compilation. unsigned UseTemporary : 1; + /// When using -emit-module, treat the modulemap as a system module. + unsigned IsSystemModule : 1; + CodeCompleteOptions CodeCompleteOpts; /// Specifies the output format of the AST. Index: clang/include/clang/Driver/Options.td =================================================================== --- clang/include/clang/Driver/Options.td +++ clang/include/clang/Driver/Options.td @@ -1445,6 +1445,8 @@ def fmodule_name : Separate<["-"], "fmodule-name">, Alias<fmodule_name_EQ>; def fmodule_implementation_of : Separate<["-"], "fmodule-implementation-of">, Flags<[CC1Option]>, Alias<fmodule_name_EQ>; +def fsystem_module : Flag<["-"], "fsystem-module">, Flags<[CC1Option]>, + HelpText<"Build this module as a system module. Only used with -emit-module">; def fmodule_map_file : Joined<["-"], "fmodule-map-file=">, Group<f_Group>, Flags<[DriverOption,CC1Option]>, MetaVarName<"<file>">, HelpText<"Load this module map file">;
_______________________________________________ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits