summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--llvm/include/llvm/CodeGen/TargetLoweringObjectFileImpl.h3
-rw-r--r--llvm/lib/CodeGen/TargetLoweringObjectFileImpl.cpp7
-rw-r--r--llvm/lib/Target/X86/X86ISelLowering.cpp25
-rw-r--r--llvm/lib/Target/X86/X86ISelLowering.h1
-rw-r--r--llvm/test/CodeGen/X86/win64-jumptable.ll26
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.
OpenPOWER on IntegriCloud