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