Remove -disable-mips-abicall and -enable-mips-absolute-call command-line
options, which don't appear to be useful. -enable-mips-absolute-call is completely unused (and unless I'm mistaken, is supposed to have the same effect that -relocation-model=dynamic-no-pic should have), and -disable-mips-abicall appears to be effectively a synonym for -relocation-model=static. Adjust the few users of hasABICall to checks which seem more appropriate. Update MipsSubtarget, MipsTargetMachine, and MipselTargetMachine to synchronize with recent changes. llvm-svn: 77938
This commit is contained in:
parent
43fb93ab2f
commit
57c11da8df
|
@ -497,10 +497,9 @@ LowerGlobalAddress(SDValue Op, SelectionDAG &DAG)
|
||||||
GlobalValue *GV = cast<GlobalAddressSDNode>(Op)->getGlobal();
|
GlobalValue *GV = cast<GlobalAddressSDNode>(Op)->getGlobal();
|
||||||
SDValue GA = DAG.getTargetGlobalAddress(GV, MVT::i32);
|
SDValue GA = DAG.getTargetGlobalAddress(GV, MVT::i32);
|
||||||
|
|
||||||
if (!Subtarget->hasABICall()) {
|
if (getTargetMachine().getRelocationModel() != Reloc::PIC_) {
|
||||||
SDVTList VTs = DAG.getVTList(MVT::i32);
|
|
||||||
// %hi/%lo relocation
|
// %hi/%lo relocation
|
||||||
SDValue HiPart = DAG.getNode(MipsISD::Hi, dl, VTs, &GA, 1);
|
SDValue HiPart = DAG.getNode(MipsISD::Hi, dl, MVT::i32, GA);
|
||||||
SDValue Lo = DAG.getNode(MipsISD::Lo, dl, MVT::i32, GA);
|
SDValue Lo = DAG.getNode(MipsISD::Lo, dl, MVT::i32, GA);
|
||||||
return DAG.getNode(ISD::ADD, dl, MVT::i32, HiPart, Lo);
|
return DAG.getNode(ISD::ADD, dl, MVT::i32, HiPart, Lo);
|
||||||
|
|
||||||
|
@ -566,8 +565,7 @@ LowerConstantPool(SDValue Op, SelectionDAG &DAG)
|
||||||
// but the asm printer currently doens't support this feature without
|
// but the asm printer currently doens't support this feature without
|
||||||
// hacking it. This feature should come soon so we can uncomment the
|
// hacking it. This feature should come soon so we can uncomment the
|
||||||
// stuff below.
|
// stuff below.
|
||||||
//if (!Subtarget->hasABICall() &&
|
//if (IsInSmallSection(C->getType())) {
|
||||||
// IsInSmallSection(getTargetData()->getTypeAllocSize(C->getType()))) {
|
|
||||||
// SDValue GPRelNode = DAG.getNode(MipsISD::GPRel, MVT::i32, CP);
|
// SDValue GPRelNode = DAG.getNode(MipsISD::GPRel, MVT::i32, CP);
|
||||||
// SDValue GOT = DAG.getGLOBAL_OFFSET_TABLE(MVT::i32);
|
// SDValue GOT = DAG.getGLOBAL_OFFSET_TABLE(MVT::i32);
|
||||||
// ResNode = DAG.getNode(ISD::ADD, MVT::i32, GOT, GPRelNode);
|
// ResNode = DAG.getNode(ISD::ADD, MVT::i32, GOT, GPRelNode);
|
||||||
|
|
|
@ -17,19 +17,12 @@
|
||||||
#include "llvm/Support/CommandLine.h"
|
#include "llvm/Support/CommandLine.h"
|
||||||
using namespace llvm;
|
using namespace llvm;
|
||||||
|
|
||||||
static cl::opt<bool>
|
MipsSubtarget::MipsSubtarget(const std::string &TT, const std::string &FS,
|
||||||
NotABICall("disable-mips-abicall", cl::Hidden,
|
bool little) :
|
||||||
cl::desc("Disable code for SVR4-style dynamic objects"));
|
|
||||||
static cl::opt<bool>
|
|
||||||
AbsoluteCall("enable-mips-absolute-call", cl::Hidden,
|
|
||||||
cl::desc("Enable absolute call within abicall"));
|
|
||||||
|
|
||||||
MipsSubtarget::MipsSubtarget(const TargetMachine &TM, const std::string &TT,
|
|
||||||
const std::string &FS, bool little) :
|
|
||||||
MipsArchVersion(Mips1), MipsABI(O32), IsLittle(little), IsSingleFloat(false),
|
MipsArchVersion(Mips1), MipsABI(O32), IsLittle(little), IsSingleFloat(false),
|
||||||
IsFP64bit(false), IsGP64bit(false), HasVFPU(false), HasABICall(true),
|
IsFP64bit(false), IsGP64bit(false), HasVFPU(false), IsLinux(true),
|
||||||
HasAbsoluteCall(false), IsLinux(true), HasSEInReg(false), HasCondMov(false),
|
HasSEInReg(false), HasCondMov(false), HasMulDivAdd(false), HasMinMax(false),
|
||||||
HasMulDivAdd(false), HasMinMax(false), HasSwap(false), HasBitCount(false)
|
HasSwap(false), HasBitCount(false)
|
||||||
{
|
{
|
||||||
std::string CPU = "mips1";
|
std::string CPU = "mips1";
|
||||||
MipsArchVersion = Mips1;
|
MipsArchVersion = Mips1;
|
||||||
|
@ -56,13 +49,4 @@ MipsSubtarget::MipsSubtarget(const TargetMachine &TM, const std::string &TT,
|
||||||
HasSwap = true;
|
HasSwap = true;
|
||||||
HasCondMov = true;
|
HasCondMov = true;
|
||||||
}
|
}
|
||||||
|
|
||||||
// Abicall is the default for O32 ABI, but is disabled within EABI and in
|
|
||||||
// static code.
|
|
||||||
if (NotABICall || isABI_EABI() || (TM.getRelocationModel() == Reloc::Static))
|
|
||||||
HasABICall = false;
|
|
||||||
|
|
||||||
// TODO: disable when handling 64 bit symbols in the future.
|
|
||||||
if (HasABICall && AbsoluteCall)
|
|
||||||
HasAbsoluteCall = true;
|
|
||||||
}
|
}
|
||||||
|
|
|
@ -57,13 +57,6 @@ protected:
|
||||||
// HasVFPU - Processor has a vector floating point unit.
|
// HasVFPU - Processor has a vector floating point unit.
|
||||||
bool HasVFPU;
|
bool HasVFPU;
|
||||||
|
|
||||||
// IsABICall - Enable SRV4 code for SVR4-style dynamic objects
|
|
||||||
bool HasABICall;
|
|
||||||
|
|
||||||
// HasAbsoluteCall - Enable code that is not fully position-independent.
|
|
||||||
// Only works with HasABICall enabled.
|
|
||||||
bool HasAbsoluteCall;
|
|
||||||
|
|
||||||
// isLinux - Target system is Linux. Is false we consider ELFOS for now.
|
// isLinux - Target system is Linux. Is false we consider ELFOS for now.
|
||||||
bool IsLinux;
|
bool IsLinux;
|
||||||
|
|
||||||
|
@ -99,8 +92,7 @@ public:
|
||||||
|
|
||||||
/// This constructor initializes the data members to match that
|
/// This constructor initializes the data members to match that
|
||||||
/// of the specified triple.
|
/// of the specified triple.
|
||||||
MipsSubtarget(const TargetMachine &TM, const std::string &TT,
|
MipsSubtarget(const std::string &TT, const std::string &FS, bool little);
|
||||||
const std::string &FS, bool little);
|
|
||||||
|
|
||||||
/// ParseSubtargetFeatures - Parses features string setting specified
|
/// ParseSubtargetFeatures - Parses features string setting specified
|
||||||
/// subtarget options. Definition of function is auto generated by tblgen.
|
/// subtarget options. Definition of function is auto generated by tblgen.
|
||||||
|
@ -116,8 +108,6 @@ public:
|
||||||
bool isSingleFloat() const { return IsSingleFloat; };
|
bool isSingleFloat() const { return IsSingleFloat; };
|
||||||
bool isNotSingleFloat() const { return !IsSingleFloat; };
|
bool isNotSingleFloat() const { return !IsSingleFloat; };
|
||||||
bool hasVFPU() const { return HasVFPU; };
|
bool hasVFPU() const { return HasVFPU; };
|
||||||
bool hasABICall() const { return HasABICall; };
|
|
||||||
bool hasAbsoluteCall() const { return HasAbsoluteCall; };
|
|
||||||
bool isLinux() const { return IsLinux; };
|
bool isLinux() const { return IsLinux; };
|
||||||
|
|
||||||
/// Features related to the presence of specific instructions.
|
/// Features related to the presence of specific instructions.
|
||||||
|
|
|
@ -25,8 +25,6 @@ MipsTargetAsmInfo::MipsTargetAsmInfo(const MipsTargetMachine &TM) {
|
||||||
CommentString = "#";
|
CommentString = "#";
|
||||||
ZeroDirective = "\t.space\t";
|
ZeroDirective = "\t.space\t";
|
||||||
|
|
||||||
if (!TM.getSubtarget<MipsSubtarget>().hasABICall())
|
if (TM.getRelocationModel() == Reloc::PIC_)
|
||||||
JumpTableDirective = "\t.word\t";
|
|
||||||
else
|
|
||||||
JumpTableDirective = "\t.gpword\t";
|
JumpTableDirective = "\t.gpword\t";
|
||||||
}
|
}
|
||||||
|
|
|
@ -20,8 +20,8 @@ using namespace llvm;
|
||||||
|
|
||||||
extern "C" void LLVMInitializeMipsTarget() {
|
extern "C" void LLVMInitializeMipsTarget() {
|
||||||
// Register the target.
|
// Register the target.
|
||||||
RegisterTargetMachineDeprecated<MipsTargetMachine> X(TheMipsTarget);
|
RegisterTargetMachine<MipsTargetMachine> X(TheMipsTarget);
|
||||||
RegisterTargetMachineDeprecated<MipselTargetMachine> Y(TheMipselTarget);
|
RegisterTargetMachine<MipselTargetMachine> Y(TheMipselTarget);
|
||||||
}
|
}
|
||||||
|
|
||||||
const TargetAsmInfo *MipsTargetMachine::
|
const TargetAsmInfo *MipsTargetMachine::
|
||||||
|
@ -38,10 +38,10 @@ createTargetAsmInfo() const
|
||||||
// an easier handling.
|
// an easier handling.
|
||||||
// Using CodeModel::Large enables different CALL behavior.
|
// Using CodeModel::Large enables different CALL behavior.
|
||||||
MipsTargetMachine::
|
MipsTargetMachine::
|
||||||
MipsTargetMachine(const Target &T, const Module &M, const std::string &FS,
|
MipsTargetMachine(const Target &T, const std::string &TT, const std::string &FS,
|
||||||
bool isLittle=false):
|
bool isLittle=false):
|
||||||
LLVMTargetMachine(T),
|
LLVMTargetMachine(T),
|
||||||
Subtarget(*this, M.getTargetTriple(), FS, isLittle),
|
Subtarget(TT, FS, isLittle),
|
||||||
DataLayout(isLittle ? std::string("e-p:32:32:32-i8:8:32-i16:16:32") :
|
DataLayout(isLittle ? std::string("e-p:32:32:32-i8:8:32-i16:16:32") :
|
||||||
std::string("E-p:32:32:32-i8:8:32-i16:16:32")),
|
std::string("E-p:32:32:32-i8:8:32-i16:16:32")),
|
||||||
InstrInfo(*this),
|
InstrInfo(*this),
|
||||||
|
@ -49,8 +49,12 @@ MipsTargetMachine(const Target &T, const Module &M, const std::string &FS,
|
||||||
TLInfo(*this)
|
TLInfo(*this)
|
||||||
{
|
{
|
||||||
// Abicall enables PIC by default
|
// Abicall enables PIC by default
|
||||||
if (Subtarget.hasABICall())
|
if (getRelocationModel() == Reloc::Default) {
|
||||||
setRelocationModel(Reloc::PIC_);
|
if (Subtarget.isABI_O32())
|
||||||
|
setRelocationModel(Reloc::PIC_);
|
||||||
|
else
|
||||||
|
setRelocationModel(Reloc::Static);
|
||||||
|
}
|
||||||
|
|
||||||
// TODO: create an option to enable long calls, like -mlong-calls,
|
// TODO: create an option to enable long calls, like -mlong-calls,
|
||||||
// that would be our CodeModel::Large. It must not work with Abicall.
|
// that would be our CodeModel::Large. It must not work with Abicall.
|
||||||
|
@ -59,8 +63,9 @@ MipsTargetMachine(const Target &T, const Module &M, const std::string &FS,
|
||||||
}
|
}
|
||||||
|
|
||||||
MipselTargetMachine::
|
MipselTargetMachine::
|
||||||
MipselTargetMachine(const Target &T, const Module &M, const std::string &FS) :
|
MipselTargetMachine(const Target &T, const std::string &TT,
|
||||||
MipsTargetMachine(T, M, FS, true) {}
|
const std::string &FS) :
|
||||||
|
MipsTargetMachine(T, TT, FS, true) {}
|
||||||
|
|
||||||
// Install an instruction selector pass using
|
// Install an instruction selector pass using
|
||||||
// the ISelDag to gen Mips code.
|
// the ISelDag to gen Mips code.
|
||||||
|
|
|
@ -35,7 +35,7 @@ namespace llvm {
|
||||||
virtual const TargetAsmInfo *createTargetAsmInfo() const;
|
virtual const TargetAsmInfo *createTargetAsmInfo() const;
|
||||||
|
|
||||||
public:
|
public:
|
||||||
MipsTargetMachine(const Target &T, const Module &M,
|
MipsTargetMachine(const Target &T, const std::string &TT,
|
||||||
const std::string &FS, bool isLittle);
|
const std::string &FS, bool isLittle);
|
||||||
|
|
||||||
virtual const MipsInstrInfo *getInstrInfo() const
|
virtual const MipsInstrInfo *getInstrInfo() const
|
||||||
|
@ -66,7 +66,8 @@ namespace llvm {
|
||||||
///
|
///
|
||||||
class MipselTargetMachine : public MipsTargetMachine {
|
class MipselTargetMachine : public MipsTargetMachine {
|
||||||
public:
|
public:
|
||||||
MipselTargetMachine(const Target &T, const Module &M, const std::string &FS);
|
MipselTargetMachine(const Target &T, const std::string &TT,
|
||||||
|
const std::string &FS);
|
||||||
};
|
};
|
||||||
|
|
||||||
} // End llvm namespace
|
} // End llvm namespace
|
||||||
|
|
Loading…
Reference in New Issue