[mips] Replace MipsABIEnum with a MipsABIInfo class.

Summary:
No functional change yet, it's just an object replacement for an enum.
It will allow us to gather ABI information in a single place so that we can
start testing for properties of the ABI's instead of the ABI itself.

For example we will eventually be able to use:
  ABI.MinStackAlignmentInBytes()
instead of:
  (isABI_N32() || isABI_N64()) ? 16 : 8
which is clearer and more maintainable.

Reviewers: matheusalmeida

Reviewed By: matheusalmeida

Differential Revision: http://reviews.llvm.org/D3341

git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@220568 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
Daniel Sanders 2014-10-24 16:15:27 +00:00
parent 5ea04462dc
commit 2992ea0cb5
7 changed files with 70 additions and 32 deletions

View File

@ -69,13 +69,13 @@ def FeatureNaN2008 : SubtargetFeature<"nan2008", "IsNaN2008bit", "true",
"IEEE 754-2008 NaN encoding.">; "IEEE 754-2008 NaN encoding.">;
def FeatureSingleFloat : SubtargetFeature<"single-float", "IsSingleFloat", def FeatureSingleFloat : SubtargetFeature<"single-float", "IsSingleFloat",
"true", "Only supports single precision float">; "true", "Only supports single precision float">;
def FeatureO32 : SubtargetFeature<"o32", "MipsABI", "O32", def FeatureO32 : SubtargetFeature<"o32", "ABI", "MipsABIInfo::O32()",
"Enable o32 ABI">; "Enable o32 ABI">;
def FeatureN32 : SubtargetFeature<"n32", "MipsABI", "N32", def FeatureN32 : SubtargetFeature<"n32", "ABI", "MipsABIInfo::N32()",
"Enable n32 ABI">; "Enable n32 ABI">;
def FeatureN64 : SubtargetFeature<"n64", "MipsABI", "N64", def FeatureN64 : SubtargetFeature<"n64", "ABI", "MipsABIInfo::N64()",
"Enable n64 ABI">; "Enable n64 ABI">;
def FeatureEABI : SubtargetFeature<"eabi", "MipsABI", "EABI", def FeatureEABI : SubtargetFeature<"eabi", "ABI", "MipsABIInfo::EABI()",
"Enable eabi ABI">; "Enable eabi ABI">;
def FeatureNoOddSPReg : SubtargetFeature<"nooddspreg", "UseOddSPReg", "false", def FeatureNoOddSPReg : SubtargetFeature<"nooddspreg", "UseOddSPReg", "false",
"Disable odd numbered single-precision " "Disable odd numbered single-precision "

View File

@ -0,0 +1,46 @@
//===---- MipsABIInfo.h - Information about MIPS ABI's --------------------===//
//
// The LLVM Compiler Infrastructure
//
// This file is distributed under the University of Illinois Open Source
// License. See LICENSE.TXT for details.
//
//===----------------------------------------------------------------------===//
#ifndef MIPSABIINFO_H
#define MIPSABIINFO_H
namespace llvm {
class MipsABIInfo {
public:
enum class ABI { Unknown, O32, N32, N64, EABI };
protected:
ABI ThisABI;
public:
MipsABIInfo(ABI ThisABI) : ThisABI(ThisABI) {}
static MipsABIInfo Unknown() { return MipsABIInfo(ABI::Unknown); }
static MipsABIInfo O32() { return MipsABIInfo(ABI::O32); }
static MipsABIInfo N32() { return MipsABIInfo(ABI::N32); }
static MipsABIInfo N64() { return MipsABIInfo(ABI::N64); }
static MipsABIInfo EABI() { return MipsABIInfo(ABI::EABI); }
bool IsKnown() const { return ThisABI != ABI::Unknown; }
bool IsO32() const { return ThisABI == ABI::O32; }
bool IsN32() const { return ThisABI == ABI::N32; }
bool IsN64() const { return ThisABI == ABI::N64; }
bool IsEABI() const { return ThisABI == ABI::EABI; }
ABI GetEnumValue() const { return ThisABI; }
/// Ordering of ABI's
/// MipsGenSubtargetInfo.inc will use this to resolve conflicts when given
/// multiple ABI options.
bool operator<(const MipsABIInfo Other) const {
return ThisABI < Other.GetEnumValue();
}
};
}
#endif

View File

@ -319,11 +319,11 @@ void MipsAsmPrinter::emitFrameDirective() {
/// Emit Set directives. /// Emit Set directives.
const char *MipsAsmPrinter::getCurrentABIString() const { const char *MipsAsmPrinter::getCurrentABIString() const {
switch (Subtarget->getTargetABI()) { switch (Subtarget->getABI().GetEnumValue()) {
case MipsSubtarget::O32: return "abi32"; case MipsABIInfo::ABI::O32: return "abi32";
case MipsSubtarget::N32: return "abiN32"; case MipsABIInfo::ABI::N32: return "abiN32";
case MipsSubtarget::N64: return "abi64"; case MipsABIInfo::ABI::N64: return "abi64";
case MipsSubtarget::EABI: return "eabi32"; // TODO: handle eabi64 case MipsABIInfo::ABI::EABI: return "eabi32"; // TODO: handle eabi64
default: llvm_unreachable("Unknown Mips ABI"); default: llvm_unreachable("Unknown Mips ABI");
} }
} }

View File

@ -344,7 +344,6 @@ namespace {
const TargetMachine &TM; const TargetMachine &TM;
bool IsPIC; bool IsPIC;
unsigned ABI;
const MipsSubtarget *STI; const MipsSubtarget *STI;
const Mips16InstrInfo *TII; const Mips16InstrInfo *TII;
MipsFunctionInfo *MFI; MipsFunctionInfo *MFI;
@ -367,8 +366,7 @@ namespace {
static char ID; static char ID;
MipsConstantIslands(TargetMachine &tm) MipsConstantIslands(TargetMachine &tm)
: MachineFunctionPass(ID), TM(tm), : MachineFunctionPass(ID), TM(tm),
IsPIC(TM.getRelocationModel() == Reloc::PIC_), IsPIC(TM.getRelocationModel() == Reloc::PIC_), STI(nullptr),
ABI(TM.getSubtarget<MipsSubtarget>().getTargetABI()), STI(nullptr),
MF(nullptr), MCP(nullptr), PrescannedForConstants(false) {} MF(nullptr), MCP(nullptr), PrescannedForConstants(false) {}
const char *getPassName() const override { const char *getPassName() const override {

View File

@ -65,8 +65,8 @@ namespace {
MipsLongBranch(TargetMachine &tm) MipsLongBranch(TargetMachine &tm)
: MachineFunctionPass(ID), TM(tm), : MachineFunctionPass(ID), TM(tm),
IsPIC(TM.getRelocationModel() == Reloc::PIC_), IsPIC(TM.getRelocationModel() == Reloc::PIC_),
ABI(TM.getSubtarget<MipsSubtarget>().getTargetABI()), ABI(TM.getSubtarget<MipsSubtarget>().getABI()),
LongBranchSeqSize(!IsPIC ? 2 : (ABI == MipsSubtarget::N64 ? 10 : LongBranchSeqSize(!IsPIC ? 2 : (ABI.IsN64() ? 10 :
(!TM.getSubtarget<MipsSubtarget>().isTargetNaCl() ? 9 : 10))) {} (!TM.getSubtarget<MipsSubtarget>().isTargetNaCl() ? 9 : 10))) {}
const char *getPassName() const override { const char *getPassName() const override {
@ -87,7 +87,7 @@ namespace {
MachineFunction *MF; MachineFunction *MF;
SmallVector<MBBInfo, 16> MBBInfos; SmallVector<MBBInfo, 16> MBBInfos;
bool IsPIC; bool IsPIC;
unsigned ABI; MipsABIInfo ABI;
unsigned LongBranchSeqSize; unsigned LongBranchSeqSize;
}; };
@ -274,7 +274,7 @@ void MipsLongBranch::expandToLongBranch(MBBInfo &I) {
const MipsSubtarget &Subtarget = TM.getSubtarget<MipsSubtarget>(); const MipsSubtarget &Subtarget = TM.getSubtarget<MipsSubtarget>();
unsigned BalOp = Subtarget.hasMips32r6() ? Mips::BAL : Mips::BAL_BR; unsigned BalOp = Subtarget.hasMips32r6() ? Mips::BAL : Mips::BAL_BR;
if (ABI != MipsSubtarget::N64) { if (!ABI.IsN64()) {
// $longbr: // $longbr:
// addiu $sp, $sp, -8 // addiu $sp, $sp, -8
// sw $ra, 0($sp) // sw $ra, 0($sp)

View File

@ -106,7 +106,7 @@ MipsSubtarget::MipsSubtarget(const std::string &TT, const std::string &CPU,
const std::string &FS, bool little, const std::string &FS, bool little,
const MipsTargetMachine *_TM) const MipsTargetMachine *_TM)
: MipsGenSubtargetInfo(TT, CPU, FS), MipsArchVersion(Mips32), : MipsGenSubtargetInfo(TT, CPU, FS), MipsArchVersion(Mips32),
MipsABI(UnknownABI), IsLittle(little), IsSingleFloat(false), ABI(MipsABIInfo::Unknown()), IsLittle(little), IsSingleFloat(false),
IsFPXX(false), NoABICalls(false), IsFP64bit(false), UseOddSPReg(true), IsFPXX(false), NoABICalls(false), IsFP64bit(false), UseOddSPReg(true),
IsNaN2008bit(false), IsGP64bit(false), HasVFPU(false), HasCnMips(false), IsNaN2008bit(false), IsGP64bit(false), HasVFPU(false), HasCnMips(false),
IsLinux(true), HasMips3_32(false), HasMips3_32r2(false), IsLinux(true), HasMips3_32(false), HasMips3_32r2(false),
@ -136,7 +136,7 @@ MipsSubtarget::MipsSubtarget(const std::string &TT, const std::string &CPU,
report_fatal_error("Code generation for MIPS-V is not implemented", false); report_fatal_error("Code generation for MIPS-V is not implemented", false);
// Assert exactly one ABI was chosen. // Assert exactly one ABI was chosen.
assert(MipsABI != UnknownABI); assert(ABI.IsKnown());
assert((((getFeatureBits() & Mips::FeatureO32) != 0) + assert((((getFeatureBits() & Mips::FeatureO32) != 0) +
((getFeatureBits() & Mips::FeatureEABI) != 0) + ((getFeatureBits() & Mips::FeatureEABI) != 0) +
((getFeatureBits() & Mips::FeatureN32) != 0) + ((getFeatureBits() & Mips::FeatureN32) != 0) +

View File

@ -22,6 +22,7 @@
#include "llvm/MC/MCInstrItineraries.h" #include "llvm/MC/MCInstrItineraries.h"
#include "llvm/Support/ErrorHandling.h" #include "llvm/Support/ErrorHandling.h"
#include "llvm/Target/TargetSubtargetInfo.h" #include "llvm/Target/TargetSubtargetInfo.h"
#include "MipsABIInfo.h"
#include <string> #include <string>
#define GET_SUBTARGETINFO_HEADER #define GET_SUBTARGETINFO_HEADER
@ -35,13 +36,6 @@ class MipsTargetMachine;
class MipsSubtarget : public MipsGenSubtargetInfo { class MipsSubtarget : public MipsGenSubtargetInfo {
virtual void anchor(); virtual void anchor();
public:
// NOTE: O64 will not be supported.
enum MipsABIEnum {
UnknownABI, O32, N32, N64, EABI
};
protected:
enum MipsArchEnum { enum MipsArchEnum {
Mips1, Mips2, Mips32, Mips32r2, Mips32r6, Mips3, Mips4, Mips5, Mips64, Mips1, Mips2, Mips32, Mips32r2, Mips32r6, Mips3, Mips4, Mips5, Mips64,
Mips64r2, Mips64r6 Mips64r2, Mips64r6
@ -50,8 +44,8 @@ protected:
// Mips architecture version // Mips architecture version
MipsArchEnum MipsArchVersion; MipsArchEnum MipsArchVersion;
// Mips supported ABIs // Selected ABI
MipsABIEnum MipsABI; MipsABIInfo ABI;
// IsLittle - The target is Little Endian // IsLittle - The target is Little Endian
bool IsLittle; bool IsLittle;
@ -158,12 +152,12 @@ public:
CodeGenOpt::Level getOptLevelToEnablePostRAScheduler() const override; CodeGenOpt::Level getOptLevelToEnablePostRAScheduler() const override;
/// Only O32 and EABI supported right now. /// Only O32 and EABI supported right now.
bool isABI_EABI() const { return MipsABI == EABI; } bool isABI_EABI() const { return ABI.IsEABI(); }
bool isABI_N64() const { return MipsABI == N64; } bool isABI_N64() const { return ABI.IsN64(); }
bool isABI_N32() const { return MipsABI == N32; } bool isABI_N32() const { return ABI.IsN32(); }
bool isABI_O32() const { return MipsABI == O32; } bool isABI_O32() const { return ABI.IsO32(); }
bool isABI_FPXX() const { return isABI_O32() && IsFPXX; } bool isABI_FPXX() const { return isABI_O32() && IsFPXX; }
unsigned getTargetABI() const { return MipsABI; } const MipsABIInfo &getABI() const { return ABI; }
/// 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.