Skip to content

Commit 7272a6c

Browse files
[BPF] Avoid relocation for jumptable entries (#166301)
Currently, the jump table entry contains labels only. For example, the following is one example: BPF.JT.0.0: .quad LBB0_1 .quad LBB0_2 .size BPF.JT.0.0, 16 Since the jump table entry contains a label, the relocation is necessary so linker can resolve the label value. The relocation looks like below: Relocation section '.rel.jumptables' at offset 0x160 contains 2 entries: Offset Info Type Symbol's Value Symbol's Name 0000000000000000 0000000200000002 R_BPF_64_ABS64 0000000000000000 .text 0000000000000008 0000000200000002 R_BPF_64_ABS64 0000000000000000 .text You can see that the symbol value is 0 which makes .rel.jumptables not very useful. Instead of having the label itself in the jump table entry, use the difference of label and the section begin symbol. This can avoid the relocation and the eventual jumptable entries in object file remains the same as before. Hex dump of section '.jumptables': 0x00000000 68000000 00000000 78000000 00000000 h.......x.......
1 parent e03fac1 commit 7272a6c

File tree

4 files changed

+42
-36
lines changed

4 files changed

+42
-36
lines changed

llvm/lib/Target/BPF/BPFAsmPrinter.cpp

Lines changed: 8 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -219,6 +219,10 @@ void BPFAsmPrinter::emitJumpTableInfo() {
219219

220220
const TargetLoweringObjectFile &TLOF = getObjFileLowering();
221221
const Function &F = MF->getFunction();
222+
223+
MCSection *Sec = OutStreamer->getCurrentSectionOnly();
224+
MCSymbol *SecStart = Sec->getBeginSymbol();
225+
222226
MCSection *JTS = TLOF.getSectionForJumpTable(F, TM);
223227
assert(MJTI->getEntryKind() == MachineJumpTableInfo::EK_BlockAddress);
224228
unsigned EntrySize = MJTI->getEntrySize(getDataLayout());
@@ -231,8 +235,10 @@ void BPFAsmPrinter::emitJumpTableInfo() {
231235
MCSymbol *JTStart = getJTPublicSymbol(JTI);
232236
OutStreamer->emitLabel(JTStart);
233237
for (const MachineBasicBlock *MBB : JTBBs) {
234-
const MCExpr *LHS = MCSymbolRefExpr::create(MBB->getSymbol(), OutContext);
235-
OutStreamer->emitValue(LHS, EntrySize);
238+
const MCExpr *Diff = MCBinaryExpr::createSub(
239+
MCSymbolRefExpr::create(MBB->getSymbol(), OutContext),
240+
MCSymbolRefExpr::create(SecStart, OutContext), OutContext);
241+
OutStreamer->emitValue(Diff, EntrySize);
236242
}
237243
const MCExpr *JTSize =
238244
MCConstantExpr::create(JTBBs.size() * EntrySize, OutContext);

llvm/test/CodeGen/BPF/jump_table_blockaddr.ll

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -84,8 +84,8 @@ llc -march=bpf -mcpu=v4 < test.ll \
8484
; CHECK: .cfi_endproc
8585
; CHECK: .section .jumptables,"",@progbits
8686
; CHECK: BPF.JT.0.0:
87-
; CHECK: .quad LBB0_3
87+
; CHECK: .quad LBB0_3-.text
8888
; CHECK: .size BPF.JT.0.0, 8
8989
; CHECK: BPF.JT.0.1:
90-
; CHECK: .quad LBB0_4
90+
; CHECK: .quad LBB0_4-.text
9191
; CHECK: .size BPF.JT.0.1, 8

llvm/test/CodeGen/BPF/jump_table_global_var.ll

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -78,6 +78,6 @@ llc -march=bpf -mcpu=v4 < test.ll \
7878
; CHECK: .cfi_endproc
7979
; CHECK: .section .jumptables,"",@progbits
8080
; CHECK: BPF.JT.0.0:
81-
; CHECK: .quad LBB0_1
82-
; CHECK: .quad LBB0_2
81+
; CHECK: .quad LBB0_1-.text
82+
; CHECK: .quad LBB0_2-.text
8383
; CHECK: .size BPF.JT.0.0, 16

llvm/test/CodeGen/BPF/jump_table_switch_stmt.ll

Lines changed: 30 additions & 30 deletions
Original file line numberDiff line numberDiff line change
@@ -93,34 +93,34 @@ llc -march=bpf -mcpu=v4 -bpf-min-jump-table-entries=3 < test.ll \
9393
; CHECK: .cfi_endproc
9494
; CHECK: .section .jumptables,"",@progbits
9595
; CHECK: BPF.JT.0.0:
96-
; CHECK: .quad LBB0_4
97-
; CHECK: .quad LBB0_5
98-
; CHECK: .quad LBB0_5
99-
; CHECK: .quad LBB0_5
100-
; CHECK: .quad LBB0_5
101-
; CHECK: .quad LBB0_5
102-
; CHECK: .quad LBB0_5
103-
; CHECK: .quad LBB0_5
104-
; CHECK: .quad LBB0_5
105-
; CHECK: .quad LBB0_5
106-
; CHECK: .quad LBB0_5
107-
; CHECK: .quad LBB0_5
108-
; CHECK: .quad LBB0_5
109-
; CHECK: .quad LBB0_5
110-
; CHECK: .quad LBB0_5
111-
; CHECK: .quad LBB0_5
112-
; CHECK: .quad LBB0_5
113-
; CHECK: .quad LBB0_5
114-
; CHECK: .quad LBB0_5
115-
; CHECK: .quad LBB0_2
116-
; CHECK: .quad LBB0_5
117-
; CHECK: .quad LBB0_5
118-
; CHECK: .quad LBB0_5
119-
; CHECK: .quad LBB0_5
120-
; CHECK: .quad LBB0_5
121-
; CHECK: .quad LBB0_5
122-
; CHECK: .quad LBB0_5
123-
; CHECK: .quad LBB0_5
124-
; CHECK: .quad LBB0_5
125-
; CHECK: .quad LBB0_3
96+
; CHECK: .quad LBB0_4-.text
97+
; CHECK: .quad LBB0_5-.text
98+
; CHECK: .quad LBB0_5-.text
99+
; CHECK: .quad LBB0_5-.text
100+
; CHECK: .quad LBB0_5-.text
101+
; CHECK: .quad LBB0_5-.text
102+
; CHECK: .quad LBB0_5-.text
103+
; CHECK: .quad LBB0_5-.text
104+
; CHECK: .quad LBB0_5-.text
105+
; CHECK: .quad LBB0_5-.text
106+
; CHECK: .quad LBB0_5-.text
107+
; CHECK: .quad LBB0_5-.text
108+
; CHECK: .quad LBB0_5-.text
109+
; CHECK: .quad LBB0_5-.text
110+
; CHECK: .quad LBB0_5-.text
111+
; CHECK: .quad LBB0_5-.text
112+
; CHECK: .quad LBB0_5-.text
113+
; CHECK: .quad LBB0_5-.text
114+
; CHECK: .quad LBB0_5-.text
115+
; CHECK: .quad LBB0_2-.text
116+
; CHECK: .quad LBB0_5-.text
117+
; CHECK: .quad LBB0_5-.text
118+
; CHECK: .quad LBB0_5-.text
119+
; CHECK: .quad LBB0_5-.text
120+
; CHECK: .quad LBB0_5-.text
121+
; CHECK: .quad LBB0_5-.text
122+
; CHECK: .quad LBB0_5-.text
123+
; CHECK: .quad LBB0_5-.text
124+
; CHECK: .quad LBB0_5-.text
125+
; CHECK: .quad LBB0_3-.text
126126
; CHECK: .size BPF.JT.0.0, 240

0 commit comments

Comments
 (0)