X86MCTargetDesc.cpp 33 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828
  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. #include "X86MCTargetDesc.h"
  13. #include "TargetInfo/X86TargetInfo.h"
  14. #include "X86ATTInstPrinter.h"
  15. #include "X86BaseInfo.h"
  16. #include "X86IntelInstPrinter.h"
  17. #include "X86MCAsmInfo.h"
  18. #include "llvm/ADT/APInt.h"
  19. #include "llvm/ADT/Triple.h"
  20. #include "llvm/DebugInfo/CodeView/CodeView.h"
  21. #include "llvm/MC/MCDwarf.h"
  22. #include "llvm/MC/MCInstrAnalysis.h"
  23. #include "llvm/MC/MCInstrInfo.h"
  24. #include "llvm/MC/MCRegisterInfo.h"
  25. #include "llvm/MC/MCStreamer.h"
  26. #include "llvm/MC/MCSubtargetInfo.h"
  27. #include "llvm/MC/MachineLocation.h"
  28. #include "llvm/MC/TargetRegistry.h"
  29. #include "llvm/Support/ErrorHandling.h"
  30. #include "llvm/Support/Host.h"
  31. using namespace llvm;
  32. #define GET_REGINFO_MC_DESC
  33. #include "X86GenRegisterInfo.inc"
  34. #define GET_INSTRINFO_MC_DESC
  35. #define GET_INSTRINFO_MC_HELPERS
  36. #include "X86GenInstrInfo.inc"
  37. #define GET_SUBTARGETINFO_MC_DESC
  38. #include "X86GenSubtargetInfo.inc"
  39. std::string X86_MC::ParseX86Triple(const Triple &TT) {
  40. std::string FS;
  41. // SSE2 should default to enabled in 64-bit mode, but can be turned off
  42. // explicitly.
  43. if (TT.isArch64Bit())
  44. FS = "+64bit-mode,-32bit-mode,-16bit-mode,+sse2";
  45. else if (TT.getEnvironment() != Triple::CODE16)
  46. FS = "-64bit-mode,+32bit-mode,-16bit-mode";
  47. else
  48. FS = "-64bit-mode,-32bit-mode,+16bit-mode";
  49. return FS;
  50. }
  51. unsigned X86_MC::getDwarfRegFlavour(const Triple &TT, bool isEH) {
  52. if (TT.getArch() == Triple::x86_64)
  53. return DWARFFlavour::X86_64;
  54. if (TT.isOSDarwin())
  55. return isEH ? DWARFFlavour::X86_32_DarwinEH : DWARFFlavour::X86_32_Generic;
  56. if (TT.isOSCygMing())
  57. // Unsupported by now, just quick fallback
  58. return DWARFFlavour::X86_32_Generic;
  59. return DWARFFlavour::X86_32_Generic;
  60. }
  61. bool X86_MC::hasLockPrefix(const MCInst &MI) {
  62. return MI.getFlags() & X86::IP_HAS_LOCK;
  63. }
  64. void X86_MC::initLLVMToSEHAndCVRegMapping(MCRegisterInfo *MRI) {
  65. // FIXME: TableGen these.
  66. for (unsigned Reg = X86::NoRegister + 1; Reg < X86::NUM_TARGET_REGS; ++Reg) {
  67. unsigned SEH = MRI->getEncodingValue(Reg);
  68. MRI->mapLLVMRegToSEHReg(Reg, SEH);
  69. }
  70. // Mapping from CodeView to MC register id.
  71. static const struct {
  72. codeview::RegisterId CVReg;
  73. MCPhysReg Reg;
  74. } RegMap[] = {
  75. {codeview::RegisterId::AL, X86::AL},
  76. {codeview::RegisterId::CL, X86::CL},
  77. {codeview::RegisterId::DL, X86::DL},
  78. {codeview::RegisterId::BL, X86::BL},
  79. {codeview::RegisterId::AH, X86::AH},
  80. {codeview::RegisterId::CH, X86::CH},
  81. {codeview::RegisterId::DH, X86::DH},
  82. {codeview::RegisterId::BH, X86::BH},
  83. {codeview::RegisterId::AX, X86::AX},
  84. {codeview::RegisterId::CX, X86::CX},
  85. {codeview::RegisterId::DX, X86::DX},
  86. {codeview::RegisterId::BX, X86::BX},
  87. {codeview::RegisterId::SP, X86::SP},
  88. {codeview::RegisterId::BP, X86::BP},
  89. {codeview::RegisterId::SI, X86::SI},
  90. {codeview::RegisterId::DI, X86::DI},
  91. {codeview::RegisterId::EAX, X86::EAX},
  92. {codeview::RegisterId::ECX, X86::ECX},
  93. {codeview::RegisterId::EDX, X86::EDX},
  94. {codeview::RegisterId::EBX, X86::EBX},
  95. {codeview::RegisterId::ESP, X86::ESP},
  96. {codeview::RegisterId::EBP, X86::EBP},
  97. {codeview::RegisterId::ESI, X86::ESI},
  98. {codeview::RegisterId::EDI, X86::EDI},
  99. {codeview::RegisterId::EFLAGS, X86::EFLAGS},
  100. {codeview::RegisterId::ST0, X86::ST0},
  101. {codeview::RegisterId::ST1, X86::ST1},
  102. {codeview::RegisterId::ST2, X86::ST2},
  103. {codeview::RegisterId::ST3, X86::ST3},
  104. {codeview::RegisterId::ST4, X86::ST4},
  105. {codeview::RegisterId::ST5, X86::ST5},
  106. {codeview::RegisterId::ST6, X86::ST6},
  107. {codeview::RegisterId::ST7, X86::ST7},
  108. {codeview::RegisterId::ST0, X86::FP0},
  109. {codeview::RegisterId::ST1, X86::FP1},
  110. {codeview::RegisterId::ST2, X86::FP2},
  111. {codeview::RegisterId::ST3, X86::FP3},
  112. {codeview::RegisterId::ST4, X86::FP4},
  113. {codeview::RegisterId::ST5, X86::FP5},
  114. {codeview::RegisterId::ST6, X86::FP6},
  115. {codeview::RegisterId::ST7, X86::FP7},
  116. {codeview::RegisterId::MM0, X86::MM0},
  117. {codeview::RegisterId::MM1, X86::MM1},
  118. {codeview::RegisterId::MM2, X86::MM2},
  119. {codeview::RegisterId::MM3, X86::MM3},
  120. {codeview::RegisterId::MM4, X86::MM4},
  121. {codeview::RegisterId::MM5, X86::MM5},
  122. {codeview::RegisterId::MM6, X86::MM6},
  123. {codeview::RegisterId::MM7, X86::MM7},
  124. {codeview::RegisterId::XMM0, X86::XMM0},
  125. {codeview::RegisterId::XMM1, X86::XMM1},
  126. {codeview::RegisterId::XMM2, X86::XMM2},
  127. {codeview::RegisterId::XMM3, X86::XMM3},
  128. {codeview::RegisterId::XMM4, X86::XMM4},
  129. {codeview::RegisterId::XMM5, X86::XMM5},
  130. {codeview::RegisterId::XMM6, X86::XMM6},
  131. {codeview::RegisterId::XMM7, X86::XMM7},
  132. {codeview::RegisterId::XMM8, X86::XMM8},
  133. {codeview::RegisterId::XMM9, X86::XMM9},
  134. {codeview::RegisterId::XMM10, X86::XMM10},
  135. {codeview::RegisterId::XMM11, X86::XMM11},
  136. {codeview::RegisterId::XMM12, X86::XMM12},
  137. {codeview::RegisterId::XMM13, X86::XMM13},
  138. {codeview::RegisterId::XMM14, X86::XMM14},
  139. {codeview::RegisterId::XMM15, X86::XMM15},
  140. {codeview::RegisterId::SIL, X86::SIL},
  141. {codeview::RegisterId::DIL, X86::DIL},
  142. {codeview::RegisterId::BPL, X86::BPL},
  143. {codeview::RegisterId::SPL, X86::SPL},
  144. {codeview::RegisterId::RAX, X86::RAX},
  145. {codeview::RegisterId::RBX, X86::RBX},
  146. {codeview::RegisterId::RCX, X86::RCX},
  147. {codeview::RegisterId::RDX, X86::RDX},
  148. {codeview::RegisterId::RSI, X86::RSI},
  149. {codeview::RegisterId::RDI, X86::RDI},
  150. {codeview::RegisterId::RBP, X86::RBP},
  151. {codeview::RegisterId::RSP, X86::RSP},
  152. {codeview::RegisterId::R8, X86::R8},
  153. {codeview::RegisterId::R9, X86::R9},
  154. {codeview::RegisterId::R10, X86::R10},
  155. {codeview::RegisterId::R11, X86::R11},
  156. {codeview::RegisterId::R12, X86::R12},
  157. {codeview::RegisterId::R13, X86::R13},
  158. {codeview::RegisterId::R14, X86::R14},
  159. {codeview::RegisterId::R15, X86::R15},
  160. {codeview::RegisterId::R8B, X86::R8B},
  161. {codeview::RegisterId::R9B, X86::R9B},
  162. {codeview::RegisterId::R10B, X86::R10B},
  163. {codeview::RegisterId::R11B, X86::R11B},
  164. {codeview::RegisterId::R12B, X86::R12B},
  165. {codeview::RegisterId::R13B, X86::R13B},
  166. {codeview::RegisterId::R14B, X86::R14B},
  167. {codeview::RegisterId::R15B, X86::R15B},
  168. {codeview::RegisterId::R8W, X86::R8W},
  169. {codeview::RegisterId::R9W, X86::R9W},
  170. {codeview::RegisterId::R10W, X86::R10W},
  171. {codeview::RegisterId::R11W, X86::R11W},
  172. {codeview::RegisterId::R12W, X86::R12W},
  173. {codeview::RegisterId::R13W, X86::R13W},
  174. {codeview::RegisterId::R14W, X86::R14W},
  175. {codeview::RegisterId::R15W, X86::R15W},
  176. {codeview::RegisterId::R8D, X86::R8D},
  177. {codeview::RegisterId::R9D, X86::R9D},
  178. {codeview::RegisterId::R10D, X86::R10D},
  179. {codeview::RegisterId::R11D, X86::R11D},
  180. {codeview::RegisterId::R12D, X86::R12D},
  181. {codeview::RegisterId::R13D, X86::R13D},
  182. {codeview::RegisterId::R14D, X86::R14D},
  183. {codeview::RegisterId::R15D, X86::R15D},
  184. {codeview::RegisterId::AMD64_YMM0, X86::YMM0},
  185. {codeview::RegisterId::AMD64_YMM1, X86::YMM1},
  186. {codeview::RegisterId::AMD64_YMM2, X86::YMM2},
  187. {codeview::RegisterId::AMD64_YMM3, X86::YMM3},
  188. {codeview::RegisterId::AMD64_YMM4, X86::YMM4},
  189. {codeview::RegisterId::AMD64_YMM5, X86::YMM5},
  190. {codeview::RegisterId::AMD64_YMM6, X86::YMM6},
  191. {codeview::RegisterId::AMD64_YMM7, X86::YMM7},
  192. {codeview::RegisterId::AMD64_YMM8, X86::YMM8},
  193. {codeview::RegisterId::AMD64_YMM9, X86::YMM9},
  194. {codeview::RegisterId::AMD64_YMM10, X86::YMM10},
  195. {codeview::RegisterId::AMD64_YMM11, X86::YMM11},
  196. {codeview::RegisterId::AMD64_YMM12, X86::YMM12},
  197. {codeview::RegisterId::AMD64_YMM13, X86::YMM13},
  198. {codeview::RegisterId::AMD64_YMM14, X86::YMM14},
  199. {codeview::RegisterId::AMD64_YMM15, X86::YMM15},
  200. {codeview::RegisterId::AMD64_YMM16, X86::YMM16},
  201. {codeview::RegisterId::AMD64_YMM17, X86::YMM17},
  202. {codeview::RegisterId::AMD64_YMM18, X86::YMM18},
  203. {codeview::RegisterId::AMD64_YMM19, X86::YMM19},
  204. {codeview::RegisterId::AMD64_YMM20, X86::YMM20},
  205. {codeview::RegisterId::AMD64_YMM21, X86::YMM21},
  206. {codeview::RegisterId::AMD64_YMM22, X86::YMM22},
  207. {codeview::RegisterId::AMD64_YMM23, X86::YMM23},
  208. {codeview::RegisterId::AMD64_YMM24, X86::YMM24},
  209. {codeview::RegisterId::AMD64_YMM25, X86::YMM25},
  210. {codeview::RegisterId::AMD64_YMM26, X86::YMM26},
  211. {codeview::RegisterId::AMD64_YMM27, X86::YMM27},
  212. {codeview::RegisterId::AMD64_YMM28, X86::YMM28},
  213. {codeview::RegisterId::AMD64_YMM29, X86::YMM29},
  214. {codeview::RegisterId::AMD64_YMM30, X86::YMM30},
  215. {codeview::RegisterId::AMD64_YMM31, X86::YMM31},
  216. {codeview::RegisterId::AMD64_ZMM0, X86::ZMM0},
  217. {codeview::RegisterId::AMD64_ZMM1, X86::ZMM1},
  218. {codeview::RegisterId::AMD64_ZMM2, X86::ZMM2},
  219. {codeview::RegisterId::AMD64_ZMM3, X86::ZMM3},
  220. {codeview::RegisterId::AMD64_ZMM4, X86::ZMM4},
  221. {codeview::RegisterId::AMD64_ZMM5, X86::ZMM5},
  222. {codeview::RegisterId::AMD64_ZMM6, X86::ZMM6},
  223. {codeview::RegisterId::AMD64_ZMM7, X86::ZMM7},
  224. {codeview::RegisterId::AMD64_ZMM8, X86::ZMM8},
  225. {codeview::RegisterId::AMD64_ZMM9, X86::ZMM9},
  226. {codeview::RegisterId::AMD64_ZMM10, X86::ZMM10},
  227. {codeview::RegisterId::AMD64_ZMM11, X86::ZMM11},
  228. {codeview::RegisterId::AMD64_ZMM12, X86::ZMM12},
  229. {codeview::RegisterId::AMD64_ZMM13, X86::ZMM13},
  230. {codeview::RegisterId::AMD64_ZMM14, X86::ZMM14},
  231. {codeview::RegisterId::AMD64_ZMM15, X86::ZMM15},
  232. {codeview::RegisterId::AMD64_ZMM16, X86::ZMM16},
  233. {codeview::RegisterId::AMD64_ZMM17, X86::ZMM17},
  234. {codeview::RegisterId::AMD64_ZMM18, X86::ZMM18},
  235. {codeview::RegisterId::AMD64_ZMM19, X86::ZMM19},
  236. {codeview::RegisterId::AMD64_ZMM20, X86::ZMM20},
  237. {codeview::RegisterId::AMD64_ZMM21, X86::ZMM21},
  238. {codeview::RegisterId::AMD64_ZMM22, X86::ZMM22},
  239. {codeview::RegisterId::AMD64_ZMM23, X86::ZMM23},
  240. {codeview::RegisterId::AMD64_ZMM24, X86::ZMM24},
  241. {codeview::RegisterId::AMD64_ZMM25, X86::ZMM25},
  242. {codeview::RegisterId::AMD64_ZMM26, X86::ZMM26},
  243. {codeview::RegisterId::AMD64_ZMM27, X86::ZMM27},
  244. {codeview::RegisterId::AMD64_ZMM28, X86::ZMM28},
  245. {codeview::RegisterId::AMD64_ZMM29, X86::ZMM29},
  246. {codeview::RegisterId::AMD64_ZMM30, X86::ZMM30},
  247. {codeview::RegisterId::AMD64_ZMM31, X86::ZMM31},
  248. {codeview::RegisterId::AMD64_K0, X86::K0},
  249. {codeview::RegisterId::AMD64_K1, X86::K1},
  250. {codeview::RegisterId::AMD64_K2, X86::K2},
  251. {codeview::RegisterId::AMD64_K3, X86::K3},
  252. {codeview::RegisterId::AMD64_K4, X86::K4},
  253. {codeview::RegisterId::AMD64_K5, X86::K5},
  254. {codeview::RegisterId::AMD64_K6, X86::K6},
  255. {codeview::RegisterId::AMD64_K7, X86::K7},
  256. {codeview::RegisterId::AMD64_XMM16, X86::XMM16},
  257. {codeview::RegisterId::AMD64_XMM17, X86::XMM17},
  258. {codeview::RegisterId::AMD64_XMM18, X86::XMM18},
  259. {codeview::RegisterId::AMD64_XMM19, X86::XMM19},
  260. {codeview::RegisterId::AMD64_XMM20, X86::XMM20},
  261. {codeview::RegisterId::AMD64_XMM21, X86::XMM21},
  262. {codeview::RegisterId::AMD64_XMM22, X86::XMM22},
  263. {codeview::RegisterId::AMD64_XMM23, X86::XMM23},
  264. {codeview::RegisterId::AMD64_XMM24, X86::XMM24},
  265. {codeview::RegisterId::AMD64_XMM25, X86::XMM25},
  266. {codeview::RegisterId::AMD64_XMM26, X86::XMM26},
  267. {codeview::RegisterId::AMD64_XMM27, X86::XMM27},
  268. {codeview::RegisterId::AMD64_XMM28, X86::XMM28},
  269. {codeview::RegisterId::AMD64_XMM29, X86::XMM29},
  270. {codeview::RegisterId::AMD64_XMM30, X86::XMM30},
  271. {codeview::RegisterId::AMD64_XMM31, X86::XMM31},
  272. };
  273. for (const auto &I : RegMap)
  274. MRI->mapLLVMRegToCVReg(I.Reg, static_cast<int>(I.CVReg));
  275. }
  276. MCSubtargetInfo *X86_MC::createX86MCSubtargetInfo(const Triple &TT,
  277. StringRef CPU, StringRef FS) {
  278. std::string ArchFS = X86_MC::ParseX86Triple(TT);
  279. assert(!ArchFS.empty() && "Failed to parse X86 triple");
  280. if (!FS.empty())
  281. ArchFS = (Twine(ArchFS) + "," + FS).str();
  282. if (CPU.empty())
  283. CPU = "generic";
  284. return createX86MCSubtargetInfoImpl(TT, CPU, /*TuneCPU*/ CPU, ArchFS);
  285. }
  286. static MCInstrInfo *createX86MCInstrInfo() {
  287. MCInstrInfo *X = new MCInstrInfo();
  288. InitX86MCInstrInfo(X);
  289. return X;
  290. }
  291. static MCRegisterInfo *createX86MCRegisterInfo(const Triple &TT) {
  292. unsigned RA = (TT.getArch() == Triple::x86_64)
  293. ? X86::RIP // Should have dwarf #16.
  294. : X86::EIP; // Should have dwarf #8.
  295. MCRegisterInfo *X = new MCRegisterInfo();
  296. InitX86MCRegisterInfo(X, RA, X86_MC::getDwarfRegFlavour(TT, false),
  297. X86_MC::getDwarfRegFlavour(TT, true), RA);
  298. X86_MC::initLLVMToSEHAndCVRegMapping(X);
  299. return X;
  300. }
  301. static MCAsmInfo *createX86MCAsmInfo(const MCRegisterInfo &MRI,
  302. const Triple &TheTriple,
  303. const MCTargetOptions &Options) {
  304. bool is64Bit = TheTriple.getArch() == Triple::x86_64;
  305. MCAsmInfo *MAI;
  306. if (TheTriple.isOSBinFormatMachO()) {
  307. if (is64Bit)
  308. MAI = new X86_64MCAsmInfoDarwin(TheTriple);
  309. else
  310. MAI = new X86MCAsmInfoDarwin(TheTriple);
  311. } else if (TheTriple.isOSBinFormatELF()) {
  312. // Force the use of an ELF container.
  313. MAI = new X86ELFMCAsmInfo(TheTriple);
  314. } else if (TheTriple.isWindowsMSVCEnvironment() ||
  315. TheTriple.isWindowsCoreCLREnvironment()) {
  316. if (Options.getAssemblyLanguage().equals_insensitive("masm"))
  317. MAI = new X86MCAsmInfoMicrosoftMASM(TheTriple);
  318. else
  319. MAI = new X86MCAsmInfoMicrosoft(TheTriple);
  320. } else if (TheTriple.isOSCygMing() ||
  321. TheTriple.isWindowsItaniumEnvironment()) {
  322. MAI = new X86MCAsmInfoGNUCOFF(TheTriple);
  323. } else {
  324. // The default is ELF.
  325. MAI = new X86ELFMCAsmInfo(TheTriple);
  326. }
  327. // Initialize initial frame state.
  328. // Calculate amount of bytes used for return address storing
  329. int stackGrowth = is64Bit ? -8 : -4;
  330. // Initial state of the frame pointer is esp+stackGrowth.
  331. unsigned StackPtr = is64Bit ? X86::RSP : X86::ESP;
  332. MCCFIInstruction Inst = MCCFIInstruction::cfiDefCfa(
  333. nullptr, MRI.getDwarfRegNum(StackPtr, true), -stackGrowth);
  334. MAI->addInitialFrameState(Inst);
  335. // Add return address to move list
  336. unsigned InstPtr = is64Bit ? X86::RIP : X86::EIP;
  337. MCCFIInstruction Inst2 = MCCFIInstruction::createOffset(
  338. nullptr, MRI.getDwarfRegNum(InstPtr, true), stackGrowth);
  339. MAI->addInitialFrameState(Inst2);
  340. return MAI;
  341. }
  342. static MCInstPrinter *createX86MCInstPrinter(const Triple &T,
  343. unsigned SyntaxVariant,
  344. const MCAsmInfo &MAI,
  345. const MCInstrInfo &MII,
  346. const MCRegisterInfo &MRI) {
  347. if (SyntaxVariant == 0)
  348. return new X86ATTInstPrinter(MAI, MII, MRI);
  349. if (SyntaxVariant == 1)
  350. return new X86IntelInstPrinter(MAI, MII, MRI);
  351. return nullptr;
  352. }
  353. static MCRelocationInfo *createX86MCRelocationInfo(const Triple &TheTriple,
  354. MCContext &Ctx) {
  355. // Default to the stock relocation info.
  356. return llvm::createMCRelocationInfo(TheTriple, Ctx);
  357. }
  358. namespace llvm {
  359. namespace X86_MC {
  360. class X86MCInstrAnalysis : public MCInstrAnalysis {
  361. X86MCInstrAnalysis(const X86MCInstrAnalysis &) = delete;
  362. X86MCInstrAnalysis &operator=(const X86MCInstrAnalysis &) = delete;
  363. virtual ~X86MCInstrAnalysis() = default;
  364. public:
  365. X86MCInstrAnalysis(const MCInstrInfo *MCII) : MCInstrAnalysis(MCII) {}
  366. #define GET_STIPREDICATE_DECLS_FOR_MC_ANALYSIS
  367. #include "X86GenSubtargetInfo.inc"
  368. bool clearsSuperRegisters(const MCRegisterInfo &MRI, const MCInst &Inst,
  369. APInt &Mask) const override;
  370. std::vector<std::pair<uint64_t, uint64_t>>
  371. findPltEntries(uint64_t PltSectionVA, ArrayRef<uint8_t> PltContents,
  372. uint64_t GotSectionVA,
  373. const Triple &TargetTriple) const override;
  374. bool evaluateBranch(const MCInst &Inst, uint64_t Addr, uint64_t Size,
  375. uint64_t &Target) const override;
  376. Optional<uint64_t> evaluateMemoryOperandAddress(const MCInst &Inst,
  377. const MCSubtargetInfo *STI,
  378. uint64_t Addr,
  379. uint64_t Size) const override;
  380. Optional<uint64_t>
  381. getMemoryOperandRelocationOffset(const MCInst &Inst,
  382. uint64_t Size) const override;
  383. };
  384. #define GET_STIPREDICATE_DEFS_FOR_MC_ANALYSIS
  385. #include "X86GenSubtargetInfo.inc"
  386. bool X86MCInstrAnalysis::clearsSuperRegisters(const MCRegisterInfo &MRI,
  387. const MCInst &Inst,
  388. APInt &Mask) const {
  389. const MCInstrDesc &Desc = Info->get(Inst.getOpcode());
  390. unsigned NumDefs = Desc.getNumDefs();
  391. unsigned NumImplicitDefs = Desc.getNumImplicitDefs();
  392. assert(Mask.getBitWidth() == NumDefs + NumImplicitDefs &&
  393. "Unexpected number of bits in the mask!");
  394. bool HasVEX = (Desc.TSFlags & X86II::EncodingMask) == X86II::VEX;
  395. bool HasEVEX = (Desc.TSFlags & X86II::EncodingMask) == X86II::EVEX;
  396. bool HasXOP = (Desc.TSFlags & X86II::EncodingMask) == X86II::XOP;
  397. const MCRegisterClass &GR32RC = MRI.getRegClass(X86::GR32RegClassID);
  398. const MCRegisterClass &VR128XRC = MRI.getRegClass(X86::VR128XRegClassID);
  399. const MCRegisterClass &VR256XRC = MRI.getRegClass(X86::VR256XRegClassID);
  400. auto ClearsSuperReg = [=](unsigned RegID) {
  401. // On X86-64, a general purpose integer register is viewed as a 64-bit
  402. // register internal to the processor.
  403. // An update to the lower 32 bits of a 64 bit integer register is
  404. // architecturally defined to zero extend the upper 32 bits.
  405. if (GR32RC.contains(RegID))
  406. return true;
  407. // Early exit if this instruction has no vex/evex/xop prefix.
  408. if (!HasEVEX && !HasVEX && !HasXOP)
  409. return false;
  410. // All VEX and EVEX encoded instructions are defined to zero the high bits
  411. // of the destination register up to VLMAX (i.e. the maximum vector register
  412. // width pertaining to the instruction).
  413. // We assume the same behavior for XOP instructions too.
  414. return VR128XRC.contains(RegID) || VR256XRC.contains(RegID);
  415. };
  416. Mask.clearAllBits();
  417. for (unsigned I = 0, E = NumDefs; I < E; ++I) {
  418. const MCOperand &Op = Inst.getOperand(I);
  419. if (ClearsSuperReg(Op.getReg()))
  420. Mask.setBit(I);
  421. }
  422. for (unsigned I = 0, E = NumImplicitDefs; I < E; ++I) {
  423. const MCPhysReg Reg = Desc.getImplicitDefs()[I];
  424. if (ClearsSuperReg(Reg))
  425. Mask.setBit(NumDefs + I);
  426. }
  427. return Mask.getBoolValue();
  428. }
  429. static std::vector<std::pair<uint64_t, uint64_t>>
  430. findX86PltEntries(uint64_t PltSectionVA, ArrayRef<uint8_t> PltContents,
  431. uint64_t GotPltSectionVA) {
  432. // Do a lightweight parsing of PLT entries.
  433. std::vector<std::pair<uint64_t, uint64_t>> Result;
  434. for (uint64_t Byte = 0, End = PltContents.size(); Byte + 6 < End; ) {
  435. // Recognize a jmp.
  436. if (PltContents[Byte] == 0xff && PltContents[Byte + 1] == 0xa3) {
  437. // The jmp instruction at the beginning of each PLT entry jumps to the
  438. // address of the base of the .got.plt section plus the immediate.
  439. uint32_t Imm = support::endian::read32le(PltContents.data() + Byte + 2);
  440. Result.push_back(
  441. std::make_pair(PltSectionVA + Byte, GotPltSectionVA + Imm));
  442. Byte += 6;
  443. } else if (PltContents[Byte] == 0xff && PltContents[Byte + 1] == 0x25) {
  444. // The jmp instruction at the beginning of each PLT entry jumps to the
  445. // immediate.
  446. uint32_t Imm = support::endian::read32le(PltContents.data() + Byte + 2);
  447. Result.push_back(std::make_pair(PltSectionVA + Byte, Imm));
  448. Byte += 6;
  449. } else
  450. Byte++;
  451. }
  452. return Result;
  453. }
  454. static std::vector<std::pair<uint64_t, uint64_t>>
  455. findX86_64PltEntries(uint64_t PltSectionVA, ArrayRef<uint8_t> PltContents) {
  456. // Do a lightweight parsing of PLT entries.
  457. std::vector<std::pair<uint64_t, uint64_t>> Result;
  458. for (uint64_t Byte = 0, End = PltContents.size(); Byte + 6 < End; ) {
  459. // Recognize a jmp.
  460. if (PltContents[Byte] == 0xff && PltContents[Byte + 1] == 0x25) {
  461. // The jmp instruction at the beginning of each PLT entry jumps to the
  462. // address of the next instruction plus the immediate.
  463. uint32_t Imm = support::endian::read32le(PltContents.data() + Byte + 2);
  464. Result.push_back(
  465. std::make_pair(PltSectionVA + Byte, PltSectionVA + Byte + 6 + Imm));
  466. Byte += 6;
  467. } else
  468. Byte++;
  469. }
  470. return Result;
  471. }
  472. std::vector<std::pair<uint64_t, uint64_t>> X86MCInstrAnalysis::findPltEntries(
  473. uint64_t PltSectionVA, ArrayRef<uint8_t> PltContents,
  474. uint64_t GotPltSectionVA, const Triple &TargetTriple) const {
  475. switch (TargetTriple.getArch()) {
  476. case Triple::x86:
  477. return findX86PltEntries(PltSectionVA, PltContents, GotPltSectionVA);
  478. case Triple::x86_64:
  479. return findX86_64PltEntries(PltSectionVA, PltContents);
  480. default:
  481. return {};
  482. }
  483. }
  484. bool X86MCInstrAnalysis::evaluateBranch(const MCInst &Inst, uint64_t Addr,
  485. uint64_t Size, uint64_t &Target) const {
  486. if (Inst.getNumOperands() == 0 ||
  487. Info->get(Inst.getOpcode()).OpInfo[0].OperandType != MCOI::OPERAND_PCREL)
  488. return false;
  489. Target = Addr + Size + Inst.getOperand(0).getImm();
  490. return true;
  491. }
  492. Optional<uint64_t> X86MCInstrAnalysis::evaluateMemoryOperandAddress(
  493. const MCInst &Inst, const MCSubtargetInfo *STI, uint64_t Addr,
  494. uint64_t Size) const {
  495. const MCInstrDesc &MCID = Info->get(Inst.getOpcode());
  496. int MemOpStart = X86II::getMemoryOperandNo(MCID.TSFlags);
  497. if (MemOpStart == -1)
  498. return None;
  499. MemOpStart += X86II::getOperandBias(MCID);
  500. const MCOperand &SegReg = Inst.getOperand(MemOpStart + X86::AddrSegmentReg);
  501. const MCOperand &BaseReg = Inst.getOperand(MemOpStart + X86::AddrBaseReg);
  502. const MCOperand &IndexReg = Inst.getOperand(MemOpStart + X86::AddrIndexReg);
  503. const MCOperand &ScaleAmt = Inst.getOperand(MemOpStart + X86::AddrScaleAmt);
  504. const MCOperand &Disp = Inst.getOperand(MemOpStart + X86::AddrDisp);
  505. if (SegReg.getReg() != 0 || IndexReg.getReg() != 0 || ScaleAmt.getImm() != 1 ||
  506. !Disp.isImm())
  507. return None;
  508. // RIP-relative addressing.
  509. if (BaseReg.getReg() == X86::RIP)
  510. return Addr + Size + Disp.getImm();
  511. return None;
  512. }
  513. Optional<uint64_t>
  514. X86MCInstrAnalysis::getMemoryOperandRelocationOffset(const MCInst &Inst,
  515. uint64_t Size) const {
  516. if (Inst.getOpcode() != X86::LEA64r)
  517. return None;
  518. const MCInstrDesc &MCID = Info->get(Inst.getOpcode());
  519. int MemOpStart = X86II::getMemoryOperandNo(MCID.TSFlags);
  520. if (MemOpStart == -1)
  521. return None;
  522. MemOpStart += X86II::getOperandBias(MCID);
  523. const MCOperand &SegReg = Inst.getOperand(MemOpStart + X86::AddrSegmentReg);
  524. const MCOperand &BaseReg = Inst.getOperand(MemOpStart + X86::AddrBaseReg);
  525. const MCOperand &IndexReg = Inst.getOperand(MemOpStart + X86::AddrIndexReg);
  526. const MCOperand &ScaleAmt = Inst.getOperand(MemOpStart + X86::AddrScaleAmt);
  527. const MCOperand &Disp = Inst.getOperand(MemOpStart + X86::AddrDisp);
  528. // Must be a simple rip-relative address.
  529. if (BaseReg.getReg() != X86::RIP || SegReg.getReg() != 0 ||
  530. IndexReg.getReg() != 0 || ScaleAmt.getImm() != 1 || !Disp.isImm())
  531. return None;
  532. // rip-relative ModR/M immediate is 32 bits.
  533. assert(Size > 4 && "invalid instruction size for rip-relative lea");
  534. return Size - 4;
  535. }
  536. } // end of namespace X86_MC
  537. } // end of namespace llvm
  538. static MCInstrAnalysis *createX86MCInstrAnalysis(const MCInstrInfo *Info) {
  539. return new X86_MC::X86MCInstrAnalysis(Info);
  540. }
  541. // Force static initialization.
  542. extern "C" LLVM_EXTERNAL_VISIBILITY void LLVMInitializeX86TargetMC() {
  543. for (Target *T : {&getTheX86_32Target(), &getTheX86_64Target()}) {
  544. // Register the MC asm info.
  545. RegisterMCAsmInfoFn X(*T, createX86MCAsmInfo);
  546. // Register the MC instruction info.
  547. TargetRegistry::RegisterMCInstrInfo(*T, createX86MCInstrInfo);
  548. // Register the MC register info.
  549. TargetRegistry::RegisterMCRegInfo(*T, createX86MCRegisterInfo);
  550. // Register the MC subtarget info.
  551. TargetRegistry::RegisterMCSubtargetInfo(*T,
  552. X86_MC::createX86MCSubtargetInfo);
  553. // Register the MC instruction analyzer.
  554. TargetRegistry::RegisterMCInstrAnalysis(*T, createX86MCInstrAnalysis);
  555. // Register the code emitter.
  556. TargetRegistry::RegisterMCCodeEmitter(*T, createX86MCCodeEmitter);
  557. // Register the obj target streamer.
  558. TargetRegistry::RegisterObjectTargetStreamer(*T,
  559. createX86ObjectTargetStreamer);
  560. // Register the asm target streamer.
  561. TargetRegistry::RegisterAsmTargetStreamer(*T, createX86AsmTargetStreamer);
  562. TargetRegistry::RegisterCOFFStreamer(*T, createX86WinCOFFStreamer);
  563. // Register the MCInstPrinter.
  564. TargetRegistry::RegisterMCInstPrinter(*T, createX86MCInstPrinter);
  565. // Register the MC relocation info.
  566. TargetRegistry::RegisterMCRelocationInfo(*T, createX86MCRelocationInfo);
  567. }
  568. // Register the asm backend.
  569. TargetRegistry::RegisterMCAsmBackend(getTheX86_32Target(),
  570. createX86_32AsmBackend);
  571. TargetRegistry::RegisterMCAsmBackend(getTheX86_64Target(),
  572. createX86_64AsmBackend);
  573. }
  574. MCRegister llvm::getX86SubSuperRegisterOrZero(MCRegister Reg, unsigned Size,
  575. bool High) {
  576. switch (Size) {
  577. default: return X86::NoRegister;
  578. case 8:
  579. if (High) {
  580. switch (Reg.id()) {
  581. default: return getX86SubSuperRegisterOrZero(Reg, 64);
  582. case X86::SIL: case X86::SI: case X86::ESI: case X86::RSI:
  583. return X86::SI;
  584. case X86::DIL: case X86::DI: case X86::EDI: case X86::RDI:
  585. return X86::DI;
  586. case X86::BPL: case X86::BP: case X86::EBP: case X86::RBP:
  587. return X86::BP;
  588. case X86::SPL: case X86::SP: case X86::ESP: case X86::RSP:
  589. return X86::SP;
  590. case X86::AH: case X86::AL: case X86::AX: case X86::EAX: case X86::RAX:
  591. return X86::AH;
  592. case X86::DH: case X86::DL: case X86::DX: case X86::EDX: case X86::RDX:
  593. return X86::DH;
  594. case X86::CH: case X86::CL: case X86::CX: case X86::ECX: case X86::RCX:
  595. return X86::CH;
  596. case X86::BH: case X86::BL: case X86::BX: case X86::EBX: case X86::RBX:
  597. return X86::BH;
  598. }
  599. } else {
  600. switch (Reg.id()) {
  601. default: return X86::NoRegister;
  602. case X86::AH: case X86::AL: case X86::AX: case X86::EAX: case X86::RAX:
  603. return X86::AL;
  604. case X86::DH: case X86::DL: case X86::DX: case X86::EDX: case X86::RDX:
  605. return X86::DL;
  606. case X86::CH: case X86::CL: case X86::CX: case X86::ECX: case X86::RCX:
  607. return X86::CL;
  608. case X86::BH: case X86::BL: case X86::BX: case X86::EBX: case X86::RBX:
  609. return X86::BL;
  610. case X86::SIL: case X86::SI: case X86::ESI: case X86::RSI:
  611. return X86::SIL;
  612. case X86::DIL: case X86::DI: case X86::EDI: case X86::RDI:
  613. return X86::DIL;
  614. case X86::BPL: case X86::BP: case X86::EBP: case X86::RBP:
  615. return X86::BPL;
  616. case X86::SPL: case X86::SP: case X86::ESP: case X86::RSP:
  617. return X86::SPL;
  618. case X86::R8B: case X86::R8W: case X86::R8D: case X86::R8:
  619. return X86::R8B;
  620. case X86::R9B: case X86::R9W: case X86::R9D: case X86::R9:
  621. return X86::R9B;
  622. case X86::R10B: case X86::R10W: case X86::R10D: case X86::R10:
  623. return X86::R10B;
  624. case X86::R11B: case X86::R11W: case X86::R11D: case X86::R11:
  625. return X86::R11B;
  626. case X86::R12B: case X86::R12W: case X86::R12D: case X86::R12:
  627. return X86::R12B;
  628. case X86::R13B: case X86::R13W: case X86::R13D: case X86::R13:
  629. return X86::R13B;
  630. case X86::R14B: case X86::R14W: case X86::R14D: case X86::R14:
  631. return X86::R14B;
  632. case X86::R15B: case X86::R15W: case X86::R15D: case X86::R15:
  633. return X86::R15B;
  634. }
  635. }
  636. case 16:
  637. switch (Reg.id()) {
  638. default: return X86::NoRegister;
  639. case X86::AH: case X86::AL: case X86::AX: case X86::EAX: case X86::RAX:
  640. return X86::AX;
  641. case X86::DH: case X86::DL: case X86::DX: case X86::EDX: case X86::RDX:
  642. return X86::DX;
  643. case X86::CH: case X86::CL: case X86::CX: case X86::ECX: case X86::RCX:
  644. return X86::CX;
  645. case X86::BH: case X86::BL: case X86::BX: case X86::EBX: case X86::RBX:
  646. return X86::BX;
  647. case X86::SIL: case X86::SI: case X86::ESI: case X86::RSI:
  648. return X86::SI;
  649. case X86::DIL: case X86::DI: case X86::EDI: case X86::RDI:
  650. return X86::DI;
  651. case X86::BPL: case X86::BP: case X86::EBP: case X86::RBP:
  652. return X86::BP;
  653. case X86::SPL: case X86::SP: case X86::ESP: case X86::RSP:
  654. return X86::SP;
  655. case X86::R8B: case X86::R8W: case X86::R8D: case X86::R8:
  656. return X86::R8W;
  657. case X86::R9B: case X86::R9W: case X86::R9D: case X86::R9:
  658. return X86::R9W;
  659. case X86::R10B: case X86::R10W: case X86::R10D: case X86::R10:
  660. return X86::R10W;
  661. case X86::R11B: case X86::R11W: case X86::R11D: case X86::R11:
  662. return X86::R11W;
  663. case X86::R12B: case X86::R12W: case X86::R12D: case X86::R12:
  664. return X86::R12W;
  665. case X86::R13B: case X86::R13W: case X86::R13D: case X86::R13:
  666. return X86::R13W;
  667. case X86::R14B: case X86::R14W: case X86::R14D: case X86::R14:
  668. return X86::R14W;
  669. case X86::R15B: case X86::R15W: case X86::R15D: case X86::R15:
  670. return X86::R15W;
  671. }
  672. case 32:
  673. switch (Reg.id()) {
  674. default: return X86::NoRegister;
  675. case X86::AH: case X86::AL: case X86::AX: case X86::EAX: case X86::RAX:
  676. return X86::EAX;
  677. case X86::DH: case X86::DL: case X86::DX: case X86::EDX: case X86::RDX:
  678. return X86::EDX;
  679. case X86::CH: case X86::CL: case X86::CX: case X86::ECX: case X86::RCX:
  680. return X86::ECX;
  681. case X86::BH: case X86::BL: case X86::BX: case X86::EBX: case X86::RBX:
  682. return X86::EBX;
  683. case X86::SIL: case X86::SI: case X86::ESI: case X86::RSI:
  684. return X86::ESI;
  685. case X86::DIL: case X86::DI: case X86::EDI: case X86::RDI:
  686. return X86::EDI;
  687. case X86::BPL: case X86::BP: case X86::EBP: case X86::RBP:
  688. return X86::EBP;
  689. case X86::SPL: case X86::SP: case X86::ESP: case X86::RSP:
  690. return X86::ESP;
  691. case X86::R8B: case X86::R8W: case X86::R8D: case X86::R8:
  692. return X86::R8D;
  693. case X86::R9B: case X86::R9W: case X86::R9D: case X86::R9:
  694. return X86::R9D;
  695. case X86::R10B: case X86::R10W: case X86::R10D: case X86::R10:
  696. return X86::R10D;
  697. case X86::R11B: case X86::R11W: case X86::R11D: case X86::R11:
  698. return X86::R11D;
  699. case X86::R12B: case X86::R12W: case X86::R12D: case X86::R12:
  700. return X86::R12D;
  701. case X86::R13B: case X86::R13W: case X86::R13D: case X86::R13:
  702. return X86::R13D;
  703. case X86::R14B: case X86::R14W: case X86::R14D: case X86::R14:
  704. return X86::R14D;
  705. case X86::R15B: case X86::R15W: case X86::R15D: case X86::R15:
  706. return X86::R15D;
  707. }
  708. case 64:
  709. switch (Reg.id()) {
  710. default: return 0;
  711. case X86::AH: case X86::AL: case X86::AX: case X86::EAX: case X86::RAX:
  712. return X86::RAX;
  713. case X86::DH: case X86::DL: case X86::DX: case X86::EDX: case X86::RDX:
  714. return X86::RDX;
  715. case X86::CH: case X86::CL: case X86::CX: case X86::ECX: case X86::RCX:
  716. return X86::RCX;
  717. case X86::BH: case X86::BL: case X86::BX: case X86::EBX: case X86::RBX:
  718. return X86::RBX;
  719. case X86::SIL: case X86::SI: case X86::ESI: case X86::RSI:
  720. return X86::RSI;
  721. case X86::DIL: case X86::DI: case X86::EDI: case X86::RDI:
  722. return X86::RDI;
  723. case X86::BPL: case X86::BP: case X86::EBP: case X86::RBP:
  724. return X86::RBP;
  725. case X86::SPL: case X86::SP: case X86::ESP: case X86::RSP:
  726. return X86::RSP;
  727. case X86::R8B: case X86::R8W: case X86::R8D: case X86::R8:
  728. return X86::R8;
  729. case X86::R9B: case X86::R9W: case X86::R9D: case X86::R9:
  730. return X86::R9;
  731. case X86::R10B: case X86::R10W: case X86::R10D: case X86::R10:
  732. return X86::R10;
  733. case X86::R11B: case X86::R11W: case X86::R11D: case X86::R11:
  734. return X86::R11;
  735. case X86::R12B: case X86::R12W: case X86::R12D: case X86::R12:
  736. return X86::R12;
  737. case X86::R13B: case X86::R13W: case X86::R13D: case X86::R13:
  738. return X86::R13;
  739. case X86::R14B: case X86::R14W: case X86::R14D: case X86::R14:
  740. return X86::R14;
  741. case X86::R15B: case X86::R15W: case X86::R15D: case X86::R15:
  742. return X86::R15;
  743. }
  744. }
  745. }
  746. MCRegister llvm::getX86SubSuperRegister(MCRegister Reg, unsigned Size, bool High) {
  747. MCRegister Res = getX86SubSuperRegisterOrZero(Reg, Size, High);
  748. assert(Res != X86::NoRegister && "Unexpected register or VT");
  749. return Res;
  750. }