blob: 2a9bc25d7fadbfab1ab092abe4be445835493696 [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.
Mehdi Aminif42454b2016-10-09 23:00:34 +000035 RegisterTargetMachine<LanaiTargetMachine> registered_target(
36 getTheLanaiTarget());
Jacques Pienaarfcef3e42016-03-28 13:09:54 +000037}
38
Jacques Pienaare2f06992016-07-15 22:38:32 +000039static std::string computeDataLayout() {
Jacques Pienaarfcef3e42016-03-28 13:09:54 +000040 // Data layout (keep in sync with clang/lib/Basic/Targets.cpp)
41 return "E" // Big endian
42 "-m:e" // ELF name manging
43 "-p:32:32" // 32-bit pointers, 32 bit aligned
44 "-i64:64" // 64 bit integers, 64 bit aligned
45 "-a:0:32" // 32 bit alignment of objects of aggregate type
46 "-n32" // 32 bit native integer width
47 "-S64"; // 64 bit natural stack alignment
48}
49
Jacques Pienaare2f06992016-07-15 22:38:32 +000050static Reloc::Model getEffectiveRelocModel(Optional<Reloc::Model> RM) {
Jacques Pienaar813e8372016-05-20 03:21:37 +000051 if (!RM.hasValue())
Jacques Pienaar5ffdef52016-05-20 21:41:53 +000052 return Reloc::PIC_;
Jacques Pienaar813e8372016-05-20 03:21:37 +000053 return *RM;
54}
55
56LanaiTargetMachine::LanaiTargetMachine(const Target &T, const Triple &TT,
Jacques Pienaarfcef3e42016-03-28 13:09:54 +000057 StringRef Cpu, StringRef FeatureString,
58 const TargetOptions &Options,
Jacques Pienaar813e8372016-05-20 03:21:37 +000059 Optional<Reloc::Model> RM,
Jacques Pienaarfcef3e42016-03-28 13:09:54 +000060 CodeModel::Model CodeModel,
61 CodeGenOpt::Level OptLevel)
Jacques Pienaare2f06992016-07-15 22:38:32 +000062 : LLVMTargetMachine(T, computeDataLayout(), TT, Cpu, FeatureString, Options,
63 getEffectiveRelocModel(RM), CodeModel, OptLevel),
Jacques Pienaar813e8372016-05-20 03:21:37 +000064 Subtarget(TT, Cpu, FeatureString, *this, Options, CodeModel, OptLevel),
Jacques Pienaarfcef3e42016-03-28 13:09:54 +000065 TLOF(new LanaiTargetObjectFile()) {
66 initAsmInfo();
67}
68
69TargetIRAnalysis LanaiTargetMachine::getTargetIRAnalysis() {
70 return TargetIRAnalysis([this](const Function &F) {
71 return TargetTransformInfo(LanaiTTIImpl(this, F));
72 });
73}
74
75namespace {
76// Lanai Code Generator Pass Configuration Options.
77class LanaiPassConfig : public TargetPassConfig {
78public:
79 LanaiPassConfig(LanaiTargetMachine *TM, PassManagerBase *PassManager)
80 : TargetPassConfig(TM, *PassManager) {}
81
82 LanaiTargetMachine &getLanaiTargetMachine() const {
83 return getTM<LanaiTargetMachine>();
84 }
85
86 bool addInstSelector() override;
87 void addPreSched2() override;
88 void addPreEmitPass() override;
89};
90} // namespace
91
92TargetPassConfig *
93LanaiTargetMachine::createPassConfig(PassManagerBase &PassManager) {
94 return new LanaiPassConfig(this, &PassManager);
95}
96
97// Install an instruction selector pass.
98bool LanaiPassConfig::addInstSelector() {
99 addPass(createLanaiISelDag(getLanaiTargetMachine()));
100 return false;
101}
102
103// Implemented by targets that want to run passes immediately before
104// machine code is emitted.
105void LanaiPassConfig::addPreEmitPass() {
106 addPass(createLanaiDelaySlotFillerPass(getLanaiTargetMachine()));
107}
108
109// Run passes after prolog-epilog insertion and before the second instruction
110// scheduling pass.
111void LanaiPassConfig::addPreSched2() {
112 addPass(createLanaiMemAluCombinerPass());
Jacques Pienaarfcef3e42016-03-28 13:09:54 +0000113}