1f22ef01cSRoman Divacky //===-- XCoreTargetMachine.cpp - Define TargetMachine for XCore -----------===//
2f22ef01cSRoman Divacky //
3f22ef01cSRoman Divacky // The LLVM Compiler Infrastructure
4f22ef01cSRoman Divacky //
5f22ef01cSRoman Divacky // This file is distributed under the University of Illinois Open Source
6f22ef01cSRoman Divacky // License. See LICENSE.TXT for details.
7f22ef01cSRoman Divacky //
8f22ef01cSRoman Divacky //===----------------------------------------------------------------------===//
9f22ef01cSRoman Divacky //
10f22ef01cSRoman Divacky //
11f22ef01cSRoman Divacky //===----------------------------------------------------------------------===//
12f22ef01cSRoman Divacky
13db17bf38SDimitry Andric #include "XCoreTargetMachine.h"
147a7e6055SDimitry Andric #include "MCTargetDesc/XCoreMCTargetDesc.h"
157a7e6055SDimitry Andric #include "XCore.h"
1639d628a0SDimitry Andric #include "XCoreTargetObjectFile.h"
17ff0cc061SDimitry Andric #include "XCoreTargetTransformInfo.h"
187a7e6055SDimitry Andric #include "llvm/ADT/Optional.h"
197a7e6055SDimitry Andric #include "llvm/ADT/STLExtras.h"
207a7e6055SDimitry Andric #include "llvm/Analysis/TargetTransformInfo.h"
21dff0c46cSDimitry Andric #include "llvm/CodeGen/Passes.h"
223ca95b02SDimitry Andric #include "llvm/CodeGen/TargetPassConfig.h"
237a7e6055SDimitry Andric #include "llvm/Support/CodeGen.h"
246122f3e6SDimitry Andric #include "llvm/Support/TargetRegistry.h"
257a7e6055SDimitry Andric
26f22ef01cSRoman Divacky using namespace llvm;
27f22ef01cSRoman Divacky
getEffectiveRelocModel(Optional<Reloc::Model> RM)283ca95b02SDimitry Andric static Reloc::Model getEffectiveRelocModel(Optional<Reloc::Model> RM) {
293ca95b02SDimitry Andric if (!RM.hasValue())
303ca95b02SDimitry Andric return Reloc::Static;
313ca95b02SDimitry Andric return *RM;
323ca95b02SDimitry Andric }
333ca95b02SDimitry Andric
34*b5893f02SDimitry Andric static CodeModel::Model
getEffectiveXCoreCodeModel(Optional<CodeModel::Model> CM)35*b5893f02SDimitry Andric getEffectiveXCoreCodeModel(Optional<CodeModel::Model> CM) {
362cab237bSDimitry Andric if (CM) {
372cab237bSDimitry Andric if (*CM != CodeModel::Small && *CM != CodeModel::Large)
382cab237bSDimitry Andric report_fatal_error("Target only supports CodeModel Small or Large");
392cab237bSDimitry Andric return *CM;
402cab237bSDimitry Andric }
412cab237bSDimitry Andric return CodeModel::Small;
422cab237bSDimitry Andric }
432cab237bSDimitry Andric
443ca95b02SDimitry Andric /// Create an ILP32 architecture model
45f22ef01cSRoman Divacky ///
XCoreTargetMachine(const Target & T,const Triple & TT,StringRef CPU,StringRef FS,const TargetOptions & Options,Optional<Reloc::Model> RM,Optional<CodeModel::Model> CM,CodeGenOpt::Level OL,bool JIT)468f0fd8f6SDimitry Andric XCoreTargetMachine::XCoreTargetMachine(const Target &T, const Triple &TT,
476122f3e6SDimitry Andric StringRef CPU, StringRef FS,
48dff0c46cSDimitry Andric const TargetOptions &Options,
493ca95b02SDimitry Andric Optional<Reloc::Model> RM,
502cab237bSDimitry Andric Optional<CodeModel::Model> CM,
512cab237bSDimitry Andric CodeGenOpt::Level OL, bool JIT)
52ff0cc061SDimitry Andric : LLVMTargetMachine(
53ff0cc061SDimitry Andric T, "e-m:e-p:32:32-i1:8:32-i8:8:32-i16:16:32-i64:32-f64:32-a:0:32-n32",
542cab237bSDimitry Andric TT, CPU, FS, Options, getEffectiveRelocModel(RM),
55*b5893f02SDimitry Andric getEffectiveXCoreCodeModel(CM), OL),
567a7e6055SDimitry Andric TLOF(llvm::make_unique<XCoreTargetObjectFile>()),
5791bc56edSDimitry Andric Subtarget(TT, CPU, FS, *this) {
58f785676fSDimitry Andric initAsmInfo();
59f22ef01cSRoman Divacky }
60f22ef01cSRoman Divacky
617a7e6055SDimitry Andric XCoreTargetMachine::~XCoreTargetMachine() = default;
6239d628a0SDimitry Andric
63dff0c46cSDimitry Andric namespace {
647a7e6055SDimitry Andric
65dff0c46cSDimitry Andric /// XCore Code Generator Pass Configuration Options.
66dff0c46cSDimitry Andric class XCorePassConfig : public TargetPassConfig {
67dff0c46cSDimitry Andric public:
XCorePassConfig(XCoreTargetMachine & TM,PassManagerBase & PM)68f9448bf3SDimitry Andric XCorePassConfig(XCoreTargetMachine &TM, PassManagerBase &PM)
69dff0c46cSDimitry Andric : TargetPassConfig(TM, PM) {}
70dff0c46cSDimitry Andric
getXCoreTargetMachine() const71dff0c46cSDimitry Andric XCoreTargetMachine &getXCoreTargetMachine() const {
72dff0c46cSDimitry Andric return getTM<XCoreTargetMachine>();
73dff0c46cSDimitry Andric }
74dff0c46cSDimitry Andric
7539d628a0SDimitry Andric void addIRPasses() override;
7691bc56edSDimitry Andric bool addPreISel() override;
7791bc56edSDimitry Andric bool addInstSelector() override;
7839d628a0SDimitry Andric void addPreEmitPass() override;
79dff0c46cSDimitry Andric };
807a7e6055SDimitry Andric
817a7e6055SDimitry Andric } // end anonymous namespace
82dff0c46cSDimitry Andric
createPassConfig(PassManagerBase & PM)83dff0c46cSDimitry Andric TargetPassConfig *XCoreTargetMachine::createPassConfig(PassManagerBase &PM) {
84f9448bf3SDimitry Andric return new XCorePassConfig(*this, PM);
85dff0c46cSDimitry Andric }
86dff0c46cSDimitry Andric
addIRPasses()8739d628a0SDimitry Andric void XCorePassConfig::addIRPasses() {
88d8866befSDimitry Andric addPass(createAtomicExpandPass());
8939d628a0SDimitry Andric
9039d628a0SDimitry Andric TargetPassConfig::addIRPasses();
9139d628a0SDimitry Andric }
9239d628a0SDimitry Andric
addPreISel()93284c1978SDimitry Andric bool XCorePassConfig::addPreISel() {
94284c1978SDimitry Andric addPass(createXCoreLowerThreadLocalPass());
95284c1978SDimitry Andric return false;
96284c1978SDimitry Andric }
97284c1978SDimitry Andric
addInstSelector()98dff0c46cSDimitry Andric bool XCorePassConfig::addInstSelector() {
997ae0e2c9SDimitry Andric addPass(createXCoreISelDag(getXCoreTargetMachine(), getOptLevel()));
100f22ef01cSRoman Divacky return false;
101f22ef01cSRoman Divacky }
102f22ef01cSRoman Divacky
addPreEmitPass()10339d628a0SDimitry Andric void XCorePassConfig::addPreEmitPass() {
10439d628a0SDimitry Andric addPass(createXCoreFrameToArgsOffsetEliminationPass(), false);
10591bc56edSDimitry Andric }
10691bc56edSDimitry Andric
107f22ef01cSRoman Divacky // Force static initialization.
LLVMInitializeXCoreTarget()108f22ef01cSRoman Divacky extern "C" void LLVMInitializeXCoreTarget() {
109d88c1a5aSDimitry Andric RegisterTargetMachine<XCoreTargetMachine> X(getTheXCoreTarget());
110f22ef01cSRoman Divacky }
111f785676fSDimitry Andric
112da09e106SDimitry Andric TargetTransformInfo
getTargetTransformInfo(const Function & F)113da09e106SDimitry Andric XCoreTargetMachine::getTargetTransformInfo(const Function &F) {
114875ed548SDimitry Andric return TargetTransformInfo(XCoreTTIImpl(this, F));
115f785676fSDimitry Andric }
116