blob: 6a333f9e3a7dda1915191c9817be07ee38f52767 [file] [log] [blame]
// Copyright 2023 The IREE Authors
//
// Licensed under the Apache License v2.0 with LLVM Exceptions.
// See https://llvm.org/LICENSE.txt for license information.
// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
#include "iree/vm/bytecode/utils/features.h"
// clang-format off
static const iree_bitfield_string_mapping_t iree_vm_bytecode_feature_mappings[] = {
{iree_vm_FeatureBits_EXT_F32, IREE_SVL("EXT_F32")},
{iree_vm_FeatureBits_EXT_F64, IREE_SVL("EXT_F64")},
};
// clang-format on
iree_string_view_t iree_vm_bytecode_features_format(
iree_vm_FeatureBits_enum_t value, iree_bitfield_string_temp_t* out_temp) {
return iree_bitfield_format_inline(
value, IREE_ARRAYSIZE(iree_vm_bytecode_feature_mappings),
iree_vm_bytecode_feature_mappings, out_temp);
}
iree_vm_FeatureBits_enum_t iree_vm_bytecode_available_features(void) {
iree_vm_FeatureBits_enum_t result = 0;
#if IREE_VM_EXT_F32_ENABLE
result |= iree_vm_FeatureBits_EXT_F32;
#endif // IREE_VM_EXT_F32_ENABLE
#if IREE_VM_EXT_F64_ENABLE
result |= iree_vm_FeatureBits_EXT_F64;
#endif // IREE_VM_EXT_F64_ENABLE
return result;
}
iree_status_t iree_vm_check_feature_mismatch(
const char* file, int line, iree_vm_FeatureBits_enum_t required_features,
iree_vm_FeatureBits_enum_t available_features) {
if (IREE_LIKELY(iree_all_bits_set(available_features, required_features))) {
return iree_ok_status();
}
#if IREE_STATUS_MODE
const iree_vm_FeatureBits_enum_t needed_features =
required_features & ~available_features;
iree_bitfield_string_temp_t temp0, temp1, temp2;
iree_string_view_t available_features_str =
iree_vm_bytecode_features_format(available_features, &temp0);
iree_string_view_t required_features_str =
iree_vm_bytecode_features_format(required_features, &temp1);
iree_string_view_t needed_features_str =
iree_vm_bytecode_features_format(needed_features, &temp2);
return iree_make_status_with_location(
file, line, IREE_STATUS_INVALID_ARGUMENT,
"required module features [%.*s] are not available in this runtime "
"configuration; have [%.*s] while module requires [%.*s]",
(int)needed_features_str.size, needed_features_str.data,
(int)available_features_str.size, available_features_str.data,
(int)required_features_str.size, required_features_str.data);
#else
return iree_status_from_code(IREE_STATUS_INVALID_ARGUMENT);
#endif // IREE_STATUS_MODE
}