https://github.com/tmatheson-arm updated https://github.com/llvm/llvm-project/pull/126945
>From e618aba47c0e7244105bf325ab8019a085e1ed99 Mon Sep 17 00:00:00 2001 From: Tomas Matheson <tomas.mathe...@arm.com> Date: Wed, 12 Feb 2025 14:31:47 +0000 Subject: [PATCH 1/3] Add missing Neon Types The AAPCS64 adds a number of vector types to the C unconditionally: https://github.com/ARM-software/abi-aa/blob/main/aapcs64/aapcs64.rst#11appendix-support-for-advanced-simd-extensions The equivalent SVE types are already available in clang: https://github.com/ARM-software/abi-aa/blob/main/aapcs64/aapcs64.rst#12appendix-support-for-scalable-vectors __mfp8 is defined in the ACLE https://arm-software.github.io/acle/main/acle.html#data-types I'm not sure whether __mfp8 should be defined for A32. For now I have left it as it is. --- .../clang/Basic/AArch64SVEACLETypes.def | 37 +++++ clang/include/clang/Basic/LangOptions.def | 1 + clang/include/clang/Basic/Specifiers.h | 5 + clang/include/clang/Basic/TokenKinds.def | 5 + clang/include/clang/Sema/DeclSpec.h | 5 + clang/lib/AST/ASTContext.cpp | 12 +- clang/lib/AST/Type.cpp | 1 - clang/lib/Basic/IdentifierTable.cpp | 5 +- clang/lib/Basic/LangOptions.cpp | 5 + clang/lib/CodeGen/CodeGenTypes.cpp | 1 - clang/lib/CodeGen/Targets/AArch64.cpp | 1 - clang/lib/Parse/ParseDecl.cpp | 11 ++ clang/lib/Parse/ParseTentative.cpp | 6 + clang/lib/Sema/DeclSpec.cpp | 7 + clang/lib/Sema/SemaTemplateVariadic.cpp | 3 + clang/lib/Sema/SemaType.cpp | 6 + clang/test/AST/ast-dump-aarch64-neon-types.c | 128 ++++++++++++++++++ 17 files changed, 232 insertions(+), 7 deletions(-) create mode 100644 clang/test/AST/ast-dump-aarch64-neon-types.c diff --git a/clang/include/clang/Basic/AArch64SVEACLETypes.def b/clang/include/clang/Basic/AArch64SVEACLETypes.def index 6a6f51c95ebd0..6d0a9ef4eba59 100644 --- a/clang/include/clang/Basic/AArch64SVEACLETypes.def +++ b/clang/include/clang/Basic/AArch64SVEACLETypes.def @@ -57,6 +57,10 @@ // - IsBF true for vector of brain float elements. //===----------------------------------------------------------------------===// +#ifndef SVE_TYPE +#define SVE_TYPE(Name, Id, SingletonId) +#endif + #ifndef SVE_SCALAR_TYPE #define SVE_SCALAR_TYPE(Name, MangledName, Id, SingletonId, Bits) \ SVE_TYPE(Name, Id, SingletonId) @@ -201,6 +205,39 @@ SVE_OPAQUE_TYPE(__SVCount_t, __SVCount_t, SveCount, SveCountTy) SVE_SCALAR_TYPE(__mfp8, __mfp8, MFloat8, MFloat8Ty, 8) +#ifndef NEON_VECTOR_TYPE +#define NEON_VECTOR_TYPE(Name, BaseType, ElBits, NumEls, VectorKind) +#endif +NEON_VECTOR_TYPE(__Int8x8_t, CharTy, 8, 8, VectorKind::Neon) +NEON_VECTOR_TYPE(__Int16x4_t, ShortTy, 16, 4, VectorKind::Neon) +NEON_VECTOR_TYPE(__Int32x2_t, IntTy, 32, 2, VectorKind::Neon) +NEON_VECTOR_TYPE(__Uint8x8_t, CharTy, 8, 8, VectorKind::Neon) +NEON_VECTOR_TYPE(__Uint16x4_t, UnsignedShortTy, 16, 4, VectorKind::Neon) +NEON_VECTOR_TYPE(__Uint32x2_t, UnsignedIntTy, 32, 2, VectorKind::Neon) +NEON_VECTOR_TYPE(__Float16x4_t, Float16Ty, 16, 4, VectorKind::Neon) +NEON_VECTOR_TYPE(__Float32x2_t, FloatTy, 32, 2, VectorKind::Neon) +NEON_VECTOR_TYPE(__Poly8x8_t, CharTy, 8, 8, VectorKind::NeonPoly) +NEON_VECTOR_TYPE(__Poly16x4_t, UnsignedShortTy, 16, 4, VectorKind::NeonPoly) +NEON_VECTOR_TYPE(__Bfloat16x4_t, BFloat16Ty, 16, 4, VectorKind::Neon) +NEON_VECTOR_TYPE(__Int8x16_t, CharTy, 18, 6, VectorKind::Neon) +NEON_VECTOR_TYPE(__Int16x8_t, ShortTy, 16, 8, VectorKind::Neon) +NEON_VECTOR_TYPE(__Int32x4_t, IntTy, 32, 4, VectorKind::Neon) +NEON_VECTOR_TYPE(__Int64x2_t, LongLongTy, 64, 2, VectorKind::Neon) +NEON_VECTOR_TYPE(__Uint8x16_t, CharTy, 18, 6, VectorKind::Neon) +NEON_VECTOR_TYPE(__Uint16x8_t, UnsignedShortTy, 16, 8, VectorKind::Neon) +NEON_VECTOR_TYPE(__Uint32x4_t, UnsignedIntTy, 32, 4, VectorKind::Neon) +NEON_VECTOR_TYPE(__Uint64x2_t, UnsignedLongLongTy, 64, 2, VectorKind::Neon) +NEON_VECTOR_TYPE(__Float16x8_t, Float16Ty, 16, 8, VectorKind::Neon) +NEON_VECTOR_TYPE(__Float32x4_t, FloatTy, 32, 4, VectorKind::Neon) +NEON_VECTOR_TYPE(__Float64x2_t, DoubleTy, 64, 2, VectorKind::Neon) +NEON_VECTOR_TYPE(__Poly8x16_t, CharTy, 18, 6, VectorKind::NeonPoly) +NEON_VECTOR_TYPE(__Poly16x8_t, UnsignedShortTy, 16, 8, VectorKind::NeonPoly) +NEON_VECTOR_TYPE(__Poly64x2_t, UnsignedLongLongTy, 64, 2, VectorKind::NeonPoly) +NEON_VECTOR_TYPE(__Bfloat16x8_t, BFloat16Ty, 16, 8, VectorKind::Neon) +NEON_VECTOR_TYPE(__Mfloat8x8_t, MFloat8Ty, 8, 8, VectorKind::Neon) +NEON_VECTOR_TYPE(__Mfloat8x16_t, MFloat8Ty, 16, 8, VectorKind::Neon) + +#undef NEON_VECTOR_TYPE #undef SVE_VECTOR_TYPE #undef SVE_VECTOR_TYPE_MFLOAT #undef SVE_VECTOR_TYPE_BFLOAT diff --git a/clang/include/clang/Basic/LangOptions.def b/clang/include/clang/Basic/LangOptions.def index cb55f09acc076..a2d39f1f837e5 100644 --- a/clang/include/clang/Basic/LangOptions.def +++ b/clang/include/clang/Basic/LangOptions.def @@ -463,6 +463,7 @@ COMPATIBLE_VALUE_LANGOPT(FunctionAlignment, 5, 0, "Default alignment for functio COMPATIBLE_VALUE_LANGOPT(LoopAlignment, 32, 0, "Default alignment for loops") LANGOPT(FixedPoint, 1, 0, "fixed point types") +LANGOPT(ACLE, 1, 0, "Arm C Language Extensions") LANGOPT(PaddingOnUnsignedFixedPoint, 1, 0, "unsigned fixed point types having one extra padding bit") diff --git a/clang/include/clang/Basic/Specifiers.h b/clang/include/clang/Basic/Specifiers.h index 9c089908fdc13..51264fec647e7 100644 --- a/clang/include/clang/Basic/Specifiers.h +++ b/clang/include/clang/Basic/Specifiers.h @@ -98,6 +98,11 @@ namespace clang { #define GENERIC_IMAGE_TYPE(ImgType, Id) \ TST_##ImgType##_t, // OpenCL image types #include "clang/Basic/OpenCLImageTypes.def" + +#define NEON_VECTOR_TYPE(Name, BaseType, ElBits, NumEls, VectorKind) \ + TST_##Name, +#include "clang/Basic/AArch64SVEACLETypes.def" + #define HLSL_INTANGIBLE_TYPE(Name, Id, SingletonId) \ TST_##Name, // HLSL Intangible Types #include "clang/Basic/HLSLIntangibleTypes.def" diff --git a/clang/include/clang/Basic/TokenKinds.def b/clang/include/clang/Basic/TokenKinds.def index 8902a20b07ffa..a9639192b4a77 100644 --- a/clang/include/clang/Basic/TokenKinds.def +++ b/clang/include/clang/Basic/TokenKinds.def @@ -679,6 +679,11 @@ KEYWORD(__bool , KEYALTIVEC|KEYZVECTOR) ALIAS("__fp16", half , KEYALL) KEYWORD(__bf16 , KEYALL) +// ARM NEON types +#define NEON_VECTOR_TYPE(Name, BaseType, ElBits, NumEls, VectorKind) \ + KEYWORD(Name, KEYACLE) +#include "clang/Basic/AArch64SVEACLETypes.def" + // OpenCL Extension. KEYWORD(half , HALFSUPPORT) diff --git a/clang/include/clang/Sema/DeclSpec.h b/clang/include/clang/Sema/DeclSpec.h index 5f5df3a45d41d..d77467ad13751 100644 --- a/clang/include/clang/Sema/DeclSpec.h +++ b/clang/include/clang/Sema/DeclSpec.h @@ -322,6 +322,11 @@ class DeclSpec { #define GENERIC_IMAGE_TYPE(ImgType, Id) \ static const TST TST_##ImgType##_t = clang::TST_##ImgType##_t; #include "clang/Basic/OpenCLImageTypes.def" + +#define NEON_VECTOR_TYPE(Name, BaseType, ElBits, NumEls, VectorKind) \ + static const TST TST_##Name = clang::TST_##Name; +#include "clang/Basic/AArch64SVEACLETypes.def" + #define HLSL_INTANGIBLE_TYPE(Name, Id, SingletonId) \ static const TST TST_##Name = clang::TST_##Name; #include "clang/Basic/HLSLIntangibleTypes.def" diff --git a/clang/lib/AST/ASTContext.cpp b/clang/lib/AST/ASTContext.cpp index 2dc96691f1da7..f32ab3c8a7b4f 100644 --- a/clang/lib/AST/ASTContext.cpp +++ b/clang/lib/AST/ASTContext.cpp @@ -1440,11 +1440,19 @@ void ASTContext::InitBuiltinTypes(const TargetInfo &Target, if (Target.hasAArch64SVETypes() || (AuxTarget && AuxTarget->hasAArch64SVETypes())) { -#define SVE_TYPE(Name, Id, SingletonId) \ + #define SVE_VECTOR_TYPE(Name, MangledName, Id, SingletonId) \ + InitBuiltinType(SingletonId, BuiltinType::Id); + #define SVE_PREDICATE_TYPE(Name, MangledName, Id, SingletonId) \ + InitBuiltinType(SingletonId, BuiltinType::Id); + #define SVE_OPAQUE_TYPE(Name, MangledName, Id, SingletonId) \ InitBuiltinType(SingletonId, BuiltinType::Id); #include "clang/Basic/AArch64SVEACLETypes.def" } + if (LangOpts.ACLE) { + InitBuiltinType(MFloat8Ty, BuiltinType::MFloat8); + } + if (Target.getTriple().isPPC64()) { #define PPC_VECTOR_MMA_TYPE(Name, Id, Size) \ InitBuiltinType(Id##Ty, BuiltinType::Id); @@ -4429,7 +4437,6 @@ ASTContext::getBuiltinVectorTypeInfo(const BuiltinType *Ty) const { #define SVE_PREDICATE_TYPE_ALL(Name, MangledName, Id, SingletonId, NumEls, NF) \ case BuiltinType::Id: \ return {BoolTy, llvm::ElementCount::getScalable(NumEls), NF}; -#define SVE_TYPE(Name, Id, SingletonId) #include "clang/Basic/AArch64SVEACLETypes.def" #define RVV_VECTOR_TYPE_INT(Name, Id, SingletonId, NumEls, ElBits, NF, \ @@ -4500,7 +4507,6 @@ QualType ASTContext::getScalableVectorType(QualType EltTy, unsigned NumElts, #define SVE_PREDICATE_TYPE_ALL(Name, MangledName, Id, SingletonId, NumEls, NF) \ if (EltTy->isBooleanType() && NumElts == (NumEls * NF) && NumFields == 1) \ return SingletonId; -#define SVE_TYPE(Name, Id, SingletonId) #include "clang/Basic/AArch64SVEACLETypes.def" } else if (Target->hasRISCVVTypes()) { uint64_t EltTySize = getTypeSize(EltTy); diff --git a/clang/lib/AST/Type.cpp b/clang/lib/AST/Type.cpp index 8c11ec2e1fe24..ee464bbd65f1d 100644 --- a/clang/lib/AST/Type.cpp +++ b/clang/lib/AST/Type.cpp @@ -2527,7 +2527,6 @@ bool Type::isSVESizelessBuiltinType() const { #define SVE_PREDICATE_TYPE(Name, MangledName, Id, SingletonId) \ case BuiltinType::Id: \ return true; -#define SVE_TYPE(Name, Id, SingletonId) #include "clang/Basic/AArch64SVEACLETypes.def" default: return false; diff --git a/clang/lib/Basic/IdentifierTable.cpp b/clang/lib/Basic/IdentifierTable.cpp index 16151c94464f9..15bb3f2289ff6 100644 --- a/clang/lib/Basic/IdentifierTable.cpp +++ b/clang/lib/Basic/IdentifierTable.cpp @@ -111,7 +111,8 @@ enum TokenKey : unsigned { KEYNOZOS = 0x4000000, KEYHLSL = 0x8000000, KEYFIXEDPOINT = 0x10000000, - KEYMAX = KEYFIXEDPOINT, // The maximum key + KEYACLE = 0x20000000, // Enable Arm Neon vector type keywords + KEYMAX = KEYACLE, // The maximum key KEYALLCXX = KEYCXX | KEYCXX11 | KEYCXX20, KEYALL = (KEYMAX | (KEYMAX - 1)) & ~KEYNOMS18 & ~KEYNOOPENCL & ~KEYNOZOS // KEYNOMS18, KEYNOOPENCL, KEYNOZOS are excluded. @@ -216,6 +217,8 @@ static KeywordStatus getKeywordStatusHelper(const LangOptions &LangOpts, return KS_Unknown; case KEYFIXEDPOINT: return LangOpts.FixedPoint ? KS_Enabled : KS_Disabled; + case KEYACLE: + return LangOpts.ACLE ? KS_Enabled : KS_Disabled; default: llvm_unreachable("Unknown KeywordStatus flag"); } diff --git a/clang/lib/Basic/LangOptions.cpp b/clang/lib/Basic/LangOptions.cpp index e3037ec819add..3ffdaacde1c0d 100644 --- a/clang/lib/Basic/LangOptions.cpp +++ b/clang/lib/Basic/LangOptions.cpp @@ -203,6 +203,11 @@ void LangOptions::setLangDefaults(LangOptions &Opts, Language Lang, Opts.setDefaultFPContractMode(LangOptions::FPM_Fast); } + if (T.isARM() || T.isAArch64()) { + Opts.ACLE = true; + } + + // OpenCL, C++ and C23 have bool, true, false keywords. Opts.Bool = Opts.OpenCL || Opts.CPlusPlus || Opts.C23; diff --git a/clang/lib/CodeGen/CodeGenTypes.cpp b/clang/lib/CodeGen/CodeGenTypes.cpp index 405242e97e75c..01631d7ad53c6 100644 --- a/clang/lib/CodeGen/CodeGenTypes.cpp +++ b/clang/lib/CodeGen/CodeGenTypes.cpp @@ -505,7 +505,6 @@ llvm::Type *CodeGenTypes::ConvertType(QualType T) { case BuiltinType::Id: #define SVE_PREDICATE_TYPE(Name, MangledName, Id, SingletonId) \ case BuiltinType::Id: -#define SVE_TYPE(Name, Id, SingletonId) #include "clang/Basic/AArch64SVEACLETypes.def" { ASTContext::BuiltinVectorTypeInfo Info = diff --git a/clang/lib/CodeGen/Targets/AArch64.cpp b/clang/lib/CodeGen/Targets/AArch64.cpp index e2e434815d43a..789839b165d84 100644 --- a/clang/lib/CodeGen/Targets/AArch64.cpp +++ b/clang/lib/CodeGen/Targets/AArch64.cpp @@ -766,7 +766,6 @@ bool AArch64ABIInfo::passAsPureScalableType( case BuiltinType::Id: \ isPredicate = true; \ break; -#define SVE_TYPE(Name, Id, SingletonId) #include "clang/Basic/AArch64SVEACLETypes.def" default: return false; diff --git a/clang/lib/Parse/ParseDecl.cpp b/clang/lib/Parse/ParseDecl.cpp index 75b5e11f8327c..f0fa5e753896d 100644 --- a/clang/lib/Parse/ParseDecl.cpp +++ b/clang/lib/Parse/ParseDecl.cpp @@ -4684,6 +4684,14 @@ void Parser::ParseDeclarationSpecifiers( goto DoneWithDeclSpec; \ break; #include "clang/Basic/OpenCLImageTypes.def" + +#define NEON_VECTOR_TYPE(Name, BaseType, ElBits, NumEls, VectorKind) \ + case tok::kw_##Name: \ + isInvalid = DS.SetTypeSpecType(DeclSpec::TST_##Name, Loc, PrevSpec, \ + DiagID, Policy); \ + break; +#include "clang/Basic/AArch64SVEACLETypes.def" + case tok::kw___unknown_anytype: isInvalid = DS.SetTypeSpecType(TST_unknown_anytype, Loc, PrevSpec, DiagID, Policy); @@ -6283,6 +6291,9 @@ bool Parser::isDeclarationSpecifier( case tok::kw___read_only: case tok::kw___read_write: case tok::kw___write_only: +#define NEON_VECTOR_TYPE(Name, BaseType, ElBits, NumEls, VectorKind) \ + case tok::kw_##Name: +#include "clang/Basic/AArch64SVEACLETypes.def" #define GENERIC_IMAGE_TYPE(ImgType, Id) case tok::kw_##ImgType##_t: #include "clang/Basic/OpenCLImageTypes.def" #define HLSL_INTANGIBLE_TYPE(Name, Id, SingletonId) case tok::kw_##Name: diff --git a/clang/lib/Parse/ParseTentative.cpp b/clang/lib/Parse/ParseTentative.cpp index ff27ef70944a4..8cf1f60b8d4a6 100644 --- a/clang/lib/Parse/ParseTentative.cpp +++ b/clang/lib/Parse/ParseTentative.cpp @@ -1805,6 +1805,9 @@ Parser::isCXXDeclarationSpecifier(ImplicitTypenameContext AllowImplicitTypename, case tok::kw__Fract: case tok::kw__Sat: case tok::annot_pack_indexing_type: +#define NEON_VECTOR_TYPE(Name, BaseType, ElBits, NumEls, VectorKind) \ + case tok::kw_##Name: +#include "clang/Basic/AArch64SVEACLETypes.def" #define GENERIC_IMAGE_TYPE(ImgType, Id) case tok::kw_##ImgType##_t: #include "clang/Basic/OpenCLImageTypes.def" #define HLSL_INTANGIBLE_TYPE(Name, Id, SingletonId) case tok::kw_##Name: @@ -1933,6 +1936,9 @@ bool Parser::isCXXDeclarationSpecifierAType() { case tok::kw__Accum: case tok::kw__Fract: case tok::kw__Sat: +#define NEON_VECTOR_TYPE(Name, BaseType, ElBits, NumEls, VectorKind) \ + case tok::kw_##Name: +#include "clang/Basic/AArch64SVEACLETypes.def" #define GENERIC_IMAGE_TYPE(ImgType, Id) case tok::kw_##ImgType##_t: #include "clang/Basic/OpenCLImageTypes.def" #define HLSL_INTANGIBLE_TYPE(Name, Id, SingletonId) case tok::kw_##Name: diff --git a/clang/lib/Sema/DeclSpec.cpp b/clang/lib/Sema/DeclSpec.cpp index 95e14ca0fa3b7..43302bae4d0f2 100644 --- a/clang/lib/Sema/DeclSpec.cpp +++ b/clang/lib/Sema/DeclSpec.cpp @@ -374,6 +374,9 @@ bool Declarator::isDeclarationOfFunction() const { case TST_typename_pack_indexing: #define GENERIC_IMAGE_TYPE(ImgType, Id) case TST_##ImgType##_t: #include "clang/Basic/OpenCLImageTypes.def" +#define NEON_VECTOR_TYPE(Name, BaseType, ElBits, NumEls, VectorKind) \ + case TST_##Name: +#include "clang/Basic/AArch64SVEACLETypes.def" #define HLSL_INTANGIBLE_TYPE(Name, Id, SingletonId) case TST_##Name: #include "clang/Basic/HLSLIntangibleTypes.def" return false; @@ -607,6 +610,10 @@ const char *DeclSpec::getSpecifierName(DeclSpec::TST T, case DeclSpec::TST_##ImgType##_t: \ return #ImgType "_t"; #include "clang/Basic/OpenCLImageTypes.def" +#define NEON_VECTOR_TYPE(Name, BaseType, ElBits, NumEls, VectorKind) \ + case DeclSpec::TST_##Name: \ + return #Name; +#include "clang/Basic/AArch64SVEACLETypes.def" #define HLSL_INTANGIBLE_TYPE(Name, Id, SingletonId) \ case DeclSpec::TST_##Name: \ return #Name; diff --git a/clang/lib/Sema/SemaTemplateVariadic.cpp b/clang/lib/Sema/SemaTemplateVariadic.cpp index 3c56794722dcc..7bcfce47dd35b 100644 --- a/clang/lib/Sema/SemaTemplateVariadic.cpp +++ b/clang/lib/Sema/SemaTemplateVariadic.cpp @@ -1081,6 +1081,9 @@ bool Sema::containsUnexpandedParameterPacks(Declarator &D) { case TST_BFloat16: #define GENERIC_IMAGE_TYPE(ImgType, Id) case TST_##ImgType##_t: #include "clang/Basic/OpenCLImageTypes.def" +#define NEON_VECTOR_TYPE(Name, BaseType, ElBits, NumEls, VectorKind) \ + case TST_##Name: +#include "clang/Basic/AArch64SVEACLETypes.def" #define HLSL_INTANGIBLE_TYPE(Name, Id, SingletonId) case TST_##Name: #include "clang/Basic/HLSLIntangibleTypes.def" case TST_unknown_anytype: diff --git a/clang/lib/Sema/SemaType.cpp b/clang/lib/Sema/SemaType.cpp index 1fa5239a597c8..2bf4f76c714cb 100644 --- a/clang/lib/Sema/SemaType.cpp +++ b/clang/lib/Sema/SemaType.cpp @@ -1366,6 +1366,12 @@ static QualType ConvertDeclSpecToType(TypeProcessingState &state) { break; #include "clang/Basic/OpenCLImageTypes.def" +#define NEON_VECTOR_TYPE(Name, BaseType, ElBits, NumEls, VectorKind) \ + case DeclSpec::TST_##Name: \ + Result = Context.getVectorType(Context.BaseType, ElBits, VectorKind); \ + break; +#include "clang/Basic/AArch64SVEACLETypes.def" + #define HLSL_INTANGIBLE_TYPE(Name, Id, SingletonId) \ case DeclSpec::TST_##Name: \ Result = Context.SingletonId; \ diff --git a/clang/test/AST/ast-dump-aarch64-neon-types.c b/clang/test/AST/ast-dump-aarch64-neon-types.c new file mode 100644 index 0000000000000..5c0175096c450 --- /dev/null +++ b/clang/test/AST/ast-dump-aarch64-neon-types.c @@ -0,0 +1,128 @@ +// Test that NEON types are defined, even when arm_neon.h is not included. +// as required by AAPCS64 "Support for Advanced SIMD Extensions". + +// RUN: %clang_cc1 -ast-dump -triple arm-linux-gnu -D A32 %s -x c | FileCheck --check-prefixes=CHECK %s +// RUN: %clang_cc1 -ast-dump -triple arm-linux-gnu -D A32 %s -x c++ | FileCheck --check-prefixes=CHECK %s +// RUN: %clang_cc1 -ast-dump -triple aarch64-linux-gnu %s -x c | FileCheck --check-prefixes=CHECK,A64 %s +// RUN: %clang_cc1 -ast-dump -triple aarch64-linux-gnu %s -x c++ | FileCheck --check-prefixes=CHECK,A64 %s +// RUN: %clang_cc1 -verify -verify-ignore-unexpected=note -triple x86_64 %s -x c +// RUN: %clang_cc1 -verify -verify-ignore-unexpected=note -triple x86_64 %s -x c++ + +__Int8x8_t Int8x8; +// CHECK: Int8x8 '__attribute__((neon_vector_type(8))) char' +// expected-error@-2{{unknown type name '__Int8x8_t'}} + +__Int16x4_t Int16x4; +// CHECK: Int16x4 '__attribute__((neon_vector_type(16))) short' +// expected-error@-2{{unknown type name '__Int16x4_t'}} + +__Int32x2_t Int32x2; +// CHECK: Int32x2 '__attribute__((neon_vector_type(32))) int' +// expected-error@-2{{unknown type name '__Int32x2_t'}} + +__Uint8x8_t Uint8x8; +// CHECK: Uint8x8 '__attribute__((neon_vector_type(8))) char' +// expected-error@-2{{unknown type name '__Uint8x8_t'}} + +__Uint16x4_t Uint16x4; +// CHECK: Uint16x4 '__attribute__((neon_vector_type(16))) unsigned short' +// expected-error@-2{{unknown type name '__Uint16x4_t'}} + +__Uint32x2_t Uint32x2; +// CHECK: Uint32x2 '__attribute__((neon_vector_type(32))) unsigned int' +// expected-error@-2{{unknown type name '__Uint32x2_t'}} + +__Float16x4_t Float16x4; +// CHECK: Float16x4 '__attribute__((neon_vector_type(16))) _Float16' +// expected-error@-2{{unknown type name '__Float16x4_t'}} + +__Float32x2_t Float32x2; +// CHECK: Float32x2 '__attribute__((neon_vector_type(32))) float' +// expected-error@-2{{unknown type name '__Float32x2_t'}} + +__Poly8x8_t Poly8x8; +// CHECK: Poly8x8 '__attribute__((neon_polyvector_type(8))) char' +// expected-error@-2{{unknown type name '__Poly8x8_t'}} + +__Poly16x4_t Poly16x4; +// CHECK: Poly16x4 '__attribute__((neon_polyvector_type(16))) unsigned short' +// expected-error@-2{{unknown type name '__Poly16x4_t'}} + +__Bfloat16x4_t Bfloat16x4; +// CHECK: Bfloat16x4 '__attribute__((neon_vector_type(16))) __bf16' +// expected-error@-2{{unknown type name '__Bfloat16x4_t'}} + +__Int8x16_t Int8x16; +// CHECK: Int8x16 '__attribute__((neon_vector_type(18))) char' +// expected-error@-2{{unknown type name '__Int8x16_t'}} + +__Int16x8_t Int16x8; +// CHECK: Int16x8 '__attribute__((neon_vector_type(16))) short' +// expected-error@-2{{unknown type name '__Int16x8_t'}} + +__Int32x4_t Int32x4; +// CHECK: Int32x4 '__attribute__((neon_vector_type(32))) int' +// expected-error@-2{{unknown type name '__Int32x4_t'}} + +__Int64x2_t Int64x2; +// CHECK: Int64x2 '__attribute__((neon_vector_type(64))) long long' +// expected-error@-2{{unknown type name '__Int64x2_t'}} + +__Uint8x16_t Uint8x16; +// CHECK: Uint8x16 '__attribute__((neon_vector_type(18))) char' +// expected-error@-2{{unknown type name '__Uint8x16_t'}} + +__Uint16x8_t Uint16x8; +// CHECK: Uint16x8 '__attribute__((neon_vector_type(16))) unsigned short' +// expected-error@-2{{unknown type name '__Uint16x8_t'}} + +__Uint32x4_t Uint32x4; +// CHECK: Uint32x4 '__attribute__((neon_vector_type(32))) unsigned int' +// expected-error@-2{{unknown type name '__Uint32x4_t'}} + +__Uint64x2_t Uint64x2; +// CHECK: Uint64x2 '__attribute__((neon_vector_type(64))) unsigned long long' +// expected-error@-2{{unknown type name '__Uint64x2_t'}} + +__Float16x8_t Float16x8; +// CHECK: Float16x8 '__attribute__((neon_vector_type(16))) _Float16' +// expected-error@-2{{unknown type name '__Float16x8_t'}} + +__Float32x4_t Float32x4; +// CHECK: Float32x4 '__attribute__((neon_vector_type(32))) float' +// expected-error@-2{{unknown type name '__Float32x4_t'}} + +__Float64x2_t Float64x2; +// CHECK: Float64x2 '__attribute__((neon_vector_type(64))) double' +// expected-error@-2{{unknown type name '__Float64x2_t'}} + +__Poly8x16_t Poly8x16; +// CHECK: Poly8x16 '__attribute__((neon_polyvector_type(18))) char' +// expected-error@-2{{unknown type name '__Poly8x16_t'}} + +__Poly16x8_t Poly16x8; +// CHECK: Poly16x8 '__attribute__((neon_polyvector_type(16))) unsigned short' +// expected-error@-2{{unknown type name '__Poly16x8_t'}} + +__Poly64x2_t Poly64x2; +// CHECK: Poly64x2 '__attribute__((neon_polyvector_type(64))) unsigned long long' +// expected-error@-2{{unknown type name '__Poly64x2_t'}} + +__Bfloat16x8_t Bfloat16x8; +// CHECK: Bfloat16x8 '__attribute__((neon_vector_type(16))) __bf16' +// expected-error@-2{{unknown type name '__Bfloat16x8_t'}} + + +#ifndef A32 +__mfp8 mfp8; +// A64: mfp8 '__mfp8' +// expected-error@-2{{unknown type name '__mfp8'}} + +__Mfloat8x8_t Mfloat8x8; +// A64: Mfloat8x8 '__attribute__((neon_vector_type(8))) __mfp8' +// expected-error@-2{{unknown type name '__Mfloat8x8_t'}} + +__Mfloat8x16_t Mfloat8x16; +// A64: Mfloat8x16 '__attribute__((neon_vector_type(16))) __mfp8' +// expected-error@-2{{unknown type name '__Mfloat8x16_t'}} +#endif >From e59e207c8ba2d353ae862493a2a310ae7a5c05c0 Mon Sep 17 00:00:00 2001 From: Tomas Matheson <tomas.mathe...@arm.com> Date: Thu, 13 Feb 2025 13:03:32 +0000 Subject: [PATCH 2/3] address comments --- .../clang/Basic/AArch64SVEACLETypes.def | 7 +++---- clang/include/clang/Basic/Specifiers.h | 1 + clang/include/clang/Basic/TokenKinds.def | 1 + clang/include/clang/Sema/DeclSpec.h | 1 + clang/lib/AST/ASTContext.cpp | 18 ++++++++++-------- clang/lib/AST/Type.cpp | 1 + clang/lib/CodeGen/CodeGenTypes.cpp | 1 + clang/lib/CodeGen/Targets/AArch64.cpp | 1 + clang/lib/Parse/ParseDecl.cpp | 2 ++ clang/lib/Parse/ParseTentative.cpp | 2 ++ clang/lib/Sema/DeclSpec.cpp | 2 ++ clang/lib/Sema/SemaTemplateVariadic.cpp | 1 + clang/lib/Sema/SemaType.cpp | 1 + 13 files changed, 27 insertions(+), 12 deletions(-) diff --git a/clang/include/clang/Basic/AArch64SVEACLETypes.def b/clang/include/clang/Basic/AArch64SVEACLETypes.def index 6d0a9ef4eba59..2097f4a7d8f54 100644 --- a/clang/include/clang/Basic/AArch64SVEACLETypes.def +++ b/clang/include/clang/Basic/AArch64SVEACLETypes.def @@ -57,10 +57,6 @@ // - IsBF true for vector of brain float elements. //===----------------------------------------------------------------------===// -#ifndef SVE_TYPE -#define SVE_TYPE(Name, Id, SingletonId) -#endif - #ifndef SVE_SCALAR_TYPE #define SVE_SCALAR_TYPE(Name, MangledName, Id, SingletonId, Bits) \ SVE_TYPE(Name, Id, SingletonId) @@ -205,6 +201,9 @@ SVE_OPAQUE_TYPE(__SVCount_t, __SVCount_t, SveCount, SveCountTy) SVE_SCALAR_TYPE(__mfp8, __mfp8, MFloat8, MFloat8Ty, 8) +// Unlike the SVE types above, the Neon vector types are parsed as keywords and +// mapped to the equivalent __attribute__(neon_vector_type(...)) vector type. +// They are not builtin types. #ifndef NEON_VECTOR_TYPE #define NEON_VECTOR_TYPE(Name, BaseType, ElBits, NumEls, VectorKind) #endif diff --git a/clang/include/clang/Basic/Specifiers.h b/clang/include/clang/Basic/Specifiers.h index 51264fec647e7..1219bb638af45 100644 --- a/clang/include/clang/Basic/Specifiers.h +++ b/clang/include/clang/Basic/Specifiers.h @@ -101,6 +101,7 @@ namespace clang { #define NEON_VECTOR_TYPE(Name, BaseType, ElBits, NumEls, VectorKind) \ TST_##Name, +#define SVE_TYPE(Name, Id, SingletonId) #include "clang/Basic/AArch64SVEACLETypes.def" #define HLSL_INTANGIBLE_TYPE(Name, Id, SingletonId) \ diff --git a/clang/include/clang/Basic/TokenKinds.def b/clang/include/clang/Basic/TokenKinds.def index a9639192b4a77..579fd20bb9dfe 100644 --- a/clang/include/clang/Basic/TokenKinds.def +++ b/clang/include/clang/Basic/TokenKinds.def @@ -682,6 +682,7 @@ KEYWORD(__bf16 , KEYALL) // ARM NEON types #define NEON_VECTOR_TYPE(Name, BaseType, ElBits, NumEls, VectorKind) \ KEYWORD(Name, KEYACLE) +#define SVE_TYPE(Name, Id, SingletonId) #include "clang/Basic/AArch64SVEACLETypes.def" // OpenCL Extension. diff --git a/clang/include/clang/Sema/DeclSpec.h b/clang/include/clang/Sema/DeclSpec.h index d77467ad13751..6dcd71ceb5559 100644 --- a/clang/include/clang/Sema/DeclSpec.h +++ b/clang/include/clang/Sema/DeclSpec.h @@ -325,6 +325,7 @@ class DeclSpec { #define NEON_VECTOR_TYPE(Name, BaseType, ElBits, NumEls, VectorKind) \ static const TST TST_##Name = clang::TST_##Name; +#define SVE_TYPE(Name, Id, SingletonId) #include "clang/Basic/AArch64SVEACLETypes.def" #define HLSL_INTANGIBLE_TYPE(Name, Id, SingletonId) \ diff --git a/clang/lib/AST/ASTContext.cpp b/clang/lib/AST/ASTContext.cpp index f32ab3c8a7b4f..493fd423739e4 100644 --- a/clang/lib/AST/ASTContext.cpp +++ b/clang/lib/AST/ASTContext.cpp @@ -1440,18 +1440,18 @@ void ASTContext::InitBuiltinTypes(const TargetInfo &Target, if (Target.hasAArch64SVETypes() || (AuxTarget && AuxTarget->hasAArch64SVETypes())) { - #define SVE_VECTOR_TYPE(Name, MangledName, Id, SingletonId) \ - InitBuiltinType(SingletonId, BuiltinType::Id); - #define SVE_PREDICATE_TYPE(Name, MangledName, Id, SingletonId) \ - InitBuiltinType(SingletonId, BuiltinType::Id); - #define SVE_OPAQUE_TYPE(Name, MangledName, Id, SingletonId) \ - InitBuiltinType(SingletonId, BuiltinType::Id); +#define SVE_VECTOR_TYPE(Name, MangledName, Id, SingletonId) \ + InitBuiltinType(SingletonId, BuiltinType::Id); +#define SVE_PREDICATE_TYPE(Name, MangledName, Id, SingletonId) \ + InitBuiltinType(SingletonId, BuiltinType::Id); +#define SVE_OPAQUE_TYPE(Name, MangledName, Id, SingletonId) \ + InitBuiltinType(SingletonId, BuiltinType::Id); +#define SVE_TYPE(Name, MangledName, SingletonId) #include "clang/Basic/AArch64SVEACLETypes.def" } - if (LangOpts.ACLE) { + if (LangOpts.ACLE) InitBuiltinType(MFloat8Ty, BuiltinType::MFloat8); - } if (Target.getTriple().isPPC64()) { #define PPC_VECTOR_MMA_TYPE(Name, Id, Size) \ @@ -4437,6 +4437,7 @@ ASTContext::getBuiltinVectorTypeInfo(const BuiltinType *Ty) const { #define SVE_PREDICATE_TYPE_ALL(Name, MangledName, Id, SingletonId, NumEls, NF) \ case BuiltinType::Id: \ return {BoolTy, llvm::ElementCount::getScalable(NumEls), NF}; +#define SVE_TYPE(Name, Id, SingletonId) #include "clang/Basic/AArch64SVEACLETypes.def" #define RVV_VECTOR_TYPE_INT(Name, Id, SingletonId, NumEls, ElBits, NF, \ @@ -4507,6 +4508,7 @@ QualType ASTContext::getScalableVectorType(QualType EltTy, unsigned NumElts, #define SVE_PREDICATE_TYPE_ALL(Name, MangledName, Id, SingletonId, NumEls, NF) \ if (EltTy->isBooleanType() && NumElts == (NumEls * NF) && NumFields == 1) \ return SingletonId; +#define SVE_TYPE(Name, Id, SingletonId) #include "clang/Basic/AArch64SVEACLETypes.def" } else if (Target->hasRISCVVTypes()) { uint64_t EltTySize = getTypeSize(EltTy); diff --git a/clang/lib/AST/Type.cpp b/clang/lib/AST/Type.cpp index ee464bbd65f1d..8c11ec2e1fe24 100644 --- a/clang/lib/AST/Type.cpp +++ b/clang/lib/AST/Type.cpp @@ -2527,6 +2527,7 @@ bool Type::isSVESizelessBuiltinType() const { #define SVE_PREDICATE_TYPE(Name, MangledName, Id, SingletonId) \ case BuiltinType::Id: \ return true; +#define SVE_TYPE(Name, Id, SingletonId) #include "clang/Basic/AArch64SVEACLETypes.def" default: return false; diff --git a/clang/lib/CodeGen/CodeGenTypes.cpp b/clang/lib/CodeGen/CodeGenTypes.cpp index 01631d7ad53c6..405242e97e75c 100644 --- a/clang/lib/CodeGen/CodeGenTypes.cpp +++ b/clang/lib/CodeGen/CodeGenTypes.cpp @@ -505,6 +505,7 @@ llvm::Type *CodeGenTypes::ConvertType(QualType T) { case BuiltinType::Id: #define SVE_PREDICATE_TYPE(Name, MangledName, Id, SingletonId) \ case BuiltinType::Id: +#define SVE_TYPE(Name, Id, SingletonId) #include "clang/Basic/AArch64SVEACLETypes.def" { ASTContext::BuiltinVectorTypeInfo Info = diff --git a/clang/lib/CodeGen/Targets/AArch64.cpp b/clang/lib/CodeGen/Targets/AArch64.cpp index 789839b165d84..e2e434815d43a 100644 --- a/clang/lib/CodeGen/Targets/AArch64.cpp +++ b/clang/lib/CodeGen/Targets/AArch64.cpp @@ -766,6 +766,7 @@ bool AArch64ABIInfo::passAsPureScalableType( case BuiltinType::Id: \ isPredicate = true; \ break; +#define SVE_TYPE(Name, Id, SingletonId) #include "clang/Basic/AArch64SVEACLETypes.def" default: return false; diff --git a/clang/lib/Parse/ParseDecl.cpp b/clang/lib/Parse/ParseDecl.cpp index f0fa5e753896d..f221f228599a6 100644 --- a/clang/lib/Parse/ParseDecl.cpp +++ b/clang/lib/Parse/ParseDecl.cpp @@ -4690,6 +4690,7 @@ void Parser::ParseDeclarationSpecifiers( isInvalid = DS.SetTypeSpecType(DeclSpec::TST_##Name, Loc, PrevSpec, \ DiagID, Policy); \ break; +#define SVE_TYPE(Name, Id, SingletonId) #include "clang/Basic/AArch64SVEACLETypes.def" case tok::kw___unknown_anytype: @@ -6293,6 +6294,7 @@ bool Parser::isDeclarationSpecifier( case tok::kw___write_only: #define NEON_VECTOR_TYPE(Name, BaseType, ElBits, NumEls, VectorKind) \ case tok::kw_##Name: +#define SVE_TYPE(Name, Id, SingletonId) #include "clang/Basic/AArch64SVEACLETypes.def" #define GENERIC_IMAGE_TYPE(ImgType, Id) case tok::kw_##ImgType##_t: #include "clang/Basic/OpenCLImageTypes.def" diff --git a/clang/lib/Parse/ParseTentative.cpp b/clang/lib/Parse/ParseTentative.cpp index 8cf1f60b8d4a6..59498c8aa6b49 100644 --- a/clang/lib/Parse/ParseTentative.cpp +++ b/clang/lib/Parse/ParseTentative.cpp @@ -1807,6 +1807,7 @@ Parser::isCXXDeclarationSpecifier(ImplicitTypenameContext AllowImplicitTypename, case tok::annot_pack_indexing_type: #define NEON_VECTOR_TYPE(Name, BaseType, ElBits, NumEls, VectorKind) \ case tok::kw_##Name: +#define SVE_TYPE(Name, Id, SingletonId) #include "clang/Basic/AArch64SVEACLETypes.def" #define GENERIC_IMAGE_TYPE(ImgType, Id) case tok::kw_##ImgType##_t: #include "clang/Basic/OpenCLImageTypes.def" @@ -1938,6 +1939,7 @@ bool Parser::isCXXDeclarationSpecifierAType() { case tok::kw__Sat: #define NEON_VECTOR_TYPE(Name, BaseType, ElBits, NumEls, VectorKind) \ case tok::kw_##Name: +#define SVE_TYPE(Name, Id, SingletonId) #include "clang/Basic/AArch64SVEACLETypes.def" #define GENERIC_IMAGE_TYPE(ImgType, Id) case tok::kw_##ImgType##_t: #include "clang/Basic/OpenCLImageTypes.def" diff --git a/clang/lib/Sema/DeclSpec.cpp b/clang/lib/Sema/DeclSpec.cpp index 43302bae4d0f2..acdc2ff3baeca 100644 --- a/clang/lib/Sema/DeclSpec.cpp +++ b/clang/lib/Sema/DeclSpec.cpp @@ -376,6 +376,7 @@ bool Declarator::isDeclarationOfFunction() const { #include "clang/Basic/OpenCLImageTypes.def" #define NEON_VECTOR_TYPE(Name, BaseType, ElBits, NumEls, VectorKind) \ case TST_##Name: +#define SVE_TYPE(Name, Id, SingletonId) #include "clang/Basic/AArch64SVEACLETypes.def" #define HLSL_INTANGIBLE_TYPE(Name, Id, SingletonId) case TST_##Name: #include "clang/Basic/HLSLIntangibleTypes.def" @@ -613,6 +614,7 @@ const char *DeclSpec::getSpecifierName(DeclSpec::TST T, #define NEON_VECTOR_TYPE(Name, BaseType, ElBits, NumEls, VectorKind) \ case DeclSpec::TST_##Name: \ return #Name; +#define SVE_TYPE(Name, Id, SingletonId) #include "clang/Basic/AArch64SVEACLETypes.def" #define HLSL_INTANGIBLE_TYPE(Name, Id, SingletonId) \ case DeclSpec::TST_##Name: \ diff --git a/clang/lib/Sema/SemaTemplateVariadic.cpp b/clang/lib/Sema/SemaTemplateVariadic.cpp index 7bcfce47dd35b..ac47d315a1b2e 100644 --- a/clang/lib/Sema/SemaTemplateVariadic.cpp +++ b/clang/lib/Sema/SemaTemplateVariadic.cpp @@ -1083,6 +1083,7 @@ bool Sema::containsUnexpandedParameterPacks(Declarator &D) { #include "clang/Basic/OpenCLImageTypes.def" #define NEON_VECTOR_TYPE(Name, BaseType, ElBits, NumEls, VectorKind) \ case TST_##Name: +#define SVE_TYPE(Name, Id, SingletonId) #include "clang/Basic/AArch64SVEACLETypes.def" #define HLSL_INTANGIBLE_TYPE(Name, Id, SingletonId) case TST_##Name: #include "clang/Basic/HLSLIntangibleTypes.def" diff --git a/clang/lib/Sema/SemaType.cpp b/clang/lib/Sema/SemaType.cpp index 2bf4f76c714cb..e63fba6127c8d 100644 --- a/clang/lib/Sema/SemaType.cpp +++ b/clang/lib/Sema/SemaType.cpp @@ -1370,6 +1370,7 @@ static QualType ConvertDeclSpecToType(TypeProcessingState &state) { case DeclSpec::TST_##Name: \ Result = Context.getVectorType(Context.BaseType, ElBits, VectorKind); \ break; +#define SVE_TYPE(Name, Id, SingletonId) #include "clang/Basic/AArch64SVEACLETypes.def" #define HLSL_INTANGIBLE_TYPE(Name, Id, SingletonId) \ >From 6f9a9541e181c55fe487a55392f61c6015baf0cc Mon Sep 17 00:00:00 2001 From: Tomas Matheson <tomas.mathe...@arm.com> Date: Thu, 13 Feb 2025 13:03:56 +0000 Subject: [PATCH 3/3] clang-format --- clang/lib/Basic/IdentifierTable.cpp | 2 +- clang/lib/Basic/LangOptions.cpp | 1 - clang/lib/Sema/DeclSpec.cpp | 2 +- 3 files changed, 2 insertions(+), 3 deletions(-) diff --git a/clang/lib/Basic/IdentifierTable.cpp b/clang/lib/Basic/IdentifierTable.cpp index 15bb3f2289ff6..1bc71cff86157 100644 --- a/clang/lib/Basic/IdentifierTable.cpp +++ b/clang/lib/Basic/IdentifierTable.cpp @@ -112,7 +112,7 @@ enum TokenKey : unsigned { KEYHLSL = 0x8000000, KEYFIXEDPOINT = 0x10000000, KEYACLE = 0x20000000, // Enable Arm Neon vector type keywords - KEYMAX = KEYACLE, // The maximum key + KEYMAX = KEYACLE, // The maximum key KEYALLCXX = KEYCXX | KEYCXX11 | KEYCXX20, KEYALL = (KEYMAX | (KEYMAX - 1)) & ~KEYNOMS18 & ~KEYNOOPENCL & ~KEYNOZOS // KEYNOMS18, KEYNOOPENCL, KEYNOZOS are excluded. diff --git a/clang/lib/Basic/LangOptions.cpp b/clang/lib/Basic/LangOptions.cpp index 3ffdaacde1c0d..1eb5170b93b5e 100644 --- a/clang/lib/Basic/LangOptions.cpp +++ b/clang/lib/Basic/LangOptions.cpp @@ -207,7 +207,6 @@ void LangOptions::setLangDefaults(LangOptions &Opts, Language Lang, Opts.ACLE = true; } - // OpenCL, C++ and C23 have bool, true, false keywords. Opts.Bool = Opts.OpenCL || Opts.CPlusPlus || Opts.C23; diff --git a/clang/lib/Sema/DeclSpec.cpp b/clang/lib/Sema/DeclSpec.cpp index acdc2ff3baeca..ba37a25150853 100644 --- a/clang/lib/Sema/DeclSpec.cpp +++ b/clang/lib/Sema/DeclSpec.cpp @@ -375,7 +375,7 @@ bool Declarator::isDeclarationOfFunction() const { #define GENERIC_IMAGE_TYPE(ImgType, Id) case TST_##ImgType##_t: #include "clang/Basic/OpenCLImageTypes.def" #define NEON_VECTOR_TYPE(Name, BaseType, ElBits, NumEls, VectorKind) \ - case TST_##Name: + case TST_##Name: #define SVE_TYPE(Name, Id, SingletonId) #include "clang/Basic/AArch64SVEACLETypes.def" #define HLSL_INTANGIBLE_TYPE(Name, Id, SingletonId) case TST_##Name: _______________________________________________ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits