diff --git a/llvm/lib/Target/AArch64/AArch64AsmPrinter.cpp b/llvm/lib/Target/AArch64/AArch64AsmPrinter.cpp --- a/llvm/lib/Target/AArch64/AArch64AsmPrinter.cpp +++ b/llvm/lib/Target/AArch64/AArch64AsmPrinter.cpp @@ -891,6 +891,11 @@ // formats can't relocate these properly in all cases. bool JT32InFnSection = STI->isTargetCOFF() || STI->isTargetMachO(); + // Using a linker-private symbol for the table allows the linker to dead-strip + // unused ones, and removes the 2^24 byte relocation limit if the function is + // huge. + bool UseLinkerPrivateJT = STI->isTargetMachO(); + auto AFI = MF->getInfo(); for (unsigned JTI = 0, e = JT.size(); JTI != e; ++JTI) { const std::vector &JTBBs = JT[JTI].MBBs; @@ -905,7 +910,7 @@ OutStreamer->SwitchSection(TLOF.getSectionForJumpTable(F, TM)); emitAlignment(Align(Size)); - OutStreamer->emitLabel(GetJTISymbol(JTI)); + OutStreamer->emitLabel(GetJTISymbol(JTI, UseLinkerPrivateJT)); for (auto *JTBB : JTBBs) emitJumpTableEntry(MJTI, JTBB, JTI); @@ -921,8 +926,10 @@ if (Size == 4) { // .word LBB - LJTI - const TargetLowering *TLI = MF->getSubtarget().getTargetLowering(); - const MCExpr *Base = TLI->getPICJumpTableRelocBaseExpr(MF, JTI, OutContext); + bool UseLinkerPrivateJT = + getSubtargetInfo().getTargetTriple().isOSBinFormatMachO(); + const MCExpr *Base = MCSymbolRefExpr::create( + MF->getJTISymbol(JTI, OutContext, UseLinkerPrivateJT), OutContext); Value = MCBinaryExpr::createSub(Value, Base, OutContext); } else { // .byte (LBB - LBB) >> 2 (or .hword) diff --git a/llvm/lib/Target/AArch64/AArch64MCInstLower.cpp b/llvm/lib/Target/AArch64/AArch64MCInstLower.cpp --- a/llvm/lib/Target/AArch64/AArch64MCInstLower.cpp +++ b/llvm/lib/Target/AArch64/AArch64MCInstLower.cpp @@ -345,9 +345,13 @@ case MachineOperand::MO_MCSymbol: MCOp = LowerSymbolOperand(MO, MO.getMCSymbol()); break; - case MachineOperand::MO_JumpTableIndex: - MCOp = LowerSymbolOperand(MO, Printer.GetJTISymbol(MO.getIndex())); + case MachineOperand::MO_JumpTableIndex: { + bool UseLinkerPrivateJT = + Printer.getSubtargetInfo().getTargetTriple().isOSBinFormatMachO(); + MCOp = LowerSymbolOperand( + MO, Printer.GetJTISymbol(MO.getIndex(), UseLinkerPrivateJT)); break; + } case MachineOperand::MO_ConstantPoolIndex: MCOp = LowerSymbolOperand(MO, Printer.GetCPISymbol(MO.getIndex())); break; diff --git a/llvm/test/CodeGen/AArch64/GlobalISel/arm64e-jump-table-hardening.ll b/llvm/test/CodeGen/AArch64/GlobalISel/arm64e-jump-table-hardening.ll --- a/llvm/test/CodeGen/AArch64/GlobalISel/arm64e-jump-table-hardening.ll +++ b/llvm/test/CodeGen/AArch64/GlobalISel/arm64e-jump-table-hardening.ll @@ -7,8 +7,8 @@ ; CHECK: ubfx x16, x0, #0, #32 ; CHECK: cmp x16, #5 ; CHECK: csel x16, x16, xzr, ls -; CHECK: adrp x17, LJTI0_0@PAGE -; CHECK: add x17, x17, LJTI0_0@PAGEOFF +; CHECK: adrp x17, lJTI0_0@PAGE +; CHECK: add x17, x17, lJTI0_0@PAGEOFF ; CHECK: ldrsw x16, [x17, x16, lsl #2] ; CHECK: add x16, x17, x16 ; CHECK: br x16 @@ -43,10 +43,10 @@ } -; CHECK: LJTI0_0: -; CHECK-NEXT: .long LBB{{[0-9_]+}}-LJTI0_0 -; CHECK-NEXT: .long LBB{{[0-9_]+}}-LJTI0_0 -; CHECK-NEXT: .long LBB{{[0-9_]+}}-LJTI0_0 -; CHECK-NEXT: .long LBB{{[0-9_]+}}-LJTI0_0 -; CHECK-NEXT: .long LBB{{[0-9_]+}}-LJTI0_0 -; CHECK-NEXT: .long LBB{{[0-9_]+}}-LJTI0_0 +; CHECK: lJTI0_0: +; CHECK-NEXT: .long LBB{{[0-9_]+}}-lJTI0_0 +; CHECK-NEXT: .long LBB{{[0-9_]+}}-lJTI0_0 +; CHECK-NEXT: .long LBB{{[0-9_]+}}-lJTI0_0 +; CHECK-NEXT: .long LBB{{[0-9_]+}}-lJTI0_0 +; CHECK-NEXT: .long LBB{{[0-9_]+}}-lJTI0_0 +; CHECK-NEXT: .long LBB{{[0-9_]+}}-lJTI0_0 diff --git a/llvm/test/CodeGen/AArch64/arm64-jumptable.ll b/llvm/test/CodeGen/AArch64/arm64-jumptable.ll --- a/llvm/test/CodeGen/AArch64/arm64-jumptable.ll +++ b/llvm/test/CodeGen/AArch64/arm64-jumptable.ll @@ -26,8 +26,8 @@ } ; CHECK-LABEL: sum: -; CHECK: adrp {{x[0-9]+}}, LJTI0_0@PAGE -; CHECK: add {{x[0-9]+}}, {{x[0-9]+}}, LJTI0_0@PAGEOFF +; CHECK: adrp {{x[0-9]+}}, lJTI0_0@PAGE +; CHECK: add {{x[0-9]+}}, {{x[0-9]+}}, lJTI0_0@PAGEOFF ; CHECK-LINUX-LABEL: sum: ; CHECK-LINUX: adrp {{x[0-9]+}}, .LJTI0_0 diff --git a/llvm/test/CodeGen/AArch64/arm64e-jump-table-hardening.ll b/llvm/test/CodeGen/AArch64/arm64e-jump-table-hardening.ll --- a/llvm/test/CodeGen/AArch64/arm64e-jump-table-hardening.ll +++ b/llvm/test/CodeGen/AArch64/arm64e-jump-table-hardening.ll @@ -5,8 +5,8 @@ ; CHECK: mov w[[INDEX:[0-9]+]], w0 ; CHECK: cmp x[[INDEX]], #5 ; CHECK: csel [[INDEX2:x[0-9]+]], x[[INDEX]], xzr, ls -; CHECK: adrp [[JTPAGE:x[0-9]+]], LJTI0_0@PAGE -; CHECK: add x[[JT:[0-9]+]], [[JTPAGE]], LJTI0_0@PAGEOFF +; CHECK: adrp [[JTPAGE:x[0-9]+]], lJTI0_0@PAGE +; CHECK: add x[[JT:[0-9]+]], [[JTPAGE]], lJTI0_0@PAGEOFF ; CHECK: ldrsw [[OFFSET:x[0-9]+]], [x[[JT]], [[INDEX2]], lsl #2] ; CHECK: add [[DEST:x[0-9]+]], x[[JT]], [[OFFSET]] ; CHECK: br [[DEST]] @@ -41,10 +41,10 @@ } -; CHECK: LJTI0_0: -; CHECK-NEXT: .long LBB{{[0-9_]+}}-LJTI0_0 -; CHECK-NEXT: .long LBB{{[0-9_]+}}-LJTI0_0 -; CHECK-NEXT: .long LBB{{[0-9_]+}}-LJTI0_0 -; CHECK-NEXT: .long LBB{{[0-9_]+}}-LJTI0_0 -; CHECK-NEXT: .long LBB{{[0-9_]+}}-LJTI0_0 -; CHECK-NEXT: .long LBB{{[0-9_]+}}-LJTI0_0 +; CHECK: lJTI0_0: +; CHECK-NEXT: .long LBB{{[0-9_]+}}-lJTI0_0 +; CHECK-NEXT: .long LBB{{[0-9_]+}}-lJTI0_0 +; CHECK-NEXT: .long LBB{{[0-9_]+}}-lJTI0_0 +; CHECK-NEXT: .long LBB{{[0-9_]+}}-lJTI0_0 +; CHECK-NEXT: .long LBB{{[0-9_]+}}-lJTI0_0 +; CHECK-NEXT: .long LBB{{[0-9_]+}}-lJTI0_0 diff --git a/llvm/test/CodeGen/AArch64/jump-table-32.ll b/llvm/test/CodeGen/AArch64/jump-table-32.ll --- a/llvm/test/CodeGen/AArch64/jump-table-32.ll +++ b/llvm/test/CodeGen/AArch64/jump-table-32.ll @@ -9,9 +9,9 @@ i32 2, label %lbl3 i32 4, label %lbl4 ] -; CHECK: adrp [[JTPAGE:x[0-9]+]], LJTI0_0@PAGE +; CHECK: adrp [[JTPAGE:x[0-9]+]], lJTI0_0@PAGE ; CHECK: mov w[[INDEX:[0-9]+]], w0 -; CHECK: add x[[JT:[0-9]+]], [[JTPAGE]], LJTI0_0@PAGEOFF +; CHECK: add x[[JT:[0-9]+]], [[JTPAGE]], lJTI0_0@PAGEOFF ; CHECK: adr [[BASE_BLOCK:x[0-9]+]], LBB0_2 ; CHECK: ldrb w[[OFFSET:[0-9]+]], [x[[JT]], x[[INDEX]]] ; CHECK: add [[DEST:x[0-9]+]], [[BASE_BLOCK]], x[[OFFSET]], lsl #2 @@ -34,7 +34,7 @@ } -; CHECK: LJTI0_0: +; CHECK: lJTI0_0: ; CHECK-NEXT: .byte ; CHECK-NEXT: .byte ; CHECK-NEXT: .byte diff --git a/llvm/test/CodeGen/AArch64/jump-table.ll b/llvm/test/CodeGen/AArch64/jump-table.ll --- a/llvm/test/CodeGen/AArch64/jump-table.ll +++ b/llvm/test/CodeGen/AArch64/jump-table.ll @@ -38,8 +38,8 @@ ; CHECK-PIC: add [[DEST:x[0-9]+]], [[PCBASE]], x[[OFFSET]], lsl #2 ; CHECK-PIC: br [[DEST]] -; CHECK-IOS: adrp [[JTPAGE:x[0-9]+]], LJTI0_0@PAGE -; CHECK-IOS: add x[[JT:[0-9]+]], [[JTPAGE]], LJTI0_0@PAGEOFF +; CHECK-IOS: adrp [[JTPAGE:x[0-9]+]], lJTI0_0@PAGE +; CHECK-IOS: add x[[JT:[0-9]+]], [[JTPAGE]], lJTI0_0@PAGEOFF ; CHECK-IOS: adr [[PCBASE:x[0-9]+]], [[JTBASE:LBB[0-9]+_[0-9]+]] ; CHECK-IOS: ldrb w[[OFFSET:[0-9]+]], [x[[JT]], {{x[0-9]+}}] ; CHECK-IOS: add [[DEST:x[0-9]+]], [[PCBASE]], x[[OFFSET]], lsl #2 @@ -134,7 +134,7 @@ ; CHECK-IOS: .section __TEXT,__const ; CHECK-IOS-NOT: .data_region -; CHECK-IOS: LJTI0_0: +; CHECK-IOS: lJTI0_0: ; CHECK-IOS-NEXT: .byte ([[JTBASE]]-[[JTBASE]])>>2 ; CHECK-IOS-NEXT: .byte (LBB{{.*}}-[[JTBASE]])>>2 ; CHECK-IOS-NEXT: .byte (LBB{{.*}}-[[JTBASE]])>>2 @@ -151,7 +151,7 @@ i32 4, label %lbl4 ] ; CHECK-IOS-LABEL: test_jumptable32: -; CHECK-IOS: adrp [[JTPAGE:x[0-9]+]], [[LJTI:LJTI[0-9]+_[0-9]+]]@PAGE +; CHECK-IOS: adrp [[JTPAGE:x[0-9]+]], [[LJTI:lJTI[0-9]+_[0-9]+]]@PAGE ; CHECK-IOS: add x[[JT:[0-9]+]], [[JTPAGE]], [[LJTI]]@PAGEOFF ; CHECK-IOS: ldrsw [[OFFSET:x[0-9]+]], [x[[JT]], {{x[0-9]+}}, lsl #2] ; CHECK-IOS: add [[DEST:x[0-9]+]], x[[JT]], [[OFFSET]]