diff options
| -rw-r--r-- | llvm/include/llvm/CodeGen/TargetLoweringObjectFileImpl.h | 3 | ||||
| -rw-r--r-- | llvm/lib/CodeGen/TargetLoweringObjectFileImpl.cpp | 7 | ||||
| -rw-r--r-- | llvm/lib/Target/X86/X86ISelLowering.cpp | 25 | ||||
| -rw-r--r-- | llvm/lib/Target/X86/X86ISelLowering.h | 1 | ||||
| -rw-r--r-- | llvm/test/CodeGen/X86/win64-jumptable.ll | 26 |
5 files changed, 9 insertions, 53 deletions
diff --git a/llvm/include/llvm/CodeGen/TargetLoweringObjectFileImpl.h b/llvm/include/llvm/CodeGen/TargetLoweringObjectFileImpl.h index 1839b6275c5..cc71fa3918a 100644 --- a/llvm/include/llvm/CodeGen/TargetLoweringObjectFileImpl.h +++ b/llvm/include/llvm/CodeGen/TargetLoweringObjectFileImpl.h @@ -156,9 +156,6 @@ public: MCSection *getSectionForJumpTable(const Function &F, const TargetMachine &TM) const override; - bool shouldPutJumpTableInFunctionSection(bool UsesLabelDifference, - const Function &F) const override; - /// Emit Obj-C garbage collection and linker options. Only linker option /// emission is implemented for COFF. void emitModuleFlags(MCStreamer &Streamer, diff --git a/llvm/lib/CodeGen/TargetLoweringObjectFileImpl.cpp b/llvm/lib/CodeGen/TargetLoweringObjectFileImpl.cpp index d19ca47ec1a..eb2a28f574a 100644 --- a/llvm/lib/CodeGen/TargetLoweringObjectFileImpl.cpp +++ b/llvm/lib/CodeGen/TargetLoweringObjectFileImpl.cpp @@ -1055,13 +1055,6 @@ MCSection *TargetLoweringObjectFileCOFF::getSectionForJumpTable( COFF::IMAGE_COMDAT_SELECT_ASSOCIATIVE, UniqueID); } -bool TargetLoweringObjectFileCOFF::shouldPutJumpTableInFunctionSection( - bool UsesLabelDifference, const Function &F) const { - // We can always create relative relocations, so use another section - // that can be marked non-executable. - return false; -} - void TargetLoweringObjectFileCOFF::emitModuleFlags( MCStreamer &Streamer, ArrayRef<Module::ModuleFlagEntry> ModuleFlags, const TargetMachine &TM) const { diff --git a/llvm/lib/Target/X86/X86ISelLowering.cpp b/llvm/lib/Target/X86/X86ISelLowering.cpp index d0c77030acd..b293dfa98f8 100644 --- a/llvm/lib/Target/X86/X86ISelLowering.cpp +++ b/llvm/lib/Target/X86/X86ISelLowering.cpp @@ -1926,20 +1926,10 @@ unsigned X86TargetLowering::getJumpTableEncoding() const { if (isPositionIndependent() && Subtarget.isPICStyleGOT()) return MachineJumpTableInfo::EK_Custom32; - // On Win64, we want to use both label differences and a separate section. - if (Subtarget.isTargetWin64()) - return MachineJumpTableInfo::EK_LabelDifference32; - // Otherwise, use the normal jump table encoding heuristics. return TargetLowering::getJumpTableEncoding(); } -bool X86TargetLowering::isJumpTableRelative() const { - if (Subtarget.isTargetWin64()) - return true; - return TargetLowering::isJumpTableRelative(); -} - bool X86TargetLowering::useSoftFloat() const { return Subtarget.useSoftFloat(); } @@ -1958,19 +1948,11 @@ X86TargetLowering::LowerCustomJumpTableEntry(const MachineJumpTableInfo *MJTI, /// Returns relocation base for the given PIC jumptable. SDValue X86TargetLowering::getPICJumpTableRelocBase(SDValue Table, SelectionDAG &DAG) const { - // COFF doesn't have relocations to take the difference between two arbitrary - // symbols. The assembler, however, can resolve a fixup between the function - // entry and a basic block label, so use the function entry as the base. - if (Subtarget.isTargetWin64()) - return DAG.getGlobalAddress(DAG.getMachineFunction().getFunction(), SDLoc(), - getPointerTy(DAG.getDataLayout())); - if (!Subtarget.is64Bit()) // This doesn't have SDLoc associated with it, but is not really the // same as a Register. return DAG.getNode(X86ISD::GlobalBaseReg, SDLoc(), getPointerTy(DAG.getDataLayout())); - return Table; } @@ -1979,13 +1961,6 @@ SDValue X86TargetLowering::getPICJumpTableRelocBase(SDValue Table, const MCExpr *X86TargetLowering:: getPICJumpTableRelocBaseExpr(const MachineFunction *MF, unsigned JTI, MCContext &Ctx) const { - // COFF doesn't have relocations to take the difference between two arbitrary - // symbols. The assembler, however, can resolve a fixup between the function - // entry and a basic block label, so use the function entry as the base. - if (Subtarget.isTargetWin64()) - return MCSymbolRefExpr::create( - getTargetMachine().getSymbol(MF->getFunction()), Ctx); - // X86-64 uses RIP relative addressing based on the jump table label. if (Subtarget.isPICStyleRIPRel()) return TargetLowering::getPICJumpTableRelocBaseExpr(MF, JTI, Ctx); diff --git a/llvm/lib/Target/X86/X86ISelLowering.h b/llvm/lib/Target/X86/X86ISelLowering.h index 643727d7aed..37f9353042b 100644 --- a/llvm/lib/Target/X86/X86ISelLowering.h +++ b/llvm/lib/Target/X86/X86ISelLowering.h @@ -684,7 +684,6 @@ namespace llvm { const X86Subtarget &STI); unsigned getJumpTableEncoding() const override; - bool isJumpTableRelative() const override; bool useSoftFloat() const override; MVT getScalarShiftAmountTy(const DataLayout &, EVT) const override { diff --git a/llvm/test/CodeGen/X86/win64-jumptable.ll b/llvm/test/CodeGen/X86/win64-jumptable.ll index 4fd24918864..6bb9d64c05c 100644 --- a/llvm/test/CodeGen/X86/win64-jumptable.ll +++ b/llvm/test/CodeGen/X86/win64-jumptable.ll @@ -1,5 +1,7 @@ -; RUN: llc < %s -relocation-model static | FileCheck %s --check-prefix=CHECK --check-prefix=STATIC -; RUN: llc < %s -relocation-model pic | FileCheck %s --check-prefix=CHECK --check-prefix=PIC +; RUN: llc < %s -relocation-model static | FileCheck %s + +; FIXME: Remove '-relocation-model static' when it is no longer necessary to +; trigger the separate .rdata section. target datalayout = "e-m:w-i64:64-f80:128-n8:16:32:64-S128" target triple = "x86_64-pc-windows-msvc19.0.24215" @@ -39,17 +41,7 @@ declare void @g(i32) ; CHECK: .text ; CHECK: f: ; CHECK: .seh_proc f - -; STATIC: movslq .LJTI0_0(,%{{.*}},4), %[[target:[^ ]*]] -; STATIC: leaq f(%[[target]]), %[[target]] -; STATIC: jmpq *%[[target]] - -; PIC: leaq .LJTI0_0(%rip), %[[jt:[^ ]*]] -; PIC: movslq (%[[jt]],%{{.*}},4), %[[offset:[^ ]*]] -; PIC: leaq f(%rip), %[[base:[^ ]*]] -; PIC: addq %[[offset]], %[[base]] -; PIC: jmpq *%[[base]] - +; CHECK: jmpq *.LJTI0_0 ; CHECK: .LBB0_{{.*}}: # %sw.bb ; CHECK: .LBB0_{{.*}}: # %sw.bb1 ; CHECK: .LBB0_{{.*}}: # %sw.bb2 @@ -57,10 +49,10 @@ declare void @g(i32) ; CHECK: callq g ; CHECK: jmp g # TAILCALL ; CHECK: .section .rdata,"dr" -; CHECK: .long .LBB0_{{.*}}-f -; CHECK: .long .LBB0_{{.*}}-f -; CHECK: .long .LBB0_{{.*}}-f -; CHECK: .long .LBB0_{{.*}}-f +; CHECK: .quad .LBB0_ +; CHECK: .quad .LBB0_ +; CHECK: .quad .LBB0_ +; CHECK: .quad .LBB0_ ; CHECK: .seh_handlerdata ; It's important that we switch back to .text here, not .rdata. |

