LLVM 23.0.0git
X86MCTargetDesc.cpp
Go to the documentation of this file.
1//===-- X86MCTargetDesc.cpp - X86 Target Descriptions ---------------------===//
2//
3// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
4// See https://llvm.org/LICENSE.txt for license information.
5// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
6//
7//===----------------------------------------------------------------------===//
8//
9// This file provides X86 specific target descriptions.
10//
11//===----------------------------------------------------------------------===//
12
13#include "X86MCTargetDesc.h"
15#include "X86ATTInstPrinter.h"
16#include "X86BaseInfo.h"
17#include "X86IntelInstPrinter.h"
18#include "X86MCAsmInfo.h"
19#include "X86TargetStreamer.h"
20#include "llvm-c/Visibility.h"
21#include "llvm/ADT/APInt.h"
23#include "llvm/MC/MCDwarf.h"
25#include "llvm/MC/MCInstrInfo.h"
27#include "llvm/MC/MCStreamer.h"
33
34using namespace llvm;
35
36#define GET_REGINFO_MC_DESC
37#include "X86GenRegisterInfo.inc"
38
39#define GET_INSTRINFO_MC_DESC
40#define GET_INSTRINFO_MC_HELPERS
41#define ENABLE_INSTR_PREDICATE_VERIFIER
42#include "X86GenInstrInfo.inc"
43
44#define GET_SUBTARGETINFO_MC_DESC
45#include "X86GenSubtargetInfo.inc"
46
47std::string X86_MC::ParseX86Triple(const Triple &TT) {
48 std::string FS;
49 // SSE2 should default to enabled in 64-bit mode, but can be turned off
50 // explicitly.
51 if (TT.isX86_64())
52 FS = "+64bit-mode,-32bit-mode,-16bit-mode,+sse2";
53 else if (TT.getEnvironment() != Triple::CODE16)
54 FS = "-64bit-mode,+32bit-mode,-16bit-mode";
55 else
56 FS = "-64bit-mode,-32bit-mode,+16bit-mode";
57
58 if (TT.isX32())
59 FS += ",+x32";
60
61 return FS;
62}
63
64unsigned X86_MC::getDwarfRegFlavour(const Triple &TT, bool isEH) {
65 if (TT.isX86_64())
67
68 if (TT.isOSDarwin())
70 if (TT.isOSCygMing())
71 // Unsupported by now, just quick fallback
74}
75
77 return MI.getFlags() & X86::IP_HAS_LOCK;
78}
79
80static bool isMemOperand(const MCInst &MI, unsigned Op, unsigned RegClassID) {
81 const MCOperand &Base = MI.getOperand(Op + X86::AddrBaseReg);
82 const MCOperand &Index = MI.getOperand(Op + X86::AddrIndexReg);
83 const MCRegisterClass &RC = X86MCRegisterClasses[RegClassID];
84
85 return (Base.isReg() && Base.getReg() && RC.contains(Base.getReg())) ||
86 (Index.isReg() && Index.getReg() && RC.contains(Index.getReg()));
87}
88
89bool X86_MC::is16BitMemOperand(const MCInst &MI, unsigned Op,
90 const MCSubtargetInfo &STI) {
91 const MCOperand &Base = MI.getOperand(Op + X86::AddrBaseReg);
92 const MCOperand &Index = MI.getOperand(Op + X86::AddrIndexReg);
93
94 if (STI.hasFeature(X86::Is16Bit) && Base.isReg() && !Base.getReg() &&
95 Index.isReg() && !Index.getReg())
96 return true;
97 return isMemOperand(MI, Op, X86::GR16RegClassID);
98}
99
100bool X86_MC::is32BitMemOperand(const MCInst &MI, unsigned Op) {
101 const MCOperand &Base = MI.getOperand(Op + X86::AddrBaseReg);
102 const MCOperand &Index = MI.getOperand(Op + X86::AddrIndexReg);
103 if (Base.isReg() && Base.getReg() == X86::EIP) {
104 assert(Index.isReg() && !Index.getReg() && "Invalid eip-based address");
105 return true;
106 }
107 if (Index.isReg() && Index.getReg() == X86::EIZ)
108 return true;
109 return isMemOperand(MI, Op, X86::GR32RegClassID);
110}
111
112#ifndef NDEBUG
113bool X86_MC::is64BitMemOperand(const MCInst &MI, unsigned Op) {
114 return isMemOperand(MI, Op, X86::GR64RegClassID);
115}
116#endif
117
119 const MCSubtargetInfo &STI,
120 int MemoryOperand, uint64_t TSFlags) {
121 uint64_t AdSize = TSFlags & X86II::AdSizeMask;
122 bool Is16BitMode = STI.hasFeature(X86::Is16Bit);
123 bool Is32BitMode = STI.hasFeature(X86::Is32Bit);
124 bool Is64BitMode = STI.hasFeature(X86::Is64Bit);
125 if ((Is16BitMode && AdSize == X86II::AdSize32) ||
126 (Is32BitMode && AdSize == X86II::AdSize16) ||
127 (Is64BitMode && AdSize == X86II::AdSize32))
128 return true;
129 uint64_t Form = TSFlags & X86II::FormMask;
130 switch (Form) {
131 default:
132 break;
133 case X86II::RawFrmDstSrc: {
134 MCRegister siReg = MI.getOperand(1).getReg();
135 assert(((siReg == X86::SI && MI.getOperand(0).getReg() == X86::DI) ||
136 (siReg == X86::ESI && MI.getOperand(0).getReg() == X86::EDI) ||
137 (siReg == X86::RSI && MI.getOperand(0).getReg() == X86::RDI)) &&
138 "SI and DI register sizes do not match");
139 return (!Is32BitMode && siReg == X86::ESI) ||
140 (Is32BitMode && siReg == X86::SI);
141 }
142 case X86II::RawFrmSrc: {
143 MCRegister siReg = MI.getOperand(0).getReg();
144 return (!Is32BitMode && siReg == X86::ESI) ||
145 (Is32BitMode && siReg == X86::SI);
146 }
147 case X86II::RawFrmDst: {
148 MCRegister siReg = MI.getOperand(0).getReg();
149 return (!Is32BitMode && siReg == X86::EDI) ||
150 (Is32BitMode && siReg == X86::DI);
151 }
152 }
153
154 // Determine where the memory operand starts, if present.
155 if (MemoryOperand < 0)
156 return false;
157
158 if (STI.hasFeature(X86::Is64Bit)) {
159 assert(!is16BitMemOperand(MI, MemoryOperand, STI));
160 return is32BitMemOperand(MI, MemoryOperand);
161 }
162 if (STI.hasFeature(X86::Is32Bit)) {
163 assert(!is64BitMemOperand(MI, MemoryOperand));
164 return is16BitMemOperand(MI, MemoryOperand, STI);
165 }
166 assert(STI.hasFeature(X86::Is16Bit));
167 assert(!is64BitMemOperand(MI, MemoryOperand));
168 return !is16BitMemOperand(MI, MemoryOperand, STI);
169}
170
172 // FIXME: TableGen these.
173 for (unsigned Reg = X86::NoRegister + 1; Reg < X86::NUM_TARGET_REGS; ++Reg) {
174 unsigned SEH = MRI->getEncodingValue(Reg);
175 MRI->mapLLVMRegToSEHReg(Reg, SEH);
176 }
177
178 // Mapping from CodeView to MC register id.
179 static const struct {
181 MCPhysReg Reg;
182 } RegMap[] = {
183 {codeview::RegisterId::AL, X86::AL},
184 {codeview::RegisterId::CL, X86::CL},
185 {codeview::RegisterId::DL, X86::DL},
186 {codeview::RegisterId::BL, X86::BL},
187 {codeview::RegisterId::AH, X86::AH},
188 {codeview::RegisterId::CH, X86::CH},
189 {codeview::RegisterId::DH, X86::DH},
190 {codeview::RegisterId::BH, X86::BH},
191 {codeview::RegisterId::AX, X86::AX},
192 {codeview::RegisterId::CX, X86::CX},
193 {codeview::RegisterId::DX, X86::DX},
194 {codeview::RegisterId::BX, X86::BX},
195 {codeview::RegisterId::SP, X86::SP},
196 {codeview::RegisterId::BP, X86::BP},
197 {codeview::RegisterId::SI, X86::SI},
198 {codeview::RegisterId::DI, X86::DI},
199 {codeview::RegisterId::EAX, X86::EAX},
200 {codeview::RegisterId::ECX, X86::ECX},
201 {codeview::RegisterId::EDX, X86::EDX},
202 {codeview::RegisterId::EBX, X86::EBX},
203 {codeview::RegisterId::ESP, X86::ESP},
204 {codeview::RegisterId::EBP, X86::EBP},
205 {codeview::RegisterId::ESI, X86::ESI},
206 {codeview::RegisterId::EDI, X86::EDI},
207
208 {codeview::RegisterId::EFLAGS, X86::EFLAGS},
209
210 {codeview::RegisterId::ST0, X86::ST0},
211 {codeview::RegisterId::ST1, X86::ST1},
212 {codeview::RegisterId::ST2, X86::ST2},
213 {codeview::RegisterId::ST3, X86::ST3},
214 {codeview::RegisterId::ST4, X86::ST4},
215 {codeview::RegisterId::ST5, X86::ST5},
216 {codeview::RegisterId::ST6, X86::ST6},
217 {codeview::RegisterId::ST7, X86::ST7},
218
219 {codeview::RegisterId::ST0, X86::FP0},
220 {codeview::RegisterId::ST1, X86::FP1},
221 {codeview::RegisterId::ST2, X86::FP2},
222 {codeview::RegisterId::ST3, X86::FP3},
223 {codeview::RegisterId::ST4, X86::FP4},
224 {codeview::RegisterId::ST5, X86::FP5},
225 {codeview::RegisterId::ST6, X86::FP6},
226 {codeview::RegisterId::ST7, X86::FP7},
227
228 {codeview::RegisterId::MM0, X86::MM0},
229 {codeview::RegisterId::MM1, X86::MM1},
230 {codeview::RegisterId::MM2, X86::MM2},
231 {codeview::RegisterId::MM3, X86::MM3},
232 {codeview::RegisterId::MM4, X86::MM4},
233 {codeview::RegisterId::MM5, X86::MM5},
234 {codeview::RegisterId::MM6, X86::MM6},
235 {codeview::RegisterId::MM7, X86::MM7},
236
237 {codeview::RegisterId::XMM0, X86::XMM0},
238 {codeview::RegisterId::XMM1, X86::XMM1},
239 {codeview::RegisterId::XMM2, X86::XMM2},
240 {codeview::RegisterId::XMM3, X86::XMM3},
241 {codeview::RegisterId::XMM4, X86::XMM4},
242 {codeview::RegisterId::XMM5, X86::XMM5},
243 {codeview::RegisterId::XMM6, X86::XMM6},
244 {codeview::RegisterId::XMM7, X86::XMM7},
245
246 {codeview::RegisterId::XMM8, X86::XMM8},
247 {codeview::RegisterId::XMM9, X86::XMM9},
248 {codeview::RegisterId::XMM10, X86::XMM10},
249 {codeview::RegisterId::XMM11, X86::XMM11},
250 {codeview::RegisterId::XMM12, X86::XMM12},
251 {codeview::RegisterId::XMM13, X86::XMM13},
252 {codeview::RegisterId::XMM14, X86::XMM14},
253 {codeview::RegisterId::XMM15, X86::XMM15},
254
255 {codeview::RegisterId::SIL, X86::SIL},
256 {codeview::RegisterId::DIL, X86::DIL},
257 {codeview::RegisterId::BPL, X86::BPL},
258 {codeview::RegisterId::SPL, X86::SPL},
259 {codeview::RegisterId::RAX, X86::RAX},
260 {codeview::RegisterId::RBX, X86::RBX},
261 {codeview::RegisterId::RCX, X86::RCX},
262 {codeview::RegisterId::RDX, X86::RDX},
263 {codeview::RegisterId::RSI, X86::RSI},
264 {codeview::RegisterId::RDI, X86::RDI},
265 {codeview::RegisterId::RBP, X86::RBP},
266 {codeview::RegisterId::RSP, X86::RSP},
267 {codeview::RegisterId::R8, X86::R8},
268 {codeview::RegisterId::R9, X86::R9},
269 {codeview::RegisterId::R10, X86::R10},
270 {codeview::RegisterId::R11, X86::R11},
271 {codeview::RegisterId::R12, X86::R12},
272 {codeview::RegisterId::R13, X86::R13},
273 {codeview::RegisterId::R14, X86::R14},
274 {codeview::RegisterId::R15, X86::R15},
275 {codeview::RegisterId::R16, X86::R16},
276 {codeview::RegisterId::R17, X86::R17},
277 {codeview::RegisterId::R18, X86::R18},
278 {codeview::RegisterId::R19, X86::R19},
279 {codeview::RegisterId::R20, X86::R20},
280 {codeview::RegisterId::R21, X86::R21},
281 {codeview::RegisterId::R22, X86::R22},
282 {codeview::RegisterId::R23, X86::R23},
283 {codeview::RegisterId::R24, X86::R24},
284 {codeview::RegisterId::R25, X86::R25},
285 {codeview::RegisterId::R26, X86::R26},
286 {codeview::RegisterId::R27, X86::R27},
287 {codeview::RegisterId::R28, X86::R28},
288 {codeview::RegisterId::R29, X86::R29},
289 {codeview::RegisterId::R30, X86::R30},
290 {codeview::RegisterId::R31, X86::R31},
291 {codeview::RegisterId::R8B, X86::R8B},
292 {codeview::RegisterId::R9B, X86::R9B},
293 {codeview::RegisterId::R10B, X86::R10B},
294 {codeview::RegisterId::R11B, X86::R11B},
295 {codeview::RegisterId::R12B, X86::R12B},
296 {codeview::RegisterId::R13B, X86::R13B},
297 {codeview::RegisterId::R14B, X86::R14B},
298 {codeview::RegisterId::R15B, X86::R15B},
299 {codeview::RegisterId::R16B, X86::R16B},
300 {codeview::RegisterId::R17B, X86::R17B},
301 {codeview::RegisterId::R18B, X86::R18B},
302 {codeview::RegisterId::R19B, X86::R19B},
303 {codeview::RegisterId::R20B, X86::R20B},
304 {codeview::RegisterId::R21B, X86::R21B},
305 {codeview::RegisterId::R22B, X86::R22B},
306 {codeview::RegisterId::R23B, X86::R23B},
307 {codeview::RegisterId::R24B, X86::R24B},
308 {codeview::RegisterId::R25B, X86::R25B},
309 {codeview::RegisterId::R26B, X86::R26B},
310 {codeview::RegisterId::R27B, X86::R27B},
311 {codeview::RegisterId::R28B, X86::R28B},
312 {codeview::RegisterId::R29B, X86::R29B},
313 {codeview::RegisterId::R30B, X86::R30B},
314 {codeview::RegisterId::R31B, X86::R31B},
315 {codeview::RegisterId::R8W, X86::R8W},
316 {codeview::RegisterId::R9W, X86::R9W},
317 {codeview::RegisterId::R10W, X86::R10W},
318 {codeview::RegisterId::R11W, X86::R11W},
319 {codeview::RegisterId::R12W, X86::R12W},
320 {codeview::RegisterId::R13W, X86::R13W},
321 {codeview::RegisterId::R14W, X86::R14W},
322 {codeview::RegisterId::R15W, X86::R15W},
323 {codeview::RegisterId::R16W, X86::R16W},
324 {codeview::RegisterId::R17W, X86::R17W},
325 {codeview::RegisterId::R18W, X86::R18W},
326 {codeview::RegisterId::R19W, X86::R19W},
327 {codeview::RegisterId::R20W, X86::R20W},
328 {codeview::RegisterId::R21W, X86::R21W},
329 {codeview::RegisterId::R22W, X86::R22W},
330 {codeview::RegisterId::R23W, X86::R23W},
331 {codeview::RegisterId::R24W, X86::R24W},
332 {codeview::RegisterId::R25W, X86::R25W},
333 {codeview::RegisterId::R26W, X86::R26W},
334 {codeview::RegisterId::R27W, X86::R27W},
335 {codeview::RegisterId::R28W, X86::R28W},
336 {codeview::RegisterId::R29W, X86::R29W},
337 {codeview::RegisterId::R30W, X86::R30W},
338 {codeview::RegisterId::R31W, X86::R31W},
339 {codeview::RegisterId::R8D, X86::R8D},
340 {codeview::RegisterId::R9D, X86::R9D},
341 {codeview::RegisterId::R10D, X86::R10D},
342 {codeview::RegisterId::R11D, X86::R11D},
343 {codeview::RegisterId::R12D, X86::R12D},
344 {codeview::RegisterId::R13D, X86::R13D},
345 {codeview::RegisterId::R14D, X86::R14D},
346 {codeview::RegisterId::R15D, X86::R15D},
347 {codeview::RegisterId::R16D, X86::R16D},
348 {codeview::RegisterId::R17D, X86::R17D},
349 {codeview::RegisterId::R18D, X86::R18D},
350 {codeview::RegisterId::R19D, X86::R19D},
351 {codeview::RegisterId::R20D, X86::R20D},
352 {codeview::RegisterId::R21D, X86::R21D},
353 {codeview::RegisterId::R22D, X86::R22D},
354 {codeview::RegisterId::R23D, X86::R23D},
355 {codeview::RegisterId::R24D, X86::R24D},
356 {codeview::RegisterId::R25D, X86::R25D},
357 {codeview::RegisterId::R26D, X86::R26D},
358 {codeview::RegisterId::R27D, X86::R27D},
359 {codeview::RegisterId::R28D, X86::R28D},
360 {codeview::RegisterId::R29D, X86::R29D},
361 {codeview::RegisterId::R30D, X86::R30D},
362 {codeview::RegisterId::R31D, X86::R31D},
363 {codeview::RegisterId::AMD64_YMM0, X86::YMM0},
364 {codeview::RegisterId::AMD64_YMM1, X86::YMM1},
365 {codeview::RegisterId::AMD64_YMM2, X86::YMM2},
366 {codeview::RegisterId::AMD64_YMM3, X86::YMM3},
367 {codeview::RegisterId::AMD64_YMM4, X86::YMM4},
368 {codeview::RegisterId::AMD64_YMM5, X86::YMM5},
369 {codeview::RegisterId::AMD64_YMM6, X86::YMM6},
370 {codeview::RegisterId::AMD64_YMM7, X86::YMM7},
371 {codeview::RegisterId::AMD64_YMM8, X86::YMM8},
372 {codeview::RegisterId::AMD64_YMM9, X86::YMM9},
373 {codeview::RegisterId::AMD64_YMM10, X86::YMM10},
374 {codeview::RegisterId::AMD64_YMM11, X86::YMM11},
375 {codeview::RegisterId::AMD64_YMM12, X86::YMM12},
376 {codeview::RegisterId::AMD64_YMM13, X86::YMM13},
377 {codeview::RegisterId::AMD64_YMM14, X86::YMM14},
378 {codeview::RegisterId::AMD64_YMM15, X86::YMM15},
379 {codeview::RegisterId::AMD64_YMM16, X86::YMM16},
380 {codeview::RegisterId::AMD64_YMM17, X86::YMM17},
381 {codeview::RegisterId::AMD64_YMM18, X86::YMM18},
382 {codeview::RegisterId::AMD64_YMM19, X86::YMM19},
383 {codeview::RegisterId::AMD64_YMM20, X86::YMM20},
384 {codeview::RegisterId::AMD64_YMM21, X86::YMM21},
385 {codeview::RegisterId::AMD64_YMM22, X86::YMM22},
386 {codeview::RegisterId::AMD64_YMM23, X86::YMM23},
387 {codeview::RegisterId::AMD64_YMM24, X86::YMM24},
388 {codeview::RegisterId::AMD64_YMM25, X86::YMM25},
389 {codeview::RegisterId::AMD64_YMM26, X86::YMM26},
390 {codeview::RegisterId::AMD64_YMM27, X86::YMM27},
391 {codeview::RegisterId::AMD64_YMM28, X86::YMM28},
392 {codeview::RegisterId::AMD64_YMM29, X86::YMM29},
393 {codeview::RegisterId::AMD64_YMM30, X86::YMM30},
394 {codeview::RegisterId::AMD64_YMM31, X86::YMM31},
395 {codeview::RegisterId::AMD64_ZMM0, X86::ZMM0},
396 {codeview::RegisterId::AMD64_ZMM1, X86::ZMM1},
397 {codeview::RegisterId::AMD64_ZMM2, X86::ZMM2},
398 {codeview::RegisterId::AMD64_ZMM3, X86::ZMM3},
399 {codeview::RegisterId::AMD64_ZMM4, X86::ZMM4},
400 {codeview::RegisterId::AMD64_ZMM5, X86::ZMM5},
401 {codeview::RegisterId::AMD64_ZMM6, X86::ZMM6},
402 {codeview::RegisterId::AMD64_ZMM7, X86::ZMM7},
403 {codeview::RegisterId::AMD64_ZMM8, X86::ZMM8},
404 {codeview::RegisterId::AMD64_ZMM9, X86::ZMM9},
405 {codeview::RegisterId::AMD64_ZMM10, X86::ZMM10},
406 {codeview::RegisterId::AMD64_ZMM11, X86::ZMM11},
407 {codeview::RegisterId::AMD64_ZMM12, X86::ZMM12},
408 {codeview::RegisterId::AMD64_ZMM13, X86::ZMM13},
409 {codeview::RegisterId::AMD64_ZMM14, X86::ZMM14},
410 {codeview::RegisterId::AMD64_ZMM15, X86::ZMM15},
411 {codeview::RegisterId::AMD64_ZMM16, X86::ZMM16},
412 {codeview::RegisterId::AMD64_ZMM17, X86::ZMM17},
413 {codeview::RegisterId::AMD64_ZMM18, X86::ZMM18},
414 {codeview::RegisterId::AMD64_ZMM19, X86::ZMM19},
415 {codeview::RegisterId::AMD64_ZMM20, X86::ZMM20},
416 {codeview::RegisterId::AMD64_ZMM21, X86::ZMM21},
417 {codeview::RegisterId::AMD64_ZMM22, X86::ZMM22},
418 {codeview::RegisterId::AMD64_ZMM23, X86::ZMM23},
419 {codeview::RegisterId::AMD64_ZMM24, X86::ZMM24},
420 {codeview::RegisterId::AMD64_ZMM25, X86::ZMM25},
421 {codeview::RegisterId::AMD64_ZMM26, X86::ZMM26},
422 {codeview::RegisterId::AMD64_ZMM27, X86::ZMM27},
423 {codeview::RegisterId::AMD64_ZMM28, X86::ZMM28},
424 {codeview::RegisterId::AMD64_ZMM29, X86::ZMM29},
425 {codeview::RegisterId::AMD64_ZMM30, X86::ZMM30},
426 {codeview::RegisterId::AMD64_ZMM31, X86::ZMM31},
427 {codeview::RegisterId::AMD64_K0, X86::K0},
428 {codeview::RegisterId::AMD64_K1, X86::K1},
429 {codeview::RegisterId::AMD64_K2, X86::K2},
430 {codeview::RegisterId::AMD64_K3, X86::K3},
431 {codeview::RegisterId::AMD64_K4, X86::K4},
432 {codeview::RegisterId::AMD64_K5, X86::K5},
433 {codeview::RegisterId::AMD64_K6, X86::K6},
434 {codeview::RegisterId::AMD64_K7, X86::K7},
435 {codeview::RegisterId::AMD64_XMM16, X86::XMM16},
436 {codeview::RegisterId::AMD64_XMM17, X86::XMM17},
437 {codeview::RegisterId::AMD64_XMM18, X86::XMM18},
438 {codeview::RegisterId::AMD64_XMM19, X86::XMM19},
439 {codeview::RegisterId::AMD64_XMM20, X86::XMM20},
440 {codeview::RegisterId::AMD64_XMM21, X86::XMM21},
441 {codeview::RegisterId::AMD64_XMM22, X86::XMM22},
442 {codeview::RegisterId::AMD64_XMM23, X86::XMM23},
443 {codeview::RegisterId::AMD64_XMM24, X86::XMM24},
444 {codeview::RegisterId::AMD64_XMM25, X86::XMM25},
445 {codeview::RegisterId::AMD64_XMM26, X86::XMM26},
446 {codeview::RegisterId::AMD64_XMM27, X86::XMM27},
447 {codeview::RegisterId::AMD64_XMM28, X86::XMM28},
448 {codeview::RegisterId::AMD64_XMM29, X86::XMM29},
449 {codeview::RegisterId::AMD64_XMM30, X86::XMM30},
450 {codeview::RegisterId::AMD64_XMM31, X86::XMM31},
451
452 };
453 for (const auto &I : RegMap)
454 MRI->mapLLVMRegToCVReg(I.Reg, static_cast<int>(I.CVReg));
455}
456
458 StringRef CPU, StringRef FS) {
459 std::string ArchFS = X86_MC::ParseX86Triple(TT);
460 assert(!ArchFS.empty() && "Failed to parse X86 triple");
461 if (!FS.empty())
462 ArchFS = (Twine(ArchFS) + "," + FS).str();
463
464 if (CPU.empty())
465 CPU = "generic";
466
467 return createX86MCSubtargetInfoImpl(TT, CPU, /*TuneCPU*/ CPU, ArchFS);
468}
469
471 MCInstrInfo *X = new MCInstrInfo();
472 InitX86MCInstrInfo(X);
473 return X;
474}
475
477 unsigned RA = TT.isX86_64() ? X86::RIP // Should have dwarf #16.
478 : X86::EIP; // Should have dwarf #8.
479
481 InitX86MCRegisterInfo(X, RA, X86_MC::getDwarfRegFlavour(TT, false),
482 X86_MC::getDwarfRegFlavour(TT, true), RA);
484 return X;
485}
486
488 const MCRegisterInfo &MRI) {
489 auto &Set = MAI.getReservedIdentifiers();
490 // Register names: `call rsi` is misassembled as an indirect call. Use the
491 // Intel printer's table directly — it's the lowercase asm name in stable
492 // storage. MRI::getName() returns the uppercase enum name and would need
493 // an extra .lower() heap allocation per entry.
494 for (unsigned i = 1, e = MRI.getNumRegs(); i < e; ++i)
495 if (const char *Name = X86IntelInstPrinter::getRegisterName(i))
496 if (Name[0])
497 Set.insert(CachedHashStringRef(Name));
498 // Keywords that GAS Intel syntax misparses as constants, modifiers, or
499 // pseudo-registers instead of symbol references (e.g., `call byte` calls
500 // address 1, not symbol "byte"; `call flat` errors out).
501 for (StringRef KW : {"byte", "word", "dword", "fword", "qword", "mmword",
502 "tbyte", "oword", "xmmword", "ymmword", "zmmword",
503 "offset", "flat", "near", "far", "short"})
504 Set.insert(CachedHashStringRef(KW));
505 // Operator keywords parsed by GAS/X86AsmParser in Intel mode.
506 for (StringRef KW : {"and", "eq", "ge", "gt", "le", "lt", "mod", "ne", "not",
507 "or", "shl", "shr", "xor"})
508 Set.insert(CachedHashStringRef(KW));
509}
510
512 const Triple &TheTriple,
513 const MCTargetOptions &Options) {
514 bool is64Bit = TheTriple.isX86_64();
515
516 MCAsmInfo *MAI;
517 if (TheTriple.isOSBinFormatMachO()) {
518 if (is64Bit)
519 MAI = new X86_64MCAsmInfoDarwin(TheTriple, Options);
520 else
521 MAI = new X86MCAsmInfoDarwin(TheTriple, Options);
522 } else if (TheTriple.isOSBinFormatELF()) {
523 // Force the use of an ELF container.
524 MAI = new X86ELFMCAsmInfo(TheTriple, Options);
525 } else if (TheTriple.isWindowsMSVCEnvironment() ||
526 TheTriple.isWindowsCoreCLREnvironment() || TheTriple.isUEFI()) {
527 if (Options.getAssemblyLanguage().equals_insensitive("masm"))
528 MAI = new X86MCAsmInfoMicrosoftMASM(TheTriple, Options);
529 else
530 MAI = new X86MCAsmInfoMicrosoft(TheTriple, Options);
531 } else if (TheTriple.isOSCygMing() ||
532 TheTriple.isWindowsItaniumEnvironment()) {
533 MAI = new X86MCAsmInfoGNUCOFF(TheTriple, Options);
534 } else {
535 // The default is ELF.
536 MAI = new X86ELFMCAsmInfo(TheTriple, Options);
537 }
539
540 // Initialize initial frame state.
541 // Calculate amount of bytes used for return address storing
542 int stackGrowth = is64Bit ? -8 : -4;
543
544 // Initial state of the frame pointer is esp+stackGrowth.
545 unsigned StackPtr = is64Bit ? X86::RSP : X86::ESP;
547 nullptr, MRI.getDwarfRegNum(StackPtr, true), -stackGrowth);
548 MAI->addInitialFrameState(Inst);
549
550 // Add return address to move list
551 unsigned InstPtr = is64Bit ? X86::RIP : X86::EIP;
553 nullptr, MRI.getDwarfRegNum(InstPtr, true), stackGrowth);
554 MAI->addInitialFrameState(Inst2);
555
556 return MAI;
557}
558
560 unsigned SyntaxVariant,
561 const MCAsmInfo &MAI,
562 const MCInstrInfo &MII,
563 const MCRegisterInfo &MRI) {
564 if (SyntaxVariant == 0)
565 return new X86ATTInstPrinter(MAI, MII, MRI);
566 if (SyntaxVariant == 1)
567 return new X86IntelInstPrinter(MAI, MII, MRI);
568 return nullptr;
569}
570
572 MCContext &Ctx) {
573 // Default to the stock relocation info.
574 return llvm::createMCRelocationInfo(TheTriple, Ctx);
575}
576
577namespace llvm {
578namespace X86_MC {
579
580class X86MCInstrAnalysis : public MCInstrAnalysis {
581 X86MCInstrAnalysis(const X86MCInstrAnalysis &) = delete;
582 X86MCInstrAnalysis &operator=(const X86MCInstrAnalysis &) = delete;
583 ~X86MCInstrAnalysis() override = default;
584
585public:
587
588#define GET_STIPREDICATE_DECLS_FOR_MC_ANALYSIS
589#include "X86GenSubtargetInfo.inc"
590
591 bool clearsSuperRegisters(const MCRegisterInfo &MRI, const MCInst &Inst,
592 APInt &Mask) const override;
593 std::vector<std::pair<uint64_t, uint64_t>>
594 findPltEntries(uint64_t PltSectionVA, ArrayRef<uint8_t> PltContents,
595 const MCSubtargetInfo &STI) const override;
596
597 bool evaluateBranch(const MCInst &Inst, uint64_t Addr, uint64_t Size,
598 uint64_t &Target) const override;
599 std::optional<uint64_t>
601 uint64_t Addr, uint64_t Size) const override;
602 std::optional<uint64_t>
604 uint64_t Size) const override;
605};
606
607#define GET_STIPREDICATE_DEFS_FOR_MC_ANALYSIS
608#include "X86GenSubtargetInfo.inc"
609
611 const MCInst &Inst,
612 APInt &Mask) const {
613 const MCInstrDesc &Desc = Info->get(Inst.getOpcode());
614 unsigned NumDefs = Desc.getNumDefs();
615 unsigned NumImplicitDefs = Desc.implicit_defs().size();
616 assert(Mask.getBitWidth() == NumDefs + NumImplicitDefs &&
617 "Unexpected number of bits in the mask!");
618
619 bool HasVEX = (Desc.TSFlags & X86II::EncodingMask) == X86II::VEX;
620 bool HasEVEX = (Desc.TSFlags & X86II::EncodingMask) == X86II::EVEX;
621 bool HasXOP = (Desc.TSFlags & X86II::EncodingMask) == X86II::XOP;
622
623 const MCRegisterClass &GR32RC = MRI.getRegClass(X86::GR32RegClassID);
624 const MCRegisterClass &VR128XRC = MRI.getRegClass(X86::VR128XRegClassID);
625 const MCRegisterClass &VR256XRC = MRI.getRegClass(X86::VR256XRegClassID);
626
627 auto ClearsSuperReg = [=](MCRegister RegID) {
628 // On X86-64, a general purpose integer register is viewed as a 64-bit
629 // register internal to the processor.
630 // An update to the lower 32 bits of a 64 bit integer register is
631 // architecturally defined to zero extend the upper 32 bits.
632 if (GR32RC.contains(RegID))
633 return true;
634
635 // Early exit if this instruction has no vex/evex/xop prefix.
636 if (!HasEVEX && !HasVEX && !HasXOP)
637 return false;
638
639 // All VEX and EVEX encoded instructions are defined to zero the high bits
640 // of the destination register up to VLMAX (i.e. the maximum vector register
641 // width pertaining to the instruction).
642 // We assume the same behavior for XOP instructions too.
643 return VR128XRC.contains(RegID) || VR256XRC.contains(RegID);
644 };
645
646 Mask.clearAllBits();
647 for (unsigned I = 0, E = NumDefs; I < E; ++I) {
648 const MCOperand &Op = Inst.getOperand(I);
649 if (ClearsSuperReg(Op.getReg()))
650 Mask.setBit(I);
651 }
652
653 for (unsigned I = 0, E = NumImplicitDefs; I < E; ++I) {
654 const MCPhysReg Reg = Desc.implicit_defs()[I];
655 if (ClearsSuperReg(Reg))
656 Mask.setBit(NumDefs + I);
657 }
658
659 return Mask.getBoolValue();
660}
661
662static std::vector<std::pair<uint64_t, uint64_t>>
663findX86PltEntries(uint64_t PltSectionVA, ArrayRef<uint8_t> PltContents) {
664 // Do a lightweight parsing of PLT entries.
665 std::vector<std::pair<uint64_t, uint64_t>> Result;
666 for (uint64_t Byte = 0, End = PltContents.size(); Byte + 6 < End; ) {
667 // Recognize a jmp.
668 if (PltContents[Byte] == 0xff && PltContents[Byte + 1] == 0xa3) {
669 // The jmp instruction at the beginning of each PLT entry jumps to the
670 // address of the base of the .got.plt section plus the immediate.
671 // Set the 1 << 32 bit to let ELFObjectFileBase::getPltEntries convert the
672 // offset to an address. Imm may be a negative int32_t if the GOT entry is
673 // in .got.
674 uint32_t Imm = support::endian::read32le(PltContents.data() + Byte + 2);
675 Result.emplace_back(PltSectionVA + Byte, Imm | (uint64_t(1) << 32));
676 Byte += 6;
677 } else if (PltContents[Byte] == 0xff && PltContents[Byte + 1] == 0x25) {
678 // The jmp instruction at the beginning of each PLT entry jumps to the
679 // immediate.
680 uint32_t Imm = support::endian::read32le(PltContents.data() + Byte + 2);
681 Result.push_back(std::make_pair(PltSectionVA + Byte, Imm));
682 Byte += 6;
683 } else
684 Byte++;
685 }
686 return Result;
687}
688
689static std::vector<std::pair<uint64_t, uint64_t>>
691 // Do a lightweight parsing of PLT entries.
692 std::vector<std::pair<uint64_t, uint64_t>> Result;
693 for (uint64_t Byte = 0, End = PltContents.size(); Byte + 6 < End; ) {
694 // Recognize a jmp.
695 if (PltContents[Byte] == 0xff && PltContents[Byte + 1] == 0x25) {
696 // The jmp instruction at the beginning of each PLT entry jumps to the
697 // address of the next instruction plus the immediate.
698 uint32_t Imm = support::endian::read32le(PltContents.data() + Byte + 2);
699 Result.push_back(
700 std::make_pair(PltSectionVA + Byte, PltSectionVA + Byte + 6 + Imm));
701 Byte += 6;
702 } else
703 Byte++;
704 }
705 return Result;
706}
707
708std::vector<std::pair<uint64_t, uint64_t>>
710 ArrayRef<uint8_t> PltContents,
711 const MCSubtargetInfo &STI) const {
712 const Triple &TargetTriple = STI.getTargetTriple();
713 switch (TargetTriple.getArch()) {
714 case Triple::x86:
715 return findX86PltEntries(PltSectionVA, PltContents);
716 case Triple::x86_64:
717 return findX86_64PltEntries(PltSectionVA, PltContents);
718 default:
719 return {};
720 }
721}
722
724 uint64_t Size, uint64_t &Target) const {
725 if (Inst.getNumOperands() == 0 ||
726 Info->get(Inst.getOpcode()).operands()[0].OperandType !=
728 return false;
729 Target = Addr + Size + Inst.getOperand(0).getImm();
730 return true;
731}
732
734 const MCInst &Inst, const MCSubtargetInfo *STI, uint64_t Addr,
735 uint64_t Size) const {
736 const MCInstrDesc &MCID = Info->get(Inst.getOpcode());
737 int MemOpStart = X86II::getMemoryOperandNo(MCID.TSFlags);
738 if (MemOpStart == -1)
739 return std::nullopt;
740 MemOpStart += X86II::getOperandBias(MCID);
741
742 const MCOperand &SegReg = Inst.getOperand(MemOpStart + X86::AddrSegmentReg);
743 const MCOperand &BaseReg = Inst.getOperand(MemOpStart + X86::AddrBaseReg);
744 const MCOperand &IndexReg = Inst.getOperand(MemOpStart + X86::AddrIndexReg);
745 const MCOperand &ScaleAmt = Inst.getOperand(MemOpStart + X86::AddrScaleAmt);
746 const MCOperand &Disp = Inst.getOperand(MemOpStart + X86::AddrDisp);
747 if (SegReg.getReg() || IndexReg.getReg() || ScaleAmt.getImm() != 1 ||
748 !Disp.isImm())
749 return std::nullopt;
750
751 // RIP-relative addressing.
752 if (BaseReg.getReg() == X86::RIP)
753 return Addr + Size + Disp.getImm();
754
755 return std::nullopt;
756}
757
758std::optional<uint64_t>
760 uint64_t Size) const {
761 if (Inst.getOpcode() != X86::LEA64r)
762 return std::nullopt;
763 const MCInstrDesc &MCID = Info->get(Inst.getOpcode());
764 int MemOpStart = X86II::getMemoryOperandNo(MCID.TSFlags);
765 if (MemOpStart == -1)
766 return std::nullopt;
767 MemOpStart += X86II::getOperandBias(MCID);
768 const MCOperand &SegReg = Inst.getOperand(MemOpStart + X86::AddrSegmentReg);
769 const MCOperand &BaseReg = Inst.getOperand(MemOpStart + X86::AddrBaseReg);
770 const MCOperand &IndexReg = Inst.getOperand(MemOpStart + X86::AddrIndexReg);
771 const MCOperand &ScaleAmt = Inst.getOperand(MemOpStart + X86::AddrScaleAmt);
772 const MCOperand &Disp = Inst.getOperand(MemOpStart + X86::AddrDisp);
773 // Must be a simple rip-relative address.
774 if (BaseReg.getReg() != X86::RIP || SegReg.getReg() || IndexReg.getReg() ||
775 ScaleAmt.getImm() != 1 || !Disp.isImm())
776 return std::nullopt;
777 // rip-relative ModR/M immediate is 32 bits.
778 assert(Size > 4 && "invalid instruction size for rip-relative lea");
779 return Size - 4;
780}
781
782} // end of namespace X86_MC
783
784} // end of namespace llvm
785
787 return new X86_MC::X86MCInstrAnalysis(Info);
788}
789
790// Force static initialization.
793 // Register the MC asm info.
795
796 // Register the MC instruction info.
798
799 // Register the MC register info.
801
802 // Register the MC subtarget info.
805
806 // Register the MC instruction analyzer.
808
809 // Register the code emitter.
811
812 // Register the obj target streamer.
815
816 // Register the asm target streamer.
818
819 // Register the null streamer.
821
824
825 // Register the MCInstPrinter.
827
828 // Register the MC relocation info.
830 }
831
832 // Register the asm backend.
837}
838
840 bool High) {
841#define DEFAULT_NOREG \
842 default: \
843 return X86::NoRegister;
844#define SUB_SUPER(R1, R2, R3, R4, R) \
845 case X86::R1: \
846 case X86::R2: \
847 case X86::R3: \
848 case X86::R4: \
849 return X86::R;
850#define A_SUB_SUPER(R) \
851 case X86::AH: \
852 SUB_SUPER(AL, AX, EAX, RAX, R)
853#define D_SUB_SUPER(R) \
854 case X86::DH: \
855 SUB_SUPER(DL, DX, EDX, RDX, R)
856#define C_SUB_SUPER(R) \
857 case X86::CH: \
858 SUB_SUPER(CL, CX, ECX, RCX, R)
859#define B_SUB_SUPER(R) \
860 case X86::BH: \
861 SUB_SUPER(BL, BX, EBX, RBX, R)
862#define SI_SUB_SUPER(R) SUB_SUPER(SIL, SI, ESI, RSI, R)
863#define DI_SUB_SUPER(R) SUB_SUPER(DIL, DI, EDI, RDI, R)
864#define BP_SUB_SUPER(R) SUB_SUPER(BPL, BP, EBP, RBP, R)
865#define SP_SUB_SUPER(R) SUB_SUPER(SPL, SP, ESP, RSP, R)
866#define NO_SUB_SUPER(NO, REG) \
867 SUB_SUPER(R##NO##B, R##NO##W, R##NO##D, R##NO, REG)
868#define NO_SUB_SUPER_B(NO) NO_SUB_SUPER(NO, R##NO##B)
869#define NO_SUB_SUPER_W(NO) NO_SUB_SUPER(NO, R##NO##W)
870#define NO_SUB_SUPER_D(NO) NO_SUB_SUPER(NO, R##NO##D)
871#define NO_SUB_SUPER_Q(NO) NO_SUB_SUPER(NO, R##NO)
872 switch (Size) {
873 default:
874 llvm_unreachable("illegal register size");
875 case 8:
876 if (High) {
877 switch (Reg.id()) {
879 A_SUB_SUPER(AH)
880 D_SUB_SUPER(DH)
882 B_SUB_SUPER(BH)
883 }
884 } else {
885 switch (Reg.id()) {
887 A_SUB_SUPER(AL)
889 C_SUB_SUPER(CL)
890 B_SUB_SUPER(BL)
891 SI_SUB_SUPER(SIL)
892 DI_SUB_SUPER(DIL)
893 BP_SUB_SUPER(BPL)
894 SP_SUB_SUPER(SPL)
919 }
920 }
921 case 16:
922 switch (Reg.id()) {
924 A_SUB_SUPER(AX)
925 D_SUB_SUPER(DX)
926 C_SUB_SUPER(CX)
927 B_SUB_SUPER(BX)
929 DI_SUB_SUPER(DI)
930 BP_SUB_SUPER(BP)
931 SP_SUB_SUPER(SP)
956 }
957 case 32:
958 switch (Reg.id()) {
960 A_SUB_SUPER(EAX)
961 D_SUB_SUPER(EDX)
962 C_SUB_SUPER(ECX)
963 B_SUB_SUPER(EBX)
964 SI_SUB_SUPER(ESI)
965 DI_SUB_SUPER(EDI)
966 BP_SUB_SUPER(EBP)
967 SP_SUB_SUPER(ESP)
992 }
993 case 64:
994 switch (Reg.id()) {
996 A_SUB_SUPER(RAX)
997 D_SUB_SUPER(RDX)
998 C_SUB_SUPER(RCX)
999 B_SUB_SUPER(RBX)
1000 SI_SUB_SUPER(RSI)
1002 BP_SUB_SUPER(RBP)
1003 SP_SUB_SUPER(RSP)
1006 NO_SUB_SUPER_Q(10)
1007 NO_SUB_SUPER_Q(11)
1008 NO_SUB_SUPER_Q(12)
1009 NO_SUB_SUPER_Q(13)
1010 NO_SUB_SUPER_Q(14)
1011 NO_SUB_SUPER_Q(15)
1012 NO_SUB_SUPER_Q(16)
1013 NO_SUB_SUPER_Q(17)
1014 NO_SUB_SUPER_Q(18)
1015 NO_SUB_SUPER_Q(19)
1016 NO_SUB_SUPER_Q(20)
1017 NO_SUB_SUPER_Q(21)
1018 NO_SUB_SUPER_Q(22)
1019 NO_SUB_SUPER_Q(23)
1020 NO_SUB_SUPER_Q(24)
1021 NO_SUB_SUPER_Q(25)
1022 NO_SUB_SUPER_Q(26)
1023 NO_SUB_SUPER_Q(27)
1024 NO_SUB_SUPER_Q(28)
1025 NO_SUB_SUPER_Q(29)
1026 NO_SUB_SUPER_Q(30)
1027 NO_SUB_SUPER_Q(31)
1028 }
1029 }
1030}
assert(UImm &&(UImm !=~static_cast< T >(0)) &&"Invalid immediate!")
This file implements a class to represent arbitrary precision integral constant values and operations...
ReachingDefInfo & RDI
MachineBasicBlock MachineBasicBlock::iterator DebugLoc DL
#define X(NUM, ENUM, NAME)
Definition ELF.h:853
IRTranslator LLVM IR MI
static LVOptions Options
Definition LVOptions.cpp:25
#define I(x, y, z)
Definition MD5.cpp:57
#define T
uint64_t High
#define CH(x, y, z)
Definition SHA256.cpp:34
SI optimize exec mask operations pre RA
#define LLVM_C_ABI
LLVM_C_ABI is the export/visibility macro used to mark symbols declared in llvm-c as exported when bu...
Definition Visibility.h:40
static bool is64Bit(const char *name)
#define NO_SUB_SUPER_W(NO)
#define NO_SUB_SUPER_Q(NO)
static MCRelocationInfo * createX86MCRelocationInfo(const Triple &TheTriple, MCContext &Ctx)
static MCInstrInfo * createX86MCInstrInfo()
#define C_SUB_SUPER(R)
#define NO_SUB_SUPER_D(NO)
#define DEFAULT_NOREG
static MCRegisterInfo * createX86MCRegisterInfo(const Triple &TT)
#define SP_SUB_SUPER(R)
static void populateReservedIdentifiers(MCAsmInfo &MAI, const MCRegisterInfo &MRI)
static MCInstPrinter * createX86MCInstPrinter(const Triple &T, unsigned SyntaxVariant, const MCAsmInfo &MAI, const MCInstrInfo &MII, const MCRegisterInfo &MRI)
static MCInstrAnalysis * createX86MCInstrAnalysis(const MCInstrInfo *Info)
#define SI_SUB_SUPER(R)
#define BP_SUB_SUPER(R)
#define B_SUB_SUPER(R)
LLVM_C_ABI void LLVMInitializeX86TargetMC()
#define DI_SUB_SUPER(R)
#define NO_SUB_SUPER_B(NO)
#define A_SUB_SUPER(R)
#define D_SUB_SUPER(R)
static MCAsmInfo * createX86MCAsmInfo(const MCRegisterInfo &MRI, const Triple &TheTriple, const MCTargetOptions &Options)
static bool isMemOperand(const MCInst &MI, unsigned Op, unsigned RegClassID)
Class for arbitrary precision integers.
Definition APInt.h:78
Represent a constant reference to an array (0 or more elements consecutively in memory),...
Definition ArrayRef.h:40
size_t size() const
Get the array size.
Definition ArrayRef.h:141
const T * data() const
Definition ArrayRef.h:138
A container which contains a StringRef plus a precomputed hash.
This class is intended to be used as a base class for asm properties and features specific to the tar...
Definition MCAsmInfo.h:66
void addInitialFrameState(const MCCFIInstruction &Inst)
Definition MCAsmInfo.cpp:53
llvm::DenseSet< llvm::CachedHashStringRef > & getReservedIdentifiers()
Definition MCAsmInfo.h:501
static MCCFIInstruction cfiDefCfa(MCSymbol *L, unsigned Register, int64_t Offset, SMLoc Loc={})
.cfi_def_cfa defines a rule for computing CFA as: take address from Register and add Offset to it.
Definition MCDwarf.h:615
static MCCFIInstruction createOffset(MCSymbol *L, unsigned Register, int64_t Offset, SMLoc Loc={})
.cfi_offset Previous value of Register is saved at offset Offset from CFA.
Definition MCDwarf.h:657
Context object for machine code objects.
Definition MCContext.h:83
This is an instance of a target assembly language printer that converts an MCInst to valid target ass...
Instances of this class represent a single low-level machine instruction.
Definition MCInst.h:188
unsigned getNumOperands() const
Definition MCInst.h:212
unsigned getOpcode() const
Definition MCInst.h:202
const MCOperand & getOperand(unsigned i) const
Definition MCInst.h:210
const MCInstrInfo * Info
MCInstrAnalysis(const MCInstrInfo *Info)
Describe properties that are true of each instruction in the target description file.
Interface to description of machine instruction set.
Definition MCInstrInfo.h:27
Instances of this class represent operands of the MCInst class.
Definition MCInst.h:40
int64_t getImm() const
Definition MCInst.h:84
bool isImm() const
Definition MCInst.h:66
MCRegister getReg() const
Returns the register number.
Definition MCInst.h:73
MCRegisterClass - Base class of TargetRegisterClass.
bool contains(MCRegister Reg) const
contains - Return true if the specified register is included in this register class.
MCRegisterInfo base class - We assume that the target defines a static array of MCRegisterDesc object...
void mapLLVMRegToCVReg(MCRegister LLVMReg, int CVReg)
uint16_t getEncodingValue(MCRegister Reg) const
Returns the encoding for Reg.
void mapLLVMRegToSEHReg(MCRegister LLVMReg, int SEHReg)
mapLLVMRegToSEHReg - Used to initialize LLVM register to SEH register number mapping.
const MCRegisterClass & getRegClass(unsigned i) const
Returns the register class associated with the enumeration value.
virtual int64_t getDwarfRegNum(MCRegister Reg, bool isEH) const
Map a target register to an equivalent dwarf register number.
unsigned getNumRegs() const
Return the number of registers this target has (useful for sizing arrays holding per register informa...
Wrapper class representing physical registers. Should be passed by value.
Definition MCRegister.h:41
Create MCExprs from relocations found in an object file.
Generic base class for all target subtargets.
bool hasFeature(unsigned Feature) const
const Triple & getTargetTriple() const
Represent a constant reference to a string, i.e.
Definition StringRef.h:56
Target - Wrapper for Target specific information.
Triple - Helper class for working with autoconf configuration names.
Definition Triple.h:47
bool isOSCygMing() const
Tests for either Cygwin or MinGW OS.
Definition Triple.h:735
bool isX86_64() const
Tests whether the target is x86 (64-bit).
Definition Triple.h:1119
bool isOSBinFormatMachO() const
Tests whether the environment is MachO.
Definition Triple.h:791
bool isWindowsCoreCLREnvironment() const
Definition Triple.h:718
ArchType getArch() const
Get the parsed architecture type of this triple.
Definition Triple.h:436
bool isUEFI() const
Tests whether the OS is UEFI.
Definition Triple.h:696
bool isOSBinFormatELF() const
Tests whether the OS uses the ELF binary format.
Definition Triple.h:782
bool isWindowsMSVCEnvironment() const
Checks if the environment could be MSVC.
Definition Triple.h:707
bool isWindowsItaniumEnvironment() const
Definition Triple.h:722
Twine - A lightweight data structure for efficiently representing the concatenation of temporary valu...
Definition Twine.h:82
static const char * getRegisterName(MCRegister Reg)
bool evaluateBranch(const MCInst &Inst, uint64_t Addr, uint64_t Size, uint64_t &Target) const override
Given a branch instruction try to get the address the branch targets.
X86MCInstrAnalysis(const MCInstrInfo *MCII)
std::optional< uint64_t > evaluateMemoryOperandAddress(const MCInst &Inst, const MCSubtargetInfo *STI, uint64_t Addr, uint64_t Size) const override
Given an instruction tries to get the address of a memory operand.
std::optional< uint64_t > getMemoryOperandRelocationOffset(const MCInst &Inst, uint64_t Size) const override
Given an instruction with a memory operand that could require relocation, returns the offset within t...
std::vector< std::pair< uint64_t, uint64_t > > findPltEntries(uint64_t PltSectionVA, ArrayRef< uint8_t > PltContents, const MCSubtargetInfo &STI) const override
Returns (PLT virtual address, GOT virtual address) pairs for PLT entries.
bool clearsSuperRegisters(const MCRegisterInfo &MRI, const MCInst &Inst, APInt &Mask) const override
Returns true if at least one of the register writes performed by.
#define llvm_unreachable(msg)
Marks that the current location is not supposed to be reachable.
@ RawFrmDstSrc
RawFrmDstSrc - This form is for instructions that use the source index register SI/ESI/RSI with a pos...
@ EVEX
EVEX - Specifies that this instruction use EVEX form which provides syntax support up to 32 512-bit r...
@ RawFrmDst
RawFrmDst - This form is for instructions that use the destination index register DI/EDI/RDI.
@ VEX
VEX - encoding using 0xC4/0xC5.
@ XOP
XOP - Opcode prefix used by XOP instructions.
@ RawFrmSrc
RawFrmSrc - This form is for instructions that use the source index register SI/ESI/RSI with a possib...
int getMemoryOperandNo(uint64_t TSFlags)
unsigned getOperandBias(const MCInstrDesc &Desc)
Compute whether all of the def operands are repeated in the uses and therefore should be skipped.
bool is32BitMemOperand(const MCInst &MI, unsigned Op)
bool is16BitMemOperand(const MCInst &MI, unsigned Op, const MCSubtargetInfo &STI)
bool hasLockPrefix(const MCInst &MI)
Returns true if this instruction has a LOCK prefix.
void initLLVMToSEHAndCVRegMapping(MCRegisterInfo *MRI)
static std::vector< std::pair< uint64_t, uint64_t > > findX86_64PltEntries(uint64_t PltSectionVA, ArrayRef< uint8_t > PltContents)
static std::vector< std::pair< uint64_t, uint64_t > > findX86PltEntries(uint64_t PltSectionVA, ArrayRef< uint8_t > PltContents)
bool needsAddressSizeOverride(const MCInst &MI, const MCSubtargetInfo &STI, int MemoryOperand, uint64_t TSFlags)
Returns true if this instruction needs an Address-Size override prefix.
std::string ParseX86Triple(const Triple &TT)
MCSubtargetInfo * createX86MCSubtargetInfo(const Triple &TT, StringRef CPU, StringRef FS)
Create a X86 MCSubtargetInfo instance.
bool is64BitMemOperand(const MCInst &MI, unsigned Op)
unsigned getDwarfRegFlavour(const Triple &TT, bool isEH)
uint32_t read32le(const void *P)
Definition Endian.h:432
This is an optimization pass for GlobalISel generic memory operations.
MCTargetStreamer * createX86ObjectTargetStreamer(MCStreamer &S, const MCSubtargetInfo &STI)
Implements X86-only directives for object files.
MCRegister getX86SubSuperRegister(MCRegister Reg, unsigned Size, bool High=false)
MCAsmBackend * createX86_64AsmBackend(const Target &T, const MCSubtargetInfo &STI, const MCRegisterInfo &MRI, const MCTargetOptions &Options)
MCTargetStreamer * createX86AsmTargetStreamer(MCStreamer &S, formatted_raw_ostream &OS, MCInstPrinter *InstPrinter)
Implements X86-only directives for assembly emission.
MCCodeEmitter * createX86MCCodeEmitter(const MCInstrInfo &MCII, MCContext &Ctx)
Target & getTheX86_32Target()
Op::Description Desc
LLVM_ABI MCRelocationInfo * createMCRelocationInfo(const Triple &TT, MCContext &Ctx)
MCStreamer * createX86ELFStreamer(const Triple &T, MCContext &Context, std::unique_ptr< MCAsmBackend > &&MAB, std::unique_ptr< MCObjectWriter > &&MOW, std::unique_ptr< MCCodeEmitter > &&MCE)
MCStreamer * createX86WinCOFFStreamer(MCContext &C, std::unique_ptr< MCAsmBackend > &&AB, std::unique_ptr< MCObjectWriter > &&OW, std::unique_ptr< MCCodeEmitter > &&CE)
Construct an X86 Windows COFF machine code streamer which will generate PE/COFF format object files.
uint16_t MCPhysReg
An unsigned integer type large enough to represent all physical registers, but not necessarily virtua...
Definition MCRegister.h:21
DWARFExpression::Operation Op
MCAsmBackend * createX86_32AsmBackend(const Target &T, const MCSubtargetInfo &STI, const MCRegisterInfo &MRI, const MCTargetOptions &Options)
Target & getTheX86_64Target()
MCTargetStreamer * createX86NullTargetStreamer(MCStreamer &S)
Implements X86-only null emission.
RegisterMCAsmInfoFn - Helper template for registering a target assembly info implementation.
static void RegisterMCRegInfo(Target &T, Target::MCRegInfoCtorFnTy Fn)
RegisterMCRegInfo - Register a MCRegisterInfo implementation for the given target.
static void RegisterMCAsmBackend(Target &T, Target::MCAsmBackendCtorTy Fn)
RegisterMCAsmBackend - Register a MCAsmBackend implementation for the given target.
static void RegisterMCCodeEmitter(Target &T, Target::MCCodeEmitterCtorTy Fn)
RegisterMCCodeEmitter - Register a MCCodeEmitter implementation for the given target.
static void RegisterMCSubtargetInfo(Target &T, Target::MCSubtargetInfoCtorFnTy Fn)
RegisterMCSubtargetInfo - Register a MCSubtargetInfo implementation for the given target.
static void RegisterObjectTargetStreamer(Target &T, Target::ObjectTargetStreamerCtorTy Fn)
static void RegisterMCInstrAnalysis(Target &T, Target::MCInstrAnalysisCtorFnTy Fn)
RegisterMCInstrAnalysis - Register a MCInstrAnalysis implementation for the given target.
static void RegisterELFStreamer(Target &T, Target::ELFStreamerCtorTy Fn)
static void RegisterNullTargetStreamer(Target &T, Target::NullTargetStreamerCtorTy Fn)
static void RegisterMCInstPrinter(Target &T, Target::MCInstPrinterCtorTy Fn)
RegisterMCInstPrinter - Register a MCInstPrinter implementation for the given target.
static void RegisterCOFFStreamer(Target &T, Target::COFFStreamerCtorTy Fn)
static void RegisterMCInstrInfo(Target &T, Target::MCInstrInfoCtorFnTy Fn)
RegisterMCInstrInfo - Register a MCInstrInfo implementation for the given target.
static void RegisterAsmTargetStreamer(Target &T, Target::AsmTargetStreamerCtorTy Fn)
static void RegisterMCRelocationInfo(Target &T, Target::MCRelocationInfoCtorTy Fn)
RegisterMCRelocationInfo - Register an MCRelocationInfo implementation for the given target.