forked from OSchip/llvm-project
[AArch64][SVE] Add missing debug info for ACLE types.
This patch adds type information for SVE ACLE vector types, by describing them as vectors, with a lower bound of 0, and an upper bound described by a DWARF expression using the AArch64 Vector Granule register (VG), which contains the runtime multiple of 64bit granules in an SVE vector. Reviewed By: efriedma Differential Revision: https://reviews.llvm.org/D86101
This commit is contained in:
parent
ff6dbb2319
commit
4e9b66de3f
|
@ -720,23 +720,39 @@ llvm::DIType *CGDebugInfo::CreateType(const BuiltinType *BT) {
|
||||||
case BuiltinType::Id: \
|
case BuiltinType::Id: \
|
||||||
return getOrCreateStructPtrType("opencl_" #ExtType, Id##Ty);
|
return getOrCreateStructPtrType("opencl_" #ExtType, Id##Ty);
|
||||||
#include "clang/Basic/OpenCLExtensionTypes.def"
|
#include "clang/Basic/OpenCLExtensionTypes.def"
|
||||||
// TODO: real support for SVE types requires more infrastructure
|
|
||||||
// to be added first. The types have a variable length and are
|
|
||||||
// represented in debug info as types whose length depends on a
|
|
||||||
// target-specific pseudo register.
|
|
||||||
#define SVE_TYPE(Name, Id, SingletonId) \
|
|
||||||
case BuiltinType::Id:
|
|
||||||
#include "clang/Basic/AArch64SVEACLETypes.def"
|
|
||||||
{
|
|
||||||
unsigned DiagID = CGM.getDiags().getCustomDiagID(
|
|
||||||
DiagnosticsEngine::Error,
|
|
||||||
"cannot yet generate debug info for SVE type '%0'");
|
|
||||||
auto Name = BT->getName(CGM.getContext().getPrintingPolicy());
|
|
||||||
CGM.getDiags().Report(DiagID) << Name;
|
|
||||||
// Return something safe.
|
|
||||||
return CreateType(cast<const BuiltinType>(CGM.getContext().IntTy));
|
|
||||||
}
|
|
||||||
|
|
||||||
|
#define SVE_TYPE(Name, Id, SingletonId) case BuiltinType::Id:
|
||||||
|
#include "clang/Basic/AArch64SVEACLETypes.def"
|
||||||
|
{
|
||||||
|
ASTContext::BuiltinVectorTypeInfo Info =
|
||||||
|
CGM.getContext().getBuiltinVectorTypeInfo(BT);
|
||||||
|
unsigned NumElemsPerVG = (Info.EC.Min * Info.NumVectors) / 2;
|
||||||
|
|
||||||
|
// Debuggers can't extract 1bit from a vector, so will display a
|
||||||
|
// bitpattern for svbool_t instead.
|
||||||
|
if (Info.ElementType == CGM.getContext().BoolTy) {
|
||||||
|
NumElemsPerVG /= 8;
|
||||||
|
Info.ElementType = CGM.getContext().UnsignedCharTy;
|
||||||
|
}
|
||||||
|
|
||||||
|
auto *LowerBound =
|
||||||
|
llvm::ConstantAsMetadata::get(llvm::ConstantInt::getSigned(
|
||||||
|
llvm::Type::getInt64Ty(CGM.getLLVMContext()), 0));
|
||||||
|
SmallVector<int64_t, 9> Expr(
|
||||||
|
{llvm::dwarf::DW_OP_constu, NumElemsPerVG, llvm::dwarf::DW_OP_bregx,
|
||||||
|
/* AArch64::VG */ 46, 0, llvm::dwarf::DW_OP_mul,
|
||||||
|
llvm::dwarf::DW_OP_constu, 1, llvm::dwarf::DW_OP_minus});
|
||||||
|
auto *UpperBound = DBuilder.createExpression(Expr);
|
||||||
|
|
||||||
|
llvm::Metadata *Subscript = DBuilder.getOrCreateSubrange(
|
||||||
|
/*count*/ nullptr, LowerBound, UpperBound, /*stride*/ nullptr);
|
||||||
|
llvm::DINodeArray SubscriptArray = DBuilder.getOrCreateArray(Subscript);
|
||||||
|
llvm::DIType *ElemTy =
|
||||||
|
getOrCreateType(Info.ElementType, TheCU->getFile());
|
||||||
|
auto Align = getTypeAlignIfRequired(BT, CGM.getContext());
|
||||||
|
return DBuilder.createVectorType(/*Size*/ 0, Align, ElemTy,
|
||||||
|
SubscriptArray);
|
||||||
|
}
|
||||||
case BuiltinType::UChar:
|
case BuiltinType::UChar:
|
||||||
case BuiltinType::Char_U:
|
case BuiltinType::Char_U:
|
||||||
Encoding = llvm::dwarf::DW_ATE_unsigned_char;
|
Encoding = llvm::dwarf::DW_ATE_unsigned_char;
|
||||||
|
|
|
@ -0,0 +1,71 @@
|
||||||
|
// RUN: %clang_cc1 -triple aarch64-none-linux-gnu -target-feature +sve \
|
||||||
|
// RUN: -emit-llvm -o - %s -debug-info-kind=limited 2>&1 | FileCheck %s
|
||||||
|
|
||||||
|
void test_locals(void) {
|
||||||
|
// CHECK-DAG: name: "__SVBool_t",{{.*}}, baseType: ![[CT1:[0-9]+]]
|
||||||
|
// CHECK-DAG: ![[CT1]] = !DICompositeType(tag: DW_TAG_array_type, baseType: ![[ELTTYU8:[0-9]+]], flags: DIFlagVector, elements: ![[ELTS1_64:[0-9]+]])
|
||||||
|
// CHECK-DAG: ![[ELTTYU8]] = !DIBasicType(name: "unsigned char", size: 8, encoding: DW_ATE_unsigned_char)
|
||||||
|
// CHECK-DAG: ![[ELTS1_64]] = !{![[REALELTS1_64:[0-9]+]]}
|
||||||
|
// CHECK-DAG: ![[REALELTS1_64]] = !DISubrange(lowerBound: 0, upperBound: !DIExpression(DW_OP_constu, 1, DW_OP_bregx, 46, 0, DW_OP_mul, DW_OP_constu, 1, DW_OP_minus))
|
||||||
|
__SVBool_t b8;
|
||||||
|
|
||||||
|
// CHECK-DAG: name: "__SVInt8_t",{{.*}}, baseType: ![[CT8:[0-9]+]]
|
||||||
|
// CHECK-DAG: ![[CT8]] = !DICompositeType(tag: DW_TAG_array_type, baseType: ![[ELTTYS8:[0-9]+]], flags: DIFlagVector, elements: ![[ELTS8:[0-9]+]])
|
||||||
|
// CHECK-DAG: ![[ELTTYS8]] = !DIBasicType(name: "signed char", size: 8, encoding: DW_ATE_signed_char)
|
||||||
|
// CHECK-DAG: ![[ELTS8]] = !{![[REALELTS8:[0-9]+]]}
|
||||||
|
// CHECK-DAG: ![[REALELTS8]] = !DISubrange(lowerBound: 0, upperBound: !DIExpression(DW_OP_constu, 8, DW_OP_bregx, 46, 0, DW_OP_mul, DW_OP_constu, 1, DW_OP_minus))
|
||||||
|
__SVInt8_t s8;
|
||||||
|
|
||||||
|
// CHECK-DAG: name: "__SVUint8_t",{{.*}}, baseType: ![[CT8:[0-9]+]]
|
||||||
|
// CHECK-DAG: ![[CT8]] = !DICompositeType(tag: DW_TAG_array_type, baseType: ![[ELTTYU8]], flags: DIFlagVector, elements: ![[ELTS8]])
|
||||||
|
__SVUint8_t u8;
|
||||||
|
|
||||||
|
// CHECK-DAG: name: "__SVInt16_t",{{.*}}, baseType: ![[CT16:[0-9]+]]
|
||||||
|
// CHECK-DAG: ![[CT16]] = !DICompositeType(tag: DW_TAG_array_type, baseType: ![[ELTTY16:[0-9]+]], flags: DIFlagVector, elements: ![[ELTS16:[0-9]+]])
|
||||||
|
// CHECK-DAG: ![[ELTTY16]] = !DIBasicType(name: "short", size: 16, encoding: DW_ATE_signed)
|
||||||
|
// CHECK-DAG: ![[ELTS16]] = !{![[REALELTS16:[0-9]+]]}
|
||||||
|
// CHECK-DAG: ![[REALELTS16]] = !DISubrange(lowerBound: 0, upperBound: !DIExpression(DW_OP_constu, 4, DW_OP_bregx, 46, 0, DW_OP_mul, DW_OP_constu, 1, DW_OP_minus))
|
||||||
|
__SVInt16_t s16;
|
||||||
|
|
||||||
|
// CHECK-DAG: name: "__SVUint16_t",{{.*}}, baseType: ![[CT16:[0-9]+]]
|
||||||
|
// CHECK-DAG: ![[CT16]] = !DICompositeType(tag: DW_TAG_array_type, baseType: ![[ELTTY16:[0-9]+]], flags: DIFlagVector, elements: ![[ELTS16]])
|
||||||
|
// CHECK-DAG: ![[ELTTY16]] = !DIBasicType(name: "unsigned short", size: 16, encoding: DW_ATE_unsigned)
|
||||||
|
__SVUint16_t u16;
|
||||||
|
|
||||||
|
// CHECK-DAG: name: "__SVInt32_t",{{.*}}, baseType: ![[CT32:[0-9]+]]
|
||||||
|
// CHECK-DAG: ![[CT32]] = !DICompositeType(tag: DW_TAG_array_type, baseType: ![[ELTTY32:[0-9]+]], flags: DIFlagVector, elements: ![[ELTS32:[0-9]+]])
|
||||||
|
// CHECK-DAG: ![[ELTTY32]] = !DIBasicType(name: "int", size: 32, encoding: DW_ATE_signed)
|
||||||
|
// CHECK-DAG: ![[ELTS32]] = !{![[REALELTS32:[0-9]+]]}
|
||||||
|
// CHECK-DAG: ![[REALELTS32]] = !DISubrange(lowerBound: 0, upperBound: !DIExpression(DW_OP_constu, 2, DW_OP_bregx, 46, 0, DW_OP_mul, DW_OP_constu, 1, DW_OP_minus))
|
||||||
|
__SVInt32_t s32;
|
||||||
|
|
||||||
|
// CHECK-DAG: name: "__SVUint32_t",{{.*}}, baseType: ![[CT32:[0-9]+]]
|
||||||
|
// CHECK-DAG: ![[CT32]] = !DICompositeType(tag: DW_TAG_array_type, baseType: ![[ELTTY32:[0-9]+]], flags: DIFlagVector, elements: ![[ELTS32]])
|
||||||
|
// CHECK-DAG: ![[ELTTY32]] = !DIBasicType(name: "unsigned int", size: 32, encoding: DW_ATE_unsigned)
|
||||||
|
__SVUint32_t u32;
|
||||||
|
|
||||||
|
// CHECK-DAG: name: "__SVInt64_t",{{.*}}, baseType: ![[CT64:[0-9]+]]
|
||||||
|
// CHECK-DAG: ![[CT64]] = !DICompositeType(tag: DW_TAG_array_type, baseType: ![[ELTTY64:[0-9]+]], flags: DIFlagVector, elements: ![[ELTS1_64]])
|
||||||
|
// CHECK-DAG: ![[ELTTY64]] = !DIBasicType(name: "long int", size: 64, encoding: DW_ATE_signed)
|
||||||
|
__SVInt64_t s64;
|
||||||
|
|
||||||
|
// CHECK-DAG: name: "__SVUint64_t",{{.*}}, baseType: ![[CT64:[0-9]+]]
|
||||||
|
// CHECK-DAG: ![[CT64]] = !DICompositeType(tag: DW_TAG_array_type, baseType: ![[ELTTY64:[0-9]+]], flags: DIFlagVector, elements: ![[ELTS1_64]])
|
||||||
|
// CHECK-DAG: ![[ELTTY64]] = !DIBasicType(name: "long unsigned int", size: 64, encoding: DW_ATE_unsigned)
|
||||||
|
__SVUint64_t u64;
|
||||||
|
|
||||||
|
// CHECK: name: "__SVFloat16_t",{{.*}}, baseType: ![[CT16:[0-9]+]]
|
||||||
|
// CHECK-DAG: ![[CT16]] = !DICompositeType(tag: DW_TAG_array_type, baseType: ![[ELTTY16:[0-9]+]], flags: DIFlagVector, elements: ![[ELTS16]])
|
||||||
|
// CHECK-DAG: ![[ELTTY16]] = !DIBasicType(name: "__fp16", size: 16, encoding: DW_ATE_float)
|
||||||
|
__SVFloat16_t f16;
|
||||||
|
|
||||||
|
// CHECK: name: "__SVFloat32_t",{{.*}}, baseType: ![[CT32:[0-9]+]]
|
||||||
|
// CHECK-DAG: ![[CT32]] = !DICompositeType(tag: DW_TAG_array_type, baseType: ![[ELTTY32:[0-9]+]], flags: DIFlagVector, elements: ![[ELTS32]])
|
||||||
|
// CHECK-DAG: ![[ELTTY32]] = !DIBasicType(name: "float", size: 32, encoding: DW_ATE_float)
|
||||||
|
__SVFloat32_t f32;
|
||||||
|
|
||||||
|
// CHECK: name: "__SVFloat64_t",{{.*}}, baseType: ![[CT64:[0-9]+]]
|
||||||
|
// CHECK-DAG: ![[CT64]] = !DICompositeType(tag: DW_TAG_array_type, baseType: ![[ELTTY64:[0-9]+]], flags: DIFlagVector, elements: ![[ELTS1_64]])
|
||||||
|
// CHECK-DAG: ![[ELTTY64]] = !DIBasicType(name: "double", size: 64, encoding: DW_ATE_float)
|
||||||
|
__SVFloat64_t f64;
|
||||||
|
}
|
|
@ -0,0 +1,67 @@
|
||||||
|
// RUN: %clang_cc1 -triple aarch64-none-linux-gnu -target-feature +sve \
|
||||||
|
// RUN: -emit-llvm -o - %s -debug-info-kind=limited 2>&1 | FileCheck %s
|
||||||
|
|
||||||
|
void test_locals(void) {
|
||||||
|
// CHECK-DAG: name: "__clang_svint8x2_t",{{.*}}, baseType: ![[CT8:[0-9]+]]
|
||||||
|
// CHECK-DAG: ![[CT8]] = !DICompositeType(tag: DW_TAG_array_type, baseType: ![[ELTTY8:[0-9]+]], flags: DIFlagVector, elements: ![[ELTS8x2:[0-9]+]])
|
||||||
|
// CHECK-DAG: ![[ELTTY8]] = !DIBasicType(name: "signed char", size: 8, encoding: DW_ATE_signed_char)
|
||||||
|
// CHECK-DAG: ![[ELTS8x2]] = !{![[REALELTS8x2:[0-9]+]]}
|
||||||
|
// CHECK-DAG: ![[REALELTS8x2]] = !DISubrange(lowerBound: 0, upperBound: !DIExpression(DW_OP_constu, 16, DW_OP_bregx, 46, 0, DW_OP_mul, DW_OP_constu, 1, DW_OP_minus))
|
||||||
|
__clang_svint8x2_t s8;
|
||||||
|
|
||||||
|
// CHECK-DAG: name: "__clang_svuint8x2_t",{{.*}}, baseType: ![[CT8:[0-9]+]]
|
||||||
|
// CHECK-DAG: ![[CT8]] = !DICompositeType(tag: DW_TAG_array_type, baseType: ![[ELTTY8:[0-9]+]], flags: DIFlagVector, elements: ![[ELTS8x2]])
|
||||||
|
// CHECK-DAG: ![[ELTTY8]] = !DIBasicType(name: "unsigned char", size: 8, encoding: DW_ATE_unsigned_char)
|
||||||
|
__clang_svuint8x2_t u8;
|
||||||
|
|
||||||
|
// CHECK-DAG: name: "__clang_svint16x2_t",{{.*}}, baseType: ![[CT16:[0-9]+]]
|
||||||
|
// CHECK-DAG: ![[CT16]] = !DICompositeType(tag: DW_TAG_array_type, baseType: ![[ELTTY16:[0-9]+]], flags: DIFlagVector, elements: ![[ELTS16x2:[0-9]+]])
|
||||||
|
// CHECK-DAG: ![[ELTTY16]] = !DIBasicType(name: "short", size: 16, encoding: DW_ATE_signed)
|
||||||
|
// CHECK-DAG: ![[ELTS16x2]] = !{![[REALELTS16x2:[0-9]+]]}
|
||||||
|
// CHECK-DAG: ![[REALELTS16x2]] = !DISubrange(lowerBound: 0, upperBound: !DIExpression(DW_OP_constu, 8, DW_OP_bregx, 46, 0, DW_OP_mul, DW_OP_constu, 1, DW_OP_minus))
|
||||||
|
__clang_svint16x2_t s16;
|
||||||
|
|
||||||
|
// CHECK-DAG: name: "__clang_svuint16x2_t",{{.*}}, baseType: ![[CT16:[0-9]+]]
|
||||||
|
// CHECK-DAG: ![[CT16]] = !DICompositeType(tag: DW_TAG_array_type, baseType: ![[ELTTY16:[0-9]+]], flags: DIFlagVector, elements: ![[ELTS16x2]])
|
||||||
|
// CHECK-DAG: ![[ELTTY16]] = !DIBasicType(name: "unsigned short", size: 16, encoding: DW_ATE_unsigned)
|
||||||
|
__clang_svuint16x2_t u16;
|
||||||
|
|
||||||
|
// CHECK-DAG: name: "__clang_svint32x2_t",{{.*}}, baseType: ![[CT32:[0-9]+]]
|
||||||
|
// CHECK-DAG: ![[CT32]] = !DICompositeType(tag: DW_TAG_array_type, baseType: ![[ELTTY32:[0-9]+]], flags: DIFlagVector, elements: ![[ELTS32x2:[0-9]+]])
|
||||||
|
// CHECK-DAG: ![[ELTTY32]] = !DIBasicType(name: "int", size: 32, encoding: DW_ATE_signed)
|
||||||
|
// CHECK-DAG: ![[ELTS32x2]] = !{![[REALELTS32x2:[0-9]+]]}
|
||||||
|
// CHECK-DAG: ![[REALELTS32x2]] = !DISubrange(lowerBound: 0, upperBound: !DIExpression(DW_OP_constu, 4, DW_OP_bregx, 46, 0, DW_OP_mul, DW_OP_constu, 1, DW_OP_minus))
|
||||||
|
__clang_svint32x2_t s32;
|
||||||
|
|
||||||
|
// CHECK-DAG: name: "__clang_svuint32x2_t",{{.*}}, baseType: ![[CT32:[0-9]+]]
|
||||||
|
// CHECK-DAG: ![[CT32]] = !DICompositeType(tag: DW_TAG_array_type, baseType: ![[ELTTY32:[0-9]+]], flags: DIFlagVector, elements: ![[ELTS32x2]])
|
||||||
|
// CHECK-DAG: ![[ELTTY32]] = !DIBasicType(name: "unsigned int", size: 32, encoding: DW_ATE_unsigned)
|
||||||
|
__clang_svuint32x2_t u32;
|
||||||
|
|
||||||
|
// CHECK-DAG: name: "__clang_svint64x2_t",{{.*}}, baseType: ![[CT64:[0-9]+]]
|
||||||
|
// CHECK-DAG: ![[CT64]] = !DICompositeType(tag: DW_TAG_array_type, baseType: ![[ELTTY64:[0-9]+]], flags: DIFlagVector, elements: ![[ELTS1x2_64:[0-9]+]])
|
||||||
|
// CHECK-DAG: ![[ELTTY64]] = !DIBasicType(name: "long int", size: 64, encoding: DW_ATE_signed)
|
||||||
|
// CHECK-DAG: ![[ELTS1x2_64]] = !{![[REALELTS1x2_64:[0-9]+]]}
|
||||||
|
// CHECK-DAG: ![[REALELTS1x2_64]] = !DISubrange(lowerBound: 0, upperBound: !DIExpression(DW_OP_constu, 2, DW_OP_bregx, 46, 0, DW_OP_mul, DW_OP_constu, 1, DW_OP_minus))
|
||||||
|
__clang_svint64x2_t s64;
|
||||||
|
|
||||||
|
// CHECK-DAG: name: "__clang_svuint64x2_t",{{.*}}, baseType: ![[CT64:[0-9]+]]
|
||||||
|
// CHECK-DAG: ![[CT64]] = !DICompositeType(tag: DW_TAG_array_type, baseType: ![[ELTTY64:[0-9]+]], flags: DIFlagVector, elements: ![[ELTS1x2_64]])
|
||||||
|
// CHECK-DAG: ![[ELTTY64]] = !DIBasicType(name: "long unsigned int", size: 64, encoding: DW_ATE_unsigned)
|
||||||
|
__clang_svuint64x2_t u64;
|
||||||
|
|
||||||
|
// CHECK: name: "__clang_svfloat16x2_t",{{.*}}, baseType: ![[CT16:[0-9]+]]
|
||||||
|
// CHECK-DAG: ![[CT16]] = !DICompositeType(tag: DW_TAG_array_type, baseType: ![[ELTTY16:[0-9]+]], flags: DIFlagVector, elements: ![[ELTS16x2]])
|
||||||
|
// CHECK-DAG: ![[ELTTY16]] = !DIBasicType(name: "__fp16", size: 16, encoding: DW_ATE_float)
|
||||||
|
__clang_svfloat16x2_t f16;
|
||||||
|
|
||||||
|
// CHECK: name: "__clang_svfloat32x2_t",{{.*}}, baseType: ![[CT32:[0-9]+]]
|
||||||
|
// CHECK-DAG: ![[CT32]] = !DICompositeType(tag: DW_TAG_array_type, baseType: ![[ELTTY32:[0-9]+]], flags: DIFlagVector, elements: ![[ELTS32x2]])
|
||||||
|
// CHECK-DAG: ![[ELTTY32]] = !DIBasicType(name: "float", size: 32, encoding: DW_ATE_float)
|
||||||
|
__clang_svfloat32x2_t f32;
|
||||||
|
|
||||||
|
// CHECK: name: "__clang_svfloat64x2_t",{{.*}}, baseType: ![[CT64:[0-9]+]]
|
||||||
|
// CHECK-DAG: ![[CT64]] = !DICompositeType(tag: DW_TAG_array_type, baseType: ![[ELTTY64:[0-9]+]], flags: DIFlagVector, elements: ![[ELTS1x2_64]])
|
||||||
|
// CHECK-DAG: ![[ELTTY64]] = !DIBasicType(name: "double", size: 64, encoding: DW_ATE_float)
|
||||||
|
__clang_svfloat64x2_t f64;
|
||||||
|
}
|
|
@ -0,0 +1,67 @@
|
||||||
|
// RUN: %clang_cc1 -triple aarch64-none-linux-gnu -target-feature +sve \
|
||||||
|
// RUN: -emit-llvm -o - %s -debug-info-kind=limited 2>&1 | FileCheck %s
|
||||||
|
|
||||||
|
void test_locals(void) {
|
||||||
|
// CHECK-DAG: name: "__clang_svint8x3_t",{{.*}}, baseType: ![[CT8:[0-9]+]]
|
||||||
|
// CHECK-DAG: ![[CT8]] = !DICompositeType(tag: DW_TAG_array_type, baseType: ![[ELTTY8:[0-9]+]], flags: DIFlagVector, elements: ![[ELTS8x3:[0-9]+]])
|
||||||
|
// CHECK-DAG: ![[ELTTY8]] = !DIBasicType(name: "signed char", size: 8, encoding: DW_ATE_signed_char)
|
||||||
|
// CHECK-DAG: ![[ELTS8x3]] = !{![[REALELTS8x3:[0-9]+]]}
|
||||||
|
// CHECK-DAG: ![[REALELTS8x3]] = !DISubrange(lowerBound: 0, upperBound: !DIExpression(DW_OP_constu, 24, DW_OP_bregx, 46, 0, DW_OP_mul, DW_OP_constu, 1, DW_OP_minus))
|
||||||
|
__clang_svint8x3_t s8;
|
||||||
|
|
||||||
|
// CHECK-DAG: name: "__clang_svuint8x3_t",{{.*}}, baseType: ![[CT8:[0-9]+]]
|
||||||
|
// CHECK-DAG: ![[CT8]] = !DICompositeType(tag: DW_TAG_array_type, baseType: ![[ELTTY8:[0-9]+]], flags: DIFlagVector, elements: ![[ELTS8x3]])
|
||||||
|
// CHECK-DAG: ![[ELTTY8]] = !DIBasicType(name: "unsigned char", size: 8, encoding: DW_ATE_unsigned_char)
|
||||||
|
__clang_svuint8x3_t u8;
|
||||||
|
|
||||||
|
// CHECK-DAG: name: "__clang_svint16x3_t",{{.*}}, baseType: ![[CT16:[0-9]+]]
|
||||||
|
// CHECK-DAG: ![[CT16]] = !DICompositeType(tag: DW_TAG_array_type, baseType: ![[ELTTY16:[0-9]+]], flags: DIFlagVector, elements: ![[ELTS16x3:[0-9]+]])
|
||||||
|
// CHECK-DAG: ![[ELTTY16]] = !DIBasicType(name: "short", size: 16, encoding: DW_ATE_signed)
|
||||||
|
// CHECK-DAG: ![[ELTS16x3]] = !{![[REALELTS16x3:[0-9]+]]}
|
||||||
|
// CHECK-DAG: ![[REALELTS16x3]] = !DISubrange(lowerBound: 0, upperBound: !DIExpression(DW_OP_constu, 12, DW_OP_bregx, 46, 0, DW_OP_mul, DW_OP_constu, 1, DW_OP_minus))
|
||||||
|
__clang_svint16x3_t s16;
|
||||||
|
|
||||||
|
// CHECK-DAG: name: "__clang_svuint16x3_t",{{.*}}, baseType: ![[CT16:[0-9]+]]
|
||||||
|
// CHECK-DAG: ![[CT16]] = !DICompositeType(tag: DW_TAG_array_type, baseType: ![[ELTTY16:[0-9]+]], flags: DIFlagVector, elements: ![[ELTS16x3]])
|
||||||
|
// CHECK-DAG: ![[ELTTY16]] = !DIBasicType(name: "unsigned short", size: 16, encoding: DW_ATE_unsigned)
|
||||||
|
__clang_svuint16x3_t u16;
|
||||||
|
|
||||||
|
// CHECK-DAG: name: "__clang_svint32x3_t",{{.*}}, baseType: ![[CT32:[0-9]+]]
|
||||||
|
// CHECK-DAG: ![[CT32]] = !DICompositeType(tag: DW_TAG_array_type, baseType: ![[ELTTY32:[0-9]+]], flags: DIFlagVector, elements: ![[ELTS32x3:[0-9]+]])
|
||||||
|
// CHECK-DAG: ![[ELTTY32]] = !DIBasicType(name: "int", size: 32, encoding: DW_ATE_signed)
|
||||||
|
// CHECK-DAG: ![[ELTS32x3]] = !{![[REALELTS32x3:[0-9]+]]}
|
||||||
|
// CHECK-DAG: ![[REALELTS32x3]] = !DISubrange(lowerBound: 0, upperBound: !DIExpression(DW_OP_constu, 6, DW_OP_bregx, 46, 0, DW_OP_mul, DW_OP_constu, 1, DW_OP_minus))
|
||||||
|
__clang_svint32x3_t s32;
|
||||||
|
|
||||||
|
// CHECK-DAG: name: "__clang_svuint32x3_t",{{.*}}, baseType: ![[CT32:[0-9]+]]
|
||||||
|
// CHECK-DAG: ![[CT32]] = !DICompositeType(tag: DW_TAG_array_type, baseType: ![[ELTTY32:[0-9]+]], flags: DIFlagVector, elements: ![[ELTS32x3]])
|
||||||
|
// CHECK-DAG: ![[ELTTY32]] = !DIBasicType(name: "unsigned int", size: 32, encoding: DW_ATE_unsigned)
|
||||||
|
__clang_svuint32x3_t u32;
|
||||||
|
|
||||||
|
// CHECK-DAG: name: "__clang_svint64x3_t",{{.*}}, baseType: ![[CT64:[0-9]+]]
|
||||||
|
// CHECK-DAG: ![[CT64]] = !DICompositeType(tag: DW_TAG_array_type, baseType: ![[ELTTY64:[0-9]+]], flags: DIFlagVector, elements: ![[ELTS1x3_64:[0-9]+]])
|
||||||
|
// CHECK-DAG: ![[ELTTY64]] = !DIBasicType(name: "long int", size: 64, encoding: DW_ATE_signed)
|
||||||
|
// CHECK-DAG: ![[ELTS1x3_64]] = !{![[REALELTS1x3_64:[0-9]+]]}
|
||||||
|
// CHECK-DAG: ![[REALELTS1x3_64]] = !DISubrange(lowerBound: 0, upperBound: !DIExpression(DW_OP_constu, 3, DW_OP_bregx, 46, 0, DW_OP_mul, DW_OP_constu, 1, DW_OP_minus))
|
||||||
|
__clang_svint64x3_t s64;
|
||||||
|
|
||||||
|
// CHECK-DAG: name: "__clang_svuint64x3_t",{{.*}}, baseType: ![[CT64:[0-9]+]]
|
||||||
|
// CHECK-DAG: ![[CT64]] = !DICompositeType(tag: DW_TAG_array_type, baseType: ![[ELTTY64:[0-9]+]], flags: DIFlagVector, elements: ![[ELTS1x3_64]])
|
||||||
|
// CHECK-DAG: ![[ELTTY64]] = !DIBasicType(name: "long unsigned int", size: 64, encoding: DW_ATE_unsigned)
|
||||||
|
__clang_svuint64x3_t u64;
|
||||||
|
|
||||||
|
// CHECK: name: "__clang_svfloat16x3_t",{{.*}}, baseType: ![[CT16:[0-9]+]]
|
||||||
|
// CHECK-DAG: ![[CT16]] = !DICompositeType(tag: DW_TAG_array_type, baseType: ![[ELTTY16:[0-9]+]], flags: DIFlagVector, elements: ![[ELTS16x3]])
|
||||||
|
// CHECK-DAG: ![[ELTTY16]] = !DIBasicType(name: "__fp16", size: 16, encoding: DW_ATE_float)
|
||||||
|
__clang_svfloat16x3_t f16;
|
||||||
|
|
||||||
|
// CHECK: name: "__clang_svfloat32x3_t",{{.*}}, baseType: ![[CT32:[0-9]+]]
|
||||||
|
// CHECK-DAG: ![[CT32]] = !DICompositeType(tag: DW_TAG_array_type, baseType: ![[ELTTY32:[0-9]+]], flags: DIFlagVector, elements: ![[ELTS32x3]])
|
||||||
|
// CHECK-DAG: ![[ELTTY32]] = !DIBasicType(name: "float", size: 32, encoding: DW_ATE_float)
|
||||||
|
__clang_svfloat32x3_t f32;
|
||||||
|
|
||||||
|
// CHECK: name: "__clang_svfloat64x3_t",{{.*}}, baseType: ![[CT64:[0-9]+]]
|
||||||
|
// CHECK-DAG: ![[CT64]] = !DICompositeType(tag: DW_TAG_array_type, baseType: ![[ELTTY64:[0-9]+]], flags: DIFlagVector, elements: ![[ELTS1x3_64]])
|
||||||
|
// CHECK-DAG: ![[ELTTY64]] = !DIBasicType(name: "double", size: 64, encoding: DW_ATE_float)
|
||||||
|
__clang_svfloat64x3_t f64;
|
||||||
|
}
|
|
@ -0,0 +1,67 @@
|
||||||
|
// RUN: %clang_cc1 -triple aarch64-none-linux-gnu -target-feature +sve \
|
||||||
|
// RUN: -emit-llvm -o - %s -debug-info-kind=limited 2>&1 | FileCheck %s
|
||||||
|
|
||||||
|
void test_locals(void) {
|
||||||
|
// CHECK-DAG: name: "__clang_svint8x4_t",{{.*}}, baseType: ![[CT8:[0-9]+]]
|
||||||
|
// CHECK-DAG: ![[CT8]] = !DICompositeType(tag: DW_TAG_array_type, baseType: ![[ELTTY8:[0-9]+]], flags: DIFlagVector, elements: ![[ELTS8x4:[0-9]+]])
|
||||||
|
// CHECK-DAG: ![[ELTTY8]] = !DIBasicType(name: "signed char", size: 8, encoding: DW_ATE_signed_char)
|
||||||
|
// CHECK-DAG: ![[ELTS8x4]] = !{![[REALELTS8x4:[0-9]+]]}
|
||||||
|
// CHECK-DAG: ![[REALELTS8x4]] = !DISubrange(lowerBound: 0, upperBound: !DIExpression(DW_OP_constu, 32, DW_OP_bregx, 46, 0, DW_OP_mul, DW_OP_constu, 1, DW_OP_minus))
|
||||||
|
__clang_svint8x4_t s8;
|
||||||
|
|
||||||
|
// CHECK-DAG: name: "__clang_svuint8x4_t",{{.*}}, baseType: ![[CT8:[0-9]+]]
|
||||||
|
// CHECK-DAG: ![[CT8]] = !DICompositeType(tag: DW_TAG_array_type, baseType: ![[ELTTY8:[0-9]+]], flags: DIFlagVector, elements: ![[ELTS8x4]])
|
||||||
|
// CHECK-DAG: ![[ELTTY8]] = !DIBasicType(name: "unsigned char", size: 8, encoding: DW_ATE_unsigned_char)
|
||||||
|
__clang_svuint8x4_t u8;
|
||||||
|
|
||||||
|
// CHECK-DAG: name: "__clang_svint16x4_t",{{.*}}, baseType: ![[CT16:[0-9]+]]
|
||||||
|
// CHECK-DAG: ![[CT16]] = !DICompositeType(tag: DW_TAG_array_type, baseType: ![[ELTTY16:[0-9]+]], flags: DIFlagVector, elements: ![[ELTS16x4:[0-9]+]])
|
||||||
|
// CHECK-DAG: ![[ELTTY16]] = !DIBasicType(name: "short", size: 16, encoding: DW_ATE_signed)
|
||||||
|
// CHECK-DAG: ![[ELTS16x4]] = !{![[REALELTS16x4:[0-9]+]]}
|
||||||
|
// CHECK-DAG: ![[REALELTS16x4]] = !DISubrange(lowerBound: 0, upperBound: !DIExpression(DW_OP_constu, 16, DW_OP_bregx, 46, 0, DW_OP_mul, DW_OP_constu, 1, DW_OP_minus))
|
||||||
|
__clang_svint16x4_t s16;
|
||||||
|
|
||||||
|
// CHECK-DAG: name: "__clang_svuint16x4_t",{{.*}}, baseType: ![[CT16:[0-9]+]]
|
||||||
|
// CHECK-DAG: ![[CT16]] = !DICompositeType(tag: DW_TAG_array_type, baseType: ![[ELTTY16:[0-9]+]], flags: DIFlagVector, elements: ![[ELTS16x4]])
|
||||||
|
// CHECK-DAG: ![[ELTTY16]] = !DIBasicType(name: "unsigned short", size: 16, encoding: DW_ATE_unsigned)
|
||||||
|
__clang_svuint16x4_t u16;
|
||||||
|
|
||||||
|
// CHECK-DAG: name: "__clang_svint32x4_t",{{.*}}, baseType: ![[CT32:[0-9]+]]
|
||||||
|
// CHECK-DAG: ![[CT32]] = !DICompositeType(tag: DW_TAG_array_type, baseType: ![[ELTTY32:[0-9]+]], flags: DIFlagVector, elements: ![[ELTS32x4:[0-9]+]])
|
||||||
|
// CHECK-DAG: ![[ELTTY32]] = !DIBasicType(name: "int", size: 32, encoding: DW_ATE_signed)
|
||||||
|
// CHECK-DAG: ![[ELTS32x4]] = !{![[REALELTS32x4:[0-9]+]]}
|
||||||
|
// CHECK-DAG: ![[REALELTS32x4]] = !DISubrange(lowerBound: 0, upperBound: !DIExpression(DW_OP_constu, 8, DW_OP_bregx, 46, 0, DW_OP_mul, DW_OP_constu, 1, DW_OP_minus))
|
||||||
|
__clang_svint32x4_t s32;
|
||||||
|
|
||||||
|
// CHECK-DAG: name: "__clang_svuint32x4_t",{{.*}}, baseType: ![[CT32:[0-9]+]]
|
||||||
|
// CHECK-DAG: ![[CT32]] = !DICompositeType(tag: DW_TAG_array_type, baseType: ![[ELTTY32:[0-9]+]], flags: DIFlagVector, elements: ![[ELTS32x4]])
|
||||||
|
// CHECK-DAG: ![[ELTTY32]] = !DIBasicType(name: "unsigned int", size: 32, encoding: DW_ATE_unsigned)
|
||||||
|
__clang_svuint32x4_t u32;
|
||||||
|
|
||||||
|
// CHECK-DAG: name: "__clang_svint64x4_t",{{.*}}, baseType: ![[CT64:[0-9]+]]
|
||||||
|
// CHECK-DAG: ![[CT64]] = !DICompositeType(tag: DW_TAG_array_type, baseType: ![[ELTTY64:[0-9]+]], flags: DIFlagVector, elements: ![[ELTS1x4_64:[0-9]+]])
|
||||||
|
// CHECK-DAG: ![[ELTTY64]] = !DIBasicType(name: "long int", size: 64, encoding: DW_ATE_signed)
|
||||||
|
// CHECK-DAG: ![[ELTS1x4_64]] = !{![[REALELTS1x4_64:[0-9]+]]}
|
||||||
|
// CHECK-DAG: ![[REALELTS1x4_64]] = !DISubrange(lowerBound: 0, upperBound: !DIExpression(DW_OP_constu, 4, DW_OP_bregx, 46, 0, DW_OP_mul, DW_OP_constu, 1, DW_OP_minus))
|
||||||
|
__clang_svint64x4_t s64;
|
||||||
|
|
||||||
|
// CHECK-DAG: name: "__clang_svuint64x4_t",{{.*}}, baseType: ![[CT64:[0-9]+]]
|
||||||
|
// CHECK-DAG: ![[CT64]] = !DICompositeType(tag: DW_TAG_array_type, baseType: ![[ELTTY64:[0-9]+]], flags: DIFlagVector, elements: ![[ELTS1x4_64]])
|
||||||
|
// CHECK-DAG: ![[ELTTY64]] = !DIBasicType(name: "long unsigned int", size: 64, encoding: DW_ATE_unsigned)
|
||||||
|
__clang_svuint64x4_t u64;
|
||||||
|
|
||||||
|
// CHECK: name: "__clang_svfloat16x4_t",{{.*}}, baseType: ![[CT16:[0-9]+]]
|
||||||
|
// CHECK-DAG: ![[CT16]] = !DICompositeType(tag: DW_TAG_array_type, baseType: ![[ELTTY16:[0-9]+]], flags: DIFlagVector, elements: ![[ELTS16x4]])
|
||||||
|
// CHECK-DAG: ![[ELTTY16]] = !DIBasicType(name: "__fp16", size: 16, encoding: DW_ATE_float)
|
||||||
|
__clang_svfloat16x4_t f16;
|
||||||
|
|
||||||
|
// CHECK: name: "__clang_svfloat32x4_t",{{.*}}, baseType: ![[CT32:[0-9]+]]
|
||||||
|
// CHECK-DAG: ![[CT32]] = !DICompositeType(tag: DW_TAG_array_type, baseType: ![[ELTTY32:[0-9]+]], flags: DIFlagVector, elements: ![[ELTS32x4]])
|
||||||
|
// CHECK-DAG: ![[ELTTY32]] = !DIBasicType(name: "float", size: 32, encoding: DW_ATE_float)
|
||||||
|
__clang_svfloat32x4_t f32;
|
||||||
|
|
||||||
|
// CHECK: name: "__clang_svfloat64x4_t",{{.*}}, baseType: ![[CT64:[0-9]+]]
|
||||||
|
// CHECK-DAG: ![[CT64]] = !DICompositeType(tag: DW_TAG_array_type, baseType: ![[ELTTY64:[0-9]+]], flags: DIFlagVector, elements: ![[ELTS1x4_64]])
|
||||||
|
// CHECK-DAG: ![[ELTTY64]] = !DIBasicType(name: "double", size: 64, encoding: DW_ATE_float)
|
||||||
|
__clang_svfloat64x4_t f64;
|
||||||
|
}
|
|
@ -1,22 +1,6 @@
|
||||||
// RUN: not %clang_cc1 -triple aarch64-none-linux-gnu -target-feature +sve \
|
|
||||||
// RUN: -emit-llvm -o - %s -debug-info-kind=limited 2>&1 | FileCheck %s -check-prefix=CHECK-DEBUG
|
|
||||||
// RUN: %clang_cc1 -triple aarch64-none-linux-gnu -target-feature +sve \
|
// RUN: %clang_cc1 -triple aarch64-none-linux-gnu -target-feature +sve \
|
||||||
// RUN: -emit-llvm -o - %s 2>&1 | FileCheck %s -check-prefix=CHECK
|
// RUN: -emit-llvm -o - %s 2>&1 | FileCheck %s -check-prefix=CHECK
|
||||||
|
|
||||||
// CHECK-DEBUG: cannot yet generate debug info for SVE type '__SVInt8_t'
|
|
||||||
// CHECK-DEBUG: cannot yet generate debug info for SVE type '__SVInt16_t'
|
|
||||||
// CHECK-DEBUG: cannot yet generate debug info for SVE type '__SVInt32_t'
|
|
||||||
// CHECK-DEBUG: cannot yet generate debug info for SVE type '__SVInt64_t'
|
|
||||||
// CHECK-DEBUG: cannot yet generate debug info for SVE type '__SVUint8_t'
|
|
||||||
// CHECK-DEBUG: cannot yet generate debug info for SVE type '__SVUint16_t'
|
|
||||||
// CHECK-DEBUG: cannot yet generate debug info for SVE type '__SVUint32_t'
|
|
||||||
// CHECK-DEBUG: cannot yet generate debug info for SVE type '__SVUint64_t'
|
|
||||||
// CHECK-DEBUG: cannot yet generate debug info for SVE type '__SVFloat16_t'
|
|
||||||
// CHECK-DEBUG: cannot yet generate debug info for SVE type '__SVFloat32_t'
|
|
||||||
// CHECK-DEBUG: cannot yet generate debug info for SVE type '__SVFloat64_t'
|
|
||||||
// CHECK-DEBUG: cannot yet generate debug info for SVE type '__SVBFloat16_t'
|
|
||||||
// CHECK-DEBUG: cannot yet generate debug info for SVE type '__SVBool_t'
|
|
||||||
|
|
||||||
// CHECK: @ptr = global <vscale x 16 x i8>* null, align 8
|
// CHECK: @ptr = global <vscale x 16 x i8>* null, align 8
|
||||||
// CHECK: %s8 = alloca <vscale x 16 x i8>, align 16
|
// CHECK: %s8 = alloca <vscale x 16 x i8>, align 16
|
||||||
// CHECK: %s16 = alloca <vscale x 8 x i16>, align 16
|
// CHECK: %s16 = alloca <vscale x 8 x i16>, align 16
|
||||||
|
|
|
@ -1422,8 +1422,10 @@ static bool hasVectorBeenPadded(const DICompositeType *CTy) {
|
||||||
Elements[0]->getTag() == dwarf::DW_TAG_subrange_type &&
|
Elements[0]->getTag() == dwarf::DW_TAG_subrange_type &&
|
||||||
"Invalid vector element array, expected one element of type subrange");
|
"Invalid vector element array, expected one element of type subrange");
|
||||||
const auto Subrange = cast<DISubrange>(Elements[0]);
|
const auto Subrange = cast<DISubrange>(Elements[0]);
|
||||||
const auto CI = Subrange->getCount().get<ConstantInt *>();
|
const auto NumVecElements =
|
||||||
const int32_t NumVecElements = CI->getSExtValue();
|
Subrange->getCount()
|
||||||
|
? Subrange->getCount().get<ConstantInt *>()->getSExtValue()
|
||||||
|
: 0;
|
||||||
|
|
||||||
// Ensure we found the element count and that the actual size is wide
|
// Ensure we found the element count and that the actual size is wide
|
||||||
// enough to contain the requested size.
|
// enough to contain the requested size.
|
||||||
|
|
|
@ -0,0 +1,44 @@
|
||||||
|
; Test that the debug info for the vector type is correctly codegenerated
|
||||||
|
; when the DISubrange has no count, but only an upperbound.
|
||||||
|
; RUN: llc -mtriple aarch64 -mattr=+sve -filetype=obj -o %t %s
|
||||||
|
; RUN: llvm-dwarfdump %t | FileCheck %s
|
||||||
|
; RUN: rm %t
|
||||||
|
|
||||||
|
; CHECK: {{.*}}: DW_TAG_subrange_type
|
||||||
|
; CHECK-NEXT: DW_AT_type ({{.*}} "__ARRAY_SIZE_TYPE__")
|
||||||
|
; CHECK-NEXT: DW_AT_upper_bound (DW_OP_lit8, DW_OP_bregx VG+0, DW_OP_mul, DW_OP_lit1, DW_OP_minus)
|
||||||
|
|
||||||
|
define <vscale x 16 x i8> @test_svint8_t(<vscale x 16 x i8> returned %op1) !dbg !7 {
|
||||||
|
entry:
|
||||||
|
call void @llvm.dbg.value(metadata <vscale x 16 x i8> %op1, metadata !19, metadata !DIExpression()), !dbg !20
|
||||||
|
ret <vscale x 16 x i8> %op1, !dbg !21
|
||||||
|
}
|
||||||
|
|
||||||
|
declare void @llvm.dbg.value(metadata, metadata, metadata)
|
||||||
|
|
||||||
|
!llvm.dbg.cu = !{!0}
|
||||||
|
!llvm.module.flags = !{!3, !4, !5}
|
||||||
|
!llvm.ident = !{!6}
|
||||||
|
|
||||||
|
!0 = distinct !DICompileUnit(language: DW_LANG_C99, file: !1, producer: "clang version 12.0.0", isOptimized: true, runtimeVersion: 0, emissionKind: FullDebug, enums: !2, nameTableKind: None)
|
||||||
|
!1 = !DIFile(filename: "dbg-sve-types.ll", directory: "")
|
||||||
|
!2 = !{}
|
||||||
|
!3 = !{i32 7, !"Dwarf Version", i32 4}
|
||||||
|
!4 = !{i32 2, !"Debug Info Version", i32 3}
|
||||||
|
!5 = !{i32 1, !"wchar_size", i32 4}
|
||||||
|
!6 = !{!"clang version 12.0.0"}
|
||||||
|
!7 = distinct !DISubprogram(name: "test_svint8_t", scope: !8, file: !8, line: 5, type: !9, scopeLine: 5, flags: DIFlagPrototyped, spFlags: DISPFlagDefinition | DISPFlagOptimized, unit: !0, retainedNodes: !18)
|
||||||
|
!8 = !DIFile(filename: "dbg-sve-types.ll", directory: "")
|
||||||
|
!9 = !DISubroutineType(types: !10)
|
||||||
|
!10 = !{!11, !11}
|
||||||
|
!11 = !DIDerivedType(tag: DW_TAG_typedef, name: "svint8_t", file: !12, line: 32, baseType: !13)
|
||||||
|
!12 = !DIFile(filename: "lib/clang/12.0.0/include/arm_sve.h", directory: "")
|
||||||
|
!13 = !DIDerivedType(tag: DW_TAG_typedef, name: "__SVInt8_t", file: !1, baseType: !14)
|
||||||
|
!14 = !DICompositeType(tag: DW_TAG_array_type, baseType: !15, flags: DIFlagVector, elements: !16)
|
||||||
|
!15 = !DIBasicType(name: "signed char", size: 8, encoding: DW_ATE_signed_char)
|
||||||
|
!16 = !{!17}
|
||||||
|
!17 = !DISubrange(lowerBound: 0, upperBound: !DIExpression(DW_OP_constu, 8, DW_OP_bregx, 46, 0, DW_OP_mul, DW_OP_constu, 1, DW_OP_minus))
|
||||||
|
!18 = !{!19}
|
||||||
|
!19 = !DILocalVariable(name: "op1", arg: 1, scope: !7, file: !8, line: 5, type: !11)
|
||||||
|
!20 = !DILocation(line: 0, scope: !7)
|
||||||
|
!21 = !DILocation(line: 5, column: 39, scope: !7)
|
Loading…
Reference in New Issue