16d528ed9Sopenharmony_cidiff --git a/src/gn/filesystem_utils.cc b/src/gn/filesystem_utils.cc
26d528ed9Sopenharmony_ciindex 58d8cca..5f61443 100644
36d528ed9Sopenharmony_ci--- a/src/gn/filesystem_utils.cc
46d528ed9Sopenharmony_ci+++ b/src/gn/filesystem_utils.cc
56d528ed9Sopenharmony_ci@@ -1069,25 +1069,10 @@ OutputFile GetSubBuildDirAsOutputFile(const BuildDirContext& context,
66d528ed9Sopenharmony_ci   OutputFile result = GetBuildDirAsOutputFile(context, type);
76d528ed9Sopenharmony_ci 
86d528ed9Sopenharmony_ci   if (source_dir.is_source_absolute()) {
96d528ed9Sopenharmony_ci-    std::string_view build_dir = context.build_settings->build_dir().value();
106d528ed9Sopenharmony_ci-    std::string_view source_dir_path = source_dir.value();
116d528ed9Sopenharmony_ci-    if (source_dir_path.substr(0, build_dir.size()) == build_dir) {
126d528ed9Sopenharmony_ci-      // The source dir is source-absolute, but in the build directory
136d528ed9Sopenharmony_ci-      // (e.g. `//out/Debug/gen/src/foo.cc` or
146d528ed9Sopenharmony_ci-      // `//out/Debug/toolchain1/gen/foo.cc`), which happens for generated
156d528ed9Sopenharmony_ci-      // sources. In this case, remove the build directory prefix, and replace
166d528ed9Sopenharmony_ci-      // it with `BUILD_DIR`. This will create results like `obj/BUILD_DIR/gen`
176d528ed9Sopenharmony_ci-      // or `toolchain2/obj/BUILD_DIR/toolchain1/gen` which look surprising,
186d528ed9Sopenharmony_ci-      // but guarantee unicity.
196d528ed9Sopenharmony_ci-      result.value().append("BUILD_DIR/");
206d528ed9Sopenharmony_ci-      result.value().append(&source_dir_path[build_dir.size()],
216d528ed9Sopenharmony_ci-                            source_dir_path.size() - build_dir.size());
226d528ed9Sopenharmony_ci-    } else {
236d528ed9Sopenharmony_ci-      // The source dir is source-absolute, so we trim off the two leading
246d528ed9Sopenharmony_ci-      // slashes to append to the toolchain object directory.
256d528ed9Sopenharmony_ci-      result.value().append(&source_dir.value()[2],
266d528ed9Sopenharmony_ci-                            source_dir.value().size() - 2);
276d528ed9Sopenharmony_ci-    }
286d528ed9Sopenharmony_ci+    // The source dir is source-absolute, so we trim off the two leading
296d528ed9Sopenharmony_ci+    // slashes to append to the toolchain object directory.
306d528ed9Sopenharmony_ci+    result.value().append(&source_dir.value()[2],
316d528ed9Sopenharmony_ci+                          source_dir.value().size() - 2);
326d528ed9Sopenharmony_ci   } else {
336d528ed9Sopenharmony_ci     // System-absolute.
346d528ed9Sopenharmony_ci     AppendFixedAbsolutePathSuffix(context.build_settings, source_dir, &result);
356d528ed9Sopenharmony_cidiff --git a/src/gn/ninja_c_binary_target_writer_unittest.cc b/src/gn/ninja_c_binary_target_writer_unittest.cc
366d528ed9Sopenharmony_ciindex 9476193..6056c36 100644
376d528ed9Sopenharmony_ci--- a/src/gn/ninja_c_binary_target_writer_unittest.cc
386d528ed9Sopenharmony_ci+++ b/src/gn/ninja_c_binary_target_writer_unittest.cc
396d528ed9Sopenharmony_ci@@ -405,18 +405,18 @@ TEST_F(NinjaCBinaryTargetWriterTest, NoHardDepsToNoPublicHeaderTarget) {
406d528ed9Sopenharmony_ci       "target_out_dir = obj/foo\n"
416d528ed9Sopenharmony_ci       "target_output_name = gen_obj\n"
426d528ed9Sopenharmony_ci       "\n"
436d528ed9Sopenharmony_ci-      "build obj/BUILD_DIR/gen_obj.generated.o: cxx generated.cc"
446d528ed9Sopenharmony_ci+      "build obj/out/Debug/gen_obj.generated.o: cxx generated.cc"
456d528ed9Sopenharmony_ci       " || obj/foo/generate.stamp\n"
466d528ed9Sopenharmony_ci       "  source_file_part = generated.cc\n"
476d528ed9Sopenharmony_ci       "  source_name_part = generated\n"
486d528ed9Sopenharmony_ci       "\n"
496d528ed9Sopenharmony_ci-      "build obj/foo/gen_obj.stamp: stamp obj/BUILD_DIR/gen_obj.generated.o"
506d528ed9Sopenharmony_ci+      "build obj/foo/gen_obj.stamp: stamp obj/out/Debug/gen_obj.generated.o"
516d528ed9Sopenharmony_ci       // The order-only dependency here is strictly unnecessary since the
526d528ed9Sopenharmony_ci       // sources list this as an order-only dep.
536d528ed9Sopenharmony_ci       " || obj/foo/generate.stamp\n";
546d528ed9Sopenharmony_ci 
556d528ed9Sopenharmony_ci   std::string obj_str = obj_out.str();
566d528ed9Sopenharmony_ci-  EXPECT_EQ(std::string(obj_expected), obj_str);
576d528ed9Sopenharmony_ci+  EXPECT_EQ(obj_expected, obj_str);
586d528ed9Sopenharmony_ci 
596d528ed9Sopenharmony_ci   // A shared library depends on gen_obj, having corresponding header for
606d528ed9Sopenharmony_ci   // generated obj.
616d528ed9Sopenharmony_ci@@ -442,7 +442,7 @@ TEST_F(NinjaCBinaryTargetWriterTest, NoHardDepsToNoPublicHeaderTarget) {
626d528ed9Sopenharmony_ci       "target_output_name = libgen_lib\n"
636d528ed9Sopenharmony_ci       "\n"
646d528ed9Sopenharmony_ci       "\n"
656d528ed9Sopenharmony_ci-      "build ./libgen_lib.so: solink obj/BUILD_DIR/gen_obj.generated.o"
666d528ed9Sopenharmony_ci+      "build ./libgen_lib.so: solink obj/out/Debug/gen_obj.generated.o"
676d528ed9Sopenharmony_ci       // The order-only dependency here is strictly unnecessary since
686d528ed9Sopenharmony_ci       // obj/out/Debug/gen_obj.generated.o has dependency to
696d528ed9Sopenharmony_ci       // obj/foo/gen_obj.stamp
706d528ed9Sopenharmony_cidiff --git a/src/gn/substitution_writer_unittest.cc b/src/gn/substitution_writer_unittest.cc
716d528ed9Sopenharmony_ciindex eaa521a..fc3c446 100644
726d528ed9Sopenharmony_ci--- a/src/gn/substitution_writer_unittest.cc
736d528ed9Sopenharmony_ci+++ b/src/gn/substitution_writer_unittest.cc
746d528ed9Sopenharmony_ci@@ -45,12 +45,6 @@ TEST(SubstitutionWriter, ApplyPatternToSource) {
756d528ed9Sopenharmony_ci   SourceFile result = SubstitutionWriter::ApplyPatternToSource(
766d528ed9Sopenharmony_ci       nullptr, setup.settings(), pattern, SourceFile("//foo/bar/myfile.txt"));
776d528ed9Sopenharmony_ci   ASSERT_EQ("//out/Debug/gen/foo/bar/myfile.tmp", result.value());
786d528ed9Sopenharmony_ci-
796d528ed9Sopenharmony_ci-  result = SubstitutionWriter::ApplyPatternToSource(
806d528ed9Sopenharmony_ci-      nullptr, setup.settings(), pattern,
816d528ed9Sopenharmony_ci-      SourceFile("//out/Debug/gen/generated_file.cc"));
826d528ed9Sopenharmony_ci-  ASSERT_EQ("//out/Debug/gen/BUILD_DIR/gen/generated_file.tmp", result.value())
836d528ed9Sopenharmony_ci-      << result.value();
846d528ed9Sopenharmony_ci }
856d528ed9Sopenharmony_ci 
866d528ed9Sopenharmony_ci TEST(SubstitutionWriter, ApplyPatternToSourceAsOutputFile) {
87