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

Eli Friedman via Phabricator via llvm-commits llvm-commits at lists.llvm.org
Tue May 9 14:49:58 PDT 2023


efriedma added inline comments.


================
Comment at: llvm/lib/CodeGen/AsmPrinter/CodeViewDebug.cpp:3483
+            // and the jump table that it uses in the debug info.
+            if (MO.getType() == MachineOperand::MO_JumpTableIndex) {
+              // For label-difference jump tables, find the base expression.
----------------
efriedma wrote:
> I'm concerned this could fail to find the jump table, or find the wrong jump table.  It is possible to hoist some jump-table-related operations into an earlier block.  For example:
> 
> ```
>  extern "C" void f1();
>  extern "C" void f2();
>  extern "C" void f3();
>  extern "C" void f4();
>  extern "C" void f5();
>  extern "C" void func(int i, int j){
>    for (int k = 0; k < j; ++k) {
>      switch (i) {
>          case 0: f1(); break;
>          case 1: f2(); break;
>          case 2: f3(); break;
>          case 3: f4(); break;
>      }
>    }
>  }
> ```
> 
> On AArch64, we produce:
> 
> ```
> // %bb.1:
>         mov     w19, w1
>         mov     w20, w0
>         mov     w21, w0
>         adrp    x22, .LJTI0_0
>         add     x22, x22, :lo12:.LJTI0_0
>         b       .LBB0_4
> .LBB0_2:                                // %sw.bb3
>                                         //   in Loop: Header=BB0_4 Depth=1
>         bl      f4
> .LBB0_3:                                // %for.inc
>                                         //   in Loop: Header=BB0_4 Depth=1
>         subs    w19, w19, #1
>         b.eq    .LBB0_9
> .LBB0_4:                                // %for.body
>                                         // =>This Inner Loop Header: Depth=1
>         cmp     w20, #3
>         b.hi    .LBB0_3
> // %bb.5:                               // %for.body
>                                         //   in Loop: Header=BB0_4 Depth=1
>         adr     x8, .LBB0_2
>         ldrb    w9, [x22, x21]
>         add     x8, x8, x9, lsl #2
>         br      x8
> ```
> 
> Off the top of my head, I'm not sure how to write a testcase where it actually finds the wrong table, but I suspect it's possible.
> 
> We might need to encode the associated jump table into the MachineInstrs some other way.  I'm not sure what that looks like, exactly; maybe a pseudo-instruction just before the jump?
Err, I guess on aarch64, you can pull the table out of the JumpTableDest32 instruction, which we currently don't hoist.  But on x86, we don't do jump table compression, so there's no such operand.


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

https://reviews.llvm.org/D149367



More information about the llvm-commits mailing list