xref: /llvm-project/llvm/test/DebugInfo/COFF/jump-table-with-indirect-ptr-null.ll (revision d53425e2a33a0ff7336c86d3f668b1855c47a6de)
1*0c5c7b52SDaniel Paoliello; REQUIRES: x86-registered-target
2*0c5c7b52SDaniel Paoliello; RUN: llc < %s | FileCheck %s
3*0c5c7b52SDaniel Paoliello
4*0c5c7b52SDaniel Paoliello; Repro for issue https://reviews.llvm.org/D149367#4619121
5*0c5c7b52SDaniel Paoliello; Validates that `indirect ptr null` and a jump table can be used in the same function.
6*0c5c7b52SDaniel Paoliello
7*0c5c7b52SDaniel Paoliello; Verify branch labels match what's in the CodeView
8*0c5c7b52SDaniel Paoliello; CHECK:            .Ltmp2:
9*0c5c7b52SDaniel Paoliello; CHECK-NEXT:       jmpq    *%{{.*}}
10*0c5c7b52SDaniel Paoliello
11*0c5c7b52SDaniel Paoliello; Verify jump table have the same entry size, base offset and shift as what's in the CodeView
12*0c5c7b52SDaniel Paoliello; CHECK:          {{\.?}}LJTI0_0:
13*0c5c7b52SDaniel Paoliello; CHECK-NEXT:     .long   .LBB0_[[#]]-.LJTI0_0
14*0c5c7b52SDaniel Paoliello
15*0c5c7b52SDaniel Paoliello; Verify CodeView
16*0c5c7b52SDaniel Paoliello; CHECK:          .short	4441          # Record kind: S_ARMSWITCHTABLE
17*0c5c7b52SDaniel Paoliello; CHECK-NEXT:     .secrel32	.LJTI0_0    # Base offset
18*0c5c7b52SDaniel Paoliello; CHECK-NEXT:     .secidx	.LJTI0_0      # Base section index
19*0c5c7b52SDaniel Paoliello; CHECK-NEXT:     .short	4             # Switch type
20*0c5c7b52SDaniel Paoliello; CHECK-NEXT:     .secrel32	.Ltmp2      # Branch offset
21*0c5c7b52SDaniel Paoliello; CHECK-NEXT:     .secrel32	.LJTI0_0    # Table offset
22*0c5c7b52SDaniel Paoliello; CHECK-NEXT:     .secidx	.Ltmp2        # Branch section index
23*0c5c7b52SDaniel Paoliello; CHECK-NEXT:     .secidx	.LJTI0_0      # Table section index
24*0c5c7b52SDaniel Paoliello; CHECK-NEXT:     .long	4               # Entries count
25*0c5c7b52SDaniel Paoliello; CHECK-NOT:      .short	4441          # Record kind: S_ARMSWITCHTABLE
26*0c5c7b52SDaniel Paoliello
27*0c5c7b52SDaniel Paoliellotarget datalayout = "e-m:w-p270:32:32-p271:32:32-p272:64:64-i64:64-f80:128-n8:16:32:64-S128"
28*0c5c7b52SDaniel Paoliellotarget triple = "x86_64-pc-windows-msvc19.34.0"
29*0c5c7b52SDaniel Paoliello
30*0c5c7b52SDaniel Paoliellodefine i32 @f() !dbg !5 {
31*0c5c7b52SDaniel Paolielloentry:
32*0c5c7b52SDaniel Paoliello  indirectbr ptr null, [label %BC_SUCCEED], !dbg !11
33*0c5c7b52SDaniel Paoliello
34*0c5c7b52SDaniel PaolielloBC_SUCCEED:                                       ; preds = %entry
35*0c5c7b52SDaniel Paoliello  %0 = lshr i64 0, 0
36*0c5c7b52SDaniel Paoliello  switch i64 %0, label %sw.default.i.i2445 [
37*0c5c7b52SDaniel Paoliello    i64 3, label %sw.bb15.i.i
38*0c5c7b52SDaniel Paoliello    i64 1, label %sw.bb7.i.i
39*0c5c7b52SDaniel Paoliello    i64 2, label %sw.bb11.i.i2444
40*0c5c7b52SDaniel Paoliello    i64 0, label %sw.bb3.i.i
41*0c5c7b52SDaniel Paoliello  ]
42*0c5c7b52SDaniel Paoliello
43*0c5c7b52SDaniel Paoliellosw.bb3.i.i:                                       ; preds = %BC_SUCCEED
44*0c5c7b52SDaniel Paoliello  ret i32 0
45*0c5c7b52SDaniel Paoliello
46*0c5c7b52SDaniel Paoliellosw.bb7.i.i:                                       ; preds = %BC_SUCCEED
47*0c5c7b52SDaniel Paoliello  ret i32 0
48*0c5c7b52SDaniel Paoliello
49*0c5c7b52SDaniel Paoliellosw.bb11.i.i2444:                                  ; preds = %BC_SUCCEED
50*0c5c7b52SDaniel Paoliello  ret i32 0
51*0c5c7b52SDaniel Paoliello
52*0c5c7b52SDaniel Paoliellosw.bb15.i.i:                                      ; preds = %BC_SUCCEED
53*0c5c7b52SDaniel Paoliello  ret i32 0
54*0c5c7b52SDaniel Paoliello
55*0c5c7b52SDaniel Paoliellosw.default.i.i2445:                               ; preds = %BC_SUCCEED
56*0c5c7b52SDaniel Paoliello  ret i32 0
57*0c5c7b52SDaniel Paoliello}
58*0c5c7b52SDaniel Paoliello
59*0c5c7b52SDaniel Paoliello!llvm.dbg.cu = !{!0}
60*0c5c7b52SDaniel Paoliello!llvm.module.flags = !{!3, !4}
61*0c5c7b52SDaniel Paoliello
62*0c5c7b52SDaniel Paoliello!0 = distinct !DICompileUnit(language: DW_LANG_C_plus_plus_14, file: !1, isOptimized: true, runtimeVersion: 0, emissionKind: FullDebug, enums: !2, retainedTypes: !2, globals: !2, imports: !2, splitDebugInlining: false, nameTableKind: None)
63*0c5c7b52SDaniel Paoliello!1 = !DIFile(filename: "../../v8/src/regexp\\regexp-interpreter.cc", directory: ".", checksumkind: CSK_MD5, checksum: "ddba353f72137fb1d64b5fc8ee071a9c")
64*0c5c7b52SDaniel Paoliello!2 = !{}
65*0c5c7b52SDaniel Paoliello!3 = !{i32 2, !"CodeView", i32 1}
66*0c5c7b52SDaniel Paoliello!4 = !{i32 2, !"Debug Info Version", i32 3}
67*0c5c7b52SDaniel Paoliello!5 = distinct !DISubprogram(name: "f", linkageName: "f", scope: !7, file: !6, line: 386, type: !10, scopeLine: 391, flags: DIFlagPrototyped, spFlags: DISPFlagLocalToUnit | DISPFlagDefinition | DISPFlagOptimized, unit: !0, templateParams: !2, retainedNodes: !2)
68*0c5c7b52SDaniel Paoliello!6 = !DIFile(filename: "../../v8/src/regexp/regexp-interpreter.cc", directory: ".", checksumkind: CSK_MD5, checksum: "ddba353f72137fb1d64b5fc8ee071a9c")
69*0c5c7b52SDaniel Paoliello!7 = !DINamespace(scope: !8)
70*0c5c7b52SDaniel Paoliello!8 = !DINamespace(name: "internal", scope: !9)
71*0c5c7b52SDaniel Paoliello!9 = !DINamespace(name: "v8", scope: null)
72*0c5c7b52SDaniel Paoliello!10 = distinct !DISubroutineType(types: !2)
73*0c5c7b52SDaniel Paoliello!11 = !DILocation(line: 1, scope: !5)