[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