[PATCH] D149367: Emit the CodeView `S_ARMSWITCHTABLE` debug symbol for jump tables

Daniel Paoliello via Phabricator via llvm-commits llvm-commits at lists.llvm.org
Mon May 1 14:48:33 PDT 2023


dpaoliello added inline comments.


================
Comment at: llvm/lib/CodeGen/AsmPrinter/CodeViewDebug.cpp:3491
+                    "EK_Inline, EK_Custom32, EK_GPRel32BlockAddress, and "
+                    "EK_GPRel64BlockAddress should never be emitted for COFF");
+              case MachineJumpTableInfo::EK_BlockAddress:
----------------
efriedma wrote:
> dpaoliello wrote:
> > efriedma wrote:
> > > LLVM can target 32-bit ARM Windows.
> > I wasn't seeing ARM32 hit this code before, but it looks like it was because of the assumption that the branch instruction wasn't the one to use the jump table value.
> > 
> > I've fixed the code to handle ARM32 and added it to the tests, but there seems to be some bug where the offsets are always 0? If I run the test via `llc` then the correct labels appear in the debug info, but somewhere between `llc -filetype=obj` and `llvm-readobj` the offsets are lost...
> In general, .secrel32 emits a relocation; `llvm-readobj --codeview` won't dump it, I think, but it should still be there.  What's the relocation pointing to?
The "Branch" and "Base" are pointing to a label for the `ADD` instruction, and "Table" is pointing to the Jump Table itself:

If I run `llc -mtriple=thumbv7a-windows < llvm\test\DebugInfo\COFF\jump-table.ll"` I get:

```
        .text
        .syntax unified
        .file   "jump-table.cpp"
'x86-64' is not a recognized processor for this target (ignoring processor)
'+cx8' is not a recognized feature for this target (ignoring feature)
'+fxsr' is not a recognized feature for this target (ignoring feature)
'+mmx' is not a recognized feature for this target (ignoring feature)
'+sse' is not a recognized feature for this target (ignoring feature)
'+sse2' is not a recognized feature for this target (ignoring feature)
'+x87' is not a recognized feature for this target (ignoring feature)
'x86-64' is not a recognized processor for this target (ignoring processor)
'x86-64' is not a recognized processor for this target (ignoring processor)
'+cx8' is not a recognized feature for this target (ignoring feature)
'+fxsr' is not a recognized feature for this target (ignoring feature)
'+mmx' is not a recognized feature for this target (ignoring feature)
'+sse' is not a recognized feature for this target (ignoring feature)
'+sse2' is not a recognized feature for this target (ignoring feature)
'+x87' is not a recognized feature for this target (ignoring feature)
'x86-64' is not a recognized processor for this target (ignoring processor)
'x86-64' is not a recognized processor for this target (ignoring processor)
'x86-64' is not a recognized processor for this target (ignoring processor)
        .def    func;
        .scl    2;
        .type   32;
        .endef
        .globl  func                            @ -- Begin function func
        .p2align        2
        .code16                                 @ @func
        .thumb_func
func:
$Mfunc_begin0:
        .cv_func_id 0
        .cv_file        1 "C:\\llvm\\jump-table.cpp" "35610C7104C8080F83E2BF6A02DABFC9" 1
        .cv_loc 0 1 6 0                         @ .\jump-table.cpp:6:0
@ %bb.0:
        push    {r7, lr}
        sub     sp, #8
        str     r0, [sp, #4]
$Mtmp0:
        .cv_loc 0 1 7 0                         @ .\jump-table.cpp:7:0
        ldr     r0, [sp, #4]
        cmp     r0, #3
        bhi     ($MBB0_7)
@ %bb.1:
$Mtmp1:
        .p2align        2
        add     r0, pc
        ldrb    r0, [r0, #4]
        lsls    r0, r0, #1
.LCPI0_0:
        add     pc, r0
@ %bb.2:
        .p2align        2
.LJTI0_0:
        .byte   (($MBB0_3)-(.LCPI0_0+4))/2
        .byte   (($MBB0_4)-(.LCPI0_0+4))/2
        .byte   (($MBB0_5)-(.LCPI0_0+4))/2
        .byte   (($MBB0_6)-(.LCPI0_0+4))/2
        .p2align        1
$MBB0_3:
$Mtmp2:
        .cv_loc 0 1 8 0                         @ .\jump-table.cpp:8:0
        bl      f1
        b       ($MBB0_7)
$MBB0_4:
        .cv_loc 0 1 9 0                         @ .\jump-table.cpp:9:0
        bl      f2
        b       ($MBB0_7)
$MBB0_5:
        .cv_loc 0 1 10 0                        @ .\jump-table.cpp:10:0
        bl      f3
        b       ($MBB0_7)
$MBB0_6:
        .cv_loc 0 1 11 0                        @ .\jump-table.cpp:11:0
        bl      f4
        b       ($MBB0_7)
$Mtmp3:
$MBB0_7:
        .cv_loc 0 1 13 0                        @ .\jump-table.cpp:13:0
        ldr     r0, [sp, #4]
        subs    r0, r0, #1
        cmp     r0, #4
        bhi     ($MBB0_15)
@ %bb.8:
$Mtmp4:
        .p2align        2
        add     r0, pc
        ldrb    r0, [r0, #4]
        lsls    r0, r0, #1
.LCPI0_1:
        add     pc, r0
@ %bb.9:
        .p2align        2
.LJTI0_1:
        .byte   (($MBB0_10)-(.LCPI0_1+4))/2
        .byte   (($MBB0_11)-(.LCPI0_1+4))/2
        .byte   (($MBB0_12)-(.LCPI0_1+4))/2
        .byte   (($MBB0_13)-(.LCPI0_1+4))/2
        .byte   (($MBB0_14)-(.LCPI0_1+4))/2
        .p2align        1
$MBB0_10:
$Mtmp5:
        .cv_loc 0 1 14 0                        @ .\jump-table.cpp:14:0
        bl      f2
        b       ($MBB0_15)
$MBB0_11:
        .cv_loc 0 1 15 0                        @ .\jump-table.cpp:15:0
        bl      f3
        b       ($MBB0_15)
$MBB0_12:
        .cv_loc 0 1 16 0                        @ .\jump-table.cpp:16:0
        bl      f4
        b       ($MBB0_15)
$MBB0_13:
        .cv_loc 0 1 17 0                        @ .\jump-table.cpp:17:0
        bl      f5
        b       ($MBB0_15)
$MBB0_14:
        .cv_loc 0 1 18 0                        @ .\jump-table.cpp:18:0
        bl      f1
        b       ($MBB0_15)
$Mtmp6:
$MBB0_15:
        .cv_loc 0 1 20 0                        @ .\jump-table.cpp:20:0
        add     sp, #8
        pop     {r7}
        pop     {r0}
        mov     lr, r0
        bx      lr
$Mtmp7:
$Mfunc_end0:
                                        @ -- End function
        .section        .debug$S,"dr"
        .p2align        2, 0x0
        .long   4                               @ Debug section magic
        .long   241
        .long   ($Mtmp9)-($Mtmp8)               @ Subsection size
$Mtmp8:
        .short  ($Mtmp11)-($Mtmp10)             @ Record length
$Mtmp10:
        .short  4353                            @ Record kind: S_OBJNAME
        .long   0                               @ Signature
        .byte   0                               @ Object name
        .p2align        2, 0x0
$Mtmp11:
        .short  ($Mtmp13)-($Mtmp12)             @ Record length
$Mtmp12:
        .short  4412                            @ Record kind: S_COMPILE3
        .long   16385                           @ Flags and language
        .short  244                             @ CPUType
        .short  15                              @ Frontend version
        .short  0
        .short  1
        .short  0
        .short  17000                           @ Backend version
        .short  0
        .short  0
        .short  0
        .asciz  "clang version 15.0.1"          @ Null-terminated compiler version string
        .p2align        2, 0x0
$Mtmp13:
$Mtmp9:
        .p2align        2, 0x0
        .long   241                             @ Symbol subsection for func
        .long   ($Mtmp15)-($Mtmp14)             @ Subsection size
$Mtmp14:
        .short  ($Mtmp17)-($Mtmp16)             @ Record length
$Mtmp16:
        .short  4423                            @ Record kind: S_GPROC32_ID
        .long   0                               @ PtrParent
        .long   0                               @ PtrEnd
        .long   0                               @ PtrNext
        .long   ($Mfunc_end0)-func              @ Code size
        .long   0                               @ Offset after prologue
        .long   0                               @ Offset before epilogue
        .long   4098                            @ Function type index
        .secrel32       func                    @ Function section relative address
        .secidx func                            @ Function section index
        .byte   0                               @ Flags
        .asciz  "func"                          @ Function name
        .p2align        2, 0x0
$Mtmp17:
        .short  ($Mtmp19)-($Mtmp18)             @ Record length
$Mtmp18:
        .short  4114                            @ Record kind: S_FRAMEPROC
        .long   16                              @ FrameSize
        .long   0                               @ Padding
        .long   0                               @ Offset of padding
        .long   0                               @ Bytes of callee saved registers
        .long   0                               @ Exception handler offset
        .short  0                               @ Exception handler section
        .long   90112                           @ Flags (defines frame register)
        .p2align        2, 0x0
$Mtmp19:
        .short  ($Mtmp21)-($Mtmp20)             @ Record length
$Mtmp20:
        .short  4414                            @ Record kind: S_LOCAL
        .long   116                             @ TypeIndex
        .short  1                               @ Flags
        .asciz  "i"
        .p2align        2, 0x0
$Mtmp21:
        .cv_def_range    $Mtmp0 $Mtmp7, reg_rel, 23, 0, 4
        .short  ($Mtmp23)-($Mtmp22)             @ Record length
$Mtmp22:
        .short  4441                            @ Record kind: S_ARMSWITCHTABLE
        .secrel32       .LCPI0_0                @ Base offset
        .secidx .LCPI0_0                        @ Base section index
        .short  7                               @ Switch type
        .secrel32       .LCPI0_0                @ Branch offset
        .secrel32       .LJTI0_0                @ Table offset
        .secidx .LCPI0_0                        @ Branch section index
        .secidx .LJTI0_0                        @ Table section index
        .long   4                               @ Entries count
        .p2align        2, 0x0
$Mtmp23:
        .short  ($Mtmp25)-($Mtmp24)             @ Record length
$Mtmp24:
        .short  4441                            @ Record kind: S_ARMSWITCHTABLE
        .secrel32       .LCPI0_1                @ Base offset
        .secidx .LCPI0_1                        @ Base section index
        .short  7                               @ Switch type
        .secrel32       .LCPI0_1                @ Branch offset
        .secrel32       .LJTI0_1                @ Table offset
        .secidx .LCPI0_1                        @ Branch section index
        .secidx .LJTI0_1                        @ Table section index
        .long   5                               @ Entries count
        .p2align        2, 0x0
$Mtmp25:
        .short  2                               @ Record length
        .short  4431                            @ Record kind: S_PROC_ID_END
$Mtmp15:
        .p2align        2, 0x0
        .cv_linetable   0, func, $Mfunc_end0
        .cv_filechecksums                       @ File index to string table offset subsection
        .cv_stringtable                         @ String table
        .long   241
        .long   ($Mtmp27)-($Mtmp26)             @ Subsection size
$Mtmp26:
        .short  ($Mtmp29)-($Mtmp28)             @ Record length
$Mtmp28:
        .short  4428                            @ Record kind: S_BUILDINFO
        .long   4102                            @ LF_BUILDINFO index
        .p2align        2, 0x0
$Mtmp29:
$Mtmp27:
        .p2align        2, 0x0
        .section        .debug$T,"dr"
        .p2align        2, 0x0
        .long   4                               @ Debug section magic
        @ ArgList (0x1000)
        .short  0xa                             @ Record length
        .short  0x1201                          @ Record kind: LF_ARGLIST
        .long   0x1                             @ NumArgs
        .long   0x74                            @ Argument: int
        @ Procedure (0x1001)
        .short  0xe                             @ Record length
        .short  0x1008                          @ Record kind: LF_PROCEDURE
        .long   0x3                             @ ReturnType: void
        .byte   0x0                             @ CallingConvention: NearC
        .byte   0x0                             @ FunctionOptions
        .short  0x1                             @ NumParameters
        .long   0x1000                          @ ArgListType: (int)
        @ FuncId (0x1002)
        .short  0x12                            @ Record length
        .short  0x1601                          @ Record kind: LF_FUNC_ID
        .long   0x0                             @ ParentScope
        .long   0x1001                          @ FunctionType: void (int)
        .asciz  "func"                          @ Name
        .byte   243
        .byte   242
        .byte   241
        @ StringId (0x1003)
        .short  0xe                             @ Record length
        .short  0x1605                          @ Record kind: LF_STRING_ID
        .long   0x0                             @ Id
        .asciz  "C:\\llvm"                      @ StringData
        @ StringId (0x1004)
        .short  0x16                            @ Record length
        .short  0x1605                          @ Record kind: LF_STRING_ID
        .long   0x0                             @ Id
        .asciz  "jump-table.cpp"                @ StringData
        .byte   241
        @ StringId (0x1005)
        .short  0xa                             @ Record length
        .short  0x1605                          @ Record kind: LF_STRING_ID
        .long   0x0                             @ Id
        .byte   0                               @ StringData
        .byte   243
        .byte   242
        .byte   241
        @ BuildInfo (0x1006)
        .short  0x1a                            @ Record length
        .short  0x1603                          @ Record kind: LF_BUILDINFO
        .short  0x5                             @ NumArgs
        .long   0x1003                          @ Argument: C:\llvm
        .long   0x0                             @ Argument
        .long   0x1004                          @ Argument: jump-table.cpp
        .long   0x1005                          @ Argument
        .long   0x0                             @ Argument
        .byte   242
        .byte   241
```


CHANGES SINCE LAST ACTION
  https://reviews.llvm.org/D149367/new/

https://reviews.llvm.org/D149367



More information about the llvm-commits mailing list