Move all of the hexagon subtarget dependent variables from the target

machine to the subtarget.

git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@211824 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
Eric Christopher 2014-06-27 00:27:40 +00:00
parent 460f2ac45f
commit 061b8c389c
4 changed files with 46 additions and 29 deletions

View File

@ -48,10 +48,8 @@ EnableIEEERndNear(
cl::Hidden, cl::ZeroOrMore, cl::init(false), cl::Hidden, cl::ZeroOrMore, cl::init(false),
cl::desc("Generate non-chopped conversion from fp to int.")); cl::desc("Generate non-chopped conversion from fp to int."));
HexagonSubtarget::HexagonSubtarget(StringRef TT, StringRef CPU, StringRef FS): HexagonSubtarget &
HexagonGenSubtargetInfo(TT, CPU, FS), HexagonSubtarget::initializeSubtargetDependencies(StringRef CPU, StringRef FS) {
CPUString(CPU.str()) {
// If the programmer has not specified a Hexagon version, default to -mv4. // If the programmer has not specified a Hexagon version, default to -mv4.
if (CPUString.empty()) if (CPUString.empty())
CPUString = "hexagonv4"; CPUString = "hexagonv4";
@ -70,6 +68,15 @@ HexagonSubtarget::HexagonSubtarget(StringRef TT, StringRef CPU, StringRef FS):
} }
ParseSubtargetFeatures(CPUString, FS); ParseSubtargetFeatures(CPUString, FS);
return *this;
}
HexagonSubtarget::HexagonSubtarget(StringRef TT, StringRef CPU, StringRef FS,
const TargetMachine &TM)
: HexagonGenSubtargetInfo(TT, CPU, FS), CPUString(CPU.str()),
DL("e-m:e-p:32:32-i1:32-i64:64-a:0-n32"),
InstrInfo(initializeSubtargetDependencies(CPU, FS)), TLInfo(TM),
TSInfo(DL), FrameLowering() {
// Initialize scheduling itinerary for the specified CPU. // Initialize scheduling itinerary for the specified CPU.
InstrItins = getInstrItineraryForCPU(CPUString); InstrItins = getInstrItineraryForCPU(CPUString);

View File

@ -14,6 +14,11 @@
#ifndef Hexagon_SUBTARGET_H #ifndef Hexagon_SUBTARGET_H
#define Hexagon_SUBTARGET_H #define Hexagon_SUBTARGET_H
#include "HexagonFrameLowering.h"
#include "HexagonInstrInfo.h"
#include "HexagonISelLowering.h"
#include "HexagonSelectionDAGInfo.h"
#include "llvm/IR/DataLayout.h"
#include "llvm/Target/TargetMachine.h" #include "llvm/Target/TargetMachine.h"
#include "llvm/Target/TargetSubtargetInfo.h" #include "llvm/Target/TargetSubtargetInfo.h"
#include <string> #include <string>
@ -28,6 +33,7 @@ namespace llvm {
class HexagonSubtarget : public HexagonGenSubtargetInfo { class HexagonSubtarget : public HexagonGenSubtargetInfo {
virtual void anchor(); virtual void anchor();
bool UseMemOps; bool UseMemOps;
bool ModeIEEERndNear; bool ModeIEEERndNear;
@ -37,16 +43,35 @@ public:
}; };
HexagonArchEnum HexagonArchVersion; HexagonArchEnum HexagonArchVersion;
private:
std::string CPUString; std::string CPUString;
const DataLayout DL; // Calculates type size & alignment.
HexagonInstrInfo InstrInfo;
HexagonTargetLowering TLInfo;
HexagonSelectionDAGInfo TSInfo;
HexagonFrameLowering FrameLowering;
InstrItineraryData InstrItins; InstrItineraryData InstrItins;
public: public:
HexagonSubtarget(StringRef TT, StringRef CPU, StringRef FS); HexagonSubtarget(StringRef TT, StringRef CPU, StringRef FS,
const TargetMachine &TM);
/// getInstrItins - Return the instruction itineraies based on subtarget /// getInstrItins - Return the instruction itineraies based on subtarget
/// selection. /// selection.
const InstrItineraryData &getInstrItineraryData() const { return InstrItins; } const InstrItineraryData &getInstrItineraryData() const { return InstrItins; }
const HexagonInstrInfo *getInstrInfo() const { return &InstrInfo; }
const HexagonRegisterInfo *getRegisterInfo() const {
return &InstrInfo.getRegisterInfo();
}
const HexagonTargetLowering *getTargetLowering() const { return &TLInfo; }
const HexagonFrameLowering *getFrameLowering() const {
return &FrameLowering;
}
const HexagonSelectionDAGInfo *getSelectionDAGInfo() const { return &TSInfo; }
const DataLayout *getDataLayout() const { return &DL; }
HexagonSubtarget &initializeSubtargetDependencies(StringRef CPU,
StringRef FS);
/// 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.

View File

@ -70,9 +70,7 @@ HexagonTargetMachine::HexagonTargetMachine(const Target &T, StringRef TT,
Reloc::Model RM, CodeModel::Model CM, Reloc::Model RM, CodeModel::Model CM,
CodeGenOpt::Level OL) CodeGenOpt::Level OL)
: LLVMTargetMachine(T, TT, CPU, FS, Options, RM, CM, OL), : LLVMTargetMachine(T, TT, CPU, FS, Options, RM, CM, OL),
DL("e-m:e-p:32:32-i1:32-i64:64-a:0-n32"), Subtarget(TT, CPU, FS), Subtarget(TT, CPU, FS, *this) {
InstrInfo(Subtarget), TLInfo(*this), TSInfo(DL),
FrameLowering() {
initAsmInfo(); initAsmInfo();
} }

View File

@ -14,12 +14,8 @@
#ifndef HexagonTARGETMACHINE_H #ifndef HexagonTARGETMACHINE_H
#define HexagonTARGETMACHINE_H #define HexagonTARGETMACHINE_H
#include "HexagonFrameLowering.h"
#include "HexagonISelLowering.h"
#include "HexagonInstrInfo.h" #include "HexagonInstrInfo.h"
#include "HexagonSelectionDAGInfo.h"
#include "HexagonSubtarget.h" #include "HexagonSubtarget.h"
#include "llvm/IR/DataLayout.h"
#include "llvm/Target/TargetMachine.h" #include "llvm/Target/TargetMachine.h"
namespace llvm { namespace llvm {
@ -27,12 +23,7 @@ namespace llvm {
class Module; class Module;
class HexagonTargetMachine : public LLVMTargetMachine { class HexagonTargetMachine : public LLVMTargetMachine {
const DataLayout DL; // Calculates type size & alignment.
HexagonSubtarget Subtarget; HexagonSubtarget Subtarget;
HexagonInstrInfo InstrInfo;
HexagonTargetLowering TLInfo;
HexagonSelectionDAGInfo TSInfo;
HexagonFrameLowering FrameLowering;
public: public:
HexagonTargetMachine(const Target &T, StringRef TT,StringRef CPU, HexagonTargetMachine(const Target &T, StringRef TT,StringRef CPU,
@ -41,33 +32,29 @@ public:
CodeGenOpt::Level OL); CodeGenOpt::Level OL);
const HexagonInstrInfo *getInstrInfo() const override { const HexagonInstrInfo *getInstrInfo() const override {
return &InstrInfo; return getSubtargetImpl()->getInstrInfo();
} }
const HexagonSubtarget *getSubtargetImpl() const override { const HexagonSubtarget *getSubtargetImpl() const override {
return &Subtarget; return &Subtarget;
} }
const HexagonRegisterInfo *getRegisterInfo() const override { const HexagonRegisterInfo *getRegisterInfo() const override {
return &InstrInfo.getRegisterInfo(); return getSubtargetImpl()->getRegisterInfo();
} }
const InstrItineraryData* getInstrItineraryData() const override { const InstrItineraryData* getInstrItineraryData() const override {
return &getSubtargetImpl()->getInstrItineraryData(); return &getSubtargetImpl()->getInstrItineraryData();
} }
const HexagonTargetLowering* getTargetLowering() const override { const HexagonTargetLowering* getTargetLowering() const override {
return &TLInfo; return getSubtargetImpl()->getTargetLowering();
} }
const HexagonFrameLowering* getFrameLowering() const override { const HexagonFrameLowering* getFrameLowering() const override {
return &FrameLowering; return getSubtargetImpl()->getFrameLowering();
} }
const HexagonSelectionDAGInfo* getSelectionDAGInfo() const override { const HexagonSelectionDAGInfo* getSelectionDAGInfo() const override {
return &TSInfo; return getSubtargetImpl()->getSelectionDAGInfo();
}
const DataLayout *getDataLayout() const override {
return getSubtargetImpl()->getDataLayout();
} }
const DataLayout *getDataLayout() const override { return &DL; }
static unsigned getModuleMatchQuality(const Module &M); static unsigned getModuleMatchQuality(const Module &M);
TargetPassConfig *createPassConfig(PassManagerBase &PM) override; TargetPassConfig *createPassConfig(PassManagerBase &PM) override;