[llvm] r352465 - [COFF, ARM64] Don't put jump table into a separate COFF section for EK_LabelDifference32
Hans Wennborg via llvm-commits
llvm-commits at lists.llvm.org
Mon Mar 4 04:43:47 PST 2019
Merged to release_80 in r355311.
On Tue, Jan 29, 2019 at 10:36 AM Martin Storsjo via llvm-commits
<llvm-commits at lists.llvm.org> wrote:
>
> Author: mstorsjo
> Date: Tue Jan 29 01:36:48 2019
> New Revision: 352465
>
> URL: http://llvm.org/viewvc/llvm-project?rev=352465&view=rev
> Log:
> [COFF, ARM64] Don't put jump table into a separate COFF section for EK_LabelDifference32
>
> Windows ARM64 has PIC relocation model and uses jump table kind
> EK_LabelDifference32. This produces jump table entry as
> ".word LBB123 - LJTI1_2" which represents the distance between the block
> and jump table.
>
> A new relocation type (IMAGE_REL_ARM64_REL32) is needed to do the fixup
> correctly if they are in different COFF section.
>
> This change saves the jump table to the same COFF section as the
> associated code. An ideal fix could be utilizing IMAGE_REL_ARM64_REL32
> relocation type.
>
> Patch by Tom Tan!
>
> Differential Revision: https://reviews.llvm.org/D57277
>
> Added:
> llvm/trunk/test/CodeGen/AArch64/win64-jumptable.ll
> Modified:
> llvm/trunk/lib/Target/AArch64/AArch64AsmPrinter.cpp
> llvm/trunk/lib/Target/AArch64/AArch64TargetMachine.cpp
>
> Modified: llvm/trunk/lib/Target/AArch64/AArch64AsmPrinter.cpp
> URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Target/AArch64/AArch64AsmPrinter.cpp?rev=352465&r1=352464&r2=352465&view=diff
> ==============================================================================
> --- llvm/trunk/lib/Target/AArch64/AArch64AsmPrinter.cpp (original)
> +++ llvm/trunk/lib/Target/AArch64/AArch64AsmPrinter.cpp Tue Jan 29 01:36:48 2019
> @@ -578,9 +578,18 @@ void AArch64AsmPrinter::EmitJumpTableInf
> const std::vector<MachineJumpTableEntry> &JT = MJTI->getJumpTables();
> if (JT.empty()) return;
>
> + const Function &F = MF->getFunction();
> const TargetLoweringObjectFile &TLOF = getObjFileLowering();
> - MCSection *ReadOnlySec = TLOF.getSectionForJumpTable(MF->getFunction(), TM);
> - OutStreamer->SwitchSection(ReadOnlySec);
> + bool JTInDiffSection =
> + !STI->isTargetCOFF() ||
> + !TLOF.shouldPutJumpTableInFunctionSection(
> + MJTI->getEntryKind() == MachineJumpTableInfo::EK_LabelDifference32,
> + F);
> + if (JTInDiffSection) {
> + // Drop it in the readonly section.
> + MCSection *ReadOnlySec = TLOF.getSectionForJumpTable(F, TM);
> + OutStreamer->SwitchSection(ReadOnlySec);
> + }
>
> auto AFI = MF->getInfo<AArch64FunctionInfo>();
> for (unsigned JTI = 0, e = JT.size(); JTI != e; ++JTI) {
>
> Modified: llvm/trunk/lib/Target/AArch64/AArch64TargetMachine.cpp
> URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Target/AArch64/AArch64TargetMachine.cpp?rev=352465&r1=352464&r2=352465&view=diff
> ==============================================================================
> --- llvm/trunk/lib/Target/AArch64/AArch64TargetMachine.cpp (original)
> +++ llvm/trunk/lib/Target/AArch64/AArch64TargetMachine.cpp Tue Jan 29 01:36:48 2019
> @@ -208,8 +208,8 @@ static std::string computeDataLayout(con
>
> static Reloc::Model getEffectiveRelocModel(const Triple &TT,
> Optional<Reloc::Model> RM) {
> - // AArch64 Darwin is always PIC.
> - if (TT.isOSDarwin())
> + // AArch64 Darwin and Windows are always PIC.
> + if (TT.isOSDarwin() || TT.isOSWindows())
> return Reloc::PIC_;
> // On ELF platforms the default static relocation model has a smart enough
> // linker to cope with referencing external symbols defined in a shared
>
> Added: llvm/trunk/test/CodeGen/AArch64/win64-jumptable.ll
> URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/test/CodeGen/AArch64/win64-jumptable.ll?rev=352465&view=auto
> ==============================================================================
> --- llvm/trunk/test/CodeGen/AArch64/win64-jumptable.ll (added)
> +++ llvm/trunk/test/CodeGen/AArch64/win64-jumptable.ll Tue Jan 29 01:36:48 2019
> @@ -0,0 +1,48 @@
> +; RUN: llc -o - %s -mtriple=aarch64-windows -aarch64-enable-compress-jump-tables=0 | FileCheck %s
> +
> +define void @f(i32 %x) {
> +entry:
> + switch i32 %x, label %sw.epilog [
> + i32 0, label %sw.bb
> + i32 1, label %sw.bb1
> + i32 2, label %sw.bb2
> + i32 3, label %sw.bb3
> + ]
> +
> +sw.bb: ; preds = %entry
> + tail call void @g(i32 0) #2
> + br label %sw.epilog
> +
> +sw.bb1: ; preds = %entry
> + tail call void @g(i32 1) #2
> + br label %sw.epilog
> +
> +sw.bb2: ; preds = %entry
> + tail call void @g(i32 2) #2
> + br label %sw.epilog
> +
> +sw.bb3: ; preds = %entry
> + tail call void @g(i32 3) #2
> + br label %sw.epilog
> +
> +sw.epilog: ; preds = %entry, %sw.bb3, %sw.bb2, %sw.bb1, %sw.bb
> + tail call void @g(i32 10) #2
> + ret void
> +}
> +
> +declare void @g(i32)
> +
> +; CHECK: .text
> +; CHECK: f:
> +; CHECK: .seh_proc f
> +; CHECK: b g
> +; CHECK-NEXT: .p2align 2
> +; CHECK-NEXT: .LJTI0_0:
> +; CHECK: .word .LBB0_2-.LJTI0_0
> +; CHECK: .word .LBB0_3-.LJTI0_0
> +; CHECK: .word .LBB0_4-.LJTI0_0
> +; CHECK: .word .LBB0_5-.LJTI0_0
> +; CHECK: .section .xdata,"dr"
> +; CHECK: .seh_handlerdata
> +; CHECK: .text
> +; CHECK: .seh_endproc
>
>
> _______________________________________________
> llvm-commits mailing list
> llvm-commits at lists.llvm.org
> https://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-commits
More information about the llvm-commits
mailing list