Add new debug_prefix_map_pwd_is_dot CROSSTOOL feature

This feature sets `-fdebug_prefix_map=$PWD=.` as an argument to Clang
in order to standardize the paths to debug symbols (by making them
relative to the exec root).

Note that this needs to be implemented inside wrapped_clang instead
of as an argument to the action itself for caching purposes, as PWD
can change based on the action's executor.

PiperOrigin-RevId: 206019016
diff --git a/tools/osx/crosstool/CROSSTOOL.tpl b/tools/osx/crosstool/CROSSTOOL.tpl
index 6686ce0..0e29643 100644
--- a/tools/osx/crosstool/CROSSTOOL.tpl
+++ b/tools/osx/crosstool/CROSSTOOL.tpl
@@ -201,6 +201,24 @@
     }
   }
   feature {
+    name: "debug_prefix_map_pwd_is_dot"
+    flag_set {
+      action: "assemble"
+      action: "preprocess-assemble"
+      action: "c-compile"
+      action: "c++-compile"
+      action: "c++-header-parsing"
+      action: "c++-module-compile"
+      action: "c++-module-codegen"
+      action: "linkstamp-compile"
+      action: "objc-compile"
+      action: "objc++-compile"
+      flag_group {
+        flag: "DEBUG_PREFIX_MAP_PWD=."
+      }
+    }
+  }
+  feature {
     name: "no_dsym_create_zip"
   }
   feature {
@@ -1830,6 +1848,24 @@
     }
   }
   feature {
+    name: "debug_prefix_map_pwd_is_dot"
+    flag_set {
+      action: "assemble"
+      action: "preprocess-assemble"
+      action: "c-compile"
+      action: "c++-compile"
+      action: "c++-header-parsing"
+      action: "c++-module-compile"
+      action: "c++-module-codegen"
+      action: "linkstamp-compile"
+      action: "objc-compile"
+      action: "objc++-compile"
+      flag_group {
+        flag: "DEBUG_PREFIX_MAP_PWD=."
+      }
+    }
+  }
+  feature {
     name: "no_dsym_create_zip"
   }
   feature {
@@ -3475,6 +3511,24 @@
     }
   }
   feature {
+    name: "debug_prefix_map_pwd_is_dot"
+    flag_set {
+      action: "assemble"
+      action: "preprocess-assemble"
+      action: "c-compile"
+      action: "c++-compile"
+      action: "c++-header-parsing"
+      action: "c++-module-compile"
+      action: "c++-module-codegen"
+      action: "linkstamp-compile"
+      action: "objc-compile"
+      action: "objc++-compile"
+      flag_group {
+        flag: "DEBUG_PREFIX_MAP_PWD=."
+      }
+    }
+  }
+  feature {
     name: "no_dsym_create_zip"
   }
   feature {
@@ -5123,6 +5177,24 @@
     }
   }
   feature {
+    name: "debug_prefix_map_pwd_is_dot"
+    flag_set {
+      action: "assemble"
+      action: "preprocess-assemble"
+      action: "c-compile"
+      action: "c++-compile"
+      action: "c++-header-parsing"
+      action: "c++-module-compile"
+      action: "c++-module-codegen"
+      action: "linkstamp-compile"
+      action: "objc-compile"
+      action: "objc++-compile"
+      flag_group {
+        flag: "DEBUG_PREFIX_MAP_PWD=."
+      }
+    }
+  }
+  feature {
     name: "no_dsym_create_zip"
   }
   feature {
@@ -6798,6 +6870,24 @@
     }
   }
   feature {
+    name: "debug_prefix_map_pwd_is_dot"
+    flag_set {
+      action: "assemble"
+      action: "preprocess-assemble"
+      action: "c-compile"
+      action: "c++-compile"
+      action: "c++-header-parsing"
+      action: "c++-module-compile"
+      action: "c++-module-codegen"
+      action: "linkstamp-compile"
+      action: "objc-compile"
+      action: "objc++-compile"
+      flag_group {
+        flag: "DEBUG_PREFIX_MAP_PWD=."
+      }
+    }
+  }
+  feature {
     name: "no_dsym_create_zip"
   }
   feature {
@@ -8443,6 +8533,24 @@
     }
   }
   feature {
+    name: "debug_prefix_map_pwd_is_dot"
+    flag_set {
+      action: "assemble"
+      action: "preprocess-assemble"
+      action: "c-compile"
+      action: "c++-compile"
+      action: "c++-header-parsing"
+      action: "c++-module-compile"
+      action: "c++-module-codegen"
+      action: "linkstamp-compile"
+      action: "objc-compile"
+      action: "objc++-compile"
+      flag_group {
+        flag: "DEBUG_PREFIX_MAP_PWD=."
+      }
+    }
+  }
+  feature {
     name: "no_dsym_create_zip"
   }
   feature {
@@ -10076,6 +10184,24 @@
     }
   }
   feature {
+    name: "debug_prefix_map_pwd_is_dot"
+    flag_set {
+      action: "assemble"
+      action: "preprocess-assemble"
+      action: "c-compile"
+      action: "c++-compile"
+      action: "c++-header-parsing"
+      action: "c++-module-compile"
+      action: "c++-module-codegen"
+      action: "linkstamp-compile"
+      action: "objc-compile"
+      action: "objc++-compile"
+      flag_group {
+        flag: "DEBUG_PREFIX_MAP_PWD=."
+      }
+    }
+  }
+  feature {
     name: "no_dsym_create_zip"
   }
   feature {
@@ -11712,6 +11838,24 @@
     }
   }
   feature {
+    name: "debug_prefix_map_pwd_is_dot"
+    flag_set {
+      action: "assemble"
+      action: "preprocess-assemble"
+      action: "c-compile"
+      action: "c++-compile"
+      action: "c++-header-parsing"
+      action: "c++-module-compile"
+      action: "c++-module-codegen"
+      action: "linkstamp-compile"
+      action: "objc-compile"
+      action: "objc++-compile"
+      flag_group {
+        flag: "DEBUG_PREFIX_MAP_PWD=."
+      }
+    }
+  }
+  feature {
     name: "no_dsym_create_zip"
   }
   feature {
@@ -13375,6 +13519,24 @@
     }
   }
   feature {
+    name: "debug_prefix_map_pwd_is_dot"
+    flag_set {
+      action: "assemble"
+      action: "preprocess-assemble"
+      action: "c-compile"
+      action: "c++-compile"
+      action: "c++-header-parsing"
+      action: "c++-module-compile"
+      action: "c++-module-codegen"
+      action: "linkstamp-compile"
+      action: "objc-compile"
+      action: "objc++-compile"
+      flag_group {
+        flag: "DEBUG_PREFIX_MAP_PWD=."
+      }
+    }
+  }
+  feature {
     name: "no_dsym_create_zip"
   }
   feature {
@@ -15009,6 +15171,24 @@
     }
   }
   feature {
+    name: "debug_prefix_map_pwd_is_dot"
+    flag_set {
+      action: "assemble"
+      action: "preprocess-assemble"
+      action: "c-compile"
+      action: "c++-compile"
+      action: "c++-header-parsing"
+      action: "c++-module-compile"
+      action: "c++-module-codegen"
+      action: "linkstamp-compile"
+      action: "objc-compile"
+      action: "objc++-compile"
+      flag_group {
+        flag: "DEBUG_PREFIX_MAP_PWD=."
+      }
+    }
+  }
+  feature {
     name: "no_dsym_create_zip"
   }
   feature {
diff --git a/tools/osx/crosstool/wrapped_clang.cc b/tools/osx/crosstool/wrapped_clang.cc
index 5f283a3..25ead4b 100644
--- a/tools/osx/crosstool/wrapped_clang.cc
+++ b/tools/osx/crosstool/wrapped_clang.cc
@@ -177,6 +177,15 @@
   std::vector<std::string> processed_args = {"/usr/bin/xcrun", tool_name};
 
   std::string linked_binary, dsym_path, dsym_bundle_zip, bitcode_symbol_map;
+  std::string dest_dir;
+
+  std::unique_ptr<char, decltype(std::free) *> cwd{getcwd(nullptr, 0),
+                                                   std::free};
+  if (cwd == nullptr) {
+    std::cerr << "Error determining current working directory\n";
+    abort();
+  }
+
   for (int i = 1; i < argc; i++) {
     std::string arg(argv[i]);
 
@@ -196,6 +205,9 @@
       std::ofstream bitcode_symbol_map_file(bitcode_symbol_map);
       arg = bitcode_symbol_map;
     }
+    if (SetArgIfFlagPresent(arg, "DEBUG_PREFIX_MAP_PWD", &dest_dir)) {
+      arg = "-fdebug-prefix-map=" + std::string(cwd.get()) + "=" + dest_dir;
+    }
     FindAndReplace("__BAZEL_XCODE_DEVELOPER_DIR__", developer_dir, &arg);
     FindAndReplace("__BAZEL_XCODE_SDKROOT__", sdk_root, &arg);
     processed_args.push_back(arg);
@@ -240,12 +252,6 @@
   RunSubProcess(dsymutil_args);
 
   if (dsyms_use_zip_file) {
-    std::unique_ptr<char, decltype(std::free) *> cwd{getcwd(nullptr, 0),
-                                                     std::free};
-    if (cwd == nullptr) {
-      std::cerr << "Error determining current working directory\n";
-      abort();
-    }
     std::vector<std::string> zip_args = {
         "/usr/bin/zip", "-q", "-r",
         std::string(cwd.get()) + "/" + dsym_bundle_zip, "."};