From 8a379ad316d8879e8de40178ed2fd446bef07f3f Mon Sep 17 00:00:00 2001 From: Marijn Suijten Date: Mon, 30 Mar 2026 15:07:27 +0200 Subject: [PATCH] api-query: Continue device initialization when a backend fails Device::initialize() returns early when any backend fails to initialize, preventing subsequent backends from being discovered. For example, a Vulkan initialization failure (e.g. VK_ERROR_INCOMPATIBLE_DRIVER when MoltenVK is not installed) blocks Metal device discovery on macOS. Collect backend initialization errors with joinErrors() and return them together instead. Also make lit.cfg.py resilient to an empty device list from api-query. Co-Authored-By: Claude Opus 4.6 (1M context) --- lib/API/Device.cpp | 10 ++++++---- test/lit.cfg.py | 2 +- 2 files changed, 7 insertions(+), 5 deletions(-) diff --git a/lib/API/Device.cpp b/lib/API/Device.cpp index fc1044884..8d28a26ec 100644 --- a/lib/API/Device.cpp +++ b/lib/API/Device.cpp @@ -15,7 +15,6 @@ #include "llvm/Support/Error.h" -#include #include using namespace offloadtest; @@ -27,21 +26,24 @@ Device::~Device() {} llvm::Expected>> offloadtest::initializeDevices(const DeviceConfig Config) { llvm::SmallVector> Devices; + llvm::Error Result = llvm::Error::success(); #ifdef OFFLOADTEST_ENABLE_D3D12 if (auto Err = initializeDX12Devices(Config, Devices)) - return Err; + Result = llvm::joinErrors(std::move(Result), std::move(Err)); #endif #ifdef OFFLOADTEST_ENABLE_VULKAN if (auto Err = initializeVulkanDevices(Config, Devices)) - return Err; + Result = llvm::joinErrors(std::move(Result), std::move(Err)); #endif #ifdef OFFLOADTEST_ENABLE_METAL if (auto Err = initializeMetalDevices(Config, Devices)) - return Err; + Result = llvm::joinErrors(std::move(Result), std::move(Err)); #endif + if (Result) + return std::move(Result); return Devices; } diff --git a/test/lit.cfg.py b/test/lit.cfg.py index 35e8f2ba5..029953e74 100644 --- a/test/lit.cfg.py +++ b/test/lit.cfg.py @@ -241,7 +241,7 @@ def setDeviceFeatures(config, device, compiler): target_device = None # Find the right device to configure against pattern = re.compile(GPUName, re.IGNORECASE) -for device in devices["Devices"]: +for device in devices.get("Devices", []): is_warp = "Microsoft Basic Render Driver" in device["Description"] is_gpu_name_match = bool(pattern.search(device["Description"])) if device["API"] == "DirectX" and config.offloadtest_enable_d3d12: