Skip to content

Commit

Permalink
[DebugInfo][RemoveDIs] Fix error from not tracking seen debug labels (#…
Browse files Browse the repository at this point in the history
…88718)

Fixes the reported errors on:
#87379

A previous patch updated the bitcode reading for debug
intrinsics/records to not perform the expensive debug info format
conversion from records to intrinsics in cases where no records were
present, but the patch did not actually track when debug labels had been
seen, resulting in errors when parsing bitcode where functions contained
debug label records but no other debug records. This patch fixes that
case and adds a test for it.
  • Loading branch information
SLTozer committed Apr 15, 2024
1 parent 673da8c commit 7b039c0
Show file tree
Hide file tree
Showing 2 changed files with 51 additions and 0 deletions.
1 change: 1 addition & 0 deletions llvm/lib/Bitcode/Reader/BitcodeReader.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -6454,6 +6454,7 @@ Error BitcodeReader::parseFunctionBody(Function *F) {
case bitc::FUNC_CODE_DEBUG_RECORD_LABEL: {
// DbgLabelRecords are placed after the Instructions that they are
// attached to.
SeenDebugRecord = true;
Instruction *Inst = getLastInstruction();
if (!Inst)
return error("Invalid dbg record: missing instruction");
Expand Down
50 changes: 50 additions & 0 deletions llvm/test/Bitcode/dbg-label-record-bc.ll
Original file line number Diff line number Diff line change
@@ -0,0 +1,50 @@
;; Tests that we can parse and print a function containing a debug label record
;; and no other debug record kinds.

; RUN: llvm-as --write-experimental-debuginfo-iterators-to-bitcode=true %s -o - \
; RUN: | opt -S | FileCheck %s --check-prefixes=CHECK,INTRINSIC

; RUN: llvm-as --write-experimental-debuginfo-iterators-to-bitcode=true %s -o - \
; RUN: | opt -S --preserve-input-debuginfo-format=true \
; RUN: | FileCheck %s --check-prefixes=CHECK,RECORD

source_filename = "bbi-94196.c"
target datalayout = "e-m:e-p270:32:32-p271:32:32-p272:64:64-i64:64-i128:128-f80:128-n8:16:32:64-S128"
target triple = "x86_64-unknown-linux-gnu"

; CHECK-LABEL: void @foo()
; CHECK: bar:
; INTRINSIC-NEXT: call void @llvm.dbg.label(metadata ![[LABEL:[0-9]+]]), !dbg ![[LOC:[0-9]+]]
; RECORD-NEXT: #dbg_label(![[LABEL:[0-9]+]], ![[LOC:[0-9]+]])

; CHECK-DAG: ![[LABEL]] = !DILabel({{.*}}name: "bar"
; CHECK-DAG: ![[LOC]] = !DILocation(line: 5, column: 1

define dso_local void @foo() !dbg !5 {
entry:
br label %bar, !dbg !9

bar: ; preds = %entry
tail call void @llvm.dbg.label(metadata !10), !dbg !11
ret void, !dbg !12
}

declare void @llvm.dbg.label(metadata)

!llvm.dbg.cu = !{!0}
!llvm.module.flags = !{!2, !3}
!llvm.ident = !{!4}

!0 = distinct !DICompileUnit(language: DW_LANG_C11, file: !1, producer: "clang version 19.0.0git", isOptimized: false, runtimeVersion: 0, emissionKind: FullDebug, splitDebugInlining: false, nameTableKind: None)
!1 = !DIFile(filename: "<stdin>", directory: "/home/gbtozers/dev/llvm-project-ddd-textual-ir")
!2 = !{i32 2, !"Debug Info Version", i32 3}
!3 = !{i32 1, !"wchar_size", i32 4}
!4 = !{!"clang version 19.0.0git"}
!5 = distinct !DISubprogram(name: "foo", scope: !6, file: !6, line: 1, type: !7, scopeLine: 2, spFlags: DISPFlagDefinition, unit: !0)
!6 = !DIFile(filename: "bbi-94196.c", directory: "/home/gbtozers/dev/llvm-project-ddd-textual-ir")
!7 = !DISubroutineType(types: !8)
!8 = !{null}
!9 = !DILocation(line: 3, column: 3, scope: !5)
!10 = !DILabel(scope: !5, name: "bar", file: !6, line: 5)
!11 = !DILocation(line: 5, column: 1, scope: !5)
!12 = !DILocation(line: 6, column: 3, scope: !5)

0 comments on commit 7b039c0

Please sign in to comment.