LLVM 24.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 "X86MCLFIRewriter.h"
20#include "X86MCOptions.h"
21#include "X86TargetStreamer.h"
22#include "llvm-c/Visibility.h"
23#include "llvm/ADT/APInt.h"
25#include "llvm/MC/MCDwarf.h"
27#include "llvm/MC/MCInstrInfo.h"
29#include "llvm/MC/MCStreamer.h"
36
37using namespace llvm;
38
39#define GET_REGINFO_MC_DESC
40#include "X86GenRegisterInfo.inc"
41
42#define GET_INSTRINFO_MC_DESC
43#define GET_INSTRINFO_MC_HELPERS
44#define ENABLE_INSTR_PREDICATE_VERIFIER
45#include "X86GenInstrInfo.inc"
46
47#define GET_SUBTARGETINFO_MC_DESC
48#include "X86GenSubtargetInfo.inc"
49
50#define OPTIONS_STRUCT_DEFS
51#include "X86MCOptions.inc"
52
53std::string X86_MC::ParseX86Triple(const Triple &TT) {
54 std::string FS;
55 // SSE2 should default to enabled in 64-bit mode, but can be turned off
56 // explicitly.
57 if (TT.isX86_64())
58 FS = "+64bit-mode,-32bit-mode,-16bit-mode,+sse2";
59 else if (TT.getEnvironment() != Triple::CODE16)
60 FS = "-64bit-mode,+32bit-mode,-16bit-mode";
61 else
62 FS = "-64bit-mode,-32bit-mode,+16bit-mode";
63
64 if (TT.isX32())
65 FS += ",+x32";
66
67 return FS;
68}
69
70unsigned X86_MC::getDwarfRegFlavour(const Triple &TT, bool isEH) {
71 if (TT.isX86_64())
73
74 if (TT.isOSDarwin())
76 if (TT.isOSCygMing())
77 // Unsupported by now, just quick fallback
80}
81
83 return MI.getFlags() & X86::IP_HAS_LOCK;
84}
85
86static bool isMemOperand(const MCInst &MI, unsigned Op, unsigned RegClassID) {
87 const MCOperand &Base = MI.getOperand(Op + X86::AddrBaseReg);
88 const MCOperand &Index = MI.getOperand(Op + X86::AddrIndexReg);
89 const MCRegisterClass &RC = getX86MCRegisterClass(RegClassID);
90
91 return (Base.isReg() && Base.getReg() && RC.contains(Base.getReg())) ||
92 (Index.isReg() && Index.getReg() && RC.contains(Index.getReg()));
93}
94
95bool X86_MC::is16BitMemOperand(const MCInst &MI, unsigned Op,
96 const MCSubtargetInfo &STI) {
97 const MCOperand &Base = MI.getOperand(Op + X86::AddrBaseReg);
98 const MCOperand &Index = MI.getOperand(Op + X86::AddrIndexReg);
99
100 if (STI.hasFeature(X86::Is16Bit) && Base.isReg() && !Base.getReg() &&
101 Index.isReg() && !Index.getReg())
102 return true;
103 return isMemOperand(MI, Op, X86::GR16RegClassID);
104}
105
106bool X86_MC::is32BitMemOperand(const MCInst &MI, unsigned Op) {
107 const MCOperand &Base = MI.getOperand(Op + X86::AddrBaseReg);
108 const MCOperand &Index = MI.getOperand(Op + X86::AddrIndexReg);
109 if (Base.isReg() && Base.getReg() == X86::EIP) {
110 assert(Index.isReg() && !Index.getReg() && "Invalid eip-based address");
111 return true;
112 }
113 if (Index.isReg() && Index.getReg() == X86::EIZ)
114 return true;
115 return isMemOperand(MI, Op, X86::GR32RegClassID);
116}
117
118#ifndef NDEBUG
119bool X86_MC::is64BitMemOperand(const MCInst &MI, unsigned Op) {
120 return isMemOperand(MI, Op, X86::GR64RegClassID);
121}
122#endif
123
125 const MCSubtargetInfo &STI,
126 int MemoryOperand, uint64_t TSFlags) {
127 uint64_t AdSize = TSFlags & X86II::AdSizeMask;
128 bool Is16BitMode = STI.hasFeature(X86::Is16Bit);
129 bool Is32BitMode = STI.hasFeature(X86::Is32Bit);
130 bool Is64BitMode = STI.hasFeature(X86::Is64Bit);
131 if ((Is16BitMode && AdSize == X86II::AdSize32) ||
132 (Is32BitMode && AdSize == X86II::AdSize16) ||
133 (Is64BitMode && AdSize == X86II::AdSize32))
134 return true;
135 uint64_t Form = TSFlags & X86II::FormMask;
136 switch (Form) {
137 default:
138 break;
139 case X86II::RawFrmDstSrc: {
140 MCRegister siReg = MI.getOperand(1).getReg();
141 assert(((siReg == X86::SI && MI.getOperand(0).getReg() == X86::DI) ||
142 (siReg == X86::ESI && MI.getOperand(0).getReg() == X86::EDI) ||
143 (siReg == X86::RSI && MI.getOperand(0).getReg() == X86::RDI)) &&
144 "SI and DI register sizes do not match");
145 return (!Is32BitMode && siReg == X86::ESI) ||
146 (Is32BitMode && siReg == X86::SI);
147 }
148 case X86II::RawFrmSrc: {
149 MCRegister siReg = MI.getOperand(0).getReg();
150 return (!Is32BitMode && siReg == X86::ESI) ||
151 (Is32BitMode && siReg == X86::SI);
152 }
153 case X86II::RawFrmDst: {
154 MCRegister siReg = MI.getOperand(0).getReg();
155 return (!Is32BitMode && siReg == X86::EDI) ||
156 (Is32BitMode && siReg == X86::DI);
157 }
158 }
159
160 // Determine where the memory operand starts, if present.
161 if (MemoryOperand < 0)
162 return false;
163
164 if (STI.hasFeature(X86::Is64Bit)) {
165 assert(!is16BitMemOperand(MI, MemoryOperand, STI));
166 return is32BitMemOperand(MI, MemoryOperand);
167 }
168 if (STI.hasFeature(X86::Is32Bit)) {
169 assert(!is64BitMemOperand(MI, MemoryOperand));
170 return is16BitMemOperand(MI, MemoryOperand, STI);
171 }
172 assert(STI.hasFeature(X86::Is16Bit));
173 assert(!is64BitMemOperand(MI, MemoryOperand));
174 return !is16BitMemOperand(MI, MemoryOperand, STI);
175}
176
178 // FIXME: TableGen these.
179 for (unsigned Reg = X86::NoRegister + 1; Reg < X86::NUM_TARGET_REGS; ++Reg) {
180 unsigned SEH = MRI->getEncodingValue(Reg);
181 MRI->mapLLVMRegToSEHReg(Reg, SEH);
182 }
183
184 // Mapping from CodeView to MC register id.
185 static const struct {
187 MCPhysReg Reg;
188 } RegMap[] = {
189 {codeview::RegisterId::AL, X86::AL},
190 {codeview::RegisterId::CL, X86::CL},
191 {codeview::RegisterId::DL, X86::DL},
192 {codeview::RegisterId::BL, X86::BL},
193 {codeview::RegisterId::AH, X86::AH},
194 {codeview::RegisterId::CH, X86::CH},
195 {codeview::RegisterId::DH, X86::DH},
196 {codeview::RegisterId::BH, X86::BH},
197 {codeview::RegisterId::AX, X86::AX},
198 {codeview::RegisterId::CX, X86::CX},
199 {codeview::RegisterId::DX, X86::DX},
200 {codeview::RegisterId::BX, X86::BX},
201 {codeview::RegisterId::SP, X86::SP},
202 {codeview::RegisterId::BP, X86::BP},
203 {codeview::RegisterId::SI, X86::SI},
204 {codeview::RegisterId::DI, X86::DI},
205 {codeview::RegisterId::EAX, X86::EAX},
206 {codeview::RegisterId::ECX, X86::ECX},
207 {codeview::RegisterId::EDX, X86::EDX},
208 {codeview::RegisterId::EBX, X86::EBX},
209 {codeview::RegisterId::ESP, X86::ESP},
210 {codeview::RegisterId::EBP, X86::EBP},
211 {codeview::RegisterId::ESI, X86::ESI},
212 {codeview::RegisterId::EDI, X86::EDI},
213
214 {codeview::RegisterId::EFLAGS, X86::EFLAGS},
215
216 {codeview::RegisterId::ST0, X86::ST0},
217 {codeview::RegisterId::ST1, X86::ST1},
218 {codeview::RegisterId::ST2, X86::ST2},
219 {codeview::RegisterId::ST3, X86::ST3},
220 {codeview::RegisterId::ST4, X86::ST4},
221 {codeview::RegisterId::ST5, X86::ST5},
222 {codeview::RegisterId::ST6, X86::ST6},
223 {codeview::RegisterId::ST7, X86::ST7},
224
225 {codeview::RegisterId::ST0, X86::FP0},
226 {codeview::RegisterId::ST1, X86::FP1},
227 {codeview::RegisterId::ST2, X86::FP2},
228 {codeview::RegisterId::ST3, X86::FP3},
229 {codeview::RegisterId::ST4, X86::FP4},
230 {codeview::RegisterId::ST5, X86::FP5},
231 {codeview::RegisterId::ST6, X86::FP6},
232 {codeview::RegisterId::ST7, X86::FP7},
233
234 {codeview::RegisterId::MM0, X86::MM0},
235 {codeview::RegisterId::MM1, X86::MM1},
236 {codeview::RegisterId::MM2, X86::MM2},
237 {codeview::RegisterId::MM3, X86::MM3},
238 {codeview::RegisterId::MM4, X86::MM4},
239 {codeview::RegisterId::MM5, X86::MM5},
240 {codeview::RegisterId::MM6, X86::MM6},
241 {codeview::RegisterId::MM7, X86::MM7},
242
243 {codeview::RegisterId::XMM0, X86::XMM0},
244 {codeview::RegisterId::XMM1, X86::XMM1},
245 {codeview::RegisterId::XMM2, X86::XMM2},
246 {codeview::RegisterId::XMM3, X86::XMM3},
247 {codeview::RegisterId::XMM4, X86::XMM4},
248 {codeview::RegisterId::XMM5, X86::XMM5},
249 {codeview::RegisterId::XMM6, X86::XMM6},
250 {codeview::RegisterId::XMM7, X86::XMM7},
251
252 {codeview::RegisterId::XMM8, X86::XMM8},
253 {codeview::RegisterId::XMM9, X86::XMM9},
254 {codeview::RegisterId::XMM10, X86::XMM10},
255 {codeview::RegisterId::XMM11, X86::XMM11},
256 {codeview::RegisterId::XMM12, X86::XMM12},
257 {codeview::RegisterId::XMM13, X86::XMM13},
258 {codeview::RegisterId::XMM14, X86::XMM14},
259 {codeview::RegisterId::XMM15, X86::XMM15},
260
261 {codeview::RegisterId::SIL, X86::SIL},
262 {codeview::RegisterId::DIL, X86::DIL},
263 {codeview::RegisterId::BPL, X86::BPL},
264 {codeview::RegisterId::SPL, X86::SPL},
265 {codeview::RegisterId::RAX, X86::RAX},
266 {codeview::RegisterId::RBX, X86::RBX},
267 {codeview::RegisterId::RCX, X86::RCX},
268 {codeview::RegisterId::RDX, X86::RDX},
269 {codeview::RegisterId::RSI, X86::RSI},
270 {codeview::RegisterId::RDI, X86::RDI},
271 {codeview::RegisterId::RBP, X86::RBP},
272 {codeview::RegisterId::RSP, X86::RSP},
273 {codeview::RegisterId::R8, X86::R8},
274 {codeview::RegisterId::R9, X86::R9},
275 {codeview::RegisterId::R10, X86::R10},
276 {codeview::RegisterId::R11, X86::R11},
277 {codeview::RegisterId::R12, X86::R12},
278 {codeview::RegisterId::R13, X86::R13},
279 {codeview::RegisterId::R14, X86::R14},
280 {codeview::RegisterId::R15, X86::R15},
281 {codeview::RegisterId::R16, X86::R16},
282 {codeview::RegisterId::R17, X86::R17},
283 {codeview::RegisterId::R18, X86::R18},
284 {codeview::RegisterId::R19, X86::R19},
285 {codeview::RegisterId::R20, X86::R20},
286 {codeview::RegisterId::R21, X86::R21},
287 {codeview::RegisterId::R22, X86::R22},
288 {codeview::RegisterId::R23, X86::R23},
289 {codeview::RegisterId::R24, X86::R24},
290 {codeview::RegisterId::R25, X86::R25},
291 {codeview::RegisterId::R26, X86::R26},
292 {codeview::RegisterId::R27, X86::R27},
293 {codeview::RegisterId::R28, X86::R28},
294 {codeview::RegisterId::R29, X86::R29},
295 {codeview::RegisterId::R30, X86::R30},
296 {codeview::RegisterId::R31, X86::R31},
297 {codeview::RegisterId::R8B, X86::R8B},
298 {codeview::RegisterId::R9B, X86::R9B},
299 {codeview::RegisterId::R10B, X86::R10B},
300 {codeview::RegisterId::R11B, X86::R11B},
301 {codeview::RegisterId::R12B, X86::R12B},
302 {codeview::RegisterId::R13B, X86::R13B},
303 {codeview::RegisterId::R14B, X86::R14B},
304 {codeview::RegisterId::R15B, X86::R15B},
305 {codeview::RegisterId::R16B, X86::R16B},
306 {codeview::RegisterId::R17B, X86::R17B},
307 {codeview::RegisterId::R18B, X86::R18B},
308 {codeview::RegisterId::R19B, X86::R19B},
309 {codeview::RegisterId::R20B, X86::R20B},
310 {codeview::RegisterId::R21B, X86::R21B},
311 {codeview::RegisterId::R22B, X86::R22B},
312 {codeview::RegisterId::R23B, X86::R23B},
313 {codeview::RegisterId::R24B, X86::R24B},
314 {codeview::RegisterId::R25B, X86::R25B},
315 {codeview::RegisterId::R26B, X86::R26B},
316 {codeview::RegisterId::R27B, X86::R27B},
317 {codeview::RegisterId::R28B, X86::R28B},
318 {codeview::RegisterId::R29B, X86::R29B},
319 {codeview::RegisterId::R30B, X86::R30B},
320 {codeview::RegisterId::R31B, X86::R31B},
321 {codeview::RegisterId::R8W, X86::R8W},
322 {codeview::RegisterId::R9W, X86::R9W},
323 {codeview::RegisterId::R10W, X86::R10W},
324 {codeview::RegisterId::R11W, X86::R11W},
325 {codeview::RegisterId::R12W, X86::R12W},
326 {codeview::RegisterId::R13W, X86::R13W},
327 {codeview::RegisterId::R14W, X86::R14W},
328 {codeview::RegisterId::R15W, X86::R15W},
329 {codeview::RegisterId::R16W, X86::R16W},
330 {codeview::RegisterId::R17W, X86::R17W},
331 {codeview::RegisterId::R18W, X86::R18W},
332 {codeview::RegisterId::R19W, X86::R19W},
333 {codeview::RegisterId::R20W, X86::R20W},
334 {codeview::RegisterId::R21W, X86::R21W},
335 {codeview::RegisterId::R22W, X86::R22W},
336 {codeview::RegisterId::R23W, X86::R23W},
337 {codeview::RegisterId::R24W, X86::R24W},
338 {codeview::RegisterId::R25W, X86::R25W},
339 {codeview::RegisterId::R26W, X86::R26W},
340 {codeview::RegisterId::R27W, X86::R27W},
341 {codeview::RegisterId::R28W, X86::R28W},
342 {codeview::RegisterId::R29W, X86::R29W},
343 {codeview::RegisterId::R30W, X86::R30W},
344 {codeview::RegisterId::R31W, X86::R31W},
345 {codeview::RegisterId::R8D, X86::R8D},
346 {codeview::RegisterId::R9D, X86::R9D},
347 {codeview::RegisterId::R10D, X86::R10D},
348 {codeview::RegisterId::R11D, X86::R11D},
349 {codeview::RegisterId::R12D, X86::R12D},
350 {codeview::RegisterId::R13D, X86::R13D},
351 {codeview::RegisterId::R14D, X86::R14D},
352 {codeview::RegisterId::R15D, X86::R15D},
353 {codeview::RegisterId::R16D, X86::R16D},
354 {codeview::RegisterId::R17D, X86::R17D},
355 {codeview::RegisterId::R18D, X86::R18D},
356 {codeview::RegisterId::R19D, X86::R19D},
357 {codeview::RegisterId::R20D, X86::R20D},
358 {codeview::RegisterId::R21D, X86::R21D},
359 {codeview::RegisterId::R22D, X86::R22D},
360 {codeview::RegisterId::R23D, X86::R23D},
361 {codeview::RegisterId::R24D, X86::R24D},
362 {codeview::RegisterId::R25D, X86::R25D},
363 {codeview::RegisterId::R26D, X86::R26D},
364 {codeview::RegisterId::R27D, X86::R27D},
365 {codeview::RegisterId::R28D, X86::R28D},
366 {codeview::RegisterId::R29D, X86::R29D},
367 {codeview::RegisterId::R30D, X86::R30D},
368 {codeview::RegisterId::R31D, X86::R31D},
369 {codeview::RegisterId::AMD64_YMM0, X86::YMM0},
370 {codeview::RegisterId::AMD64_YMM1, X86::YMM1},
371 {codeview::RegisterId::AMD64_YMM2, X86::YMM2},
372 {codeview::RegisterId::AMD64_YMM3, X86::YMM3},
373 {codeview::RegisterId::AMD64_YMM4, X86::YMM4},
374 {codeview::RegisterId::AMD64_YMM5, X86::YMM5},
375 {codeview::RegisterId::AMD64_YMM6, X86::YMM6},
376 {codeview::RegisterId::AMD64_YMM7, X86::YMM7},
377 {codeview::RegisterId::AMD64_YMM8, X86::YMM8},
378 {codeview::RegisterId::AMD64_YMM9, X86::YMM9},
379 {codeview::RegisterId::AMD64_YMM10, X86::YMM10},
380 {codeview::RegisterId::AMD64_YMM11, X86::YMM11},
381 {codeview::RegisterId::AMD64_YMM12, X86::YMM12},
382 {codeview::RegisterId::AMD64_YMM13, X86::YMM13},
383 {codeview::RegisterId::AMD64_YMM14, X86::YMM14},
384 {codeview::RegisterId::AMD64_YMM15, X86::YMM15},
385 {codeview::RegisterId::AMD64_YMM16, X86::YMM16},
386 {codeview::RegisterId::AMD64_YMM17, X86::YMM17},
387 {codeview::RegisterId::AMD64_YMM18, X86::YMM18},
388 {codeview::RegisterId::AMD64_YMM19, X86::YMM19},
389 {codeview::RegisterId::AMD64_YMM20, X86::YMM20},
390 {codeview::RegisterId::AMD64_YMM21, X86::YMM21},
391 {codeview::RegisterId::AMD64_YMM22, X86::YMM22},
392 {codeview::RegisterId::AMD64_YMM23, X86::YMM23},
393 {codeview::RegisterId::AMD64_YMM24, X86::YMM24},
394 {codeview::RegisterId::AMD64_YMM25, X86::YMM25},
395 {codeview::RegisterId::AMD64_YMM26, X86::YMM26},
396 {codeview::RegisterId::AMD64_YMM27, X86::YMM27},
397 {codeview::RegisterId::AMD64_YMM28, X86::YMM28},
398 {codeview::RegisterId::AMD64_YMM29, X86::YMM29},
399 {codeview::RegisterId::AMD64_YMM30, X86::YMM30},
400 {codeview::RegisterId::AMD64_YMM31, X86::YMM31},
401 {codeview::RegisterId::AMD64_ZMM0, X86::ZMM0},
402 {codeview::RegisterId::AMD64_ZMM1, X86::ZMM1},
403 {codeview::RegisterId::AMD64_ZMM2, X86::ZMM2},
404 {codeview::RegisterId::AMD64_ZMM3, X86::ZMM3},
405 {codeview::RegisterId::AMD64_ZMM4, X86::ZMM4},
406 {codeview::RegisterId::AMD64_ZMM5, X86::ZMM5},
407 {codeview::RegisterId::AMD64_ZMM6, X86::ZMM6},
408 {codeview::RegisterId::AMD64_ZMM7, X86::ZMM7},
409 {codeview::RegisterId::AMD64_ZMM8, X86::ZMM8},
410 {codeview::RegisterId::AMD64_ZMM9, X86::ZMM9},
411 {codeview::RegisterId::AMD64_ZMM10, X86::ZMM10},
412 {codeview::RegisterId::AMD64_ZMM11, X86::ZMM11},
413 {codeview::RegisterId::AMD64_ZMM12, X86::ZMM12},
414 {codeview::RegisterId::AMD64_ZMM13, X86::ZMM13},
415 {codeview::RegisterId::AMD64_ZMM14, X86::ZMM14},
416 {codeview::RegisterId::AMD64_ZMM15, X86::ZMM15},
417 {codeview::RegisterId::AMD64_ZMM16, X86::ZMM16},
418 {codeview::RegisterId::AMD64_ZMM17, X86::ZMM17},
419 {codeview::RegisterId::AMD64_ZMM18, X86::ZMM18},
420 {codeview::RegisterId::AMD64_ZMM19, X86::ZMM19},
421 {codeview::RegisterId::AMD64_ZMM20, X86::ZMM20},
422 {codeview::RegisterId::AMD64_ZMM21, X86::ZMM21},
423 {codeview::RegisterId::AMD64_ZMM22, X86::ZMM22},
424 {codeview::RegisterId::AMD64_ZMM23, X86::ZMM23},
425 {codeview::RegisterId::AMD64_ZMM24, X86::ZMM24},
426 {codeview::RegisterId::AMD64_ZMM25, X86::ZMM25},
427 {codeview::RegisterId::AMD64_ZMM26, X86::ZMM26},
428 {codeview::RegisterId::AMD64_ZMM27, X86::ZMM27},
429 {codeview::RegisterId::AMD64_ZMM28, X86::ZMM28},
430 {codeview::RegisterId::AMD64_ZMM29, X86::ZMM29},
431 {codeview::RegisterId::AMD64_ZMM30, X86::ZMM30},
432 {codeview::RegisterId::AMD64_ZMM31, X86::ZMM31},
433 {codeview::RegisterId::AMD64_K0, X86::K0},
434 {codeview::RegisterId::AMD64_K1, X86::K1},
435 {codeview::RegisterId::AMD64_K2, X86::K2},
436 {codeview::RegisterId::AMD64_K3, X86::K3},
437 {codeview::RegisterId::AMD64_K4, X86::K4},
438 {codeview::RegisterId::AMD64_K5, X86::K5},
439 {codeview::RegisterId::AMD64_K6, X86::K6},
440 {codeview::RegisterId::AMD64_K7, X86::K7},
441 {codeview::RegisterId::AMD64_XMM16, X86::XMM16},
442 {codeview::RegisterId::AMD64_XMM17, X86::XMM17},
443 {codeview::RegisterId::AMD64_XMM18, X86::XMM18},
444 {codeview::RegisterId::AMD64_XMM19, X86::XMM19},
445 {codeview::RegisterId::AMD64_XMM20, X86::XMM20},
446 {codeview::RegisterId::AMD64_XMM21, X86::XMM21},
447 {codeview::RegisterId::AMD64_XMM22, X86::XMM22},
448 {codeview::RegisterId::AMD64_XMM23, X86::XMM23},
449 {codeview::RegisterId::AMD64_XMM24, X86::XMM24},
450 {codeview::RegisterId::AMD64_XMM25, X86::XMM25},
451 {codeview::RegisterId::AMD64_XMM26, X86::XMM26},
452 {codeview::RegisterId::AMD64_XMM27, X86::XMM27},
453 {codeview::RegisterId::AMD64_XMM28, X86::XMM28},
454 {codeview::RegisterId::AMD64_XMM29, X86::XMM29},
455 {codeview::RegisterId::AMD64_XMM30, X86::XMM30},
456 {codeview::RegisterId::AMD64_XMM31, X86::XMM31},
457
458 };
459 for (const auto &I : RegMap)
460 MRI->mapLLVMRegToCVReg(I.Reg, static_cast<int>(I.CVReg));
461}
462
464 StringRef CPU, StringRef FS) {
465 std::string ArchFS = X86_MC::ParseX86Triple(TT);
466 assert(!ArchFS.empty() && "Failed to parse X86 triple");
467 if (!FS.empty())
468 ArchFS = (Twine(ArchFS) + "," + FS).str();
469
470 if (CPU.empty())
471 CPU = "generic";
472
473 return createX86MCSubtargetInfoImpl(TT, CPU, /*TuneCPU*/ CPU, ArchFS);
474}
475
477 MCInstrInfo *X = new MCInstrInfo();
478 InitX86MCInstrInfo(X);
479 return X;
480}
481
483 unsigned RA = TT.isX86_64() ? X86::RIP // Should have dwarf #16.
484 : X86::EIP; // Should have dwarf #8.
485
487 InitX86MCRegisterInfo(X, RA, X86_MC::getDwarfRegFlavour(TT, false),
488 X86_MC::getDwarfRegFlavour(TT, true), RA);
490 return X;
491}
492
494 const MCRegisterInfo &MRI) {
495 auto &Set = MAI.getReservedIdentifiers();
496 // Register names: `call rsi` is misassembled as an indirect call. Use the
497 // Intel printer's table directly — it's the lowercase asm name in stable
498 // storage. MRI::getName() returns the uppercase enum name and would need
499 // an extra .lower() heap allocation per entry.
500 for (unsigned i = 1, e = MRI.getNumRegs(); i < e; ++i)
501 if (const char *Name = X86IntelInstPrinter::getRegisterName(i))
502 if (Name[0])
503 Set.insert(CachedHashStringRef(Name));
504 // Keywords that GAS Intel syntax misparses as constants, modifiers, or
505 // pseudo-registers instead of symbol references (e.g., `call byte` calls
506 // address 1, not symbol "byte"; `call flat` errors out).
507 for (StringRef KW : {"byte", "word", "dword", "fword", "qword", "mmword",
508 "tbyte", "oword", "xmmword", "ymmword", "zmmword",
509 "offset", "flat", "near", "far", "short"})
510 Set.insert(CachedHashStringRef(KW));
511 // Operator keywords parsed by GAS/X86AsmParser in Intel mode.
512 for (StringRef KW : {"and", "eq", "ge", "gt", "le", "lt", "mod", "ne", "not",
513 "or", "shl", "shr", "xor"})
514 Set.insert(CachedHashStringRef(KW));
515}
516
518 const Triple &TheTriple,
519 const MCTargetOptions &Options) {
520 bool is64Bit = TheTriple.isX86_64();
521
522 MCAsmInfo *MAI;
523 if (TheTriple.isOSBinFormatMachO()) {
524 if (is64Bit)
525 MAI = new X86_64MCAsmInfoDarwin(TheTriple, Options);
526 else
527 MAI = new X86MCAsmInfoDarwin(TheTriple, Options);
528 } else if (TheTriple.isOSBinFormatELF()) {
529 // Force the use of an ELF container.
530 MAI = new X86ELFMCAsmInfo(TheTriple, Options);
531 } else if (TheTriple.isWindowsMSVCEnvironment() ||
532 TheTriple.isWindowsCoreCLREnvironment() || TheTriple.isUEFI()) {
533 if (Options.getAssemblyLanguage().equals_insensitive("masm"))
534 MAI = new X86MCAsmInfoMicrosoftMASM(TheTriple, Options);
535 else
536 MAI = new X86MCAsmInfoMicrosoft(TheTriple, Options);
537 } else if (TheTriple.isOSCygMing() ||
538 TheTriple.isWindowsItaniumEnvironment()) {
539 MAI = new X86MCAsmInfoGNUCOFF(TheTriple, Options);
540 } else {
541 // The default is ELF.
542 MAI = new X86ELFMCAsmInfo(TheTriple, Options);
543 }
544
545 // Only Intel-syntax output needs to avoid register/keyword collisions; AT&T
546 // disambiguates registers with '%' and doesn't treat `byte`, `ptr`, etc. as
547 // keywords.
548 if (MAI->getOutputAssemblerDialect() != 0)
550
551 // Initialize initial frame state.
552 // Calculate amount of bytes used for return address storing
553 int stackGrowth = is64Bit ? -8 : -4;
554
555 // Initial state of the frame pointer is esp+stackGrowth.
556 unsigned StackPtr = is64Bit ? X86::RSP : X86::ESP;
558 nullptr, MRI.getDwarfRegNum(StackPtr, true), -stackGrowth);
559 MAI->addInitialFrameState(Inst);
560
561 // Add return address to move list
562 unsigned InstPtr = is64Bit ? X86::RIP : X86::EIP;
564 nullptr, MRI.getDwarfRegNum(InstPtr, true), stackGrowth);
565 MAI->addInitialFrameState(Inst2);
566
567 return MAI;
568}
569
571 unsigned SyntaxVariant,
572 const MCAsmInfo &MAI,
573 const MCInstrInfo &MII,
574 const MCRegisterInfo &MRI) {
575 if (SyntaxVariant == 0)
576 return new X86ATTInstPrinter(MAI, MII, MRI);
577 if (SyntaxVariant == 1)
578 return new X86IntelInstPrinter(MAI, MII, MRI);
579 return nullptr;
580}
581
583 MCContext &Ctx) {
584 // Default to the stock relocation info.
585 return llvm::createMCRelocationInfo(TheTriple, Ctx);
586}
587
588namespace llvm {
589namespace X86_MC {
590
591class X86MCInstrAnalysis : public MCInstrAnalysis {
592 X86MCInstrAnalysis(const X86MCInstrAnalysis &) = delete;
593 X86MCInstrAnalysis &operator=(const X86MCInstrAnalysis &) = delete;
594 ~X86MCInstrAnalysis() override = default;
595
596public:
598
599#define GET_STIPREDICATE_DECLS_FOR_MC_ANALYSIS
600#include "X86GenSubtargetInfo.inc"
601
602 bool clearsSuperRegisters(const MCRegisterInfo &MRI, const MCInst &Inst,
603 APInt &Mask) const override;
604 std::vector<std::pair<uint64_t, uint64_t>>
605 findPltEntries(uint64_t PltSectionVA, ArrayRef<uint8_t> PltContents,
606 const MCSubtargetInfo &STI) const override;
607
608 bool evaluateBranch(const MCInst &Inst, uint64_t Addr, uint64_t Size,
609 uint64_t &Target) const override;
610 std::optional<uint64_t>
612 uint64_t Addr, uint64_t Size) const override;
613 std::optional<uint64_t>
615 uint64_t Size) const override;
616};
617
618#define GET_STIPREDICATE_DEFS_FOR_MC_ANALYSIS
619#include "X86GenSubtargetInfo.inc"
620
622 const MCInst &Inst,
623 APInt &Mask) const {
624 const MCInstrDesc &Desc = Info->get(Inst.getOpcode());
625 unsigned NumDefs = Desc.getNumDefs();
626 unsigned NumImplicitDefs = Desc.implicit_defs().size();
627 assert(Mask.getBitWidth() == NumDefs + NumImplicitDefs &&
628 "Unexpected number of bits in the mask!");
629
630 bool HasVEX = (Desc.TSFlags & X86II::EncodingMask) == X86II::VEX;
631 bool HasEVEX = (Desc.TSFlags & X86II::EncodingMask) == X86II::EVEX;
632 bool HasXOP = (Desc.TSFlags & X86II::EncodingMask) == X86II::XOP;
633
634 const MCRegisterClass &GR32RC = MRI.getRegClass(X86::GR32RegClassID);
635 const MCRegisterClass &VR128XRC = MRI.getRegClass(X86::VR128XRegClassID);
636 const MCRegisterClass &VR256XRC = MRI.getRegClass(X86::VR256XRegClassID);
637
638 auto ClearsSuperReg = [&](MCRegister RegID) {
639 // On X86-64, a general purpose integer register is viewed as a 64-bit
640 // register internal to the processor.
641 // An update to the lower 32 bits of a 64 bit integer register is
642 // architecturally defined to zero extend the upper 32 bits.
643 if (GR32RC.contains(RegID))
644 return true;
645
646 // Early exit if this instruction has no vex/evex/xop prefix.
647 if (!HasEVEX && !HasVEX && !HasXOP)
648 return false;
649
650 // All VEX and EVEX encoded instructions are defined to zero the high bits
651 // of the destination register up to VLMAX (i.e. the maximum vector register
652 // width pertaining to the instruction).
653 // We assume the same behavior for XOP instructions too.
654 return VR128XRC.contains(RegID) || VR256XRC.contains(RegID);
655 };
656
657 Mask.clearAllBits();
658 for (unsigned I = 0, E = NumDefs; I < E; ++I) {
659 const MCOperand &Op = Inst.getOperand(I);
660 if (ClearsSuperReg(Op.getReg()))
661 Mask.setBit(I);
662 }
663
664 for (unsigned I = 0, E = NumImplicitDefs; I < E; ++I) {
665 const MCPhysReg Reg = Desc.implicit_defs()[I];
666 if (ClearsSuperReg(Reg))
667 Mask.setBit(NumDefs + I);
668 }
669
670 return Mask.getBoolValue();
671}
672
673static std::vector<std::pair<uint64_t, uint64_t>>
674findX86PltEntries(uint64_t PltSectionVA, ArrayRef<uint8_t> PltContents) {
675 // Do a lightweight parsing of PLT entries.
676 std::vector<std::pair<uint64_t, uint64_t>> Result;
677 for (uint64_t Byte = 0, End = PltContents.size(); Byte + 6 < End; ) {
678 // Recognize a jmp.
679 if (PltContents[Byte] == 0xff && PltContents[Byte + 1] == 0xa3) {
680 // The jmp instruction at the beginning of each PLT entry jumps to the
681 // address of the base of the .got.plt section plus the immediate.
682 // Set the 1 << 32 bit to let ELFObjectFileBase::getPltEntries convert the
683 // offset to an address. Imm may be a negative int32_t if the GOT entry is
684 // in .got.
685 uint32_t Imm = support::endian::read32le(PltContents.data() + Byte + 2);
686 Result.emplace_back(PltSectionVA + Byte, Imm | (uint64_t(1) << 32));
687 Byte += 6;
688 } else if (PltContents[Byte] == 0xff && PltContents[Byte + 1] == 0x25) {
689 // The jmp instruction at the beginning of each PLT entry jumps to the
690 // immediate.
691 uint32_t Imm = support::endian::read32le(PltContents.data() + Byte + 2);
692 Result.push_back(std::make_pair(PltSectionVA + Byte, Imm));
693 Byte += 6;
694 } else
695 Byte++;
696 }
697 return Result;
698}
699
700static std::vector<std::pair<uint64_t, uint64_t>>
701findX86_64PltEntries(uint64_t PltSectionVA, ArrayRef<uint8_t> PltContents) {
702 // Do a lightweight parsing of PLT entries.
703 std::vector<std::pair<uint64_t, uint64_t>> Result;
704 for (uint64_t Byte = 0, End = PltContents.size(); Byte + 6 < End; ) {
705 // Recognize a jmp.
706 if (PltContents[Byte] == 0xff && PltContents[Byte + 1] == 0x25) {
707 // The jmp instruction at the beginning of each PLT entry jumps to the
708 // address of the next instruction plus the immediate.
709 uint32_t Imm = support::endian::read32le(PltContents.data() + Byte + 2);
710 Result.push_back(
711 std::make_pair(PltSectionVA + Byte, PltSectionVA + Byte + 6 + Imm));
712 Byte += 6;
713 } else
714 Byte++;
715 }
716 return Result;
717}
718
719std::vector<std::pair<uint64_t, uint64_t>>
721 ArrayRef<uint8_t> PltContents,
722 const MCSubtargetInfo &STI) const {
723 const Triple &TargetTriple = STI.getTargetTriple();
724 switch (TargetTriple.getArch()) {
725 case Triple::x86:
726 return findX86PltEntries(PltSectionVA, PltContents);
727 case Triple::x86_64:
728 return findX86_64PltEntries(PltSectionVA, PltContents);
729 default:
730 return {};
731 }
732}
733
734bool X86MCInstrAnalysis::evaluateBranch(const MCInst &Inst, uint64_t Addr,
735 uint64_t Size, uint64_t &Target) const {
736 if (Inst.getNumOperands() == 0 ||
737 Info->get(Inst.getOpcode()).operands()[0].OperandType !=
739 return false;
740 Target = Addr + Size + Inst.getOperand(0).getImm();
741 return true;
742}
743
745 const MCInst &Inst, const MCSubtargetInfo *STI, uint64_t Addr,
746 uint64_t Size) const {
747 const MCInstrDesc &MCID = Info->get(Inst.getOpcode());
748 int MemOpStart = X86II::getMemoryOperandIdx(MCID);
749 if (MemOpStart == -1)
750 return std::nullopt;
751
752 const MCOperand &SegReg = Inst.getOperand(MemOpStart + X86::AddrSegmentReg);
753 const MCOperand &BaseReg = Inst.getOperand(MemOpStart + X86::AddrBaseReg);
754 const MCOperand &IndexReg = Inst.getOperand(MemOpStart + X86::AddrIndexReg);
755 const MCOperand &ScaleAmt = Inst.getOperand(MemOpStart + X86::AddrScaleAmt);
756 const MCOperand &Disp = Inst.getOperand(MemOpStart + X86::AddrDisp);
757 if (SegReg.getReg() || IndexReg.getReg() || ScaleAmt.getImm() != 1 ||
758 !Disp.isImm())
759 return std::nullopt;
760
761 // RIP-relative addressing.
762 if (BaseReg.getReg() == X86::RIP)
763 return Addr + Size + Disp.getImm();
764
765 return std::nullopt;
766}
767
768std::optional<uint64_t>
770 uint64_t Size) const {
771 if (Inst.getOpcode() != X86::LEA64r)
772 return std::nullopt;
773 const MCInstrDesc &MCID = Info->get(Inst.getOpcode());
774 int MemOpStart = X86II::getMemoryOperandIdx(MCID);
775 if (MemOpStart == -1)
776 return std::nullopt;
777 const MCOperand &SegReg = Inst.getOperand(MemOpStart + X86::AddrSegmentReg);
778 const MCOperand &BaseReg = Inst.getOperand(MemOpStart + X86::AddrBaseReg);
779 const MCOperand &IndexReg = Inst.getOperand(MemOpStart + X86::AddrIndexReg);
780 const MCOperand &ScaleAmt = Inst.getOperand(MemOpStart + X86::AddrScaleAmt);
781 const MCOperand &Disp = Inst.getOperand(MemOpStart + X86::AddrDisp);
782 // Must be a simple rip-relative address.
783 if (BaseReg.getReg() != X86::RIP || SegReg.getReg() || IndexReg.getReg() ||
784 ScaleAmt.getImm() != 1 || !Disp.isImm())
785 return std::nullopt;
786 // rip-relative ModR/M immediate is 32 bits.
787 assert(Size > 4 && "invalid instruction size for rip-relative lea");
788 return Size - 4;
789}
790
791} // end of namespace X86_MC
792
793} // end of namespace llvm
794
796 return new X86_MC::X86MCInstrAnalysis(Info);
797}
798
799static MCLFIRewriter *
801 std::unique_ptr<MCRegisterInfo> &&RegInfo,
802 std::unique_ptr<MCInstrInfo> &&InstInfo) {
803 return new X86::X86MCLFIRewriter(Ctx, std::move(RegInfo),
804 std::move(InstInfo));
805}
806
807// Force static initialization.
811 // Register the MC asm info.
813
814 // Register the MC instruction info.
816
817 // Register the MC register info.
819
820 // Register the MC subtarget info.
823
824 // Register the MC instruction analyzer.
826
827 // Register the code emitter.
829
830 // Register the LFI rewriter.
832
833 // Register the obj target streamer.
836
837 // Register the asm target streamer.
839
840 // Register the null streamer.
842
845
846 // Register the MCInstPrinter.
848
849 // Register the MC relocation info.
851 }
852
853 // Register the asm backend.
858}
859
861 bool High) {
862#define DEFAULT_NOREG \
863 default: \
864 return X86::NoRegister;
865#define SUB_SUPER(R1, R2, R3, R4, R) \
866 case X86::R1: \
867 case X86::R2: \
868 case X86::R3: \
869 case X86::R4: \
870 return X86::R;
871#define A_SUB_SUPER(R) \
872 case X86::AH: \
873 SUB_SUPER(AL, AX, EAX, RAX, R)
874#define D_SUB_SUPER(R) \
875 case X86::DH: \
876 SUB_SUPER(DL, DX, EDX, RDX, R)
877#define C_SUB_SUPER(R) \
878 case X86::CH: \
879 SUB_SUPER(CL, CX, ECX, RCX, R)
880#define B_SUB_SUPER(R) \
881 case X86::BH: \
882 SUB_SUPER(BL, BX, EBX, RBX, R)
883#define SI_SUB_SUPER(R) SUB_SUPER(SIL, SI, ESI, RSI, R)
884#define DI_SUB_SUPER(R) SUB_SUPER(DIL, DI, EDI, RDI, R)
885#define BP_SUB_SUPER(R) SUB_SUPER(BPL, BP, EBP, RBP, R)
886#define SP_SUB_SUPER(R) SUB_SUPER(SPL, SP, ESP, RSP, R)
887#define NO_SUB_SUPER(NO, REG) \
888 SUB_SUPER(R##NO##B, R##NO##W, R##NO##D, R##NO, REG)
889#define NO_SUB_SUPER_B(NO) NO_SUB_SUPER(NO, R##NO##B)
890#define NO_SUB_SUPER_W(NO) NO_SUB_SUPER(NO, R##NO##W)
891#define NO_SUB_SUPER_D(NO) NO_SUB_SUPER(NO, R##NO##D)
892#define NO_SUB_SUPER_Q(NO) NO_SUB_SUPER(NO, R##NO)
893 switch (Size) {
894 default:
895 llvm_unreachable("illegal register size");
896 case 8:
897 if (High) {
898 switch (Reg.id()) {
900 A_SUB_SUPER(AH)
901 D_SUB_SUPER(DH)
903 B_SUB_SUPER(BH)
904 }
905 } else {
906 switch (Reg.id()) {
908 A_SUB_SUPER(AL)
910 C_SUB_SUPER(CL)
911 B_SUB_SUPER(BL)
912 SI_SUB_SUPER(SIL)
913 DI_SUB_SUPER(DIL)
914 BP_SUB_SUPER(BPL)
915 SP_SUB_SUPER(SPL)
940 }
941 }
942 case 16:
943 switch (Reg.id()) {
945 A_SUB_SUPER(AX)
946 D_SUB_SUPER(DX)
947 C_SUB_SUPER(CX)
948 B_SUB_SUPER(BX)
950 DI_SUB_SUPER(DI)
951 BP_SUB_SUPER(BP)
952 SP_SUB_SUPER(SP)
977 }
978 case 32:
979 switch (Reg.id()) {
981 A_SUB_SUPER(EAX)
982 D_SUB_SUPER(EDX)
983 C_SUB_SUPER(ECX)
984 B_SUB_SUPER(EBX)
985 SI_SUB_SUPER(ESI)
986 DI_SUB_SUPER(EDI)
987 BP_SUB_SUPER(EBP)
988 SP_SUB_SUPER(ESP)
1000 NO_SUB_SUPER_D(19)
1001 NO_SUB_SUPER_D(20)
1002 NO_SUB_SUPER_D(21)
1003 NO_SUB_SUPER_D(22)
1004 NO_SUB_SUPER_D(23)
1005 NO_SUB_SUPER_D(24)
1006 NO_SUB_SUPER_D(25)
1007 NO_SUB_SUPER_D(26)
1008 NO_SUB_SUPER_D(27)
1009 NO_SUB_SUPER_D(28)
1010 NO_SUB_SUPER_D(29)
1011 NO_SUB_SUPER_D(30)
1012 NO_SUB_SUPER_D(31)
1013 }
1014 case 64:
1015 switch (Reg.id()) {
1017 A_SUB_SUPER(RAX)
1018 D_SUB_SUPER(RDX)
1019 C_SUB_SUPER(RCX)
1020 B_SUB_SUPER(RBX)
1021 SI_SUB_SUPER(RSI)
1023 BP_SUB_SUPER(RBP)
1024 SP_SUB_SUPER(RSP)
1027 NO_SUB_SUPER_Q(10)
1028 NO_SUB_SUPER_Q(11)
1029 NO_SUB_SUPER_Q(12)
1030 NO_SUB_SUPER_Q(13)
1031 NO_SUB_SUPER_Q(14)
1032 NO_SUB_SUPER_Q(15)
1033 NO_SUB_SUPER_Q(16)
1034 NO_SUB_SUPER_Q(17)
1035 NO_SUB_SUPER_Q(18)
1036 NO_SUB_SUPER_Q(19)
1037 NO_SUB_SUPER_Q(20)
1038 NO_SUB_SUPER_Q(21)
1039 NO_SUB_SUPER_Q(22)
1040 NO_SUB_SUPER_Q(23)
1041 NO_SUB_SUPER_Q(24)
1042 NO_SUB_SUPER_Q(25)
1043 NO_SUB_SUPER_Q(26)
1044 NO_SUB_SUPER_Q(27)
1045 NO_SUB_SUPER_Q(28)
1046 NO_SUB_SUPER_Q(29)
1047 NO_SUB_SUPER_Q(30)
1048 NO_SUB_SUPER_Q(31)
1049 }
1050 }
1051}
assert(UImm &&(UImm !=~static_cast< T >(0)) &&"Invalid immediate!")
unsigned Imm
unsigned uint64_t
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:857
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)
static MCLFIRewriter * createX86MCLFIRewriter(MCContext &Ctx, std::unique_ptr< MCRegisterInfo > &&RegInfo, std::unique_ptr< MCInstrInfo > &&InstInfo)
#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:67
void addInitialFrameState(const MCCFIInstruction &Inst)
Definition MCAsmInfo.cpp:39
llvm::DenseSet< llvm::CachedHashStringRef > & getReservedIdentifiers()
Definition MCAsmInfo.h:499
unsigned getOutputAssemblerDialect() const
Definition MCAsmInfo.h:580
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:628
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:670
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:48
bool isOSCygMing() const
Tests for either Cygwin or MinGW OS.
Definition Triple.h:820
bool isX86_64() const
Tests whether the target is x86 (64-bit).
Definition Triple.h:1209
bool isOSBinFormatMachO() const
Tests whether the environment is MachO.
Definition Triple.h:876
bool isWindowsCoreCLREnvironment() const
Definition Triple.h:803
ArchType getArch() const
Get the parsed architecture type of this triple.
Definition Triple.h:515
bool isUEFI() const
Tests whether the OS is UEFI.
Definition Triple.h:775
bool isOSBinFormatELF() const
Tests whether the OS uses the ELF binary format.
Definition Triple.h:867
bool isWindowsMSVCEnvironment() const
Checks if the environment could be MSVC.
Definition Triple.h:792
bool isWindowsItaniumEnvironment() const
Definition Triple.h:807
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.
Registers T::Global with cl::ParseCommandLineOptions.
#define llvm_unreachable(msg)
Marks that the current location is not supposed to be reachable.
int getMemoryOperandIdx(const MCInstrDesc &Desc)
@ 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...
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:412
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 RegisterMCLFIRewriter(Target &T, Target::MCLFIRewriterCtorTy 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.