[clang] [llvm] [offload-arch] Move GPU detection into a library and unit tests to unittests/tools (PR #226552)

Nikita Kornev via llvm-commits llvm-commits at lists.llvm.org
Fri Sep 25 10:50:51 PDT 2026


https://github.com/KornevNikita created https://github.com/llvm/llvm-project/pull/226552

Instead of compiling tool sources directly into the unit test, build the vendor-specific detection code as a clangOffloadArch static library in clang/tools/offload-arch/lib and link it into both offload-arch and OffloadArchTests. Move the unit tests to clang/unittests/tools/offload-arch for consistency with llvm/unittests/tools.

>From d64dce2825b769f3805dfdbb6b99ca76faacc066 Mon Sep 17 00:00:00 2001
From: "Kornev, Nikita" <nikita.kornev at intel.com>
Date: Fri, 25 Sep 2026 19:28:02 +0200
Subject: [PATCH] [offload-arch] Move GPU detection into a library and unit
 tests to unittests/tools

Instead of compiling tool sources directly into the unit test, build the
vendor-specific detection code as a clangOffloadArch static library in
clang/tools/offload-arch/lib and link it into both offload-arch and
OffloadArchTests. Move the unit tests to clang/unittests/tools/offload-arch
for consistency with llvm/unittests/tools.

Co-Authored-By: Claude Opus 5.5 <noreply at anthropic.com>
---
 clang/tools/offload-arch/CMakeLists.txt       |  8 +++----
 .../{ => lib}/AMDGPUArchByHIP.cpp             |  0
 .../{ => lib}/AMDGPUArchByKFD.cpp             |  0
 clang/tools/offload-arch/lib/CMakeLists.txt   | 14 +++++++++++++
 .../offload-arch/{ => lib}/LevelZeroArch.cpp  |  0
 .../offload-arch/{ => lib}/NVPTXArch.cpp      |  1 -
 clang/unittests/CMakeLists.txt                |  2 +-
 clang/unittests/offload-arch/CMakeLists.txt   | 21 -------------------
 clang/unittests/tools/CMakeLists.txt          |  1 +
 .../tools/offload-arch/CMakeLists.txt         |  8 +++++++
 .../offload-arch/OffloadArchTest.cpp          |  4 ++--
 .../clang/tools/offload-arch/lib/BUILD.gn     | 14 +++++++++++++
 .../gn/secondary/clang/unittests/BUILD.gn     |  2 +-
 .../clang/unittests/offload-arch/BUILD.gn     | 19 -----------------
 .../unittests/tools/offload-arch/BUILD.gn     | 11 ++++++++++
 15 files changed, 56 insertions(+), 49 deletions(-)
 rename clang/tools/offload-arch/{ => lib}/AMDGPUArchByHIP.cpp (100%)
 rename clang/tools/offload-arch/{ => lib}/AMDGPUArchByKFD.cpp (100%)
 create mode 100644 clang/tools/offload-arch/lib/CMakeLists.txt
 rename clang/tools/offload-arch/{ => lib}/LevelZeroArch.cpp (100%)
 rename clang/tools/offload-arch/{ => lib}/NVPTXArch.cpp (99%)
 delete mode 100644 clang/unittests/offload-arch/CMakeLists.txt
 create mode 100644 clang/unittests/tools/CMakeLists.txt
 create mode 100644 clang/unittests/tools/offload-arch/CMakeLists.txt
 rename clang/unittests/{ => tools}/offload-arch/OffloadArchTest.cpp (98%)
 create mode 100644 llvm/utils/gn/secondary/clang/tools/offload-arch/lib/BUILD.gn
 delete mode 100644 llvm/utils/gn/secondary/clang/unittests/offload-arch/BUILD.gn
 create mode 100644 llvm/utils/gn/secondary/clang/unittests/tools/offload-arch/BUILD.gn

diff --git a/clang/tools/offload-arch/CMakeLists.txt b/clang/tools/offload-arch/CMakeLists.txt
index 8e37e3d2ae5db9..83dcdd62f1720d 100644
--- a/clang/tools/offload-arch/CMakeLists.txt
+++ b/clang/tools/offload-arch/CMakeLists.txt
@@ -1,10 +1,10 @@
-set(LLVM_LINK_COMPONENTS Support TargetParser)
+set(LLVM_LINK_COMPONENTS Support)
 
-add_clang_tool(offload-arch OffloadArch.cpp NVPTXArch.cpp AMDGPUArchByKFD.cpp
-               AMDGPUArchByHIP.cpp LevelZeroArch.cpp)
+add_clang_tool(offload-arch OffloadArch.cpp)
 
 # Legacy binary names.
 add_clang_symlink(amdgpu-arch offload-arch)
 add_clang_symlink(nvptx-arch offload-arch)
 
-target_link_libraries(offload-arch PRIVATE clangBasic)
+add_subdirectory(lib)
+target_link_libraries(offload-arch PRIVATE clangBasic clangOffloadArch)
diff --git a/clang/tools/offload-arch/AMDGPUArchByHIP.cpp b/clang/tools/offload-arch/lib/AMDGPUArchByHIP.cpp
similarity index 100%
rename from clang/tools/offload-arch/AMDGPUArchByHIP.cpp
rename to clang/tools/offload-arch/lib/AMDGPUArchByHIP.cpp
diff --git a/clang/tools/offload-arch/AMDGPUArchByKFD.cpp b/clang/tools/offload-arch/lib/AMDGPUArchByKFD.cpp
similarity index 100%
rename from clang/tools/offload-arch/AMDGPUArchByKFD.cpp
rename to clang/tools/offload-arch/lib/AMDGPUArchByKFD.cpp
diff --git a/clang/tools/offload-arch/lib/CMakeLists.txt b/clang/tools/offload-arch/lib/CMakeLists.txt
new file mode 100644
index 00000000000000..2692229dc675b6
--- /dev/null
+++ b/clang/tools/offload-arch/lib/CMakeLists.txt
@@ -0,0 +1,14 @@
+# Not add_clang_library: this is not part of clang's public library interface,
+# the sources are shared between offload-arch and its unit tests.
+add_llvm_library(clangOffloadArch STATIC
+  AMDGPUArchByHIP.cpp
+  AMDGPUArchByKFD.cpp
+  LevelZeroArch.cpp
+  NVPTXArch.cpp
+
+  BUILDTREE_ONLY
+
+  LINK_COMPONENTS
+  Support
+  TargetParser
+  )
diff --git a/clang/tools/offload-arch/LevelZeroArch.cpp b/clang/tools/offload-arch/lib/LevelZeroArch.cpp
similarity index 100%
rename from clang/tools/offload-arch/LevelZeroArch.cpp
rename to clang/tools/offload-arch/lib/LevelZeroArch.cpp
diff --git a/clang/tools/offload-arch/NVPTXArch.cpp b/clang/tools/offload-arch/lib/NVPTXArch.cpp
similarity index 99%
rename from clang/tools/offload-arch/NVPTXArch.cpp
rename to clang/tools/offload-arch/lib/NVPTXArch.cpp
index 11ea2e79cd279e..c6e728ac1d043f 100644
--- a/clang/tools/offload-arch/NVPTXArch.cpp
+++ b/clang/tools/offload-arch/lib/NVPTXArch.cpp
@@ -11,7 +11,6 @@
 //
 //===----------------------------------------------------------------------===//
 
-#include "clang/Basic/Version.h"
 #include "llvm/Support/CommandLine.h"
 #include "llvm/Support/DynamicLibrary.h"
 #include "llvm/Support/Error.h"
diff --git a/clang/unittests/CMakeLists.txt b/clang/unittests/CMakeLists.txt
index 5cc21a563be3e5..b2fee01649abc6 100644
--- a/clang/unittests/CMakeLists.txt
+++ b/clang/unittests/CMakeLists.txt
@@ -110,7 +110,7 @@ add_subdirectory(Support)
 if (CLANG_ENABLE_CIR)
   add_subdirectory(CIR)
 endif()
-add_subdirectory(offload-arch)
+add_subdirectory(tools)
 
 # If we're doing a single merged clang unit test binary, add that target after
 # all the previous subdirectories have been processed.
diff --git a/clang/unittests/offload-arch/CMakeLists.txt b/clang/unittests/offload-arch/CMakeLists.txt
deleted file mode 100644
index 523b5f33ed6b31..00000000000000
--- a/clang/unittests/offload-arch/CMakeLists.txt
+++ /dev/null
@@ -1,21 +0,0 @@
-set(OffloadArchTestSources
-  OffloadArchTest.cpp
-  ${CMAKE_CURRENT_SOURCE_DIR}/../../tools/offload-arch/AMDGPUArchByKFD.cpp
-  ${CMAKE_CURRENT_SOURCE_DIR}/../../tools/offload-arch/LevelZeroArch.cpp
-  )
-
-if(CMAKE_SYSTEM_NAME STREQUAL "Windows")
-  list(APPEND OffloadArchTestSources
-    ${CMAKE_CURRENT_SOURCE_DIR}/../../tools/offload-arch/AMDGPUArchByHIP.cpp)
-endif()
-
-add_distinct_clang_unittest(OffloadArchTests
-  ${OffloadArchTestSources}
-  CLANG_LIBS
-    clangBasic
-  LINK_LIBS
-    LLVMTestingSupport
-  LLVM_COMPONENTS
-    Support
-    TargetParser
-  )
diff --git a/clang/unittests/tools/CMakeLists.txt b/clang/unittests/tools/CMakeLists.txt
new file mode 100644
index 00000000000000..8a51d644cf1ab1
--- /dev/null
+++ b/clang/unittests/tools/CMakeLists.txt
@@ -0,0 +1 @@
+add_subdirectory(offload-arch)
diff --git a/clang/unittests/tools/offload-arch/CMakeLists.txt b/clang/unittests/tools/offload-arch/CMakeLists.txt
new file mode 100644
index 00000000000000..56cfe48d564872
--- /dev/null
+++ b/clang/unittests/tools/offload-arch/CMakeLists.txt
@@ -0,0 +1,8 @@
+add_distinct_clang_unittest(OffloadArchTests
+  OffloadArchTest.cpp
+  LINK_LIBS
+    clangOffloadArch
+    LLVMTestingSupport
+  LLVM_COMPONENTS
+    Support
+  )
diff --git a/clang/unittests/offload-arch/OffloadArchTest.cpp b/clang/unittests/tools/offload-arch/OffloadArchTest.cpp
similarity index 98%
rename from clang/unittests/offload-arch/OffloadArchTest.cpp
rename to clang/unittests/tools/offload-arch/OffloadArchTest.cpp
index 2d4a35c85729d6..7de00610bd1898 100644
--- a/clang/unittests/offload-arch/OffloadArchTest.cpp
+++ b/clang/unittests/tools/offload-arch/OffloadArchTest.cpp
@@ -21,13 +21,13 @@
 #include <optional>
 #include <string>
 
-// Defined in AMDGPUArchByHIP.cpp (non-static, compiled into this test).
+// Defined in AMDGPUArchByHIP.cpp (non-static, linked via clangOffloadArch).
 #ifdef _WIN32
 bool compareVersions(llvm::StringRef A, llvm::StringRef B);
 llvm::SmallVector<std::string, 8> getCandidateBinPaths(llvm::StringRef ExeDir);
 #endif
 
-// Defined in AMDGPUArchByKFD.cpp (non-static, compiled into this test).
+// Defined in AMDGPUArchByKFD.cpp (non-static, linked via clangOffloadArch).
 int printGPUsByKFD(llvm::StringRef NodePath);
 
 // Defined in LevelZeroArch.cpp.
diff --git a/llvm/utils/gn/secondary/clang/tools/offload-arch/lib/BUILD.gn b/llvm/utils/gn/secondary/clang/tools/offload-arch/lib/BUILD.gn
new file mode 100644
index 00000000000000..987dd7a9a9a977
--- /dev/null
+++ b/llvm/utils/gn/secondary/clang/tools/offload-arch/lib/BUILD.gn
@@ -0,0 +1,14 @@
+static_library("lib") {
+  output_name = "clangOffloadArch"
+  configs += [ "//llvm/utils/gn/build:clang_code" ]
+  deps = [
+    "//llvm/lib/Support",
+    "//llvm/lib/TargetParser",
+  ]
+  sources = [
+    "AMDGPUArchByHIP.cpp",
+    "AMDGPUArchByKFD.cpp",
+    "LevelZeroArch.cpp",
+    "NVPTXArch.cpp",
+  ]
+}
diff --git a/llvm/utils/gn/secondary/clang/unittests/BUILD.gn b/llvm/utils/gn/secondary/clang/unittests/BUILD.gn
index a8c4b93f4baba9..13ac1fac6637ec 100644
--- a/llvm/utils/gn/secondary/clang/unittests/BUILD.gn
+++ b/llvm/utils/gn/secondary/clang/unittests/BUILD.gn
@@ -24,7 +24,7 @@ group("unittests") {
     "Support:ClangSupportTests",
     "Tooling:ToolingTests",
     "Tooling/Syntax:SyntaxTests",
-    "offload-arch:OffloadArchTests",
+    "tools/offload-arch:OffloadArchTests",
   ]
   if (clang_enable_static_analyzer) {
     deps += [
diff --git a/llvm/utils/gn/secondary/clang/unittests/offload-arch/BUILD.gn b/llvm/utils/gn/secondary/clang/unittests/offload-arch/BUILD.gn
deleted file mode 100644
index 336f30a6570b91..00000000000000
--- a/llvm/utils/gn/secondary/clang/unittests/offload-arch/BUILD.gn
+++ /dev/null
@@ -1,19 +0,0 @@
-import("//third-party/unittest/unittest.gni")
-
-unittest("OffloadArchTests") {
-  configs += [ "//llvm/utils/gn/build:clang_code" ]
-  deps = [
-    "//clang/lib/Basic",
-    "//llvm/lib/Support",
-    "//llvm/lib/Testing/Support",
-  ]
-  sources = [
-    "//clang/tools/offload-arch/AMDGPUArchByKFD.cpp",
-    "//clang/tools/offload-arch/LevelZeroArch.cpp",
-    "OffloadArchTest.cpp",
-  ]
-
-  if (current_os == "win") {
-    sources += [ "//clang/tools/offload-arch/AMDGPUArchByHIP.cpp" ]
-  }
-}
diff --git a/llvm/utils/gn/secondary/clang/unittests/tools/offload-arch/BUILD.gn b/llvm/utils/gn/secondary/clang/unittests/tools/offload-arch/BUILD.gn
new file mode 100644
index 00000000000000..3ebd60b6da0c7e
--- /dev/null
+++ b/llvm/utils/gn/secondary/clang/unittests/tools/offload-arch/BUILD.gn
@@ -0,0 +1,11 @@
+import("//third-party/unittest/unittest.gni")
+
+unittest("OffloadArchTests") {
+  configs += [ "//llvm/utils/gn/build:clang_code" ]
+  deps = [
+    "//clang/tools/offload-arch/lib",
+    "//llvm/lib/Support",
+    "//llvm/lib/Testing/Support",
+  ]
+  sources = [ "OffloadArchTest.cpp" ]
+}



More information about the llvm-commits mailing list