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