mirror of
https://github.com/capstone-engine/llvm-capstone.git
synced 2025-03-02 15:26:29 +00:00

This adds an error message if the isSVESizelessBuiltinType like __SVFloat32_t / __SVInt64_t / etc, which provide the backing for the svfloat32_t / svint64_t / etc ACLE types, are used in a function without SVE. The alternative is a crash in the backend, which is not capable of handling scalable vector types. When SVE is available, either through a -march=..+sve option or via a target(sve) attribute, nothing should change. Without the sve feature, this patch gives an error for any function arguments, return values and variable declarations involving the scalable types. Struct/class members and global variables already give an error. As this can be based on the current function target attributes, the error sometimes needs to be handled later than would otherwise if it was just based on the global target. Differential Revision: https://reviews.llvm.org/D131058
61 lines
1.5 KiB
C++
61 lines
1.5 KiB
C++
// RUN: %clang_cc1 -fsyntax-only -verify -DNONEON -std=c++11 -triple aarch64-arm-none-eabi %s
|
|
|
|
// A target without sve should not be able to use sve types.
|
|
|
|
void test_var() {
|
|
__SVFloat32_t x; // expected-error {{SVE vector type '__SVFloat32_t' cannot be used in a target without sve}}
|
|
}
|
|
|
|
__attribute__((target("sve")))
|
|
void test_var_target() {
|
|
__SVFloat32_t x;
|
|
}
|
|
|
|
__attribute__((target("sve2")))
|
|
void test_var_target2() {
|
|
__SVFloat32_t x;
|
|
}
|
|
|
|
__attribute__((target("sve2-bitperm")))
|
|
void test_var_target3() {
|
|
__SVFloat32_t x;
|
|
}
|
|
|
|
__SVFloat32_t other_ret();
|
|
__SVFloat32_t test_ret() { // expected-error {{SVE vector type '__SVFloat32_t' cannot be used in a target without sve}}
|
|
return other_ret();
|
|
}
|
|
|
|
__attribute__((target("sve")))
|
|
__SVFloat32_t test_ret_target() {
|
|
return other_ret();
|
|
}
|
|
|
|
void test_arg(__SVFloat32_t arg) { // expected-error {{SVE vector type '__SVFloat32_t' cannot be used in a target without sve}}
|
|
}
|
|
|
|
__attribute__((target("sve")))
|
|
void test_arg_target(__SVFloat32_t arg) {
|
|
}
|
|
|
|
__clang_svint32x4_t test4x() { // expected-error {{SVE vector type '__clang_svint32x4_t' cannot be used in a target without sve}}
|
|
__clang_svint32x4_t x; // expected-error {{SVE vector type '__clang_svint32x4_t' cannot be used in a target without sve}}
|
|
return x;
|
|
}
|
|
|
|
__attribute__((target("sve")))
|
|
__clang_svint32x4_t test4x_target() {
|
|
__clang_svint32x4_t x;
|
|
return x;
|
|
}
|
|
|
|
// Pointers are still valid to pass around.
|
|
void foo(__SVFloat32_t *&ptrA, __SVFloat32_t* &ptrB) {
|
|
ptrA = ptrB;
|
|
}
|
|
|
|
__SVFloat32_t* foo(int x, __SVFloat32_t *ptrA) {
|
|
return ptrA;
|
|
}
|
|
|