Skip to content

Commit f583bc3

Browse files
committed
Updating verifier checks for to handle null references and adding lit test
1 parent 2811555 commit f583bc3

File tree

2 files changed

+78
-5
lines changed

2 files changed

+78
-5
lines changed

llvm/lib/IR/Verifier.cpp

Lines changed: 12 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1158,6 +1158,7 @@ void Verifier::visitMetadataAsValue(const MetadataAsValue &MDV, Function *F) {
11581158
static bool isType(const Metadata *MD) { return !MD || isa<DIType>(MD); }
11591159
static bool isScope(const Metadata *MD) { return !MD || isa<DIScope>(MD); }
11601160
static bool isDINode(const Metadata *MD) { return !MD || isa<DINode>(MD); }
1161+
static bool isMDTuple(const Metadata *MD) { return !MD || isa<MDTuple>(MD); }
11611162

11621163
void Verifier::visitDILocation(const DILocation &N) {
11631164
CheckDI(N.getRawScope() && isa<DILocalScope>(N.getRawScope()),
@@ -1321,16 +1322,22 @@ void Verifier::visitDIDerivedType(const DIDerivedType &N) {
13211322
CheckDI(isType(N.getRawExtraData()), "invalid pointer to member type", &N,
13221323
N.getRawExtraData());
13231324
} else if (N.getTag() == dwarf::DW_TAG_template_alias) {
1324-
CheckDI(isa<MDTuple>(N.getRawExtraData()), "invalid template parameters",
1325-
&N, N.getRawExtraData());
1325+
CheckDI(isMDTuple(N.getRawExtraData()), "invalid template parameters", &N,
1326+
N.getRawExtraData());
13261327
} else if (auto *ExtraData = N.getRawExtraData()) {
13271328
auto IsValidExtraData = [&]() {
13281329
if (isa<ConstantAsMetadata>(ExtraData) || isa<MDString>(ExtraData) ||
13291330
isa<DIObjCProperty>(ExtraData))
13301331
return true;
1331-
if (auto *Tuple = dyn_cast<MDTuple>(ExtraData))
1332-
return Tuple->getNumOperands() == 1 &&
1333-
isa<ConstantAsMetadata>(Tuple->getOperand(0));
1332+
if (auto *Tuple = dyn_cast<MDTuple>(ExtraData)) {
1333+
if (N.getTag() != dwarf::DW_TAG_inheritance &&
1334+
N.getTag() != dwarf::DW_TAG_member &&
1335+
N.getTag() != dwarf::DW_TAG_variable)
1336+
return false;
1337+
if (Tuple->getNumOperands() != 1)
1338+
return false;
1339+
return isa_and_nonnull<ConstantAsMetadata>(Tuple->getOperand(0).get());
1340+
}
13341341
return false;
13351342
};
13361343
CheckDI(IsValidExtraData(),
Lines changed: 66 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,66 @@
1+
; RUN: not opt -S < %s 2>&1 | FileCheck %s
2+
3+
;; Test that extraData with MDTuple is only allowed for specific DWARF tags:
4+
;; DW_TAG_inheritance, DW_TAG_member, and DW_TAG_variable
5+
6+
!llvm.module.flags = !{!0}
7+
!0 = !{i32 2, !"Debug Info Version", i32 3}
8+
9+
!1 = !DIBasicType(name: "int", size: 32, encoding: DW_ATE_signed)
10+
11+
; Keep all metadata nodes alive so verifier can check them
12+
!named = !{!1, !2, !3, !4, !5, !6, !7, !8, !9, !10, !11, !12, !13, !14, !15, !16, !17, !18, !19}
13+
!2 = !{i32 0}
14+
15+
; Valid: DW_TAG_inheritance with tuple extraData should be accepted
16+
!3 = !DIDerivedType(tag: DW_TAG_inheritance, baseType: !1, size: 32, extraData: !2)
17+
18+
; Valid: DW_TAG_member with tuple extraData should be accepted
19+
!4 = !DIDerivedType(tag: DW_TAG_member, name: "field", baseType: !1, size: 32, extraData: !2)
20+
21+
; Valid: DW_TAG_variable (static member) with tuple extraData should be accepted
22+
!5 = !DIDerivedType(tag: DW_TAG_variable, name: "var", baseType: !1, extraData: !2, flags: DIFlagStaticMember)
23+
24+
; Invalid: DW_TAG_typedef with tuple extraData should be rejected
25+
; CHECK: extraData must be ConstantAsMetadata, MDString, DIObjCProperty, or MDTuple with single ConstantAsMetadata operand
26+
; CHECK-NEXT: !{{[0-9]+}} = !DIDerivedType(tag: DW_TAG_typedef
27+
!6 = !DIDerivedType(tag: DW_TAG_typedef, name: "IntTy", baseType: !1, extraData: !2)
28+
29+
; Invalid: Empty tuple should be rejected
30+
!7 = !{}
31+
; CHECK: extraData must be ConstantAsMetadata, MDString, DIObjCProperty, or MDTuple with single ConstantAsMetadata operand
32+
; CHECK-NEXT: !{{[0-9]+}} = !DIDerivedType(tag: DW_TAG_member
33+
!8 = !DIDerivedType(tag: DW_TAG_member, name: "field2", baseType: !1, extraData: !7)
34+
35+
; Invalid: Tuple with multiple operands should be rejected
36+
!9 = !{i32 0, i32 1}
37+
; CHECK: extraData must be ConstantAsMetadata, MDString, DIObjCProperty, or MDTuple with single ConstantAsMetadata operand
38+
; CHECK-NEXT: !{{[0-9]+}} = !DIDerivedType(tag: DW_TAG_member
39+
!10 = !DIDerivedType(tag: DW_TAG_member, name: "field3", baseType: !1, extraData: !9)
40+
41+
; Invalid: Tuple with non-ConstantAsMetadata operand should be rejected
42+
!11 = !DIBasicType(name: "float", size: 32, encoding: DW_ATE_float)
43+
!12 = !{!11}
44+
; CHECK: extraData must be ConstantAsMetadata, MDString, DIObjCProperty, or MDTuple with single ConstantAsMetadata operand
45+
; CHECK-NEXT: !{{[0-9]+}} = !DIDerivedType(tag: DW_TAG_member
46+
!13 = !DIDerivedType(tag: DW_TAG_member, name: "field4", baseType: !1, extraData: !12)
47+
48+
; Valid: ConstantAsMetadata as extraData should still work for any tag
49+
!14 = !DIDerivedType(tag: DW_TAG_typedef, name: "IntTy2", baseType: !1, extraData: i32 42)
50+
51+
; Valid: MDString as extraData should still work for any tag
52+
!15 = !DIDerivedType(tag: DW_TAG_typedef, name: "IntTy3", baseType: !1, extraData: !"some string")
53+
54+
; Valid: DW_TAG_template_alias with proper template parameters tuple
55+
; Template aliases are handled specially and accept any MDTuple for template parameters
56+
!16 = !DITemplateTypeParameter(name: "T", type: !1)
57+
!17 = !{!16}
58+
!18 = !DIDerivedType(tag: DW_TAG_template_alias, name: "MyAlias", baseType: !1, extraData: !17)
59+
60+
; Invalid: DW_TAG_template_alias with non-tuple extraData should fail
61+
; CHECK: invalid template parameters
62+
; CHECK-NEXT: !{{[0-9]+}} = !DIDerivedType(tag: DW_TAG_template_alias
63+
!19 = !DIDerivedType(tag: DW_TAG_template_alias, name: "FailingAlias", baseType: !1, extraData: i32 42)
64+
65+
; CHECK: warning: ignoring invalid debug info
66+

0 commit comments

Comments
 (0)