[llvm] [BPF] Support Jump Table (PR #149715)

via llvm-commits llvm-commits at lists.llvm.org
Mon Jul 21 10:03:33 PDT 2025


eddyz87 wrote:

Currently JT offsets are calculated in bytes, but I think it still would be simpler for libbpf/kernel if offsets would be calculated in instructions. Also, there would be no need to track offsets as 8 bytes, 4 bytes would suffice. The following part was responsible for this in old pr:

```c++
    ...
    SmallPtrSet<const MachineBasicBlock *, 16> EmittedSets;
     auto *Base: const MCSymbolRefExpr * = MCSymbolRefExpr::create(Symbol: getJXAnchorSymbol(JTI), &Ctx: OutContext);
     for (const MachineBasicBlock *MBB : JTBBs) {
       if (!EmittedSets.insert(Ptr: MBB).second)
         continue;

       // Offset from gotox to target basic block expressed in number
       // of instructions, e.g.:
       //
       //   .L0_0_set_4 = ((LBB0_4 - .LBPF.JX.0.0) >> 3) - 1
       const MCExpr *LHS = MCSymbolRefExpr::create(Symbol: MBB->getSymbol(), &Ctx: OutContext);
       OutStreamer->emitAssignment(
           Symbol: GetJTSetSymbol(UID: JTI, MBBID: MBB->getNumber()),
           Value: MCBinaryExpr::createSub(
               LHS: MCBinaryExpr::createAShr(
                   LHS: MCBinaryExpr::createSub(LHS, RHS: Base, &Ctx: OutContext),
                   RHS: MCConstantExpr::create(Value: 3, &Ctx: OutContext), &Ctx: OutContext),
               RHS: MCConstantExpr::create(Value: 1, &Ctx: OutContext), &Ctx: OutContext));
     }
     // BPF.JT.0.0:
     //    .long   .L0_0_set_4
     //    .long   .L0_0_set_2
     //    ...
     //    .size   BPF.JT.0.0, 128
     MCSymbol *JTStart = getJTPublicSymbol(JTI);
     OutStreamer->emitLabel(Symbol: JTStart);
     for (const MachineBasicBlock *MBB : JTBBs) {
       MCSymbol *SetSymbol = GetJTSetSymbol(UID: JTI, MBBID: MBB->getNumber());
       const MCExpr *V = MCSymbolRefExpr::create(Symbol: SetSymbol, &Ctx: OutContext);
       OutStreamer->emitValue(Value: V, Size: EntrySize);
     }
    ...
```

The expression for `_set_` labels would probably be simpler in this pr.

https://github.com/llvm/llvm-project/pull/149715


More information about the llvm-commits mailing list