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); } };