Fix: Ensure only actual object files are included in link inputs

c_additional_outputs feature introduced additional outputs (e.g., .dwo
files) that inadvertently became part of the link inputs. This was
unintended, as typically only true object files should serve as link
inputs.

Bug: 502431091
Change-Id: Ie51f40f4cc222b15b7ef93a4b67634a977e71d6b
Reviewed-on: https://gn-review.googlesource.com/c/gn/+/22080
Reviewed-by: Andrew Grieve <agrieve@google.com>
Commit-Queue: Takuto Ikuta <tikuta@google.com>
diff --git a/src/gn/ninja_binary_target_writer.cc b/src/gn/ninja_binary_target_writer.cc
index 163141b..7aae0f8 100644
--- a/src/gn/ninja_binary_target_writer.cc
+++ b/src/gn/ninja_binary_target_writer.cc
@@ -319,8 +319,16 @@
     // Do not add .pcm files as they are not object files linked to final
     // binaries.
     if (source.GetType() != SourceFile::SOURCE_MODULEMAP &&
-        source_set->GetOutputFilesForSource(source, &tool_name, &tool_outputs))
-      obj_files->push_back(tool_outputs[0]);
+        source_set->GetOutputFilesForSource(source, &tool_name,
+                                            &tool_outputs)) {
+      const OutputFile& output = tool_outputs[0];
+      SourceFile output_as_source =
+          output.AsSourceFile(source_set->settings()->build_settings());
+      // Only collect actual object files for linking.
+      if (output_as_source.IsObjectType()) {
+        obj_files->push_back(output);
+      }
+    }
   }
 
   // Swift files may generate one object file per module or one per source file
diff --git a/src/gn/ninja_c_binary_target_writer.cc b/src/gn/ninja_c_binary_target_writer.cc
index 14f95ed..4b4fb1a 100644
--- a/src/gn/ninja_c_binary_target_writer.cc
+++ b/src/gn/ninja_c_binary_target_writer.cc
@@ -477,13 +477,21 @@
     // It's theoretically possible for a compiler to produce more than one
     // output, but we'll only link to the first output.
     if (!source.IsModuleMapType()) {
-      object_files->push_back(tool_outputs[0]);
+      const OutputFile& output = tool_outputs[0];
+      SourceFile output_as_source =
+          output.AsSourceFile(target_->settings()->build_settings());
+      // Only include actual object files for linking.
+      if (output_as_source.IsObjectType()) {
+        object_files->push_back(output);
+      } else {
+        extra_files->push_back(output);
+      }
     } else {
       extra_files->push_back(tool_outputs[0]);
     }
 
-    // Add additional outputs to extra_files so they are included in the
-    // target's stamp file.
+    // Ensure all additional outputs produced by this source are tracked for
+    // dependencies (e.g., included in the target's stamp file).
     for (size_t i = 1; i < tool_outputs.size(); ++i) {
       extra_files->push_back(tool_outputs[i]);
     }
diff --git a/src/gn/ninja_c_binary_target_writer_unittest.cc b/src/gn/ninja_c_binary_target_writer_unittest.cc
index beb7409..1f7f12b 100644
--- a/src/gn/ninja_c_binary_target_writer_unittest.cc
+++ b/src/gn/ninja_c_binary_target_writer_unittest.cc
@@ -191,7 +191,7 @@
   ASSERT_TRUE(config.OnResolved(&err));
 
   Target target(setup.settings(), Label(SourceDir("//foo/"), "bar"));
-  target.set_output_type(Target::SOURCE_SET);
+  target.set_output_type(Target::EXECUTABLE);
   target.visibility().SetPublic();
   target.sources().push_back(SourceFile("//foo/input1.cc"));
   target.source_types_used().Set(SourceFile::SOURCE_CPP);
@@ -218,7 +218,13 @@
       "  source_file_part = input1.cc\n"
       "  source_name_part = input1\n"
       "\n"
-      "build phony/foo/bar: phony obj/foo/bar.input1.o obj/foo/input1.dwo\n";
+      "build ./bar: link obj/foo/bar.input1.o\n"
+      "  ldflags =\n"
+      "  libs =\n"
+      "  frameworks =\n"
+      "  swiftmodules =\n"
+      "  output_extension =\n"
+      "  output_dir =\n";
 
   EXPECT_EQ(expected, out.str());
 }