Make clang modules output -fmodule-file=foo=<pcm>.
-fmodule-file=<pcm> is deprecated, and it also reads the module files
eagerly instead of lazily.
This decreases the compile times of an empty file for chrome from 60ms
to 30ms.
https://clang.llvm.org/docs/StandardCPlusPlusModules.html#specifying-bmi-dependencies
Change-Id: Iac7e4d86c79f75fa4e58c0e9b75f46216a6a6964
Reviewed-on: https://gn-review.googlesource.com/c/gn/+/20380
Commit-Queue: Matt Stark <msta@google.com>
Reviewed-by: Takuto Ikuta <tikuta@google.com>
diff --git a/src/gn/compile_commands_writer.cc b/src/gn/compile_commands_writer.cc
index c0c9ae7..9ab038e 100644
--- a/src/gn/compile_commands_writer.cc
+++ b/src/gn/compile_commands_writer.cc
@@ -105,7 +105,7 @@
if (!module_dep_info.empty()) {
std::ostringstream module_deps_out;
for (const auto& module_dep : module_dep_info) {
- module_deps_out << " -fmodule-file=";
+ module_deps_out << " -fmodule-file=" << module_dep.module_name << "=";
path_output.WriteFile(module_deps_out, module_dep.pcm);
}
base::EscapeJSONString(module_deps_out.str(), false,
@@ -114,7 +114,8 @@
std::ostringstream module_deps_no_self_out;
for (const auto& module_dep : module_dep_info) {
if (!module_dep.is_self) {
- module_deps_no_self_out << " -fmodule-file=";
+ module_deps_no_self_out << " -fmodule-file=" << module_dep.module_name
+ << "=";
path_output.WriteFile(module_deps_no_self_out, module_dep.pcm);
}
}
diff --git a/src/gn/compile_commands_writer_unittest.cc b/src/gn/compile_commands_writer_unittest.cc
index badd100..9dff19d 100644
--- a/src/gn/compile_commands_writer_unittest.cc
+++ b/src/gn/compile_commands_writer_unittest.cc
@@ -666,7 +666,7 @@
" \"file\": \"../../foo/dep.cc\",\r\n"
" \"directory\": \"out/Debug\",\r\n"
" \"command\": \"c++ ../../foo/dep.cc "
- "-fmodule-file=withmodules/obj/foo/module.foo.pcm -o "
+ "-fmodule-file=module=withmodules/obj/foo/module.foo.pcm -o "
"withmodules/obj/foo/dep.dep.o\"\r\n"
" }\r\n"
"]\r\n";
@@ -677,7 +677,7 @@
" \"file\": \"../../foo/dep.cc\",\n"
" \"directory\": \"out/Debug\",\n"
" \"command\": \"c++ ../../foo/dep.cc "
- "-fmodule-file=withmodules/obj/foo/module.foo.pcm -o "
+ "-fmodule-file=module=withmodules/obj/foo/module.foo.pcm -o "
"withmodules/obj/foo/dep.dep.o\"\n"
" }\n"
"]\n";
diff --git a/src/gn/ninja_c_binary_target_writer.cc b/src/gn/ninja_c_binary_target_writer.cc
index cc98af4..4d9d6e9 100644
--- a/src/gn/ninja_c_binary_target_writer.cc
+++ b/src/gn/ninja_c_binary_target_writer.cc
@@ -195,6 +195,8 @@
if (!module_dep.is_self || include_self) {
out_ << " ";
EscapeStringToStream(out_, "-fmodule-file=", options);
+ EscapeStringToStream(out_, module_dep.module_name, options);
+ out_ << "=";
path_output_.WriteFile(out_, module_dep.pcm);
}
}
diff --git a/src/gn/ninja_c_binary_target_writer_unittest.cc b/src/gn/ninja_c_binary_target_writer_unittest.cc
index 9789327..97ddad0 100644
--- a/src/gn/ninja_c_binary_target_writer_unittest.cc
+++ b/src/gn/ninja_c_binary_target_writer_unittest.cc
@@ -2584,7 +2584,7 @@
include_dirs =
cflags =
cflags_cc =
-module_deps = -fmodule-file=obj/blah/liba.a.pcm
+module_deps = -fmodule-file=a=obj/blah/liba.a.pcm
module_deps_no_self =
label = //blah$:a
root_out_dir = withmodules
@@ -2630,8 +2630,8 @@
include_dirs =
cflags =
cflags_cc =
-module_deps = -fmodule-file=obj/blah/liba.a.pcm -fmodule-file=obj/stuff/libb.b.pcm
-module_deps_no_self = -fmodule-file=obj/blah/liba.a.pcm
+module_deps = -fmodule-file=a=obj/blah/liba.a.pcm -fmodule-file=b=obj/stuff/libb.b.pcm
+module_deps_no_self = -fmodule-file=a=obj/blah/liba.a.pcm
label = //stuff$:b
root_out_dir = withmodules
target_out_dir = obj/stuff
@@ -2674,8 +2674,8 @@
include_dirs =
cflags =
cflags_cc =
-module_deps = -fmodule-file=obj/blah/liba.a.pcm -fmodule-file=obj/stuff/libb.b.pcm -fmodule-file=obj/stuff/libc.c.pcm
-module_deps_no_self = -fmodule-file=obj/blah/liba.a.pcm -fmodule-file=obj/stuff/libb.b.pcm
+module_deps = -fmodule-file=a=obj/blah/liba.a.pcm -fmodule-file=b=obj/stuff/libb.b.pcm -fmodule-file=c=obj/stuff/libc.c.pcm
+module_deps_no_self = -fmodule-file=a=obj/blah/liba.a.pcm -fmodule-file=b=obj/stuff/libb.b.pcm
label = //things$:c
root_out_dir = withmodules
target_out_dir = obj/things
@@ -2714,8 +2714,8 @@
include_dirs =
cflags =
cflags_cc =
-module_deps = -fmodule-file=obj/blah/liba.a.pcm -fmodule-file=obj/stuff/libb.b.pcm
-module_deps_no_self = -fmodule-file=obj/blah/liba.a.pcm -fmodule-file=obj/stuff/libb.b.pcm
+module_deps = -fmodule-file=a=obj/blah/liba.a.pcm -fmodule-file=b=obj/stuff/libb.b.pcm
+module_deps_no_self = -fmodule-file=a=obj/blah/liba.a.pcm -fmodule-file=b=obj/stuff/libb.b.pcm
label = //zap$:c
root_out_dir = withmodules
target_out_dir = obj/zap
diff --git a/src/gn/ninja_module_writer_util.cc b/src/gn/ninja_module_writer_util.cc
index b08aafd..168895f 100644
--- a/src/gn/ninja_module_writer_util.cc
+++ b/src/gn/ninja_module_writer_util.cc
@@ -46,10 +46,6 @@
if (!modulemap) // Not a module or no .modulemap file.
return;
- std::string label;
- CHECK(SubstitutionWriter::GetTargetSubstitution(
- t, &SubstitutionLabelNoToolchain, &label));
-
const char* tool_type;
std::vector<OutputFile> modulemap_outputs;
CHECK(
@@ -58,7 +54,8 @@
const OutputFile& pcm_file = modulemap_outputs[0];
if (added_pcms.insert(pcm_file).second) {
- ret.emplace_back(modulemap, label, pcm_file, is_self);
+ // GN sets the module name to the name of the target.
+ ret.emplace_back(modulemap, t->label().name(), pcm_file, is_self);
}
};