blob: f89464826b3f89597ec1c8903470a2769b64c75e [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"
Matthias Braun31d19d42016-05-10 03:21:59 +000021#include "llvm/CodeGen/TargetPassConfig.h"
Jacques Pienaarfcef3e42016-03-28 13:09:54 +000022#include "llvm/CodeGen/TargetLoweringObjectFileImpl.h"
23#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 &);
31void initializeLanaiSetflagAluCombinerPass(PassRegistry &);
32} // namespace llvm
33
34extern "C" void LLVMInitializeLanaiTarget() {
35 // Register the target.
36 RegisterTargetMachine<LanaiTargetMachine> registered_target(TheLanaiTarget);
37}
38
39static std::string computeDataLayout(const Triple &TT) {
40 // 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
50LanaiTargetMachine::LanaiTargetMachine(const Target &TheTarget,
51 const Triple &TargetTriple,
52 StringRef Cpu, StringRef FeatureString,
53 const TargetOptions &Options,
54 Reloc::Model RelocationModel,
55 CodeModel::Model CodeModel,
56 CodeGenOpt::Level OptLevel)
57 : LLVMTargetMachine(TheTarget, computeDataLayout(TargetTriple),
58 TargetTriple, Cpu, FeatureString, Options,
59 RelocationModel, CodeModel, OptLevel),
60 Subtarget(TargetTriple, Cpu, FeatureString, *this, Options,
61 RelocationModel, CodeModel, OptLevel),
62 TLOF(new LanaiTargetObjectFile()) {
63 initAsmInfo();
64}
65
66TargetIRAnalysis LanaiTargetMachine::getTargetIRAnalysis() {
67 return TargetIRAnalysis([this](const Function &F) {
68 return TargetTransformInfo(LanaiTTIImpl(this, F));
69 });
70}
71
72namespace {
73// Lanai Code Generator Pass Configuration Options.
74class LanaiPassConfig : public TargetPassConfig {
75public:
76 LanaiPassConfig(LanaiTargetMachine *TM, PassManagerBase *PassManager)
77 : TargetPassConfig(TM, *PassManager) {}
78
79 LanaiTargetMachine &getLanaiTargetMachine() const {
80 return getTM<LanaiTargetMachine>();
81 }
82
83 bool addInstSelector() override;
84 void addPreSched2() override;
85 void addPreEmitPass() override;
86};
87} // namespace
88
89TargetPassConfig *
90LanaiTargetMachine::createPassConfig(PassManagerBase &PassManager) {
91 return new LanaiPassConfig(this, &PassManager);
92}
93
94// Install an instruction selector pass.
95bool LanaiPassConfig::addInstSelector() {
96 addPass(createLanaiISelDag(getLanaiTargetMachine()));
97 return false;
98}
99
100// Implemented by targets that want to run passes immediately before
101// machine code is emitted.
102void LanaiPassConfig::addPreEmitPass() {
103 addPass(createLanaiDelaySlotFillerPass(getLanaiTargetMachine()));
104}
105
106// Run passes after prolog-epilog insertion and before the second instruction
107// scheduling pass.
108void LanaiPassConfig::addPreSched2() {
109 addPass(createLanaiMemAluCombinerPass());
110 addPass(createLanaiSetflagAluCombinerPass());
111}