Unbreak the `byo_llvm.sh` build with `iree_bitcode_library`. (#13968)

The byo-llvm build is broken by the way `iree_bitcode_library` assumes
it's dealing with our own bundled `clang` (#13957). This is an attempt
to fix that. Specifically, this implements the idea in
https://github.com/openxla/iree/issues/13957#issuecomment-1579175544 .

So `iree_bitcode_library` is changed to take `clang`, Clang builtin
headers, and `llvm-link` paths from externally defined variables.

`iree_llvm.cmake` is updated to set these variables appropriately, in
both the bundled and the installed cases.

`byo_llvm.sh` is updated to pass a `LLVM_INSTALL_DIR` to
`iree_llvm.cmake`.

Fixes #13957 .
diff --git a/build_tools/cmake/iree_bitcode_library.cmake b/build_tools/cmake/iree_bitcode_library.cmake
index 6b175f0..593348a 100644
--- a/build_tools/cmake/iree_bitcode_library.cmake
+++ b/build_tools/cmake/iree_bitcode_library.cmake
@@ -25,25 +25,12 @@
     ${ARGN}
   )
 
-  set(_CLANG_TOOL "$<TARGET_FILE:${IREE_CLANG_TARGET}>")
-  set(_LINK_TOOL "$<TARGET_FILE:${IREE_LLVM_LINK_TARGET}>")
-
   if(DEFINED _RULE_OUT)
     set(_OUT "${_RULE_OUT}")
   else()
     set(_OUT "${_RULE_NAME}.bc")
   endif()
 
-  # We need CLANG_VERSION_MAJOR to set up include directories. Unfortunately,
-  # Clang's own CMakeLists do not expose CLANG_VERSION_MAJOR to PARENT_SCOPE.
-  # Likewise with LLVM_VERSION_MAJOR. However, CLANG_EXECUTABLE_VERSION is
-  # CACHE'd, so we can access it, and it currently has the same value.
-  set(_CLANG_VERSION_MAJOR "${CLANG_EXECUTABLE_VERSION}")
-
-  # These are copied as part of the clang build; we could allow the user to
-  # override this but it should be harmless.
-  set(_BUILTIN_HEADERS_PATH "${IREE_BINARY_DIR}/llvm-project/lib/clang/${_CLANG_VERSION_MAJOR}/include/")
-
   iree_arch_to_llvm_arch(_LLVM_ARCH "${_RULE_ARCH}")
 
   set(_COPTS
@@ -77,7 +64,7 @@
     "-DIREE_DEVICE_STANDALONE=1"
   )
 
-  list(APPEND _COPTS "-isystem" "${_BUILTIN_HEADERS_PATH}")
+  list(APPEND _COPTS "-isystem" "${IREE_CLANG_BUILTIN_HEADERS_PATH}")
   list(APPEND _COPTS "-I" "${IREE_SOURCE_DIR}/runtime/src")
   list(APPEND _COPTS "-I" "${IREE_BINARY_DIR}/runtime/src")
   list(APPEND _COPTS "${_RULE_COPTS}")
@@ -91,14 +78,13 @@
       OUTPUT
         "${_BITCODE_FILE}"
       COMMAND
-        "${_CLANG_TOOL}"
+        "${IREE_CLANG_BINARY}"
         ${_COPTS}
         "${_BITCODE_SRC_PATH}"
         "-o"
         "${_BITCODE_FILE}"
       DEPENDS
-        "${_CLANG_TOOL}"
-        "${_LINK_TOOL}"
+        "${IREE_CLANG_BINARY}"
         "${_SRC}"
       COMMENT
         "Compiling ${_SRC} to ${_BITCODE_FILE}"
@@ -110,12 +96,12 @@
     OUTPUT
       ${_OUT}
     COMMAND
-      ${_LINK_TOOL}
+      ${IREE_LLVM_LINK_BINARY}
       ${_BITCODE_FILES}
       "-o"
       "${_OUT}"
     DEPENDS
-      ${_LINK_TOOL}
+      ${IREE_LLVM_LINK_BINARY}
       ${_BITCODE_FILES}
     COMMENT
       "Linking bitcode to ${_OUT}"
@@ -147,8 +133,6 @@
     ${ARGN}
   )
 
-  set(_LINK_TOOL "$<TARGET_FILE:${IREE_LLVM_LINK_TARGET}>")
-
   if(DEFINED _RULE_OUT)
     set(_OUT "${_RULE_OUT}")
   else()
@@ -161,12 +145,12 @@
     OUTPUT
       ${_OUT}
     COMMAND
-      ${_LINK_TOOL}
+      ${IREE_LLVM_LINK_BINARY}
       ${_BITCODE_FILES}
       "-o"
       "${_OUT}"
     DEPENDS
-      ${_LINK_TOOL}
+      ${IREE_LLVM_LINK_BINARY}
       ${_BITCODE_FILES}
     COMMENT
       "Linking bitcode to ${_OUT}"
diff --git a/build_tools/cmake/iree_llvm.cmake b/build_tools/cmake/iree_llvm.cmake
index d178b65..2235228 100644
--- a/build_tools/cmake/iree_llvm.cmake
+++ b/build_tools/cmake/iree_llvm.cmake
@@ -66,6 +66,10 @@
   set(LLVM_BINARY_DIR "${IREE_BINARY_DIR}/llvm-project")
   set(LLVM_TOOLS_BINARY_DIR "${LLVM_BINARY_DIR}/bin")
   set(LLVM_EXTERNAL_LIT "${IREE_SOURCE_DIR}/third_party/llvm-project/llvm/utils/lit/lit.py")
+
+  set(IREE_LLVM_LINK_BINARY "$<TARGET_FILE:${IREE_LLVM_LINK_TARGET}>")
+  set(IREE_CLANG_BINARY "$<TARGET_FILE:${IREE_CLANG_TARGET}>")
+  set(IREE_CLANG_BUILTIN_HEADERS_PATH "${LLVM_BINARY_DIR}/lib/clang/${CLANG_EXECUTABLE_VERSION}/include/")
 endmacro()
 
 macro(iree_llvm_configure_installed)
@@ -82,9 +86,6 @@
   list(APPEND CMAKE_MODULE_PATH "${LLD_CMAKE_DIR}")
   include_directories(${LLD_INCLUDE_DIRS})
 
-  find_package(Clang REQUIRED)
-  list(APPEND CMAKE_MODULE_PATH "${CLANG_CMAKE_DIR}")
-
   # Lit never gets installed with LLVM. So we have to reach into our copy
   # of the monorepo to get it. I'm sorry. If this doesn't work for you,
   # feel free to -DLLVM_EXTERNAL_LIT to provide your own.
@@ -93,6 +94,11 @@
   if(NOT LLVM_EXTERNAL_LIT)
     set(LLVM_EXTERNAL_LIT "${IREE_SOURCE_DIR}/third_party/llvm-project/llvm/utils/lit/lit.py")
   endif()
+
+  set(IREE_LLVM_LINK_BINARY "${LLVM_INSTALL_DIR}/llvm/bin/llvm-link${CMAKE_EXECUTABLE_SUFFIX}")
+  set(IREE_CLANG_BINARY "${LLVM_INSTALL_DIR}/llvm/bin/clang${CMAKE_EXECUTABLE_SUFFIX}")
+  string(REGEX REPLACE "[^0-9].*" "" _LLVM_VERSION_MAJOR "${LLVM_VERSION}")
+  set(IREE_CLANG_BUILTIN_HEADERS_PATH "${LLVM_INSTALL_DIR}/llvm/lib/clang/${_LLVM_VERSION_MAJOR}/include/")
 endmacro()
 
 # iree_llvm_set_bundled_cmake_options()
diff --git a/build_tools/scripts/byo_llvm.sh b/build_tools/scripts/byo_llvm.sh
index e833311..eef42f0 100755
--- a/build_tools/scripts/byo_llvm.sh
+++ b/build_tools/scripts/byo_llvm.sh
@@ -144,7 +144,7 @@
     return 1
   fi
 
-  echo "-DLLVM_DIR='$llvm_cmake_dir' -DLLD_DIR='$lld_cmake_dir' -DCLANG_DIR='$clang_cmake_dir' -DMLIR_DIR='$mlir_cmake_dir' -DIREE_BUILD_BUNDLED_LLVM=OFF"
+  echo "-DLLVM_DIR='$llvm_cmake_dir' -DLLD_DIR='$lld_cmake_dir' -DCLANG_DIR='$clang_cmake_dir' -DMLIR_DIR='$mlir_cmake_dir' -DIREE_BUILD_BUNDLED_LLVM=OFF -DLLVM_INSTALL_DIR=${LLVM_INSTALL_DIR}"
 }
 
 do_build_iree() {