Skip to content

Commit 4a8b0ea

Browse files
authored
[DebugInfo][Verifier] Verify that array types have base types present (#70803)
The base-type field of a DICompositeType is optional in the IR syntax, however it makes no sense to have an array of an unspecified type. Such debug-info would be meaningless, and the added test crashes otherwise (see #70787). Thus, add a verifier check to reject such ill-formed debug info metadata. Test produced by Christian Ulmann. fixes #70787
1 parent 3a12f35 commit 4a8b0ea

File tree

2 files changed

+31
-0
lines changed

2 files changed

+31
-0
lines changed

llvm/lib/IR/Verifier.cpp

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1287,6 +1287,10 @@ void Verifier::visitDICompositeType(const DICompositeType &N) {
12871287
CheckDI(N.getTag() == dwarf::DW_TAG_array_type,
12881288
"rank can only appear in array type");
12891289
}
1290+
1291+
if (N.getTag() == dwarf::DW_TAG_array_type) {
1292+
CheckDI(N.getRawBaseType(), "array types must have a base type", &N);
1293+
}
12901294
}
12911295

12921296
void Verifier::visitDISubroutineType(const DISubroutineType &N) {
Lines changed: 27 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,27 @@
1+
; RUN: opt %s -o - -S --passes=verify 2>&1 | FileCheck %s
2+
3+
; CHECK: array types must have a base type
4+
; CHECK-NEXT: !DICompositeType(tag: DW_TAG_array_type,
5+
; CHECK-NEXT: warning: ignoring invalid debug info
6+
7+
declare void @llvm.dbg.value(metadata, metadata, metadata)
8+
9+
define i32 @func(ptr %0) !dbg !3 {
10+
call void @llvm.dbg.value(metadata ptr %0, metadata !6, metadata !DIExpression()), !dbg !10
11+
ret i32 0
12+
}
13+
14+
!llvm.module.flags = !{!0}
15+
!llvm.dbg.cu = !{!1}
16+
17+
!0 = !{i32 2, !"Debug Info Version", i32 3}
18+
!1 = distinct !DICompileUnit(language: DW_LANG_C11, file: !2, producer: "clang", isOptimized: true, runtimeVersion: 0, emissionKind: FullDebug)
19+
!2 = !DIFile(filename: "file.c", directory: "/")
20+
!3 = distinct !DISubprogram(name: "func", scope: !2, file: !2, line: 46, type: !4, scopeLine: 48, spFlags: DISPFlagDefinition | DISPFlagOptimized, unit: !1)
21+
!4 = distinct !DISubroutineType(types: !5)
22+
!5 = !{}
23+
!6 = !DILocalVariable(name: "op", arg: 5, scope: !3, file: !2, line: 47, type: !7)
24+
!7 = !DICompositeType(tag: DW_TAG_array_type, size: 2624, elements: !8)
25+
!8 = !{!9}
26+
!9 = !DISubrange(count: 41)
27+
!10 = !DILocation(line: 0, scope: !3)

0 commit comments

Comments
 (0)