From: Elad Cohen Date: Mon, 31 Oct 2016 08:21:54 +0000 (+0000) Subject: [Modules] Add a command line option for loading the clang builtins modulemap. X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=780a9183bbdbdde327e06de4b2ef38bb8f511485;p=clang [Modules] Add a command line option for loading the clang builtins modulemap. -fbuiltin-module-map loads the clang builtins modulemap file. (This is equivalent to -fmodule-map-file=/include/module.modulemap) Differential Revision: https://reviews.llvm.org/D25767 git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@285548 91177308-0d34-0410-b5e6-96231b3b80d8 --- diff --git a/docs/Modules.rst b/docs/Modules.rst index e252c63d27..141d3b8575 100644 --- a/docs/Modules.rst +++ b/docs/Modules.rst @@ -174,6 +174,9 @@ Command-line parameters ``-fmodules`` Enable the modules feature. +``-fbuiltin-module-map`` + Load the Clang builtins module map file. (Equivalent to ``-fmodule-map-file=/include/module.modulemap``) + ``-fimplicit-module-maps`` Enable implicit search for module map files named ``module.modulemap`` and similar. This option is implied by ``-fmodules``. If this is disabled with ``-fno-implicit-module-maps``, module map files will only be loaded if they are explicitly specified via ``-fmodule-map-file`` or transitively used by another module map file. diff --git a/include/clang/Driver/Options.td b/include/clang/Driver/Options.td index b74897c756..c6cdccbcd6 100644 --- a/include/clang/Driver/Options.td +++ b/include/clang/Driver/Options.td @@ -553,6 +553,8 @@ def fbootclasspath_EQ : Joined<["-"], "fbootclasspath=">, Group; def fborland_extensions : Flag<["-"], "fborland-extensions">, Group, Flags<[CC1Option]>, HelpText<"Accept non-standard constructs supported by the Borland compiler">; def fbuiltin : Flag<["-"], "fbuiltin">, Group; +def fbuiltin_module_map : Flag <["-"], "fbuiltin-module-map">, Group, + Flags<[DriverOption]>, HelpText<"Load the clang builtins module map file.">; def fcaret_diagnostics : Flag<["-"], "fcaret-diagnostics">, Group; def fclasspath_EQ : Joined<["-"], "fclasspath=">, Group; def fcolor_diagnostics : Flag<["-"], "fcolor-diagnostics">, Group, diff --git a/lib/Driver/Tools.cpp b/lib/Driver/Tools.cpp index 4beaba3743..b8a0a680ef 100644 --- a/lib/Driver/Tools.cpp +++ b/lib/Driver/Tools.cpp @@ -5636,6 +5636,18 @@ void Clang::ConstructJob(Compilation &C, const JobAction &JA, // definitions. Args.AddAllArgs(CmdArgs, options::OPT_fmodule_map_file); + // -fbuiltin-module-map can be used to load the clang + // builtin headers modulemap file. + if (Args.hasArg(options::OPT_fbuiltin_module_map)) { + SmallString<128> BuiltinModuleMap(getToolChain().getDriver().ResourceDir); + llvm::sys::path::append(BuiltinModuleMap, "include"); + llvm::sys::path::append(BuiltinModuleMap, "module.modulemap"); + if (llvm::sys::fs::exists(BuiltinModuleMap)) { + CmdArgs.push_back(Args.MakeArgString("-fmodule-map-file=" + + BuiltinModuleMap)); + } + } + // -fmodule-file can be used to specify files containing precompiled modules. if (HaveAnyModules) Args.AddAllArgs(CmdArgs, options::OPT_fmodule_file); diff --git a/test/Driver/modules.m b/test/Driver/modules.m index ec82cc183b..e08de94d0e 100644 --- a/test/Driver/modules.m +++ b/test/Driver/modules.m @@ -51,6 +51,10 @@ // CHECK-MODULE-MAP-FILES: "-fmodule-map-file=foo.map" // CHECK-MODULE-MAP-FILES: "-fmodule-map-file=bar.map" +// RUN: %clang -fmodules -fbuiltin-module-map -### %s 2>&1 | FileCheck -check-prefix=CHECK-BUILTIN-MODULE-MAP %s +// CHECK-BUILTIN-MODULE-MAP: "-fmodules" +// CHECK-BUILTIN-MODULE-MAP: "-fmodule-map-file={{.*}}include{{/|\\\\}}module.modulemap" + // RUN: %clang -fmodules -fmodule-file=foo.pcm -fmodule-file=bar.pcm -### %s 2>&1 | FileCheck -check-prefix=CHECK-MODULE-FILES %s // CHECK-MODULE-FILES: "-fmodules" // CHECK-MODULE-FILES: "-fmodule-file=foo.pcm" diff --git a/test/Modules/compiler_builtins.m b/test/Modules/compiler_builtins.m index bffbcc6dde..a5e6315ced 100644 --- a/test/Modules/compiler_builtins.m +++ b/test/Modules/compiler_builtins.m @@ -1,6 +1,7 @@ // RUN: rm -rf %t // RUN: %clang_cc1 -fsyntax-only -fmodules -fimplicit-module-maps -fmodules-cache-path=%t %s -I%S/Inputs/System/usr/include -verify // RUN: %clang_cc1 -fsyntax-only -std=c99 -fmodules -fimplicit-module-maps -fmodules-cache-path=%t %s -I%S/Inputs/System/usr/include -verify +// RUN: %clang_cc1 -fsyntax-only -fmodules -fmodule-map-file=%resource_dir/module.modulemap -fmodules-cache-path=%t %s -I%S/Inputs/System/usr/include -verify // expected-no-diagnostics #ifdef __SSE__ diff --git a/test/Modules/compiler_builtins_x86.c b/test/Modules/compiler_builtins_x86.c index d44c3029ad..1b4d42177a 100644 --- a/test/Modules/compiler_builtins_x86.c +++ b/test/Modules/compiler_builtins_x86.c @@ -1,5 +1,6 @@ // RUN: rm -rf %t // RUN: %clang_cc1 -triple i686-unknown-unknown -fsyntax-only -fmodules -fimplicit-module-maps -fmodules-cache-path=%t %s -verify -ffreestanding +// RUN: %clang_cc1 -triple i686-unknown-unknown -fsyntax-only -fmodules -fmodule-map-file=%resource_dir/module.modulemap -fmodules-cache-path=%t %s -verify -ffreestanding // expected-no-diagnostics #include diff --git a/test/lit.cfg b/test/lit.cfg index aea4d6aa31..7695ea87b4 100644 --- a/test/lit.cfg +++ b/test/lit.cfg @@ -268,6 +268,7 @@ config.substitutions.append( ('%clang', ' ' + config.clang + ' ') ) config.substitutions.append( ('%test_debuginfo', ' ' + config.llvm_src_root + '/utils/test_debuginfo.pl ') ) config.substitutions.append( ('%itanium_abi_triple', makeItaniumABITriple(config.target_triple)) ) config.substitutions.append( ('%ms_abi_triple', makeMSABITriple(config.target_triple)) ) +config.substitutions.append( ('%resource_dir', getClangBuiltinIncludeDir(config.clang)) ) # The host triple might not be set, at least if we're compiling clang from # an already installed llvm.