From 9c36de99caa5356c7ed8760ce43d8c70cd15b2e6 Mon Sep 17 00:00:00 2001 From: Simon Atanasyan Date: Wed, 18 Sep 2019 12:24:57 +0000 Subject: [PATCH] [mips] Pass "xgot" flag as a subtarget feature We need "xgot" flag in the MipsAsmParser to implement correct expansion of some pseudo instructions in case of using 32-bit GOT (XGOT). MipsAsmParser does not have reference to MipsSubtarget but has a reference to "feature bit set". llvm-svn: 372220 --- clang/lib/Driver/ToolChains/Arch/Mips.cpp | 7 +++++++ clang/lib/Driver/ToolChains/Clang.cpp | 7 ------- clang/test/Driver/mips-features.c | 4 ++-- clang/test/Driver/mips-integrated-as.s | 10 ++++++++++ llvm/lib/Target/Mips/Mips.td | 3 +++ llvm/lib/Target/Mips/MipsISelLowering.cpp | 15 ++++++--------- llvm/lib/Target/Mips/MipsSubtarget.h | 5 +++++ llvm/test/CodeGen/Mips/address-selection.ll | 6 ++++-- llvm/test/CodeGen/Mips/biggot.ll | 14 ++++++++------ .../CodeGen/Mips/mirparser/target-flags-pic-mxgot-tls.mir | 2 +- 10 files changed, 46 insertions(+), 27 deletions(-) diff --git a/clang/lib/Driver/ToolChains/Arch/Mips.cpp b/clang/lib/Driver/ToolChains/Arch/Mips.cpp index b512ff6..384d3ac 100644 --- a/clang/lib/Driver/ToolChains/Arch/Mips.cpp +++ b/clang/lib/Driver/ToolChains/Arch/Mips.cpp @@ -267,6 +267,13 @@ void mips::getMIPSTargetFeatures(const Driver &D, const llvm::Triple &Triple, D.Diag(diag::warn_drv_unsupported_longcalls) << (ABICallsArg ? 0 : 1); } + if (Arg *A = Args.getLastArg(options::OPT_mxgot, options::OPT_mno_xgot)) { + if (A->getOption().matches(options::OPT_mxgot)) + Features.push_back("+xgot"); + else + Features.push_back("-xgot"); + } + mips::FloatABI FloatABI = mips::getMipsFloatABI(D, Args); if (FloatABI == mips::FloatABI::Soft) { // FIXME: Note, this is a hack. We need to pass the selected float diff --git a/clang/lib/Driver/ToolChains/Clang.cpp b/clang/lib/Driver/ToolChains/Clang.cpp index ac3f07d..aa17efb 100644 --- a/clang/lib/Driver/ToolChains/Clang.cpp +++ b/clang/lib/Driver/ToolChains/Clang.cpp @@ -1675,13 +1675,6 @@ void Clang::AddMIPSTargetArgs(const ArgList &Args, CmdArgs.push_back("hard"); } - if (Arg *A = Args.getLastArg(options::OPT_mxgot, options::OPT_mno_xgot)) { - if (A->getOption().matches(options::OPT_mxgot)) { - CmdArgs.push_back("-mllvm"); - CmdArgs.push_back("-mxgot"); - } - } - if (Arg *A = Args.getLastArg(options::OPT_mldc1_sdc1, options::OPT_mno_ldc1_sdc1)) { if (A->getOption().matches(options::OPT_mno_ldc1_sdc1)) { diff --git a/clang/test/Driver/mips-features.c b/clang/test/Driver/mips-features.c index 19725bc..5ae5667 100644 --- a/clang/test/Driver/mips-features.c +++ b/clang/test/Driver/mips-features.c @@ -268,13 +268,13 @@ // RUN: %clang -target mips-linux-gnu -### -c %s \ // RUN: -mno-xgot -mxgot 2>&1 \ // RUN: | FileCheck --check-prefix=CHECK-XGOT %s -// CHECK-XGOT: "-mllvm" "-mxgot" +// CHECK-XGOT: "-target-feature" "+xgot" // // -mno-xgot // RUN: %clang -target mips-linux-gnu -### -c %s \ // RUN: -mxgot -mno-xgot 2>&1 \ // RUN: | FileCheck --check-prefix=CHECK-NOXGOT %s -// CHECK-NOXGOT-NOT: "-mllvm" "-mxgot" +// CHECK-NOXGOT: "-target-feature" "-xgot" // // -mldc1-sdc1 // RUN: %clang -target mips-linux-gnu -### -c %s \ diff --git a/clang/test/Driver/mips-integrated-as.s b/clang/test/Driver/mips-integrated-as.s index 0e12877..46ce5b6 100644 --- a/clang/test/Driver/mips-integrated-as.s +++ b/clang/test/Driver/mips-integrated-as.s @@ -293,3 +293,13 @@ // IMG-SINGLEFLOAT-EXPLICIT-FPXX: "-target-feature" "+single-float" // IMG-SINGLEFLOAT-EXPLICIT-FPXX: "-target-feature" "+fpxx" // IMG-SINGLEFLOAT-EXPLICIT-FPXX: "-target-feature" "+nooddspreg" + +// RUN: %clang -target mips-linux-gnu -### -fintegrated-as -mxgot -c %s 2>&1 | \ +// RUN: FileCheck -check-prefix=XGOT %s +// XGOT: -cc1as +// XGOT: "-target-feature" "+xgot" + +// RUN: %clang -target mips-linux-gnu -### -fintegrated-as -mno-xgot -c %s 2>&1 | \ +// RUN: FileCheck -check-prefix=NOXGOT %s +// NOXGOT: -cc1as +// NOXGOT: "-target-feature" "-xgot" diff --git a/llvm/lib/Target/Mips/Mips.td b/llvm/lib/Target/Mips/Mips.td index 52f400f..0e5a583 100644 --- a/llvm/lib/Target/Mips/Mips.td +++ b/llvm/lib/Target/Mips/Mips.td @@ -209,6 +209,9 @@ def FeatureMT : SubtargetFeature<"mt", "HasMT", "true", "Mips MT ASE">; def FeatureLongCalls : SubtargetFeature<"long-calls", "UseLongCalls", "true", "Disable use of the jal instruction">; +def FeatureXGOT + : SubtargetFeature<"xgot", "UseXGOT", "true", "Assume 32-bit GOT">; + def FeatureUseIndirectJumpsHazard : SubtargetFeature<"use-indirect-jump-hazard", "UseIndirectJumpsHazard", "true", "Use indirect jump" diff --git a/llvm/lib/Target/Mips/MipsISelLowering.cpp b/llvm/lib/Target/Mips/MipsISelLowering.cpp index 3037919..c22b00a 100644 --- a/llvm/lib/Target/Mips/MipsISelLowering.cpp +++ b/llvm/lib/Target/Mips/MipsISelLowering.cpp @@ -83,10 +83,6 @@ using namespace llvm; STATISTIC(NumTailCalls, "Number of tail calls"); static cl::opt -LargeGOT("mxgot", cl::Hidden, - cl::desc("MIPS: Enable GOT larger than 64k."), cl::init(false)); - -static cl::opt NoZeroDivCheck("mno-check-zero-division", cl::Hidden, cl::desc("MIPS: Don't trap on integer division by zero."), cl::init(false)); @@ -554,8 +550,9 @@ MipsTargetLowering::createFastISel(FunctionLoweringInfo &funcInfo, !Subtarget.inMicroMipsMode(); // Disable if either of the following is true: - // We do not generate PIC, the ABI is not O32, LargeGOT is being used. - if (!TM.isPositionIndependent() || !TM.getABI().IsO32() || LargeGOT) + // We do not generate PIC, the ABI is not O32, XGOT is being used. + if (!TM.isPositionIndependent() || !TM.getABI().IsO32() || + Subtarget.useXGOT()) UseFastISel = false; return UseFastISel ? Mips::createFastISel(funcInfo, libInfo) : nullptr; @@ -1989,7 +1986,7 @@ SDValue MipsTargetLowering::lowerGlobalAddress(SDValue Op, if (GV->hasLocalLinkage()) return getAddrLocal(N, SDLoc(N), Ty, DAG, ABI.IsN32() || ABI.IsN64()); - if (LargeGOT) + if (Subtarget.useXGOT()) return getAddrGlobalLargeGOT( N, SDLoc(N), Ty, DAG, MipsII::MO_GOT_HI16, MipsII::MO_GOT_LO16, DAG.getEntryNode(), @@ -3272,7 +3269,7 @@ MipsTargetLowering::LowerCall(TargetLowering::CallLoweringInfo &CLI, if (InternalLinkage) Callee = getAddrLocal(G, DL, Ty, DAG, ABI.IsN32() || ABI.IsN64()); - else if (LargeGOT) { + else if (Subtarget.useXGOT()) { Callee = getAddrGlobalLargeGOT(G, DL, Ty, DAG, MipsII::MO_CALL_HI16, MipsII::MO_CALL_LO16, Chain, FuncInfo->callPtrInfo(Val)); @@ -3294,7 +3291,7 @@ MipsTargetLowering::LowerCall(TargetLowering::CallLoweringInfo &CLI, if (!IsPIC) // static Callee = DAG.getTargetExternalSymbol( Sym, getPointerTy(DAG.getDataLayout()), MipsII::MO_NO_FLAG); - else if (LargeGOT) { + else if (Subtarget.useXGOT()) { Callee = getAddrGlobalLargeGOT(S, DL, Ty, DAG, MipsII::MO_CALL_HI16, MipsII::MO_CALL_LO16, Chain, FuncInfo->callPtrInfo(Sym)); diff --git a/llvm/lib/Target/Mips/MipsSubtarget.h b/llvm/lib/Target/Mips/MipsSubtarget.h index 4121034..396c479 100644 --- a/llvm/lib/Target/Mips/MipsSubtarget.h +++ b/llvm/lib/Target/Mips/MipsSubtarget.h @@ -189,6 +189,9 @@ class MipsSubtarget : public MipsGenSubtargetInfo { // Disable use of the `jal` instruction. bool UseLongCalls = false; + // Assume 32-bit GOT. + bool UseXGOT = false; + /// The minimum alignment known to hold of the stack frame on /// entry to the function and which must be maintained by every function. unsigned stackAlignment; @@ -323,6 +326,8 @@ public: bool useLongCalls() const { return UseLongCalls; } + bool useXGOT() const { return UseXGOT; } + bool enableLongBranchPass() const { return hasStandardEncoding() || inMicroMipsMode() || allowMixed16_32(); } diff --git a/llvm/test/CodeGen/Mips/address-selection.ll b/llvm/test/CodeGen/Mips/address-selection.ll index 36a1d51..1e0a9a4 100644 --- a/llvm/test/CodeGen/Mips/address-selection.ll +++ b/llvm/test/CodeGen/Mips/address-selection.ll @@ -1,8 +1,10 @@ ; RUN: llc -march=mips < %s -debug 2>&1 | FileCheck %s --check-prefix=MIPS -; RUN: llc -march=mips -relocation-model=pic -mxgot < %s -debug 2>&1 | FileCheck %s --check-prefix=MIPS-XGOT +; RUN: llc -march=mips -relocation-model=pic -mattr=+xgot < %s \ +; RUN: -debug 2>&1 | FileCheck %s --check-prefix=MIPS-XGOT ; RUN: llc -march=mips -mattr=+micromips < %s -debug 2>&1 | FileCheck %s --check-prefix=MM -; RUN: llc -march=mips -relocation-model=pic -mxgot -mattr=+micromips < %s -debug 2>&1 | FileCheck %s --check-prefix=MM-XGOT +; RUN: llc -march=mips -relocation-model=pic -mattr=+xgot,+micromips < %s \ +; RUN: -debug 2>&1 | FileCheck %s --check-prefix=MM-XGOT ; REQUIRES: asserts diff --git a/llvm/test/CodeGen/Mips/biggot.ll b/llvm/test/CodeGen/Mips/biggot.ll index 305dcf8..aed1c48 100644 --- a/llvm/test/CodeGen/Mips/biggot.ll +++ b/llvm/test/CodeGen/Mips/biggot.ll @@ -1,9 +1,11 @@ -; RUN: llc -march=mipsel -mxgot -relocation-model=pic < %s | FileCheck %s -check-prefix=O32 -; RUN: llc -march=mips64el -mcpu=mips64r2 -mxgot -relocation-model=pic < %s | \ -; RUN: FileCheck %s -check-prefix=N64 -; RUN: llc -march=mipsel -mxgot -relocation-model=pic -fast-isel < %s | FileCheck %s -check-prefix=O32 -; RUN: llc -march=mips64el -mcpu=mips64r2 -mxgot -relocation-model=pic -fast-isel < %s | \ -; RUN: FileCheck %s -check-prefix=N64 +; RUN: llc -march=mipsel -mattr=+xgot \ +; RUN: -relocation-model=pic < %s | FileCheck %s -check-prefix=O32 +; RUN: llc -march=mips64el -mcpu=mips64r2 -mattr=+xgot \ +; RUN: -relocation-model=pic < %s | FileCheck %s -check-prefix=N64 +; RUN: llc -march=mipsel -mattr=+xgot -fast-isel \ +; RUN: -relocation-model=pic < %s | FileCheck %s -check-prefix=O32 +; RUN: llc -march=mips64el -mcpu=mips64r2 -mattr=+xgot -fast-isel \ +; RUN: -relocation-model=pic < %s | FileCheck %s -check-prefix=N64 @v0 = external global i32 diff --git a/llvm/test/CodeGen/Mips/mirparser/target-flags-pic-mxgot-tls.mir b/llvm/test/CodeGen/Mips/mirparser/target-flags-pic-mxgot-tls.mir index 2956a17..5b72917 100644 --- a/llvm/test/CodeGen/Mips/mirparser/target-flags-pic-mxgot-tls.mir +++ b/llvm/test/CodeGen/Mips/mirparser/target-flags-pic-mxgot-tls.mir @@ -1,5 +1,5 @@ # RUN: llc -march=mips64 -target-abi n64 -start-before=finalize-isel \ -# RUN: -stop-after=finalize-isel -relocation-model=pic -mxgot \ +# RUN: -stop-after=finalize-isel -relocation-model=pic -mattr=+xgot \ # RUN: -o /dev/null %s # A simple test to show that we can parse the target specific flags: gpoff-hi, -- 2.7.4