pw_symbolizer: Get llvm-symbolizer path from Bazel

Bug: b/355527449
Change-Id: I14120583aed72eea7cc7603ad6caa8c21de89665
Reviewed-on: https://pigweed-review.googlesource.com/c/pigweed/pigweed/+/226254
Commit-Queue: Taylor Cramer <cramertj@google.com>
Reviewed-by: Ted Pudlik <tpudlik@google.com>
Reviewed-by: Taylor Cramer <cramertj@google.com>
Lint: Lint 🤖 <android-build-ayeaye@system.gserviceaccount.com>
diff --git a/pw_symbolizer/py/BUILD.bazel b/pw_symbolizer/py/BUILD.bazel
index 2d9ae23..32c7d9a 100644
--- a/pw_symbolizer/py/BUILD.bazel
+++ b/pw_symbolizer/py/BUILD.bazel
@@ -12,11 +12,32 @@
 # License for the specific language governing permissions and limitations under
 # the License.
 
+load("@bazel_skylib//rules:copy_file.bzl", "copy_file")
 load("@rules_python//python:defs.bzl", "py_library")
 load("//pw_build:python.bzl", "pw_py_test")
 
 package(default_visibility = ["//visibility:public"])
 
+# Path to the `llvm-symbolizer` binary for the toolchain being
+# decoded.
+#
+# This should be overriden for toolchains which don't use
+# `@llvm-toolchain`.
+label_flag(
+    name = "llvm-symbolizer",
+    build_setting_default = "@llvm_toolchain//:bin/llvm-symbolizer",
+)
+
+# Symlink the `llvm-symbolizer` binary (whose path may be different
+# based on the label flag above) into a common location.
+copy_file(
+    name = "llvm-symbolizer-symlink",
+    src = ":llvm-symbolizer",
+    out = "llvm-symbolizer-copy",
+    allow_symlink = True,
+    is_executable = True,
+)
+
 py_library(
     name = "pw_symbolizer",
     srcs = [
@@ -24,6 +45,7 @@
         "pw_symbolizer/llvm_symbolizer.py",
         "pw_symbolizer/symbolizer.py",
     ],
+    data = [":llvm-symbolizer-symlink"],
     imports = ["."],
 )
 
diff --git a/pw_symbolizer/py/pw_symbolizer/llvm_symbolizer.py b/pw_symbolizer/py/pw_symbolizer/llvm_symbolizer.py
index 75dfca4..e93f4a2 100644
--- a/pw_symbolizer/py/pw_symbolizer/llvm_symbolizer.py
+++ b/pw_symbolizer/py/pw_symbolizer/llvm_symbolizer.py
@@ -20,6 +20,18 @@
 from pathlib import Path
 from pw_symbolizer import symbolizer
 
+# If the script is being run through Bazel, our support binaries are provided
+# at well known locations in its runfiles.
+try:
+    from python.runfiles import runfiles  # type: ignore
+
+    r = runfiles.Create()
+    _LLVM_SYMBOLIZER = r.Rlocation(
+        'pigweed/pw_symbolizer/py/llvm-symbolizer-copy'
+    )
+except ImportError:
+    _LLVM_SYMBOLIZER = 'llvm-symbolizer'
+
 
 class LlvmSymbolizer(symbolizer.Symbolizer):
     """A symbolizer that wraps llvm-symbolizer."""
@@ -35,7 +47,7 @@
         if llvm_symbolizer_binary:
             self._symbolizer_binary = str(llvm_symbolizer_binary)
         else:
-            self._symbolizer_binary = 'llvm-symbolizer'
+            self._symbolizer_binary = _LLVM_SYMBOLIZER
             if shutil.which(self._symbolizer_binary) is None:
                 raise FileNotFoundError(
                     'llvm-symbolizer not installed. Run bootstrap, or download '