annotate lib/Target/Lanai/LanaiTargetMachine.cpp @ 145:9987f868744e

fix CbC_llvm
author mir3636
date Tue, 05 Jun 2018 21:59:34 +0900
parents 3a76565eade5
children c2174574ed3a
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
120
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
1 //===-- LanaiTargetMachine.cpp - Define TargetMachine for Lanai ---------===//
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
2 //
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
3 // The LLVM Compiler Infrastructure
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
4 //
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
5 // This file is distributed under the University of Illinois Open Source
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
6 // License. See LICENSE.TXT for details.
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
7 //
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
8 //===----------------------------------------------------------------------===//
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
9 //
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
10 // Implements the info about Lanai target spec.
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
11 //
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
12 //===----------------------------------------------------------------------===//
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
13
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
14 #include "LanaiTargetMachine.h"
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
15
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
16 #include "Lanai.h"
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
17 #include "LanaiTargetObjectFile.h"
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
18 #include "LanaiTargetTransformInfo.h"
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
19 #include "llvm/Analysis/TargetTransformInfo.h"
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
20 #include "llvm/CodeGen/Passes.h"
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
21 #include "llvm/CodeGen/TargetLoweringObjectFileImpl.h"
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
22 #include "llvm/CodeGen/TargetPassConfig.h"
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
23 #include "llvm/Support/FormattedStream.h"
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
24 #include "llvm/Support/TargetRegistry.h"
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
25 #include "llvm/Target/TargetOptions.h"
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
26
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
27 using namespace llvm;
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
28
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
29 namespace llvm {
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
30 void initializeLanaiMemAluCombinerPass(PassRegistry &);
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
31 } // namespace llvm
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
32
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
33 extern "C" void LLVMInitializeLanaiTarget() {
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
34 // Register the target.
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
35 RegisterTargetMachine<LanaiTargetMachine> registered_target(
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
36 getTheLanaiTarget());
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
37 }
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
38
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
39 static std::string computeDataLayout() {
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
40 // Data layout (keep in sync with clang/lib/Basic/Targets.cpp)
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
41 return "E" // Big endian
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
42 "-m:e" // ELF name manging
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
43 "-p:32:32" // 32-bit pointers, 32 bit aligned
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
44 "-i64:64" // 64 bit integers, 64 bit aligned
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
45 "-a:0:32" // 32 bit alignment of objects of aggregate type
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
46 "-n32" // 32 bit native integer width
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
47 "-S64"; // 64 bit natural stack alignment
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
48 }
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
49
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
50 static Reloc::Model getEffectiveRelocModel(Optional<Reloc::Model> RM) {
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
51 if (!RM.hasValue())
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
52 return Reloc::PIC_;
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
53 return *RM;
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
54 }
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
55
121
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
56 static CodeModel::Model getEffectiveCodeModel(Optional<CodeModel::Model> CM) {
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
57 if (CM)
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
58 return *CM;
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
59 return CodeModel::Medium;
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
60 }
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
61
120
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
62 LanaiTargetMachine::LanaiTargetMachine(const Target &T, const Triple &TT,
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
63 StringRef Cpu, StringRef FeatureString,
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
64 const TargetOptions &Options,
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
65 Optional<Reloc::Model> RM,
121
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
66 Optional<CodeModel::Model> CodeModel,
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
67 CodeGenOpt::Level OptLevel, bool JIT)
120
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
68 : LLVMTargetMachine(T, computeDataLayout(), TT, Cpu, FeatureString, Options,
121
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
69 getEffectiveRelocModel(RM),
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
70 getEffectiveCodeModel(CodeModel), OptLevel),
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
71 Subtarget(TT, Cpu, FeatureString, *this, Options, getCodeModel(),
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
72 OptLevel),
120
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
73 TLOF(new LanaiTargetObjectFile()) {
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
74 initAsmInfo();
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
75 }
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
76
134
3a76565eade5 update 5.0.1
mir3636
parents: 121
diff changeset
77 TargetTransformInfo
3a76565eade5 update 5.0.1
mir3636
parents: 121
diff changeset
78 LanaiTargetMachine::getTargetTransformInfo(const Function &F) {
3a76565eade5 update 5.0.1
mir3636
parents: 121
diff changeset
79 return TargetTransformInfo(LanaiTTIImpl(this, F));
120
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
80 }
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
81
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
82 namespace {
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
83 // Lanai Code Generator Pass Configuration Options.
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
84 class LanaiPassConfig : public TargetPassConfig {
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
85 public:
121
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
86 LanaiPassConfig(LanaiTargetMachine &TM, PassManagerBase *PassManager)
120
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
87 : TargetPassConfig(TM, *PassManager) {}
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
88
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
89 LanaiTargetMachine &getLanaiTargetMachine() const {
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
90 return getTM<LanaiTargetMachine>();
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
91 }
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
92
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
93 bool addInstSelector() override;
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
94 void addPreSched2() override;
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
95 void addPreEmitPass() override;
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
96 };
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
97 } // namespace
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
98
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
99 TargetPassConfig *
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
100 LanaiTargetMachine::createPassConfig(PassManagerBase &PassManager) {
121
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
101 return new LanaiPassConfig(*this, &PassManager);
120
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
102 }
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
103
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
104 // Install an instruction selector pass.
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
105 bool LanaiPassConfig::addInstSelector() {
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
106 addPass(createLanaiISelDag(getLanaiTargetMachine()));
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
107 return false;
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
108 }
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
109
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
110 // Implemented by targets that want to run passes immediately before
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
111 // machine code is emitted.
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
112 void LanaiPassConfig::addPreEmitPass() {
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
113 addPass(createLanaiDelaySlotFillerPass(getLanaiTargetMachine()));
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
114 }
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
115
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
116 // Run passes after prolog-epilog insertion and before the second instruction
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
117 // scheduling pass.
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
118 void LanaiPassConfig::addPreSched2() {
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
119 addPass(createLanaiMemAluCombinerPass());
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
120 }