/src/keystone/llvm/lib/Target/Hexagon/MCTargetDesc/HexagonMCCodeEmitter.cpp
Line | Count | Source |
1 | | //===-- HexagonMCCodeEmitter.cpp - Hexagon Target Descriptions ------------===// |
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 | | #include "Hexagon.h" |
11 | | #include "MCTargetDesc/HexagonBaseInfo.h" |
12 | | #include "MCTargetDesc/HexagonFixupKinds.h" |
13 | | #include "MCTargetDesc/HexagonMCCodeEmitter.h" |
14 | | #include "MCTargetDesc/HexagonMCInstrInfo.h" |
15 | | #include "MCTargetDesc/HexagonMCTargetDesc.h" |
16 | | #include "llvm/MC/MCCodeEmitter.h" |
17 | | #include "llvm/MC/MCContext.h" |
18 | | #include "llvm/MC/MCExpr.h" |
19 | | #include "llvm/MC/MCInst.h" |
20 | | #include "llvm/MC/MCInstrInfo.h" |
21 | | #include "llvm/MC/MCRegisterInfo.h" |
22 | | #include "llvm/MC/MCSubtargetInfo.h" |
23 | | #include "llvm/Support/Debug.h" |
24 | | #include "llvm/Support/EndianStream.h" |
25 | | #include "llvm/Support/raw_ostream.h" |
26 | | |
27 | | #include <keystone/keystone.h> |
28 | | |
29 | | #define DEBUG_TYPE "mccodeemitter" |
30 | | |
31 | | using namespace llvm_ks; |
32 | | using namespace Hexagon; |
33 | | |
34 | | |
35 | | HexagonMCCodeEmitter::HexagonMCCodeEmitter(MCInstrInfo const &aMII, |
36 | | MCContext &aMCT) |
37 | 4.80k | : MCT(aMCT), MCII(aMII), Addend(new unsigned(0)), |
38 | 4.80k | Extended(new bool(false)), CurrentBundle(new MCInst const *) {} |
39 | | |
40 | | uint32_t HexagonMCCodeEmitter::parseBits(size_t Instruction, size_t Last, |
41 | | MCInst const &MCB, |
42 | 5.79k | MCInst const &MCI) const { |
43 | 5.79k | bool Duplex = HexagonMCInstrInfo::isDuplex(MCII, MCI); |
44 | 5.79k | if (Instruction == 0) { |
45 | 4.90k | if (HexagonMCInstrInfo::isInnerLoop(MCB)) { |
46 | 0 | assert(!Duplex); |
47 | 0 | assert(Instruction != Last); |
48 | 0 | return HexagonII::INST_PARSE_LOOP_END; |
49 | 0 | } |
50 | 4.90k | } |
51 | 5.79k | if (Instruction == 1) { |
52 | 867 | if (HexagonMCInstrInfo::isOuterLoop(MCB)) { |
53 | 0 | assert(!Duplex); |
54 | 0 | assert(Instruction != Last); |
55 | 0 | return HexagonII::INST_PARSE_LOOP_END; |
56 | 0 | } |
57 | 867 | } |
58 | 5.79k | if (Duplex) { |
59 | 17 | assert(Instruction == Last); |
60 | 17 | return HexagonII::INST_PARSE_DUPLEX; |
61 | 17 | } |
62 | 5.77k | if(Instruction == Last) |
63 | 4.88k | return HexagonII::INST_PARSE_PACKET_END; |
64 | 888 | return HexagonII::INST_PARSE_NOT_END; |
65 | 5.77k | } |
66 | | |
67 | | void HexagonMCCodeEmitter::encodeInstruction(MCInst &MI, raw_ostream &OS, |
68 | | SmallVectorImpl<MCFixup> &Fixups, |
69 | | MCSubtargetInfo const &STI, |
70 | | unsigned int &KsError) const |
71 | 4.90k | { |
72 | 4.90k | KsError = 0; |
73 | 4.90k | MCInst &HMB = const_cast<MCInst &>(MI); |
74 | | |
75 | 4.90k | assert(HexagonMCInstrInfo::isBundle(HMB)); |
76 | 4.90k | DEBUG(dbgs() << "Encoding bundle\n";); |
77 | 4.90k | *Addend = 0; |
78 | 4.90k | *Extended = false; |
79 | 4.90k | *CurrentBundle = &MI; |
80 | 4.90k | size_t Instruction = 0; |
81 | 4.90k | size_t Last = HexagonMCInstrInfo::bundleSize(HMB) - 1; |
82 | 5.79k | for (auto &I : HexagonMCInstrInfo::bundleInstructions(HMB)) { |
83 | 5.79k | MCInst &HMI = const_cast<MCInst &>(*I.getInst()); |
84 | 5.79k | setError(0); |
85 | 5.79k | EncodeSingleInstruction(HMI, OS, Fixups, STI, |
86 | 5.79k | parseBits(Instruction, Last, HMB, HMI), |
87 | 5.79k | Instruction); |
88 | 5.79k | if (getError()) { |
89 | 198 | KsError = getError(); |
90 | 198 | return; |
91 | 198 | } |
92 | 5.59k | *Extended = HexagonMCInstrInfo::isImmext(HMI); |
93 | 5.59k | *Addend += HEXAGON_INSTR_SIZE; |
94 | 5.59k | ++Instruction; |
95 | 5.59k | } |
96 | 4.70k | return; |
97 | 4.90k | } |
98 | | |
99 | | /// EncodeSingleInstruction - Emit a single |
100 | | void HexagonMCCodeEmitter::EncodeSingleInstruction( |
101 | | const MCInst &MI, raw_ostream &OS, SmallVectorImpl<MCFixup> &Fixups, |
102 | | const MCSubtargetInfo &STI, uint32_t Parse, size_t Index) const |
103 | 5.79k | { |
104 | 5.79k | MCInst HMB = MI; |
105 | 5.79k | assert(!HexagonMCInstrInfo::isBundle(HMB)); |
106 | 5.79k | uint64_t Binary; |
107 | | |
108 | | // Compound instructions are limited to using registers 0-7 and 16-23 |
109 | | // and here we make a map 16-23 to 8-15 so they can be correctly encoded. |
110 | 5.79k | static unsigned RegMap[8] = {Hexagon::R8, Hexagon::R9, Hexagon::R10, |
111 | 5.79k | Hexagon::R11, Hexagon::R12, Hexagon::R13, |
112 | 5.79k | Hexagon::R14, Hexagon::R15}; |
113 | | |
114 | | // Pseudo instructions don't get encoded and shouldn't be here |
115 | | // in the first place! |
116 | 5.79k | assert(!HexagonMCInstrInfo::getDesc(MCII, HMB).isPseudo() && |
117 | 5.79k | "pseudo-instruction found"); |
118 | 5.79k | DEBUG(dbgs() << "Encoding insn" |
119 | 5.79k | " `" << HexagonMCInstrInfo::getName(MCII, HMB) << "'" |
120 | 5.79k | "\n"); |
121 | | |
122 | 5.79k | if (llvm_ks::HexagonMCInstrInfo::getType(MCII, HMB) == HexagonII::TypeCOMPOUND) { |
123 | 8 | for (unsigned i = 0; i < HMB.getNumOperands(); ++i) |
124 | 6 | if (HMB.getOperand(i).isReg()) { |
125 | 4 | unsigned Reg = |
126 | 4 | MCT.getRegisterInfo()->getEncodingValue(HMB.getOperand(i).getReg()); |
127 | 4 | if ((Reg <= 23) && (Reg >= 16)) |
128 | 0 | HMB.getOperand(i).setReg(RegMap[Reg - 16]); |
129 | 4 | } |
130 | 2 | } |
131 | | |
132 | 5.79k | if (HexagonMCInstrInfo::isNewValue(MCII, HMB)) { |
133 | | // Calculate the new value distance to the associated producer |
134 | 0 | MCOperand &MCO = |
135 | 0 | HMB.getOperand(HexagonMCInstrInfo::getNewValueOp(MCII, HMB)); |
136 | 0 | unsigned SOffset = 0; |
137 | 0 | unsigned Register = MCO.getReg(); |
138 | 0 | unsigned Register1; |
139 | 0 | auto Instructions = HexagonMCInstrInfo::bundleInstructions(**CurrentBundle); |
140 | 0 | auto i = Instructions.begin() + Index - 1; |
141 | 0 | for (;; --i) { |
142 | 0 | assert(i != Instructions.begin() - 1 && "Couldn't find producer"); |
143 | 0 | MCInst const &Inst = *i->getInst(); |
144 | 0 | if (HexagonMCInstrInfo::isImmext(Inst)) |
145 | 0 | continue; |
146 | 0 | ++SOffset; |
147 | 0 | Register1 = |
148 | 0 | HexagonMCInstrInfo::hasNewValue(MCII, Inst) |
149 | 0 | ? HexagonMCInstrInfo::getNewValueOperand(MCII, Inst).getReg() |
150 | 0 | : static_cast<unsigned>(Hexagon::NoRegister); |
151 | 0 | if (Register != Register1) |
152 | | // This isn't the register we're looking for |
153 | 0 | continue; |
154 | 0 | if (!HexagonMCInstrInfo::isPredicated(MCII, Inst)) |
155 | | // Producer is unpredicated |
156 | 0 | break; |
157 | 0 | assert(HexagonMCInstrInfo::isPredicated(MCII, HMB) && |
158 | 0 | "Unpredicated consumer depending on predicated producer"); |
159 | 0 | if (HexagonMCInstrInfo::isPredicatedTrue(MCII, Inst) == |
160 | 0 | HexagonMCInstrInfo::isPredicatedTrue(MCII, HMB)) |
161 | | // Producer predicate sense matched ours |
162 | 0 | break; |
163 | 0 | } |
164 | | // Hexagon PRM 10.11 Construct Nt from distance |
165 | 0 | unsigned Offset = SOffset; |
166 | 0 | Offset <<= 1; |
167 | 0 | MCO.setReg(Offset + Hexagon::R0); |
168 | 0 | } |
169 | | |
170 | 5.79k | Binary = getBinaryCodeForInstr(HMB, Fixups, STI); |
171 | 5.79k | if (getError()) { |
172 | 198 | return; |
173 | 198 | } |
174 | | |
175 | | // Check for unimplemented instructions. Immediate extenders |
176 | | // are encoded as zero, so they need to be accounted for. |
177 | 5.59k | if ((!Binary) && |
178 | 416 | ((HMB.getOpcode() != DuplexIClass0) && (HMB.getOpcode() != A4_ext) && |
179 | 355 | (HMB.getOpcode() != A4_ext_b) && (HMB.getOpcode() != A4_ext_c) && |
180 | 0 | (HMB.getOpcode() != A4_ext_g))) { |
181 | | // Use a A2_nop for unimplemented instructions. |
182 | 0 | DEBUG(dbgs() << "Unimplemented inst: " |
183 | 0 | " `" << HexagonMCInstrInfo::getName(MCII, HMB) << "'" |
184 | 0 | "\n"); |
185 | 0 | llvm_unreachable("Unimplemented Instruction"); |
186 | 0 | } |
187 | 5.59k | Binary |= Parse; |
188 | | |
189 | | // if we need to emit a duplexed instruction |
190 | 5.59k | if (HMB.getOpcode() >= Hexagon::DuplexIClass0 && |
191 | 3.01k | HMB.getOpcode() <= Hexagon::DuplexIClassF) { |
192 | 17 | assert(Parse == HexagonII::INST_PARSE_DUPLEX && |
193 | 17 | "Emitting duplex without duplex parse bits"); |
194 | 17 | unsigned dupIClass; |
195 | 17 | switch (HMB.getOpcode()) { |
196 | 0 | case Hexagon::DuplexIClass0: |
197 | 0 | dupIClass = 0; |
198 | 0 | break; |
199 | 0 | case Hexagon::DuplexIClass1: |
200 | 0 | dupIClass = 1; |
201 | 0 | break; |
202 | 0 | case Hexagon::DuplexIClass2: |
203 | 0 | dupIClass = 2; |
204 | 0 | break; |
205 | 17 | case Hexagon::DuplexIClass3: |
206 | 17 | dupIClass = 3; |
207 | 17 | break; |
208 | 0 | case Hexagon::DuplexIClass4: |
209 | 0 | dupIClass = 4; |
210 | 0 | break; |
211 | 0 | case Hexagon::DuplexIClass5: |
212 | 0 | dupIClass = 5; |
213 | 0 | break; |
214 | 0 | case Hexagon::DuplexIClass6: |
215 | 0 | dupIClass = 6; |
216 | 0 | break; |
217 | 0 | case Hexagon::DuplexIClass7: |
218 | 0 | dupIClass = 7; |
219 | 0 | break; |
220 | 0 | case Hexagon::DuplexIClass8: |
221 | 0 | dupIClass = 8; |
222 | 0 | break; |
223 | 0 | case Hexagon::DuplexIClass9: |
224 | 0 | dupIClass = 9; |
225 | 0 | break; |
226 | 0 | case Hexagon::DuplexIClassA: |
227 | 0 | dupIClass = 10; |
228 | 0 | break; |
229 | 0 | case Hexagon::DuplexIClassB: |
230 | 0 | dupIClass = 11; |
231 | 0 | break; |
232 | 0 | case Hexagon::DuplexIClassC: |
233 | 0 | dupIClass = 12; |
234 | 0 | break; |
235 | 0 | case Hexagon::DuplexIClassD: |
236 | 0 | dupIClass = 13; |
237 | 0 | break; |
238 | 0 | case Hexagon::DuplexIClassE: |
239 | 0 | dupIClass = 14; |
240 | 0 | break; |
241 | 0 | case Hexagon::DuplexIClassF: |
242 | 0 | dupIClass = 15; |
243 | 0 | break; |
244 | 0 | default: |
245 | 0 | llvm_unreachable("Unimplemented DuplexIClass"); |
246 | 0 | break; |
247 | 17 | } |
248 | | // 29 is the bit position. |
249 | | // 0b1110 =0xE bits are masked off and down shifted by 1 bit. |
250 | | // Last bit is moved to bit position 13 |
251 | 17 | Binary = ((dupIClass & 0xE) << (29 - 1)) | ((dupIClass & 0x1) << 13); |
252 | | |
253 | 17 | const MCInst *subInst0 = HMB.getOperand(0).getInst(); |
254 | 17 | const MCInst *subInst1 = HMB.getOperand(1).getInst(); |
255 | | |
256 | | // get subinstruction slot 0 |
257 | 17 | unsigned subInstSlot0Bits = getBinaryCodeForInstr(*subInst0, Fixups, STI); |
258 | 17 | if (getError()) { |
259 | 0 | return; |
260 | 0 | } |
261 | | // get subinstruction slot 1 |
262 | 17 | unsigned subInstSlot1Bits = getBinaryCodeForInstr(*subInst1, Fixups, STI); |
263 | 17 | if (getError()) { |
264 | 0 | return; |
265 | 0 | } |
266 | | |
267 | 17 | Binary |= subInstSlot0Bits | (subInstSlot1Bits << 16); |
268 | 17 | } |
269 | 5.59k | support::endian::Writer<support::little>(OS).write<uint32_t>(Binary); |
270 | 5.59k | } |
271 | | |
272 | | static Hexagon::Fixups getFixupNoBits(MCInstrInfo const &MCII, const MCInst &MI, |
273 | | const MCOperand &MO, |
274 | 493 | const MCSymbolRefExpr::VariantKind kind) { |
275 | 493 | const MCInstrDesc &MCID = HexagonMCInstrInfo::getDesc(MCII, MI); |
276 | 493 | unsigned insnType = llvm_ks::HexagonMCInstrInfo::getType(MCII, MI); |
277 | | |
278 | 493 | if (insnType == HexagonII::TypePREFIX) { |
279 | 434 | switch (kind) { |
280 | 357 | case llvm_ks::MCSymbolRefExpr::VK_GOTOFF: |
281 | 357 | return Hexagon::fixup_Hexagon_GOTREL_32_6_X; |
282 | 9 | case llvm_ks::MCSymbolRefExpr::VK_GOT: |
283 | 9 | return Hexagon::fixup_Hexagon_GOT_32_6_X; |
284 | 0 | case llvm_ks::MCSymbolRefExpr::VK_TPREL: |
285 | 0 | return Hexagon::fixup_Hexagon_TPREL_32_6_X; |
286 | 0 | case llvm_ks::MCSymbolRefExpr::VK_DTPREL: |
287 | 0 | return Hexagon::fixup_Hexagon_DTPREL_32_6_X; |
288 | 0 | case llvm_ks::MCSymbolRefExpr::VK_Hexagon_GD_GOT: |
289 | 0 | return Hexagon::fixup_Hexagon_GD_GOT_32_6_X; |
290 | 0 | case llvm_ks::MCSymbolRefExpr::VK_Hexagon_LD_GOT: |
291 | 0 | return Hexagon::fixup_Hexagon_LD_GOT_32_6_X; |
292 | 0 | case llvm_ks::MCSymbolRefExpr::VK_Hexagon_IE: |
293 | 0 | return Hexagon::fixup_Hexagon_IE_32_6_X; |
294 | 0 | case llvm_ks::MCSymbolRefExpr::VK_Hexagon_IE_GOT: |
295 | 0 | return Hexagon::fixup_Hexagon_IE_GOT_32_6_X; |
296 | 68 | default: |
297 | 68 | if (MCID.isBranch()) |
298 | 14 | return Hexagon::fixup_Hexagon_B32_PCREL_X; |
299 | 54 | else |
300 | 54 | return Hexagon::fixup_Hexagon_32_6_X; |
301 | 434 | } |
302 | 434 | } else if (MCID.isBranch()) |
303 | 0 | return (Hexagon::fixup_Hexagon_B13_PCREL); |
304 | | |
305 | 59 | switch (MCID.getOpcode()) { |
306 | 0 | case Hexagon::HI: |
307 | 12 | case Hexagon::A2_tfrih: |
308 | 12 | switch (kind) { |
309 | 9 | case llvm_ks::MCSymbolRefExpr::VK_GOT: |
310 | 9 | return Hexagon::fixup_Hexagon_GOT_HI16; |
311 | 0 | case llvm_ks::MCSymbolRefExpr::VK_GOTOFF: |
312 | 0 | return Hexagon::fixup_Hexagon_GOTREL_HI16; |
313 | 0 | case llvm_ks::MCSymbolRefExpr::VK_Hexagon_GD_GOT: |
314 | 0 | return Hexagon::fixup_Hexagon_GD_GOT_HI16; |
315 | 0 | case llvm_ks::MCSymbolRefExpr::VK_Hexagon_LD_GOT: |
316 | 0 | return Hexagon::fixup_Hexagon_LD_GOT_HI16; |
317 | 0 | case llvm_ks::MCSymbolRefExpr::VK_Hexagon_IE: |
318 | 0 | return Hexagon::fixup_Hexagon_IE_HI16; |
319 | 0 | case llvm_ks::MCSymbolRefExpr::VK_Hexagon_IE_GOT: |
320 | 0 | return Hexagon::fixup_Hexagon_IE_GOT_HI16; |
321 | 0 | case llvm_ks::MCSymbolRefExpr::VK_TPREL: |
322 | 0 | return Hexagon::fixup_Hexagon_TPREL_HI16; |
323 | 0 | case llvm_ks::MCSymbolRefExpr::VK_DTPREL: |
324 | 0 | return Hexagon::fixup_Hexagon_DTPREL_HI16; |
325 | 3 | default: |
326 | 3 | return Hexagon::fixup_Hexagon_HI16; |
327 | 12 | } |
328 | | |
329 | 0 | case Hexagon::LO: |
330 | 47 | case Hexagon::A2_tfril: |
331 | 47 | switch (kind) { |
332 | 4 | case llvm_ks::MCSymbolRefExpr::VK_GOT: |
333 | 4 | return Hexagon::fixup_Hexagon_GOT_LO16; |
334 | 30 | case llvm_ks::MCSymbolRefExpr::VK_GOTOFF: |
335 | 30 | return Hexagon::fixup_Hexagon_GOTREL_LO16; |
336 | 0 | case llvm_ks::MCSymbolRefExpr::VK_Hexagon_GD_GOT: |
337 | 0 | return Hexagon::fixup_Hexagon_GD_GOT_LO16; |
338 | 0 | case llvm_ks::MCSymbolRefExpr::VK_Hexagon_LD_GOT: |
339 | 0 | return Hexagon::fixup_Hexagon_LD_GOT_LO16; |
340 | 0 | case llvm_ks::MCSymbolRefExpr::VK_Hexagon_IE: |
341 | 0 | return Hexagon::fixup_Hexagon_IE_LO16; |
342 | 0 | case llvm_ks::MCSymbolRefExpr::VK_Hexagon_IE_GOT: |
343 | 0 | return Hexagon::fixup_Hexagon_IE_GOT_LO16; |
344 | 0 | case llvm_ks::MCSymbolRefExpr::VK_TPREL: |
345 | 0 | return Hexagon::fixup_Hexagon_TPREL_LO16; |
346 | 0 | case llvm_ks::MCSymbolRefExpr::VK_DTPREL: |
347 | 0 | return Hexagon::fixup_Hexagon_DTPREL_LO16; |
348 | 13 | default: |
349 | 13 | return Hexagon::fixup_Hexagon_LO16; |
350 | 47 | } |
351 | | |
352 | | // The only relocs left should be GP relative: |
353 | 0 | default: |
354 | 0 | if (MCID.mayStore() || MCID.mayLoad()) { |
355 | 0 | for (const MCPhysReg *ImpUses = MCID.getImplicitUses(); |
356 | 0 | ImpUses && *ImpUses; ++ImpUses) { |
357 | 0 | if (*ImpUses != Hexagon::GP) |
358 | 0 | continue; |
359 | 0 | switch (HexagonMCInstrInfo::getAccessSize(MCII, MI)) { |
360 | 0 | case HexagonII::MemAccessSize::ByteAccess: |
361 | 0 | return fixup_Hexagon_GPREL16_0; |
362 | 0 | case HexagonII::MemAccessSize::HalfWordAccess: |
363 | 0 | return fixup_Hexagon_GPREL16_1; |
364 | 0 | case HexagonII::MemAccessSize::WordAccess: |
365 | 0 | return fixup_Hexagon_GPREL16_2; |
366 | 0 | case HexagonII::MemAccessSize::DoubleWordAccess: |
367 | 0 | return fixup_Hexagon_GPREL16_3; |
368 | 0 | default: |
369 | 0 | llvm_unreachable("unhandled fixup"); |
370 | 0 | } |
371 | 0 | } |
372 | 0 | } else |
373 | 0 | llvm_unreachable("unhandled fixup"); |
374 | 59 | } |
375 | | |
376 | 0 | return LastTargetFixupKind; |
377 | 59 | } |
378 | | |
379 | | namespace llvm_ks { |
380 | | extern const MCInstrDesc HexagonInsts[]; |
381 | | } |
382 | | |
383 | | namespace { |
384 | 434 | bool isPCRel (unsigned Kind) { |
385 | 434 | switch(Kind){ |
386 | 0 | case fixup_Hexagon_B22_PCREL: |
387 | 0 | case fixup_Hexagon_B15_PCREL: |
388 | 0 | case fixup_Hexagon_B7_PCREL: |
389 | 0 | case fixup_Hexagon_B13_PCREL: |
390 | 0 | case fixup_Hexagon_B9_PCREL: |
391 | 0 | case fixup_Hexagon_B32_PCREL_X: |
392 | 202 | case fixup_Hexagon_B22_PCREL_X: |
393 | 204 | case fixup_Hexagon_B15_PCREL_X: |
394 | 204 | case fixup_Hexagon_B13_PCREL_X: |
395 | 204 | case fixup_Hexagon_B9_PCREL_X: |
396 | 210 | case fixup_Hexagon_B7_PCREL_X: |
397 | 210 | case fixup_Hexagon_32_PCREL: |
398 | 210 | case fixup_Hexagon_PLT_B22_PCREL: |
399 | 210 | case fixup_Hexagon_GD_PLT_B22_PCREL: |
400 | 210 | case fixup_Hexagon_LD_PLT_B22_PCREL: |
401 | 210 | case fixup_Hexagon_6_PCREL_X: |
402 | 210 | return true; |
403 | 224 | default: |
404 | 224 | return false; |
405 | 434 | } |
406 | 434 | } |
407 | | } |
408 | | |
409 | | unsigned HexagonMCCodeEmitter::getExprOpValue(const MCInst &MI, |
410 | | const MCOperand &MO, |
411 | | const MCExpr *ME, |
412 | | SmallVectorImpl<MCFixup> &Fixups, |
413 | | const MCSubtargetInfo &STI) const |
414 | | |
415 | 7.94k | { |
416 | 7.94k | int64_t Res; |
417 | | |
418 | 7.94k | if (getError()) |
419 | 129 | return 0; |
420 | | |
421 | 7.81k | if (ME->evaluateAsAbsolute(Res)) |
422 | 3.61k | return Res; |
423 | | |
424 | 4.20k | MCExpr::ExprKind MK = ME->getKind(); |
425 | 4.20k | if (MK == MCExpr::Constant) { |
426 | 0 | return cast<MCConstantExpr>(ME)->getValue(); |
427 | 0 | } |
428 | 4.20k | if (MK == MCExpr::Binary) { |
429 | 1.64k | getExprOpValue(MI, MO, cast<MCBinaryExpr>(ME)->getLHS(), Fixups, STI); |
430 | 1.64k | getExprOpValue(MI, MO, cast<MCBinaryExpr>(ME)->getRHS(), Fixups, STI); |
431 | 1.64k | return 0; |
432 | 1.64k | } |
433 | | |
434 | | //assert(MK == MCExpr::SymbolRef); |
435 | 2.56k | if (MK == MCExpr::SymbolRef) { |
436 | 198 | setError(KS_ERR_ASM_INVALIDOPERAND); |
437 | 198 | return 0; |
438 | 198 | } |
439 | | |
440 | 2.36k | Hexagon::Fixups FixupKind = |
441 | 2.36k | Hexagon::Fixups(Hexagon::fixup_Hexagon_TPREL_LO16); |
442 | 2.36k | const MCSymbolRefExpr *MCSRE = static_cast<const MCSymbolRefExpr *>(ME); |
443 | 2.36k | const MCInstrDesc &MCID = HexagonMCInstrInfo::getDesc(MCII, MI); |
444 | 2.36k | unsigned bits = HexagonMCInstrInfo::getExtentBits(MCII, MI) - |
445 | 2.36k | HexagonMCInstrInfo::getExtentAlignment(MCII, MI); |
446 | 2.36k | const MCSymbolRefExpr::VariantKind kind = MCSRE->getKind(); |
447 | | |
448 | 2.36k | DEBUG(dbgs() << "----------------------------------------\n"); |
449 | 2.36k | DEBUG(dbgs() << "Opcode Name: " << HexagonMCInstrInfo::getName(MCII, MI) |
450 | 2.36k | << "\n"); |
451 | 2.36k | DEBUG(dbgs() << "Opcode: " << MCID.getOpcode() << "\n"); |
452 | 2.36k | DEBUG(dbgs() << "Relocation bits: " << bits << "\n"); |
453 | 2.36k | DEBUG(dbgs() << "Addend: " << *Addend << "\n"); |
454 | 2.36k | DEBUG(dbgs() << "----------------------------------------\n"); |
455 | | |
456 | 2.36k | switch (bits) { |
457 | 0 | default: |
458 | 0 | DEBUG(dbgs() << "unrecognized bit count of " << bits << '\n'); |
459 | 0 | break; |
460 | | |
461 | 0 | case 32: |
462 | 0 | switch (kind) { |
463 | 0 | case llvm_ks::MCSymbolRefExpr::VK_Hexagon_PCREL: |
464 | 0 | FixupKind = Hexagon::fixup_Hexagon_32_PCREL; |
465 | 0 | break; |
466 | 0 | case llvm_ks::MCSymbolRefExpr::VK_GOT: |
467 | 0 | FixupKind = *Extended ? Hexagon::fixup_Hexagon_GOT_32_6_X |
468 | 0 | : Hexagon::fixup_Hexagon_GOT_32; |
469 | 0 | break; |
470 | 0 | case llvm_ks::MCSymbolRefExpr::VK_GOTOFF: |
471 | 0 | FixupKind = *Extended ? Hexagon::fixup_Hexagon_GOTREL_32_6_X |
472 | 0 | : Hexagon::fixup_Hexagon_GOTREL_32; |
473 | 0 | break; |
474 | 0 | case llvm_ks::MCSymbolRefExpr::VK_Hexagon_GD_GOT: |
475 | 0 | FixupKind = *Extended ? Hexagon::fixup_Hexagon_GD_GOT_32_6_X |
476 | 0 | : Hexagon::fixup_Hexagon_GD_GOT_32; |
477 | 0 | break; |
478 | 0 | case llvm_ks::MCSymbolRefExpr::VK_Hexagon_LD_GOT: |
479 | 0 | FixupKind = *Extended ? Hexagon::fixup_Hexagon_LD_GOT_32_6_X |
480 | 0 | : Hexagon::fixup_Hexagon_LD_GOT_32; |
481 | 0 | break; |
482 | 0 | case llvm_ks::MCSymbolRefExpr::VK_Hexagon_IE: |
483 | 0 | FixupKind = *Extended ? Hexagon::fixup_Hexagon_IE_32_6_X |
484 | 0 | : Hexagon::fixup_Hexagon_IE_32; |
485 | 0 | break; |
486 | 0 | case llvm_ks::MCSymbolRefExpr::VK_Hexagon_IE_GOT: |
487 | 0 | FixupKind = *Extended ? Hexagon::fixup_Hexagon_IE_GOT_32_6_X |
488 | 0 | : Hexagon::fixup_Hexagon_IE_GOT_32; |
489 | 0 | break; |
490 | 0 | case llvm_ks::MCSymbolRefExpr::VK_TPREL: |
491 | 0 | FixupKind = *Extended ? Hexagon::fixup_Hexagon_TPREL_32_6_X |
492 | 0 | : Hexagon::fixup_Hexagon_TPREL_32; |
493 | 0 | break; |
494 | 0 | case llvm_ks::MCSymbolRefExpr::VK_DTPREL: |
495 | 0 | FixupKind = *Extended ? Hexagon::fixup_Hexagon_DTPREL_32_6_X |
496 | 0 | : Hexagon::fixup_Hexagon_DTPREL_32; |
497 | 0 | break; |
498 | 0 | default: |
499 | 0 | FixupKind = |
500 | 0 | *Extended ? Hexagon::fixup_Hexagon_32_6_X : Hexagon::fixup_Hexagon_32; |
501 | 0 | break; |
502 | 0 | } |
503 | 0 | break; |
504 | | |
505 | 1.58k | case 22: |
506 | 1.58k | switch (kind) { |
507 | 0 | case llvm_ks::MCSymbolRefExpr::VK_Hexagon_GD_PLT: |
508 | 0 | FixupKind = Hexagon::fixup_Hexagon_GD_PLT_B22_PCREL; |
509 | 0 | break; |
510 | 0 | case llvm_ks::MCSymbolRefExpr::VK_Hexagon_LD_PLT: |
511 | 0 | FixupKind = Hexagon::fixup_Hexagon_LD_PLT_B22_PCREL; |
512 | 0 | break; |
513 | 1.58k | default: |
514 | 1.58k | if (MCID.isBranch() || MCID.isCall()) { |
515 | 1.58k | FixupKind = *Extended ? Hexagon::fixup_Hexagon_B22_PCREL_X |
516 | 1.58k | : Hexagon::fixup_Hexagon_B22_PCREL; |
517 | 1.58k | } else { |
518 | 0 | errs() << "unrecognized relocation, bits: " << bits << "\n"; |
519 | 0 | errs() << "name = " << HexagonMCInstrInfo::getName(MCII, MI) << "\n"; |
520 | 0 | } |
521 | 1.58k | break; |
522 | 1.58k | } |
523 | 1.58k | break; |
524 | | |
525 | 1.58k | case 16: |
526 | 204 | if (*Extended) { |
527 | 204 | switch (kind) { |
528 | 42 | default: |
529 | 42 | FixupKind = Hexagon::fixup_Hexagon_16_X; |
530 | 42 | break; |
531 | 6 | case llvm_ks::MCSymbolRefExpr::VK_GOT: |
532 | 6 | FixupKind = Hexagon::fixup_Hexagon_GOT_16_X; |
533 | 6 | break; |
534 | 156 | case llvm_ks::MCSymbolRefExpr::VK_GOTOFF: |
535 | 156 | FixupKind = Hexagon::fixup_Hexagon_GOTREL_16_X; |
536 | 156 | break; |
537 | 0 | case llvm_ks::MCSymbolRefExpr::VK_Hexagon_GD_GOT: |
538 | 0 | FixupKind = Hexagon::fixup_Hexagon_GD_GOT_16_X; |
539 | 0 | break; |
540 | 0 | case llvm_ks::MCSymbolRefExpr::VK_Hexagon_LD_GOT: |
541 | 0 | FixupKind = Hexagon::fixup_Hexagon_LD_GOT_16_X; |
542 | 0 | break; |
543 | 0 | case llvm_ks::MCSymbolRefExpr::VK_Hexagon_IE: |
544 | 0 | FixupKind = Hexagon::fixup_Hexagon_IE_16_X; |
545 | 0 | break; |
546 | 0 | case llvm_ks::MCSymbolRefExpr::VK_Hexagon_IE_GOT: |
547 | 0 | FixupKind = Hexagon::fixup_Hexagon_IE_GOT_16_X; |
548 | 0 | break; |
549 | 0 | case llvm_ks::MCSymbolRefExpr::VK_TPREL: |
550 | 0 | FixupKind = Hexagon::fixup_Hexagon_TPREL_16_X; |
551 | 0 | break; |
552 | 0 | case llvm_ks::MCSymbolRefExpr::VK_DTPREL: |
553 | 0 | FixupKind = Hexagon::fixup_Hexagon_DTPREL_16_X; |
554 | 0 | break; |
555 | 204 | } |
556 | 204 | } else |
557 | 0 | switch (kind) { |
558 | 0 | default: |
559 | 0 | errs() << "unrecognized relocation, bits " << bits << "\n"; |
560 | 0 | errs() << "name = " << HexagonMCInstrInfo::getName(MCII, MI) << "\n"; |
561 | 0 | break; |
562 | 0 | case llvm_ks::MCSymbolRefExpr::VK_GOTOFF: |
563 | 0 | if ((MCID.getOpcode() == Hexagon::HI) || |
564 | 0 | (MCID.getOpcode() == Hexagon::LO_H)) |
565 | 0 | FixupKind = Hexagon::fixup_Hexagon_GOTREL_HI16; |
566 | 0 | else |
567 | 0 | FixupKind = Hexagon::fixup_Hexagon_GOTREL_LO16; |
568 | 0 | break; |
569 | 0 | case llvm_ks::MCSymbolRefExpr::VK_Hexagon_GPREL: |
570 | 0 | FixupKind = Hexagon::fixup_Hexagon_GPREL16_0; |
571 | 0 | break; |
572 | 0 | case llvm_ks::MCSymbolRefExpr::VK_Hexagon_LO16: |
573 | 0 | FixupKind = Hexagon::fixup_Hexagon_LO16; |
574 | 0 | break; |
575 | 0 | case llvm_ks::MCSymbolRefExpr::VK_Hexagon_HI16: |
576 | 0 | FixupKind = Hexagon::fixup_Hexagon_HI16; |
577 | 0 | break; |
578 | 0 | case llvm_ks::MCSymbolRefExpr::VK_Hexagon_GD_GOT: |
579 | 0 | FixupKind = Hexagon::fixup_Hexagon_GD_GOT_16; |
580 | 0 | break; |
581 | 0 | case llvm_ks::MCSymbolRefExpr::VK_Hexagon_LD_GOT: |
582 | 0 | FixupKind = Hexagon::fixup_Hexagon_LD_GOT_16; |
583 | 0 | break; |
584 | 0 | case llvm_ks::MCSymbolRefExpr::VK_Hexagon_IE_GOT: |
585 | 0 | FixupKind = Hexagon::fixup_Hexagon_IE_GOT_16; |
586 | 0 | break; |
587 | 0 | case llvm_ks::MCSymbolRefExpr::VK_TPREL: |
588 | 0 | FixupKind = Hexagon::fixup_Hexagon_TPREL_16; |
589 | 0 | break; |
590 | 0 | case llvm_ks::MCSymbolRefExpr::VK_DTPREL: |
591 | 0 | FixupKind = Hexagon::fixup_Hexagon_DTPREL_16; |
592 | 0 | break; |
593 | 0 | } |
594 | 204 | break; |
595 | | |
596 | 204 | case 15: |
597 | 56 | if (MCID.isBranch() || MCID.isCall()) |
598 | 56 | FixupKind = *Extended ? Hexagon::fixup_Hexagon_B15_PCREL_X |
599 | 56 | : Hexagon::fixup_Hexagon_B15_PCREL; |
600 | 56 | break; |
601 | | |
602 | 0 | case 13: |
603 | 0 | if (MCID.isBranch()) |
604 | 0 | FixupKind = Hexagon::fixup_Hexagon_B13_PCREL; |
605 | 0 | else { |
606 | 0 | errs() << "unrecognized relocation, bits " << bits << "\n"; |
607 | 0 | errs() << "name = " << HexagonMCInstrInfo::getName(MCII, MI) << "\n"; |
608 | 0 | } |
609 | 0 | break; |
610 | | |
611 | 8 | case 12: |
612 | 8 | if (*Extended) |
613 | 8 | switch (kind) { |
614 | 4 | default: |
615 | 4 | FixupKind = Hexagon::fixup_Hexagon_12_X; |
616 | 4 | break; |
617 | | // There isn't a GOT_12_X, both 11_X and 16_X resolve to 6/26 |
618 | 0 | case llvm_ks::MCSymbolRefExpr::VK_GOT: |
619 | 0 | FixupKind = Hexagon::fixup_Hexagon_GOT_16_X; |
620 | 0 | break; |
621 | 4 | case llvm_ks::MCSymbolRefExpr::VK_GOTOFF: |
622 | 4 | FixupKind = Hexagon::fixup_Hexagon_GOTREL_16_X; |
623 | 4 | break; |
624 | 8 | } |
625 | 0 | else { |
626 | 0 | errs() << "unrecognized relocation, bits " << bits << "\n"; |
627 | 0 | errs() << "name = " << HexagonMCInstrInfo::getName(MCII, MI) << "\n"; |
628 | 0 | } |
629 | 8 | break; |
630 | | |
631 | 8 | case 11: |
632 | 0 | if (*Extended) |
633 | 0 | switch (kind) { |
634 | 0 | default: |
635 | 0 | FixupKind = Hexagon::fixup_Hexagon_11_X; |
636 | 0 | break; |
637 | 0 | case llvm_ks::MCSymbolRefExpr::VK_GOT: |
638 | 0 | FixupKind = Hexagon::fixup_Hexagon_GOT_11_X; |
639 | 0 | break; |
640 | 0 | case llvm_ks::MCSymbolRefExpr::VK_GOTOFF: |
641 | 0 | FixupKind = Hexagon::fixup_Hexagon_GOTREL_11_X; |
642 | 0 | break; |
643 | 0 | case llvm_ks::MCSymbolRefExpr::VK_Hexagon_GD_GOT: |
644 | 0 | FixupKind = Hexagon::fixup_Hexagon_GD_GOT_11_X; |
645 | 0 | break; |
646 | 0 | case llvm_ks::MCSymbolRefExpr::VK_Hexagon_LD_GOT: |
647 | 0 | FixupKind = Hexagon::fixup_Hexagon_LD_GOT_11_X; |
648 | 0 | break; |
649 | 0 | case llvm_ks::MCSymbolRefExpr::VK_Hexagon_IE_GOT: |
650 | 0 | FixupKind = Hexagon::fixup_Hexagon_IE_GOT_11_X; |
651 | 0 | break; |
652 | 0 | case llvm_ks::MCSymbolRefExpr::VK_TPREL: |
653 | 0 | FixupKind = Hexagon::fixup_Hexagon_TPREL_11_X; |
654 | 0 | break; |
655 | 0 | case llvm_ks::MCSymbolRefExpr::VK_DTPREL: |
656 | 0 | FixupKind = Hexagon::fixup_Hexagon_DTPREL_11_X; |
657 | 0 | break; |
658 | 0 | } |
659 | 0 | else { |
660 | 0 | errs() << "unrecognized relocation, bits " << bits << "\n"; |
661 | 0 | errs() << "name = " << HexagonMCInstrInfo::getName(MCII, MI) << "\n"; |
662 | 0 | } |
663 | 0 | break; |
664 | | |
665 | 0 | case 10: |
666 | 0 | if (*Extended) |
667 | 0 | FixupKind = Hexagon::fixup_Hexagon_10_X; |
668 | 0 | break; |
669 | | |
670 | 2 | case 9: |
671 | 2 | if (MCID.isBranch() || |
672 | 0 | (llvm_ks::HexagonMCInstrInfo::getType(MCII, MI) == HexagonII::TypeCR)) |
673 | 2 | FixupKind = *Extended ? Hexagon::fixup_Hexagon_B9_PCREL_X |
674 | 2 | : Hexagon::fixup_Hexagon_B9_PCREL; |
675 | 0 | else if (*Extended) |
676 | 0 | FixupKind = Hexagon::fixup_Hexagon_9_X; |
677 | 0 | else { |
678 | 0 | errs() << "unrecognized relocation, bits " << bits << "\n"; |
679 | 0 | errs() << "name = " << HexagonMCInstrInfo::getName(MCII, MI) << "\n"; |
680 | 0 | } |
681 | 2 | break; |
682 | | |
683 | 0 | case 8: |
684 | 0 | if (*Extended) |
685 | 0 | FixupKind = Hexagon::fixup_Hexagon_8_X; |
686 | 0 | else { |
687 | 0 | errs() << "unrecognized relocation, bits " << bits << "\n"; |
688 | 0 | errs() << "name = " << HexagonMCInstrInfo::getName(MCII, MI) << "\n"; |
689 | 0 | } |
690 | 0 | break; |
691 | | |
692 | 10 | case 7: |
693 | 10 | if (MCID.isBranch() || |
694 | 10 | (llvm_ks::HexagonMCInstrInfo::getType(MCII, MI) == HexagonII::TypeCR)) |
695 | 10 | FixupKind = *Extended ? Hexagon::fixup_Hexagon_B7_PCREL_X |
696 | 10 | : Hexagon::fixup_Hexagon_B7_PCREL; |
697 | 0 | else if (*Extended) |
698 | 0 | FixupKind = Hexagon::fixup_Hexagon_7_X; |
699 | 0 | else { |
700 | 0 | errs() << "unrecognized relocation, bits " << bits << "\n"; |
701 | 0 | errs() << "name = " << HexagonMCInstrInfo::getName(MCII, MI) << "\n"; |
702 | 0 | } |
703 | 10 | break; |
704 | | |
705 | 12 | case 6: |
706 | 12 | if (*Extended) { |
707 | 12 | switch (kind) { |
708 | 8 | default: |
709 | 8 | FixupKind = Hexagon::fixup_Hexagon_6_X; |
710 | 8 | break; |
711 | 0 | case llvm_ks::MCSymbolRefExpr::VK_Hexagon_PCREL: |
712 | 0 | FixupKind = Hexagon::fixup_Hexagon_6_PCREL_X; |
713 | 0 | break; |
714 | | // This is part of an extender, GOT_11 is a |
715 | | // Word32_U6 unsigned/truncated reloc. |
716 | 3 | case llvm_ks::MCSymbolRefExpr::VK_GOT: |
717 | 3 | FixupKind = Hexagon::fixup_Hexagon_GOT_11_X; |
718 | 3 | break; |
719 | 1 | case llvm_ks::MCSymbolRefExpr::VK_GOTOFF: |
720 | 1 | FixupKind = Hexagon::fixup_Hexagon_GOTREL_11_X; |
721 | 1 | break; |
722 | 12 | } |
723 | 12 | } else { |
724 | 0 | errs() << "unrecognized relocation, bits " << bits << "\n"; |
725 | 0 | errs() << "name = " << HexagonMCInstrInfo::getName(MCII, MI) << "\n"; |
726 | 0 | } |
727 | 12 | break; |
728 | | |
729 | 493 | case 0: |
730 | 493 | FixupKind = getFixupNoBits(MCII, MI, MO, kind); |
731 | 493 | break; |
732 | 2.36k | } |
733 | | |
734 | 2.36k | MCExpr const *FixupExpression = (*Addend > 0 && isPCRel(FixupKind)) ? |
735 | 210 | MCBinaryExpr::createAdd(MO.getExpr(), |
736 | 210 | MCConstantExpr::create(*Addend, MCT), MCT) : |
737 | 2.36k | MO.getExpr(); |
738 | | |
739 | 2.36k | MCFixup fixup = MCFixup::create(*Addend, FixupExpression, |
740 | 2.36k | MCFixupKind(FixupKind), MI.getLoc()); |
741 | 2.36k | Fixups.push_back(fixup); |
742 | | // All of the information is in the fixup. |
743 | 2.36k | return (0); |
744 | 2.36k | } |
745 | | |
746 | | unsigned |
747 | | HexagonMCCodeEmitter::getMachineOpValue(MCInst const &MI, MCOperand const &MO, |
748 | | SmallVectorImpl<MCFixup> &Fixups, |
749 | 6.52k | MCSubtargetInfo const &STI) const { |
750 | 6.52k | if (MO.isReg()) |
751 | 1.85k | return MCT.getRegisterInfo()->getEncodingValue(MO.getReg()); |
752 | 4.66k | if (MO.isImm()) |
753 | 0 | return static_cast<unsigned>(MO.getImm()); |
754 | | |
755 | | // MO must be an ME. |
756 | 4.66k | assert(MO.isExpr()); |
757 | 4.66k | return getExprOpValue(MI, MO, MO.getExpr(), Fixups, STI); |
758 | 4.66k | } |
759 | | |
760 | | MCCodeEmitter *llvm_ks::createHexagonMCCodeEmitter(MCInstrInfo const &MII, |
761 | | MCRegisterInfo const &MRI, |
762 | 4.80k | MCContext &MCT) { |
763 | 4.80k | return new HexagonMCCodeEmitter(MII, MCT); |
764 | 4.80k | } |
765 | | |
766 | | #include "HexagonGenMCCodeEmitter.inc" |