Skip to content

Commit 79f102f

Browse files
authored
[clang][DWARF] Add DW_AT_bit_stride for SVE predicate types (#161409)
Fixes #159285
1 parent 4030b27 commit 79f102f

File tree

4 files changed

+31
-18
lines changed

4 files changed

+31
-18
lines changed

clang/lib/CodeGen/CGDebugInfo.cpp

Lines changed: 7 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -900,10 +900,13 @@ llvm::DIType *CGDebugInfo::CreateType(const BuiltinType *BT) {
900900
assert((BT->getKind() != BuiltinType::SveCount || Info.NumVectors == 1) &&
901901
"Unsupported number of vectors for svcount_t");
902902

903-
// Debuggers can't extract 1bit from a vector, so will display a
904-
// bitpattern for predicates instead.
905903
unsigned NumElems = Info.EC.getKnownMinValue() * Info.NumVectors;
906-
if (Info.ElementType == CGM.getContext().BoolTy) {
904+
llvm::Metadata *BitStride = nullptr;
905+
if (BT->getKind() == BuiltinType::SveBool) {
906+
Info.ElementType = CGM.getContext().UnsignedCharTy;
907+
BitStride = llvm::ConstantAsMetadata::get(llvm::ConstantInt::getSigned(
908+
llvm::Type::getInt64Ty(CGM.getLLVMContext()), 1));
909+
} else if (BT->getKind() == BuiltinType::SveCount) {
907910
NumElems /= 8;
908911
Info.ElementType = CGM.getContext().UnsignedCharTy;
909912
}
@@ -929,7 +932,7 @@ llvm::DIType *CGDebugInfo::CreateType(const BuiltinType *BT) {
929932
getOrCreateType(Info.ElementType, TheCU->getFile());
930933
auto Align = getTypeAlignIfRequired(BT, CGM.getContext());
931934
return DBuilder.createVectorType(/*Size*/ 0, Align, ElemTy,
932-
SubscriptArray);
935+
SubscriptArray, BitStride);
933936
}
934937
// It doesn't make sense to generate debug info for PowerPC MMA vector types.
935938
// So we return a safe type here to avoid generating an error.

clang/test/DebugInfo/AArch64/sve-vector-types.c

Lines changed: 8 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -3,10 +3,10 @@
33

44
void test_locals(void) {
55
// CHECK-DAG: name: "__SVBool_t",{{.*}}, baseType: ![[CT1:[0-9]+]]
6-
// CHECK-DAG: ![[CT1]] = !DICompositeType(tag: DW_TAG_array_type, baseType: ![[ELTTYU8:[0-9]+]], flags: DIFlagVector, elements: ![[ELTS1_64:[0-9]+]])
6+
// CHECK-DAG: ![[CT1]] = !DICompositeType(tag: DW_TAG_array_type, baseType: ![[ELTTYU8:[0-9]+]], flags: DIFlagVector, elements: ![[ELTS8:[0-9]+]], bitStride: i64 1)
77
// CHECK-DAG: ![[ELTTYU8]] = !DIBasicType(name: "unsigned char", size: 8, encoding: DW_ATE_unsigned_char)
8-
// CHECK-DAG: ![[ELTS1_64]] = !{![[REALELTS1_64:[0-9]+]]}
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))
8+
// CHECK-DAG: ![[ELTS8]] = !{![[REALELTS8:[0-9]+]]}
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))
1010
__SVBool_t b8;
1111

1212
// CHECK-DAG: name: "__SVCount_t",{{.*}}, baseType: ![[CT1_2:[0-9]+]]
@@ -18,8 +18,6 @@ void test_locals(void) {
1818
// CHECK-DAG: name: "__SVInt8_t",{{.*}}, baseType: ![[CT8:[0-9]+]]
1919
// CHECK-DAG: ![[CT8]] = !DICompositeType(tag: DW_TAG_array_type, baseType: ![[ELTTYS8:[0-9]+]], flags: DIFlagVector, elements: ![[ELTS8:[0-9]+]])
2020
// CHECK-DAG: ![[ELTTYS8]] = !DIBasicType(name: "signed char", size: 8, encoding: DW_ATE_signed_char)
21-
// CHECK-DAG: ![[ELTS8]] = !{![[REALELTS8:[0-9]+]]}
22-
// 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))
2321
__SVInt8_t s8;
2422

2523
// CHECK-DAG: name: "__SVUint8_t",{{.*}}, baseType: ![[CT8:[0-9]+]]
@@ -51,12 +49,14 @@ void test_locals(void) {
5149
__SVUint32_t u32;
5250

5351
// CHECK-DAG: name: "__SVInt64_t",{{.*}}, baseType: ![[CT64:[0-9]+]]
54-
// CHECK-DAG: ![[CT64]] = !DICompositeType(tag: DW_TAG_array_type, baseType: ![[ELTTY64:[0-9]+]], flags: DIFlagVector, elements: ![[ELTS1_64]])
52+
// CHECK-DAG: ![[CT64]] = !DICompositeType(tag: DW_TAG_array_type, baseType: ![[ELTTY64:[0-9]+]], flags: DIFlagVector, elements: ![[ELTS64:[0-9]+]])
5553
// CHECK-DAG: ![[ELTTY64]] = !DIBasicType(name: "long", size: 64, encoding: DW_ATE_signed)
54+
// CHECK-DAG: ![[ELTS64]] = !{![[REALELTS64:[0-9]+]]}
55+
// CHECK-DAG: ![[REALELTS64]] = !DISubrange(lowerBound: 0, upperBound: !DIExpression(DW_OP_constu, 1, DW_OP_bregx, 46, 0, DW_OP_mul, DW_OP_constu, 1, DW_OP_minus))
5656
__SVInt64_t s64;
5757

5858
// CHECK-DAG: name: "__SVUint64_t",{{.*}}, baseType: ![[CT64:[0-9]+]]
59-
// CHECK-DAG: ![[CT64]] = !DICompositeType(tag: DW_TAG_array_type, baseType: ![[ELTTY64:[0-9]+]], flags: DIFlagVector, elements: ![[ELTS1_64]])
59+
// CHECK-DAG: ![[CT64]] = !DICompositeType(tag: DW_TAG_array_type, baseType: ![[ELTTY64:[0-9]+]], flags: DIFlagVector, elements: ![[ELTS64]])
6060
// CHECK-DAG: ![[ELTTY64]] = !DIBasicType(name: "unsigned long", size: 64, encoding: DW_ATE_unsigned)
6161
__SVUint64_t u64;
6262

@@ -71,7 +71,7 @@ void test_locals(void) {
7171
__SVFloat32_t f32;
7272

7373
// CHECK: name: "__SVFloat64_t",{{.*}}, baseType: ![[CT64:[0-9]+]]
74-
// CHECK-DAG: ![[CT64]] = !DICompositeType(tag: DW_TAG_array_type, baseType: ![[ELTTY64:[0-9]+]], flags: DIFlagVector, elements: ![[ELTS1_64]])
74+
// CHECK-DAG: ![[CT64]] = !DICompositeType(tag: DW_TAG_array_type, baseType: ![[ELTTY64:[0-9]+]], flags: DIFlagVector, elements: ![[ELTS64]])
7575
// CHECK-DAG: ![[ELTTY64]] = !DIBasicType(name: "double", size: 64, encoding: DW_ATE_float)
7676
__SVFloat64_t f64;
7777
}

llvm/include/llvm/IR/DIBuilder.h

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -729,7 +729,8 @@ namespace llvm {
729729
/// \param Subscripts Subscripts.
730730
LLVM_ABI DICompositeType *createVectorType(uint64_t Size,
731731
uint32_t AlignInBits, DIType *Ty,
732-
DINodeArray Subscripts);
732+
DINodeArray Subscripts,
733+
Metadata *BitStride = nullptr);
733734

734735
/// Create debugging information entry for an
735736
/// enumeration.

llvm/lib/IR/DIBuilder.cpp

Lines changed: 14 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -715,11 +715,20 @@ DICompositeType *DIBuilder::createArrayType(
715715

716716
DICompositeType *DIBuilder::createVectorType(uint64_t Size,
717717
uint32_t AlignInBits, DIType *Ty,
718-
DINodeArray Subscripts) {
719-
auto *R = DICompositeType::get(VMContext, dwarf::DW_TAG_array_type, "",
720-
nullptr, 0, nullptr, Ty, Size, AlignInBits, 0,
721-
DINode::FlagVector, Subscripts, 0,
722-
/*EnumKind=*/std::nullopt, nullptr);
718+
DINodeArray Subscripts,
719+
Metadata *BitStride) {
720+
auto *R = DICompositeType::get(
721+
VMContext, dwarf::DW_TAG_array_type, /*Name=*/"",
722+
/*File=*/nullptr, /*Line=*/0, /*Scope=*/nullptr, /*BaseType=*/Ty,
723+
/*SizeInBits=*/Size, /*AlignInBits=*/AlignInBits, /*OffsetInBits=*/0,
724+
/*Flags=*/DINode::FlagVector, /*Elements=*/Subscripts,
725+
/*RuntimeLang=*/0, /*EnumKind=*/std::nullopt, /*VTableHolder=*/nullptr,
726+
/*TemplateParams=*/nullptr, /*Identifier=*/"",
727+
/*Discriminator=*/nullptr, /*DataLocation=*/nullptr,
728+
/*Associated=*/nullptr, /*Allocated=*/nullptr, /*Rank=*/nullptr,
729+
/*Annotations=*/nullptr, /*Specification=*/nullptr,
730+
/*NumExtraInhabitants=*/0,
731+
/*BitStride=*/BitStride);
723732
trackIfUnresolved(R);
724733
return R;
725734
}

0 commit comments

Comments
 (0)