blob: b1f4b496eb9ee8e00b64ab6a942d118e9b8c805b [file] [log] [blame]
Jacques Pienaarfcef3e42016-03-28 13:09:54 +00001//===-- LanaiTargetMachine.cpp - Define TargetMachine for Lanai ---------===//
2//
3// The LLVM Compiler Infrastructure
4//
5// This file is distributed under the University of Illinois Open Source
6// License. See LICENSE.TXT for details.
7//
8//===----------------------------------------------------------------------===//
9//
10// Implements the info about Lanai target spec.
11//
12//===----------------------------------------------------------------------===//
13
14#include "LanaiTargetMachine.h"
15
16#include "Lanai.h"
17#include "LanaiTargetObjectFile.h"
18#include "LanaiTargetTransformInfo.h"
19#include "llvm/Analysis/TargetTransformInfo.h"
20#include "llvm/CodeGen/Passes.h"
Jacques Pienaarfcef3e42016-03-28 13:09:54 +000021#include "llvm/CodeGen/TargetLoweringObjectFileImpl.h"
Jacques Pienaar5ffdef52016-05-20 21:41:53 +000022#include "llvm/CodeGen/TargetPassConfig.h"
Jacques Pienaarfcef3e42016-03-28 13:09:54 +000023#include "llvm/Support/FormattedStream.h"
24#include "llvm/Support/TargetRegistry.h"
25#include "llvm/Target/TargetOptions.h"
26
27using namespace llvm;
28
29namespace llvm {
30void initializeLanaiMemAluCombinerPass(PassRegistry &);
Jacques Pienaarfcef3e42016-03-28 13:09:54 +000031} // namespace llvm
32
33extern "C" void LLVMInitializeLanaiTarget() {
34 // Register the target.
35 RegisterTargetMachine<LanaiTargetMachine> registered_target(TheLanaiTarget);
36}
37
Jacques Pienaare2f06992016-07-15 22:38:32 +000038static std::string computeDataLayout() {
Jacques Pienaarfcef3e42016-03-28 13:09:54 +000039 // Data layout (keep in sync with clang/lib/Basic/Targets.cpp)
40 return "E" // Big endian
41 "-m:e" // ELF name manging
42 "-p:32:32" // 32-bit pointers, 32 bit aligned
43 "-i64:64" // 64 bit integers, 64 bit aligned
44 "-a:0:32" // 32 bit alignment of objects of aggregate type
45 "-n32" // 32 bit native integer width
46 "-S64"; // 64 bit natural stack alignment
47}
48
Jacques Pienaare2f06992016-07-15 22:38:32 +000049static Reloc::Model getEffectiveRelocModel(Optional<Reloc::Model> RM) {
Jacques Pienaar813e8372016-05-20 03:21:37 +000050 if (!RM.hasValue())
Jacques Pienaar5ffdef52016-05-20 21:41:53 +000051 return Reloc::PIC_;
Jacques Pienaar813e8372016-05-20 03:21:37 +000052 return *RM;
53}
54
55LanaiTargetMachine::LanaiTargetMachine(const Target &T, const Triple &TT,
Jacques Pienaarfcef3e42016-03-28 13:09:54 +000056 StringRef Cpu, StringRef FeatureString,
57 const TargetOptions &Options,
Jacques Pienaar813e8372016-05-20 03:21:37 +000058 Optional<Reloc::Model> RM,
Jacques Pienaarfcef3e42016-03-28 13:09:54 +000059 CodeModel::Model CodeModel,
60 CodeGenOpt::Level OptLevel)
Jacques Pienaare2f06992016-07-15 22:38:32 +000061 : LLVMTargetMachine(T, computeDataLayout(), TT, Cpu, FeatureString, Options,
62 getEffectiveRelocModel(RM), CodeModel, OptLevel),
Jacques Pienaar813e8372016-05-20 03:21:37 +000063 Subtarget(TT, Cpu, FeatureString, *this, Options, CodeModel, OptLevel),
Jacques Pienaarfcef3e42016-03-28 13:09:54 +000064 TLOF(new LanaiTargetObjectFile()) {
65 initAsmInfo();
66}
67
68TargetIRAnalysis LanaiTargetMachine::getTargetIRAnalysis() {
69 return TargetIRAnalysis([this](const Function &F) {
70 return TargetTransformInfo(LanaiTTIImpl(this, F));
71 });
72}
73
74namespace {
75// Lanai Code Generator Pass Configuration Options.
76class LanaiPassConfig : public TargetPassConfig {
77public:
78 LanaiPassConfig(LanaiTargetMachine *TM, PassManagerBase *PassManager)
79 : TargetPassConfig(TM, *PassManager) {}
80
81 LanaiTargetMachine &getLanaiTargetMachine() const {
82 return getTM<LanaiTargetMachine>();
83 }
84
85 bool addInstSelector() override;
86 void addPreSched2() override;
87 void addPreEmitPass() override;
88};
89} // namespace
90
91TargetPassConfig *
92LanaiTargetMachine::createPassConfig(PassManagerBase &PassManager) {
93 return new LanaiPassConfig(this, &PassManager);
94}
95
96// Install an instruction selector pass.
97bool LanaiPassConfig::addInstSelector() {
98 addPass(createLanaiISelDag(getLanaiTargetMachine()));
99 return false;
100}
101
102// Implemented by targets that want to run passes immediately before
103// machine code is emitted.
104void LanaiPassConfig::addPreEmitPass() {
105 addPass(createLanaiDelaySlotFillerPass(getLanaiTargetMachine()));
106}
107
108// Run passes after prolog-epilog insertion and before the second instruction
109// scheduling pass.
110void LanaiPassConfig::addPreSched2() {
111 addPass(createLanaiMemAluCombinerPass());
Jacques Pienaarfcef3e42016-03-28 13:09:54 +0000112}