Skip to content

Commit ecd4c08

Browse files
authored
[Verifier] Require that dbg.declare variable is a ptr (#134355)
As far as I understand, the first operand of dbg_declare should be a pointer (inside a metadata wrapper). However, using a non-pointer is currently not rejected, and we have some tests that use non-pointer types. As far as I can tell, these tests either meant to use dbg_value or are just incorrect hand-crafted tests. Ran into this while trying to `fix` #134008.
1 parent fd6260f commit ecd4c08

File tree

9 files changed

+30
-26
lines changed

9 files changed

+30
-26
lines changed

llvm/docs/SourceLevelDebugging.rst

+4-4
Original file line numberDiff line numberDiff line change
@@ -208,10 +208,10 @@ comma-separated arguments in parentheses, as with a `call`.
208208
#dbg_declare([Value|MDNode], DILocalVariable, DIExpression, DILocation)
209209
210210
This record provides information about a local element (e.g., variable).
211-
The first argument is an SSA value corresponding to a variable address, and is
212-
typically a static alloca in the function entry block. The second argument is a
213-
`local variable <LangRef.html#dilocalvariable>`_ containing a description of
214-
the variable. The third argument is a `complex expression
211+
The first argument is an SSA ``ptr`` value corresponding to a variable address,
212+
and is typically a static alloca in the function entry block. The second
213+
argument is a `local variable <LangRef.html#dilocalvariable>`_ containing a
214+
description of the variable. The third argument is a `complex expression
215215
<LangRef.html#diexpression>`_. The fourth argument is a `source location
216216
<LangRef.html#dilocation>`_. A ``#dbg_declare`` record describes the
217217
*address* of a source variable.

llvm/lib/IR/Verifier.cpp

+6-2
Original file line numberDiff line numberDiff line change
@@ -6666,10 +6666,14 @@ void Verifier::visit(DbgVariableRecord &DVR) {
66666666
CheckDI(MD && (isa<ValueAsMetadata>(MD) || isa<DIArgList>(MD) ||
66676667
(isa<MDNode>(MD) && !cast<MDNode>(MD)->getNumOperands())),
66686668
"invalid #dbg record address/value", &DVR, MD);
6669-
if (auto *VAM = dyn_cast<ValueAsMetadata>(MD))
6669+
if (auto *VAM = dyn_cast<ValueAsMetadata>(MD)) {
66706670
visitValueAsMetadata(*VAM, F);
6671-
else if (auto *AL = dyn_cast<DIArgList>(MD))
6671+
if (DVR.isDbgDeclare())
6672+
CheckDI(VAM->getValue()->getType()->isPointerTy(),
6673+
"location of #dbg_declare must be a pointer", &DVR, MD);
6674+
} else if (auto *AL = dyn_cast<DIArgList>(MD)) {
66726675
visitDIArgList(*AL, F);
6676+
}
66736677

66746678
CheckDI(isa_and_nonnull<DILocalVariable>(DVR.getRawVariable()),
66756679
"invalid #dbg record variable", &DVR, DVR.getRawVariable());

llvm/test/CodeGen/AArch64/fast-isel-dbg.ll

+2-2
Original file line numberDiff line numberDiff line change
@@ -6,8 +6,8 @@ target triple="aarch64--"
66

77
; CHECK-LABEL: name: func
88
; CHECK: DBG_VALUE
9-
define void @func(i32 %a) !dbg !4 {
10-
call void @llvm.dbg.declare(metadata i32 %a, metadata !5, metadata !DIExpression()), !dbg !7
9+
define void @func(ptr %a) !dbg !4 {
10+
call void @llvm.dbg.declare(metadata ptr %a, metadata !5, metadata !DIExpression()), !dbg !7
1111
ret void
1212
}
1313

llvm/test/CodeGen/AArch64/selectiondag-order.ll

+2-2
Original file line numberDiff line numberDiff line change
@@ -53,10 +53,10 @@ end: ; preds = %body
5353
; AARCH64-CHECK: BB1_1:
5454

5555

56-
define i64 @simulateWithDbgDeclare(<2 x i32> %a) local_unnamed_addr {
56+
define i64 @simulateWithDbgDeclare(<2 x i32> %a, ptr %ptr) local_unnamed_addr {
5757
entry:
5858
%rand = tail call i64 @lrand48() #3
59-
tail call void @llvm.dbg.declare(metadata i64 %rand, metadata !6, metadata !7), !dbg !8
59+
tail call void @llvm.dbg.declare(metadata ptr %ptr, metadata !6, metadata !7), !dbg !8
6060
br label %body
6161

6262
body: ; preds = %body, %entry

llvm/test/CodeGen/MIR/X86/diexpr-win32.mir

+1-1
Original file line numberDiff line numberDiff line change
@@ -82,7 +82,7 @@
8282
entry:
8383
%0 = bitcast ptr %s to ptr
8484
%bytes = load i32, ptr %0, !dbg !34
85-
call void @llvm.dbg.declare(metadata i32 %bytes, metadata !35, metadata !28), !dbg !34
85+
call void @llvm.dbg.value(metadata i32 %bytes, metadata !35, metadata !28), !dbg !34
8686
%1 = add i32 %bytes, %acc, !dbg !36
8787
ret i32 %1, !dbg !36
8888
}

llvm/test/CodeGen/X86/selectiondag-order.ll

+2-2
Original file line numberDiff line numberDiff line change
@@ -53,10 +53,10 @@ end: ; preds = %body
5353
; X86-CHECK: callq lrand48
5454
; X86-CHECK: movq %rax, %rbx
5555

56-
define i64 @simulateWithDbgDeclare(<2 x i32> %a) local_unnamed_addr {
56+
define i64 @simulateWithDbgDeclare(<2 x i32> %a, ptr %ptr) local_unnamed_addr {
5757
entry:
5858
%rand = tail call i64 @lrand48() #3
59-
tail call void @llvm.dbg.declare(metadata i64 %rand, metadata !6, metadata !7), !dbg !8
59+
tail call void @llvm.dbg.declare(metadata ptr %ptr, metadata !6, metadata !7), !dbg !8
6060
br label %body
6161

6262
body: ; preds = %body, %entry

llvm/test/DebugInfo/ARM/lowerbdgdeclare_vla.ll

+2-2
Original file line numberDiff line numberDiff line change
@@ -19,9 +19,9 @@ target triple = "thumbv7-apple-ios8.0.0"
1919
; Function Attrs: nounwind optsize readnone
2020
define void @run(float %r) #0 !dbg !4 {
2121
entry:
22-
tail call void @llvm.dbg.declare(metadata float %r, metadata !11, metadata !DIExpression()), !dbg !22
22+
tail call void @llvm.dbg.value(metadata float %r, metadata !11, metadata !DIExpression()), !dbg !22
2323
%conv = fptosi float %r to i32, !dbg !23
24-
tail call void @llvm.dbg.declare(metadata i32 %conv, metadata !12, metadata !DIExpression()), !dbg !23
24+
tail call void @llvm.dbg.value(metadata i32 %conv, metadata !12, metadata !DIExpression()), !dbg !23
2525
%vla = alloca float, i32 %conv, align 4, !dbg !24
2626
tail call void @llvm.dbg.declare(metadata ptr %vla, metadata !14, metadata !DIExpression(DW_OP_deref)), !dbg !24
2727
; The VLA alloca should be described by a dbg.declare:

llvm/test/Transforms/Coroutines/coro-debug.ll

+9-9
Original file line numberDiff line numberDiff line change
@@ -29,8 +29,8 @@ sw.bb: ; preds = %entry
2929
%direct = load i32, ptr %x.addr, align 4, !dbg !14
3030
%gep = getelementptr inbounds [16 x i8], ptr undef, i32 %direct, !dbg !14
3131
call void @llvm.dbg.declare(metadata ptr %gep, metadata !27, metadata !13), !dbg !14
32-
call void @llvm.dbg.declare(metadata i32 %conv, metadata !26, metadata !13), !dbg !14
33-
call void @llvm.dbg.declare(metadata i32 %direct, metadata !25, metadata !13), !dbg !14
32+
call void @llvm.dbg.value(metadata i32 %conv, metadata !26, metadata !13), !dbg !14
33+
call void @llvm.dbg.value(metadata i32 %direct, metadata !25, metadata !13), !dbg !14
3434
call void @llvm.dbg.declare(metadata ptr %x.addr, metadata !12, metadata !13), !dbg !14
3535
call void @llvm.dbg.declare(metadata ptr %coro_hdl, metadata !15, metadata !13), !dbg !16
3636
call void @llvm.dbg.declare(metadata ptr %late_local, metadata !29, metadata !13), !dbg !16
@@ -66,7 +66,7 @@ coro_Cleanup: ; preds = %sw.epilog, %sw.bb1
6666
%5 = load ptr, ptr %coro_hdl, align 8, !dbg !24
6767
%6 = call ptr @llvm.coro.free(token %0, ptr %5), !dbg !24
6868
call void @free(ptr %6), !dbg !24
69-
call void @llvm.dbg.declare(metadata i32 %asm_res, metadata !32, metadata !13), !dbg !16
69+
call void @llvm.dbg.value(metadata i32 %asm_res, metadata !32, metadata !13), !dbg !16
7070
br label %coro_Suspend, !dbg !24
7171

7272
coro_Suspend: ; preds = %coro_Cleanup, %sw.default
@@ -176,14 +176,14 @@ attributes #7 = { noduplicate }
176176
; CHECK: %[[DBG_PTR:.*]] = alloca ptr
177177
; CHECK: #dbg_declare(ptr %[[DBG_PTR]], ![[RESUME_COROHDL:[0-9]+]], !DIExpression(DW_OP_deref, DW_OP_plus_uconst,
178178
; CHECK: #dbg_declare(ptr %[[DBG_PTR]], ![[RESUME_X:[0-9]+]], !DIExpression(DW_OP_deref, DW_OP_plus_uconst, [[EXPR_TAIL:.*]])
179-
; CHECK: #dbg_declare(ptr %[[DBG_PTR]], ![[RESUME_DIRECT:[0-9]+]], !DIExpression(DW_OP_deref, DW_OP_plus_uconst, [[EXPR_TAIL]])
180179
; CHECK: store ptr {{.*}}, ptr %[[DBG_PTR]]
181180
; CHECK-NOT: alloca ptr
182-
; CHECK: #dbg_declare(i8 0, ![[RESUME_CONST:[0-9]+]], !DIExpression(DW_OP_LLVM_convert, 8, DW_ATE_signed, DW_OP_LLVM_convert, 32, DW_ATE_signed),
181+
; CHECK: call void @coro.devirt.trigger(ptr null)
182+
; CHECK: #dbg_value(i8 0, ![[RESUME_CONST:[0-9]+]], !DIExpression(DW_OP_LLVM_convert, 8, DW_ATE_signed, DW_OP_LLVM_convert, 32, DW_ATE_signed),
183+
; CHECK: #dbg_value(ptr %[[DBG_PTR]], ![[RESUME_DIRECT:[0-9]+]], !DIExpression(DW_OP_deref, DW_OP_plus_uconst, {{[0-9]+}}, DW_OP_deref),
183184
; Note that keeping the undef value here could be acceptable, too.
184185
; CHECK-NOT: #dbg_declare(ptr undef, !{{[0-9]+}}, !DIExpression(),
185-
; CHECK: call void @coro.devirt.trigger(ptr null)
186-
; CHECK: #dbg_value(ptr {{.*}}, ![[RESUME_DIRECT_VALUE:[0-9]+]], !DIExpression(DW_OP_deref, DW_OP_plus_uconst, {{[0-9]+}}, DW_OP_deref),
186+
; CHECK: #dbg_value(ptr %[[DBG_PTR]], ![[RESUME_DIRECT_VALUE:[0-9]+]], !DIExpression(DW_OP_deref, DW_OP_plus_uconst, {{[0-9]+}}, DW_OP_deref),
187187
; Check that the dbg.declare intrinsic of invoke instruction is hanled correctly.
188188
; CHECK: %[[ALLOCATED_STORAGE:.+]] = invoke ptr @allocate()
189189
; CHECK-NEXT: to label %[[NORMAL_DEST:.+]] unwind
@@ -193,7 +193,7 @@ attributes #7 = { noduplicate }
193193
; CHECK-NEXT: to label %[[DEFAULT_DEST:.+]] [label
194194
; CHECK: [[DEFAULT_DEST]]:
195195
; CHECK-NOT: {{.*}}:
196-
; CHECK: #dbg_declare(i32 %[[CALLBR_RES]]
196+
; CHECK: #dbg_value(i32 %[[CALLBR_RES]]
197197
; CHECK: define internal fastcc void @f.destroy(ptr noundef nonnull align 8 dereferenceable(40) %0) #0 personality i32 0 !dbg ![[DESTROY:[0-9]+]]
198198
; CHECK: define internal fastcc void @f.cleanup(ptr noundef nonnull align 8 dereferenceable(40) %0) #0 personality i32 0 !dbg ![[CLEANUP:[0-9]+]]
199199

@@ -202,8 +202,8 @@ attributes #7 = { noduplicate }
202202
; CHECK: ![[RESUME]] = distinct !DISubprogram(name: "f", linkageName: "flink"
203203
; CHECK: ![[RESUME_COROHDL]] = !DILocalVariable(name: "coro_hdl", scope: ![[RESUME]]
204204
; CHECK: ![[RESUME_X]] = !DILocalVariable(name: "x", arg: 1, scope: ![[RESUME]]
205-
; CHECK: ![[RESUME_DIRECT]] = !DILocalVariable(name: "direct_mem", scope: ![[RESUME]]
206205
; CHECK: ![[RESUME_CONST]] = !DILocalVariable(name: "direct_const", scope: ![[RESUME]]
206+
; CHECK: ![[RESUME_DIRECT]] = !DILocalVariable(name: "direct_mem", scope: ![[RESUME]]
207207
; CHECK: ![[RESUME_DIRECT_VALUE]] = !DILocalVariable(name: "direct_value", scope: ![[RESUME]]
208208

209209
; CHECK: ![[DESTROY]] = distinct !DISubprogram(name: "f", linkageName: "flink"

llvm/test/Transforms/LoopVectorize/discriminator.ll

+2-2
Original file line numberDiff line numberDiff line change
@@ -32,8 +32,8 @@ define void @_Z3foov() local_unnamed_addr #0 !dbg !6 {
3232
%7 = load i32, ptr %6, align 4, !dbg !17, !tbaa !15
3333
%8 = add nsw i32 %7, %5, !dbg !17
3434
;PSEUDO_PROBE-COUNT-5: call void @llvm.pseudoprobe(i64 6699318081062747564, i64 2, i32 0, i64 -1), !dbg ![[#PROBE:]]
35-
;DBG_VALUE: #dbg_declare{{.*}} ![[DBG:[0-9]*]]
36-
call void @llvm.dbg.declare(metadata i32 %8, metadata !22, metadata !DIExpression()), !dbg !17
35+
;DBG_VALUE: #dbg_value{{.*}} ![[DBG:[0-9]*]]
36+
call void @llvm.dbg.value(metadata i32 %8, metadata !22, metadata !DIExpression()), !dbg !17
3737
store i32 %8, ptr %6, align 4, !dbg !17, !tbaa !15
3838
%indvars.iv.next = add nuw nsw i64 %indvars.iv, 1, !dbg !18
3939
%exitcond = icmp eq i64 %indvars.iv.next, 4096, !dbg !19

0 commit comments

Comments
 (0)