annotate lib/Target/Lanai/MCTargetDesc/LanaiMCTargetDesc.cpp @ 120:1172e4bd9c6f

update 4.0.0
author mir3636
date Fri, 25 Nov 2016 19:14:25 +0900
parents
children 803732b1fca8
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
120
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
1 //===-- LanaiMCTargetDesc.cpp - Lanai Target Descriptions -----------------===//
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 // This file provides Lanai specific target descriptions.
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 "LanaiMCTargetDesc.h"
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
15
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
16 #include "InstPrinter/LanaiInstPrinter.h"
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
17 #include "LanaiMCAsmInfo.h"
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
18 #include "llvm/MC/MCInstrAnalysis.h"
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
19 #include "llvm/MC/MCInstrInfo.h"
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
20 #include "llvm/MC/MCStreamer.h"
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
21 #include "llvm/MC/MCSubtargetInfo.h"
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
22 #include "llvm/Support/ErrorHandling.h"
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
23 #include "llvm/Support/TargetRegistry.h"
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
24
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
25 #define GET_INSTRINFO_MC_DESC
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
26 #include "LanaiGenInstrInfo.inc"
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
27
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
28 #define GET_SUBTARGETINFO_MC_DESC
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
29 #include "LanaiGenSubtargetInfo.inc"
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
30
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
31 #define GET_REGINFO_MC_DESC
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
32 #include "LanaiGenRegisterInfo.inc"
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
33
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
34 using namespace llvm;
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
35
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
36 static MCInstrInfo *createLanaiMCInstrInfo() {
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
37 MCInstrInfo *X = new MCInstrInfo();
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
38 InitLanaiMCInstrInfo(X);
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
39 return X;
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
40 }
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
41
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
42 static MCRegisterInfo *createLanaiMCRegisterInfo(const Triple & /*TT*/) {
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
43 MCRegisterInfo *X = new MCRegisterInfo();
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
44 InitLanaiMCRegisterInfo(X, Lanai::RCA, 0, 0, Lanai::PC);
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
45 return X;
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
46 }
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
47
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
48 static MCSubtargetInfo *
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
49 createLanaiMCSubtargetInfo(const Triple &TT, StringRef CPU, StringRef FS) {
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
50 std::string CPUName = CPU;
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
51 if (CPUName.empty())
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
52 CPUName = "generic";
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
53
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
54 return createLanaiMCSubtargetInfoImpl(TT, CPUName, FS);
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
55 }
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
56
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
57 static MCStreamer *createMCStreamer(const Triple &T, MCContext &Context,
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
58 MCAsmBackend &MAB, raw_pwrite_stream &OS,
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
59 MCCodeEmitter *Emitter, bool RelaxAll) {
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
60 if (!T.isOSBinFormatELF())
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
61 llvm_unreachable("OS not supported");
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
62
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
63 return createELFStreamer(Context, MAB, OS, Emitter, RelaxAll);
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
64 }
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
65
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
66 static MCInstPrinter *createLanaiMCInstPrinter(const Triple & /*T*/,
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
67 unsigned SyntaxVariant,
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
68 const MCAsmInfo &MAI,
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
69 const MCInstrInfo &MII,
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
70 const MCRegisterInfo &MRI) {
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
71 if (SyntaxVariant == 0)
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
72 return new LanaiInstPrinter(MAI, MII, MRI);
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
73 return 0;
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
74 }
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
75
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
76 static MCRelocationInfo *createLanaiElfRelocation(const Triple &TheTriple,
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
77 MCContext &Ctx) {
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
78 return createMCRelocationInfo(TheTriple, Ctx);
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
79 }
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
80
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
81 namespace {
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
82 class LanaiMCInstrAnalysis : public MCInstrAnalysis {
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
83 public:
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
84 explicit LanaiMCInstrAnalysis(const MCInstrInfo *Info)
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
85 : MCInstrAnalysis(Info) {}
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
86
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
87 bool evaluateBranch(const MCInst &Inst, uint64_t Addr, uint64_t Size,
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
88 uint64_t &Target) const override {
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
89 if (Inst.getNumOperands() == 0)
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
90 return false;
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
91
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
92 if (Info->get(Inst.getOpcode()).OpInfo[0].OperandType ==
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
93 MCOI::OPERAND_PCREL) {
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
94 int64_t Imm = Inst.getOperand(0).getImm();
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
95 Target = Addr + Size + Imm;
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
96 return true;
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
97 } else {
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
98 int64_t Imm = Inst.getOperand(0).getImm();
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
99
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
100 // Skip case where immediate is 0 as that occurs in file that isn't linked
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
101 // and the branch target inferred would be wrong.
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
102 if (Imm == 0)
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
103 return false;
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
104
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
105 Target = Imm;
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
106 return true;
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
107 }
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 } // end anonymous namespace
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
111
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
112 static MCInstrAnalysis *createLanaiInstrAnalysis(const MCInstrInfo *Info) {
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
113 return new LanaiMCInstrAnalysis(Info);
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 extern "C" void LLVMInitializeLanaiTargetMC() {
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
117 // Register the MC asm info.
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
118 RegisterMCAsmInfo<LanaiMCAsmInfo> X(getTheLanaiTarget());
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
119
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
120 // Register the MC instruction info.
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
121 TargetRegistry::RegisterMCInstrInfo(getTheLanaiTarget(),
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
122 createLanaiMCInstrInfo);
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
123
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
124 // Register the MC register info.
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
125 TargetRegistry::RegisterMCRegInfo(getTheLanaiTarget(),
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
126 createLanaiMCRegisterInfo);
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
127
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
128 // Register the MC subtarget info.
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
129 TargetRegistry::RegisterMCSubtargetInfo(getTheLanaiTarget(),
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
130 createLanaiMCSubtargetInfo);
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
131
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
132 // Register the MC code emitter
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
133 TargetRegistry::RegisterMCCodeEmitter(getTheLanaiTarget(),
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
134 llvm::createLanaiMCCodeEmitter);
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
135
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
136 // Register the ASM Backend
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
137 TargetRegistry::RegisterMCAsmBackend(getTheLanaiTarget(),
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
138 createLanaiAsmBackend);
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
139
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
140 // Register the MCInstPrinter.
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
141 TargetRegistry::RegisterMCInstPrinter(getTheLanaiTarget(),
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
142 createLanaiMCInstPrinter);
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
143
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
144 // Register the ELF streamer.
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
145 TargetRegistry::RegisterELFStreamer(getTheLanaiTarget(), createMCStreamer);
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
146
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
147 // Register the MC relocation info.
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
148 TargetRegistry::RegisterMCRelocationInfo(getTheLanaiTarget(),
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
149 createLanaiElfRelocation);
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
150
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
151 // Register the MC instruction analyzer.
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
152 TargetRegistry::RegisterMCInstrAnalysis(getTheLanaiTarget(),
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
153 createLanaiInstrAnalysis);
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
154 }