Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

[SYCL] Add device config file consistency test #16369

Open
wants to merge 20 commits into
base: sycl
Choose a base branch
from
Open
Show file tree
Hide file tree
Changes from 13 commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
3 changes: 2 additions & 1 deletion .github/workflows/sycl-linux-build.yml
Original file line number Diff line number Diff line change
Expand Up @@ -173,7 +173,8 @@ jobs:
--cmake-opt=-DCMAKE_CXX_COMPILER_LAUNCHER=ccache \
--cmake-opt="-DLLVM_INSTALL_UTILS=ON" \
--cmake-opt="-DNATIVECPU_USE_OCK=Off" \
--cmake-opt="-DLLVM_EXPERIMENTAL_TARGETS_TO_BUILD=SPIRV"
--cmake-opt="-DLLVM_EXPERIMENTAL_TARGETS_TO_BUILD=SPIRV" \
--cmake-opt="-DSYCL_INSTALL_DEVICE_CONFIG_FILE=ON"
- name: Compile
id: build
run: cmake --build $GITHUB_WORKSPACE/build
Expand Down
3 changes: 2 additions & 1 deletion .github/workflows/sycl-windows-build.yml
Original file line number Diff line number Diff line change
Expand Up @@ -119,7 +119,8 @@ jobs:
--cmake-opt="-DCMAKE_CXX_COMPILER_LAUNCHER=ccache" ^
--cmake-opt="-DCMAKE_C_COMPILER_LAUNCHER=ccache" ^
--cmake-opt="-DLLVM_INSTALL_UTILS=ON" ^
--cmake-opt="-DLLVM_EXPERIMENTAL_TARGETS_TO_BUILD=SPIRV"
--cmake-opt="-DLLVM_EXPERIMENTAL_TARGETS_TO_BUILD=SPIRV" ^
--cmake-opt="-DSYCL_INSTALL_DEVICE_CONFIG_FILE=ON"
- name: Build
id: build
shell: bash
Expand Down
4 changes: 4 additions & 0 deletions llvm/include/llvm/SYCLLowerIR/CMakeLists.txt
Original file line number Diff line number Diff line change
Expand Up @@ -6,3 +6,7 @@ set(LLVM_TABLEGEN_PROJECT LLVM)
set(LLVM_TARGET_DEFINITIONS DeviceConfigFile.td)
tablegen(LLVM DeviceConfigFile.inc -gen-dynamic-tables)
add_public_tablegen_target(DeviceConfigFile)
install(FILES "${CMAKE_CURRENT_SOURCE_DIR}/DeviceConfigFile.hpp"
"${CMAKE_CURRENT_BINARY_DIR}/DeviceConfigFile.inc"
DESTINATION include/llvm/SYCLLowerIR
COMPONENT DeviceConfigFile)
7 changes: 2 additions & 5 deletions llvm/include/llvm/SYCLLowerIR/DeviceConfigFile.hpp
Original file line number Diff line number Diff line change
Expand Up @@ -8,12 +8,9 @@

#include <map>
#include <string>
#include <string_view>
#include <vector>

namespace llvm {
class StringRef;
}

namespace DeviceConfigFile {

// This struct is used in DeviceConfigFile.td. Both the fields and the name of
Expand All @@ -22,7 +19,7 @@ namespace DeviceConfigFile {
// DeviceConfigFile.td.
struct TargetInfo {
bool maySupportOtherAspects;
std::vector<llvm::StringRef> aspects;
std::vector<std::string_view> aspects;
std::vector<unsigned> subGroupSizes;
std::string aotToolchain;
std::string aotToolchainOptions;
Expand Down
48 changes: 33 additions & 15 deletions llvm/include/llvm/SYCLLowerIR/DeviceConfigFile.td
Original file line number Diff line number Diff line change
Expand Up @@ -164,14 +164,18 @@ defvar IntelCpuAspects = [
AspectExt_oneapi_srgb, AspectExt_oneapi_native_assert,
AspectExt_intel_legacy_image, AspectExt_oneapi_ballot_group,
AspectExt_oneapi_fixed_size_group, AspectExt_oneapi_opportunistic_group,
AspectExt_oneapi_tangle_group, AspectExt_oneapi_private_alloca
AspectExt_oneapi_tangle_group, AspectExt_oneapi_private_alloca,
AspectOnline_compiler, AspectOnline_linker, AspectExt_intel_gpu_slices,
AspectExt_intel_gpu_subslices_per_slice, AspectExt_intel_gpu_eu_count_per_subslice,
AspectExt_intel_gpu_hw_threads_per_eu, AspectExt_intel_device_id,
AspectExt_oneapi_virtual_functions
] # AllUSMAspects;

def : TargetInfo<"spir64", [], [], "", "", 1>;
def : TargetInfo<"spir64_gen", [], [], "", "", 1>;
def : TargetInfo<"spir64_x86_64", IntelCpuAspects, [4, 8, 16, 32, 64], "", "", 1>;
def : TargetInfo<"spir64_fpga", [], [], "", "", 1>;
def : TargetInfo<"x86_64", [], [], "", "", 1>;
def : TargetInfo<"x86_64", IntelCpuAspects, [4, 8, 16, 32, 64], "", "", 1>;
// Examples of how to use a combination of explicitly specified values + predefined lists
//defvar AspectList = [AspectCpu] # AllUSMAspects;
//def : TargetInfo<"Test", AspectList, []>;
Expand All @@ -183,9 +187,11 @@ defvar Fp16Fp64Atomic64 = [AspectFp16, AspectFp64, AspectAtomic64];
defvar Fp16Atomic64 = [AspectFp16, AspectAtomic64];
defvar Sg8_16_32 = [8, 16, 32];
defvar Sg16_32 = [16, 32];
defvar IntelBaseAspects = [AspectExt_intel_esimd];
defvar IntelGPUBaseAspects = [AspectExt_intel_esimd, AspectExt_oneapi_ballot_group,
AspectExt_oneapi_fixed_size_group, AspectExt_oneapi_opportunistic_group,
AspectExt_oneapi_tangle_group];
class IntelTargetInfo<string Name, list<Aspect> Aspects, list<int> subGroupSizesList>
: TargetInfo<Name, IntelBaseAspects # Aspects, subGroupSizesList>;
: TargetInfo<Name, IntelGPUBaseAspects # Aspects, subGroupSizesList>;
// Note: only the "canonical" target names are listed here - see
// SYCL::gen::resolveGenDevice().
//
Expand Down Expand Up @@ -249,8 +255,14 @@ class CudaTargetInfo<string targetName, list<Aspect> aspectList, int subGroupSiz
assert !eq(subGroupSize, 32), "sub-group size for Cuda must be equal to 32 and not " # subGroupSize # ".";
}

defvar CudaMinAspects = !listconcat(AllUSMAspects, [AspectGpu, AspectFp64, AspectOnline_compiler, AspectOnline_linker,
AspectQueue_profiling, AspectExt_intel_pci_address, AspectExt_intel_max_mem_bandwidth, AspectExt_intel_memory_bus_width,
defvar CudaUSMAspects = [
AspectUsm_device_allocations, AspectUsm_host_allocations,
AspectUsm_shared_allocations, AspectUsm_atomic_host_allocations,
AspectUsm_atomic_shared_allocations
];

defvar CudaMinAspects = !listconcat(CudaUSMAspects, [AspectGpu, AspectFp64, AspectOnline_compiler, AspectOnline_linker,
AspectQueue_profiling, AspectExt_intel_pci_address, AspectExt_intel_memory_bus_width,
Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

From CI:

# | Checking consistency of aspects for device nvidia_gpu_sm_86...
# | error: nvidia_gpu_sm_86 does not support aspect usm_system_allocations but it is declared in the device config file
# | error: nvidia_gpu_sm_86 does not support aspect usm_atomic_host_allocations but it is declared in the device config file
# | error: nvidia_gpu_sm_86 does not support aspect ext_intel_max_mem_bandwidth but it is declared in the device config file
# | note: the device nvidia_gpu_sm_86 supports aspect ext_intel_legacy_image but it is not declared in the device config file

AspectExt_intel_device_info_uuid, AspectExt_oneapi_native_assert, AspectExt_intel_free_memory, AspectExt_intel_device_id,
AspectExt_intel_memory_clock_rate, AspectExt_oneapi_ballot_group, AspectExt_oneapi_fixed_size_group,
AspectExt_oneapi_opportunistic_group, AspectExt_oneapi_graph, AspectExt_oneapi_limited_graph]);
Expand Down Expand Up @@ -306,37 +318,43 @@ defvar HipSubgroupSizesRDNA = [32]; // gfxX10-gfx11 (encapsulates RDNA1..3),
defvar HipSubgroupSizesCDNA = [64]; // gfx908, gfx90a (encapsulates CDNA1..2)

defvar HipMinAspects = [AspectGpu, AspectFp64, AspectOnline_compiler, AspectOnline_linker, AspectQueue_profiling,
AspectExt_intel_pci_address, AspectExt_intel_max_mem_bandwidth, AspectExt_intel_device_id,
AspectExt_intel_pci_address, AspectExt_intel_device_id,
AspectExt_intel_memory_clock_rate, AspectExt_intel_memory_bus_width, AspectExt_intel_free_memory];

defvar HipUSMAspects = [
AspectUsm_device_allocations, AspectUsm_host_allocations,
AspectUsm_shared_allocations, AspectUsm_atomic_host_allocations,
AspectUsm_atomic_shared_allocations
];

Comment on lines +320 to +328
Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

From CI:

# | Checking consistency of aspects for device amd_gpu_gfx1030...
# | error: amd_gpu_gfx1030 does not support aspect ext_intel_max_mem_bandwidth but it is declared in the device config file
# | error: amd_gpu_gfx1030 does not support aspect usm_system_allocations but it is declared in the device config file

// The following AMDGCN targets are ordered based on their ROCm driver support:
//
// Officially supported:
def : HipTargetInfo<"amd_gpu_gfx908", !listconcat(HipMinAspects, AllUSMAspects,
def : HipTargetInfo<"amd_gpu_gfx908", !listconcat(HipMinAspects, HipUSMAspects,
[AspectExt_intel_device_info_uuid, AspectExt_oneapi_graph, AspectExt_oneapi_limited_graph]), HipSubgroupSizesCDNA>;
def : HipTargetInfo<"amd_gpu_gfx90a", !listconcat(HipMinAspects, AllUSMAspects,
def : HipTargetInfo<"amd_gpu_gfx90a", !listconcat(HipMinAspects, HipUSMAspects,
[AspectExt_intel_device_info_uuid, AspectExt_oneapi_graph, AspectExt_oneapi_limited_graph, AspectExt_oneapi_native_assert]),
HipSubgroupSizesCDNA>;
// TODO: Need to verify whether device-side asserts (oneapi_native_assert) are
// now working for the new CDNA3 gfx940, gfx941, gfx942 GPUs and fixed for the
// other supported, gfx1030 and gfx1100, RDNA3 GPUs.
def : HipTargetInfo<"amd_gpu_gfx940", !listconcat(HipMinAspects, AllUSMAspects,
def : HipTargetInfo<"amd_gpu_gfx940", !listconcat(HipMinAspects, HipUSMAspects,
[AspectExt_intel_device_info_uuid, AspectExt_oneapi_graph, AspectExt_oneapi_limited_graph]),
HipSubgroupSizesCDNA>;
def : HipTargetInfo<"amd_gpu_gfx941", !listconcat(HipMinAspects, AllUSMAspects,
def : HipTargetInfo<"amd_gpu_gfx941", !listconcat(HipMinAspects, HipUSMAspects,
[AspectExt_intel_device_info_uuid, AspectExt_oneapi_graph, AspectExt_oneapi_limited_graph]),
HipSubgroupSizesCDNA>;
def : HipTargetInfo<"amd_gpu_gfx942", !listconcat(HipMinAspects, AllUSMAspects,
def : HipTargetInfo<"amd_gpu_gfx942", !listconcat(HipMinAspects, HipUSMAspects,
[AspectExt_intel_device_info_uuid, AspectExt_oneapi_graph, AspectExt_oneapi_limited_graph]),
HipSubgroupSizesCDNA>;
def : HipTargetInfo<"amd_gpu_gfx1030", !listconcat(HipMinAspects, AllUSMAspects,
def : HipTargetInfo<"amd_gpu_gfx1030", !listconcat(HipMinAspects, HipUSMAspects,
[AspectExt_intel_device_info_uuid, AspectExt_oneapi_graph, AspectExt_oneapi_limited_graph]),
HipSubgroupSizesRDNA>;
def : HipTargetInfo<"amd_gpu_gfx1100", !listconcat(HipMinAspects, AllUSMAspects,
def : HipTargetInfo<"amd_gpu_gfx1100", !listconcat(HipMinAspects, HipUSMAspects,
[AspectExt_intel_device_info_uuid, AspectExt_oneapi_graph, AspectExt_oneapi_limited_graph]),
HipSubgroupSizesRDNA>;
// Deprecated support:
def : HipTargetInfo<"amd_gpu_gfx906", !listconcat(HipMinAspects, AllUSMAspects), HipSubgroupSizesGCN5>;
def : HipTargetInfo<"amd_gpu_gfx906", !listconcat(HipMinAspects, HipUSMAspects), HipSubgroupSizesGCN5>;
// Unsupported (or unofficially supported):
def : HipTargetInfo<"amd_gpu_gfx700", HipMinAspects, HipSubgroupSizesGCN2>;
def : HipTargetInfo<"amd_gpu_gfx701", HipMinAspects, HipSubgroupSizesGCN2>;
Expand Down
5 changes: 5 additions & 0 deletions sycl/CMakeLists.txt
Original file line number Diff line number Diff line change
Expand Up @@ -532,6 +532,11 @@ if("hip" IN_LIST SYCL_ENABLE_BACKENDS)
list(APPEND SYCL_TOOLCHAIN_DEPLOY_COMPONENTS ur_adapter_hip)
endif()

if(SYCL_INSTALL_DEVICE_CONFIG_FILE)
add_dependencies(sycl-toolchain DeviceConfigFile)
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

can you give some background on why we need to install this? thx

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I'm still testing things, so I might change some things, but I want to support the new device_config_file_consistency test. It uses the DeviceConfigFile.hpp, and that file includes DeviceConfigFile.inc, which is generated by tablegen. On CI from what I understand the e2e tests are invoked by using the packed install files from the build step and only runs CMake on the sycl/test-e2e subfolder. So since we probably don't want to build tablegen and invoke other LLVM cmake files when running the e2e tests, I install the DeviceConfigFile.inc it in the build step to pass it to the e2e tests. Also note that this test must be an e2e test as it queries the device it is running the test on, so it can't be moved to sycl/test.

Copy link
Contributor

@sarnex sarnex Dec 20, 2024

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

sorry so what tools/files are required to generate that hpp file? Is it just llvm-tablegen and DeviceConfigFile.inc?

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Yea just tablegen and DeviceConfigFile.td are needed for the hpp file

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Also just for some more background I was aiming so that DeviceConfigFile.hpp is not installed by default because outside of testing, this file is not needed for a SYCL distribution, it is only used in the compiler.

list(APPEND SYCL_TOOLCHAIN_DEPLOY_COMPONENTS DeviceConfigFile)
endif()

# Use it as fake dependency in order to force another command(s) to execute.
add_custom_command(OUTPUT __force_it
COMMAND "${CMAKE_COMMAND}" -E echo
Expand Down
139 changes: 139 additions & 0 deletions sycl/test-e2e/Basic/device_config_file_consistency.cpp
Original file line number Diff line number Diff line change
@@ -0,0 +1,139 @@
// This test checks to see if every aspect and sub-group size declared in the
// device config file is supported by the device. Note this does not mean
// check that the device config file is exhaustive, only that the device
// supports everything it declares. However, this test does print out any
// aspects that are supported by the device but not declared in the device
// config file.

// UNSUPPORTED: accelerator
// UNSUPPORTED-INTENDED: Accelerator is not supported by
// sycl_ext_oneapi_device_architecture.
// REQUIRES: device-config-file
// RUN: %{build} -o %t.out %device_config_file_include_flag
// RUN: %{run} %t.out
#include <map>

#include <llvm/SYCLLowerIR/DeviceConfigFile.hpp>
#include <sycl/detail/core.hpp>

#define __SYCL_ASPECT_DEPRECATED_ALIAS(ASPECT, ID, MESSAGE) \
__SYCL_ASPECT_DEPRECATED(ASPECT, ID, MESSAGE)

using namespace sycl;

const char *getArchName(const device &Device) {
namespace syclex = sycl::ext::oneapi::experimental;
auto Arch = Device.get_info<syclex::info::device::architecture>();
switch (Arch) {
#define __SYCL_ARCHITECTURE(ARCH, VAL) \
case syclex::architecture::ARCH: \
return #ARCH;
#define __SYCL_ARCHITECTURE_ALIAS(ARCH, VAL)
#include <sycl/ext/oneapi/experimental/device_architecture.def>
#undef __SYCL_ARCHITECTURE
#undef __SYCL_ARCHITECTURE_ALIAS
}
return "unknown";
}

// Checks if a container contains a specific element
template <typename Container, typename T>
bool contains(const Container &C, const T &Elem) {
return std::find(C.begin(), C.end(), Elem) != C.end();
}

std::string_view getAspectName(aspect Asp) {
switch (Asp) {
#define __SYCL_ASPECT(ASPECT, ID) \
case aspect::ASPECT: \
return #ASPECT;
#include <sycl/info/aspects.def>
#undef __SYCL_ASPECT
}
return "unknown";
}

aspect getAspectByName(std::string_view Name) {
#define __SYCL_ASPECT(ASPECT, ID) \
if (Name == #ASPECT) \
return aspect::ASPECT;
#include <sycl/info/aspects.def>
throw std::invalid_argument("Unknown aspect name");
}

int main() {
// Get the device arch
jzc marked this conversation as resolved.
Show resolved Hide resolved
queue Q;
auto Dev = Q.get_device();
auto DeviceName = getArchName(Dev);

auto TargetInfo = DeviceConfigFile::TargetTable.find(DeviceName);
if (TargetInfo == DeviceConfigFile::TargetTable.end()) {
std::cout << "No aspects found for device " << DeviceName << "\n";
return 1;
}

// Check aspects consistency
jzc marked this conversation as resolved.
Show resolved Hide resolved
int NAspectInconsistencies = 0;
std::cout << "Checking consistency of aspects for device " << DeviceName
<< "...\n";

auto SupportedAspects = Dev.get_info<info::device::aspects>();
auto DeviceConfigAspectNames = TargetInfo->second.aspects;
std::vector<aspect> DeviceConfigAspects;
for (auto AspectName : DeviceConfigAspectNames) {
DeviceConfigAspects.push_back(getAspectByName(AspectName));
}

for (auto Asp : DeviceConfigAspects) {
if (!contains(SupportedAspects, Asp)) {
std::cout << "error: " << DeviceName << " does not support aspect "
<< getAspectName(Asp)
<< " but it is declared in the device config file\n";
++NAspectInconsistencies;
}
}
for (auto Asp : SupportedAspects) {
if (!contains(DeviceConfigAspects, Asp)) {
std::cout << "note: the device " << DeviceName << " supports aspect "
<< getAspectName(Asp)
<< " but it is not declared in the device config file\n";
// Not necessarily an error, so we won't increment n_fail
jzc marked this conversation as resolved.
Show resolved Hide resolved
}
}

if (NAspectInconsistencies == 0)
std::cout << "All aspects are consistent\n";

// Check sub-group sizes consistency
jzc marked this conversation as resolved.
Show resolved Hide resolved
int NSubGroupSizeInconsistencies = 0;
std::cout << "Checking consistency of sub-group sizes for device "
<< DeviceName << "...\n";

auto SupportedSubGroupSizes = Dev.get_info<info::device::sub_group_sizes>();
auto DeviceConfigSubGroupSizes = TargetInfo->second.subGroupSizes;

for (auto Size : DeviceConfigSubGroupSizes) {
if (!contains(SupportedSubGroupSizes, Size)) {
std::cout << "error: " << DeviceName
<< " does not support sub-group size " << Size
<< " but it is declared in the device config file\n";
++NSubGroupSizeInconsistencies;
}
}
for (auto Size : SupportedSubGroupSizes) {
if (!contains(DeviceConfigSubGroupSizes, Size)) {
std::cout << "note: the device " << DeviceName
<< " supports sub-group size " << Size
<< " but it is not declared in the device config file\n";
// Not necessarily an error, so we won't increment n_fail
jzc marked this conversation as resolved.
Show resolved Hide resolved
}
}

if (NSubGroupSizeInconsistencies == 0)
std::cout << "All sub-group sizes are consistent\n";

return NAspectInconsistencies + NSubGroupSizeInconsistencies;
}

#undef __SYCL_ASPECT_DEPRECATED_ALIAS
11 changes: 11 additions & 0 deletions sycl/test-e2e/lit.cfg.py
Original file line number Diff line number Diff line change
Expand Up @@ -679,6 +679,17 @@ def open_check_file(file_name):
# Use short names for LIT rules.
config.available_features.add("any-device-is-" + be)

if config.llvm_main_include_dir:
lit_config.note("Using device config file built from LLVM")
config.available_features.add("device-config-file")
config.substitutions.append(
("%device_config_file_include_flag", f"-I {config.llvm_main_include_dir}")
)
elif os.path.exists(f"{config.sycl_include}/llvm/SYCLLowerIR/DeviceConfigFile.hpp"):
lit_config.note("Using installed device config file")
config.available_features.add("device-config-file")
config.substitutions.append(("%device_config_file_include_flag", ""))

# That has to be executed last so that all device-independent features have been
# discovered already.
config.sycl_dev_features = {}
Expand Down
1 change: 1 addition & 0 deletions sycl/test-e2e/lit.site.cfg.py.in
Original file line number Diff line number Diff line change
Expand Up @@ -10,6 +10,7 @@ site.addsitedir("@CMAKE_CURRENT_SOURCE_DIR@")
config.dpcpp_compiler = lit_config.params.get("dpcpp_compiler", "@SYCL_CXX_COMPILER@")
config.dpcpp_root_dir= os.path.dirname(os.path.dirname(config.dpcpp_compiler))

config.llvm_main_include_dir = "@LLVM_MAIN_INCLUDE_DIR@"
config.llvm_tools_dir = os.path.join(config.dpcpp_root_dir, 'bin')
config.lit_tools_dir = os.path.dirname("@TEST_SUITE_LIT@")
config.dump_ir_supported = lit_config.params.get("dump_ir", ("@DUMP_IR_SUPPORTED@" if "@DUMP_IR_SUPPORTED@" else False))
Expand Down
5 changes: 2 additions & 3 deletions sycl/test/basic_tests/device_config_file_aspects.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,6 @@
//
#include <map>

#include <llvm/ADT/StringRef.h>
#include <llvm/SYCLLowerIR/DeviceConfigFile.hpp>
#include <sycl/sycl.hpp>

Expand All @@ -16,7 +15,7 @@ int main() {
auto aspectsList = testAspects->second.aspects;

#define __SYCL_ASPECT(ASPECT, ASPECT_VAL) \
llvm::StringRef s##ASPECT(#ASPECT); \
std::string_view s##ASPECT(#ASPECT); \
assert(std::find(aspectsList.begin(), aspectsList.end(), s##ASPECT) != \
aspectsList.end());

Expand All @@ -29,7 +28,7 @@ int main() {
assert(testDeprecatedAspects != DeviceConfigFile::TargetTable.end());
auto deprecatedAspectsList = testDeprecatedAspects->second.aspects;
#define __SYCL_ASPECT_DEPRECATED(ASPECT, ASPECT_VAL, MSG) \
llvm::StringRef s##ASPECT(#ASPECT); \
std::string_view s##ASPECT(#ASPECT); \
assert(std::find(deprecatedAspectsList.begin(), deprecatedAspectsList.end(), \
s##ASPECT) != deprecatedAspectsList.end());

Expand Down
Loading