X64.cpp 27 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798991001011021031041051061071081091101111121131141151161171181191201211221231241251261271281291301311321331341351361371381391401411421431441451461471481491501511521531541551561571581591601611621631641651661671681691701711721731741751761771781791801811821831841851861871881891901911921931941951961971981992002012022032042052062072082092102112122132142152162172182192202212222232242252262272282292302312322332342352362372382392402412422432442452462472482492502512522532542552562572582592602612622632642652662672682692702712722732742752762772782792802812822832842852862872882892902912922932942952962972982993003013023033043053063073083093103113123133143153163173183193203213223233243253263273283293303313323333343353363373383393403413423433443453463473483493503513523533543553563573583593603613623633643653663673683693703713723733743753763773783793803813823833843853863873883893903913923933943953963973983994004014024034044054064074084094104114124134144154164174184194204214224234244254264274284294304314324334344354364374384394404414424434444454464474484494504514524534544554564574584594604614624634644654664674684694704714724734744754764774784794804814824834844854864874884894904914924934944954964974984995005015025035045055065075085095105115125135145155165175185195205215225235245255265275285295305315325335345355365375385395405415425435445455465475485495505515525535545555565575585595605615625635645655665675685695705715725735745755765775785795805815825835845855865875885895905915925935945955965975985996006016026036046056066076086096106116126136146156166176186196206216226236246256266276286296306316326336346356366376386396406416426436446456466476486496506516526536546556566576586596606616626636646656666676686696706716726736746756766776786796806816826836846856866876886896906916926936946956966976986997007017027037047057067077087097107117127137147157167177187197207217227237247257267277287297307317327337347357367377387397407417427437447457467477487497507517527537547557567577587597607617627637647657667677687697707717727737747757767777787797807817827837847857867877887897907917927937947957967977987998008018028038048058068078088098108118128138148158168178188198208218228238248258268278288298308318328338348358368378388398408418428438448458468478488498508518528538548558568578588598608618628638648658668678688698708718728738748758768778788798808818828838848858868878888898908918928938948958968978988999009019029039049059069079089099109119129139149159169179189199209219229239249259269279289299309319329339349359369379389399409419429439449459469479489499509519529539549559569579589599609619629639649659669679689699709719729739749759769779789799809819829839849859869879889899909919929939949959969979989991000100110021003100410051006100710081009101010111012101310141015101610171018101910201021102210231024102510261027102810291030103110321033103410351036103710381039104010411042104310441045104610471048104910501051105210531054105510561057105810591060106110621063106410651066106710681069107010711072107310741075107610771078107910801081108210831084108510861087108810891090109110921093109410951096109710981099110011011102110311041105110611071108110911101111111211131114111511161117111811191120112111221123112411251126112711281129113011311132113311341135113611371138113911401141114211431144114511461147114811491150115111521153115411551156115711581159116011611162116311641165116611671168116911701171117211731174117511761177117811791180118111821183118411851186
  1. #pragma warning(push)
  2. #pragma warning(disable:4996)
  3. #pragma warning(disable:4800)
  4. #pragma warning(disable:4244)
  5. #pragma warning(disable:4005)
  6. #pragma warning(disable:4267)
  7. #pragma warning(disable:4146)
  8. #include "X64.h"
  9. #include "X86.h"
  10. #include <assert.h>
  11. #include "llvm/Support/AlignOf.h"
  12. #include "llvm/Support/FormattedStream.h"
  13. #include "llvm/Support/SourceMgr.h"
  14. #include "llvm/MC/MCContext.h"
  15. #include "llvm/ADT/StringRef.h"
  16. #include "llvm/MC/TargetRegistry.h"
  17. #include "llvm/MC/MCInstrInfo.h"
  18. #include "llvm/MC/MCRegisterInfo.h"
  19. #include "llvm/MC/MCSubtargetInfo.h"
  20. #include "llvm/IR/InlineAsm.h"
  21. //#include "llvm/Support/MemoryObject.h"
  22. #include "llvm/Target/TargetOptions.h"
  23. #include "llvm/Target/TargetMachine.h"
  24. //#include "llvm/Target/TargetSubtargetInfo.h"
  25. //#include "llvm/Target/TargetInstrInfo.h"
  26. #include "llvm/MC/MCAsmInfo.h"
  27. #include "llvm/MC/MCStreamer.h"
  28. #include "llvm/MC/MCParser/MCAsmParser.h"
  29. #include "llvm/MC/MCParser/MCTargetAsmParser.h"
  30. #include "llvm/MC/MCObjectFileInfo.h"
  31. #include "llvm/MC/MCDisassembler/MCDisassembler.h"
  32. #include "X86/Disassembler/X86DisassemblerDecoder.h"
  33. #include "X86/MCTargetDesc/X86MCTargetDesc.h"
  34. #include "X86/MCTargetDesc/X86BaseInfo.h"
  35. #include "X86InstrInfo.h"
  36. #include "BeefySysLib/util/HashSet.h"
  37. #include "../../llvm/lib/Target/X86/TargetInfo/X86TargetInfo.h"
  38. #pragma warning(pop)
  39. #include "BeefySysLib/util/AllocDebug.h"
  40. //#include "Support/TargetSelect.h"
  41. //int arch_8086_disasm_instr(struct x86_instr *instr, addr_t pc, char *line, unsigned int max_line);
  42. extern "C" void LLVMInitializeX86TargetMC();
  43. extern "C" void LLVMInitializeX86Disassembler();
  44. extern "C" void LLVMInitializeAArch64TargetMC();
  45. USING_NS_BF;
  46. const char* X64CPURegisters::sCPURegisterNames[] =
  47. {
  48. "NONE",
  49. // integer general registers (DO NOT REORDER THESE; must exactly match DbgModule x86 register mappings)
  50. "RAX",
  51. "RDX",
  52. "RCX",
  53. "RBX",
  54. "RSI",
  55. "RDI",
  56. "RBP",
  57. "RSP",
  58. "R8",
  59. "R9",
  60. "R10",
  61. "R11",
  62. "R12",
  63. "R13",
  64. "R14",
  65. "R15",
  66. "RIP",
  67. "EFL",
  68. "GS",
  69. "EAX",
  70. "EDX",
  71. "ECX",
  72. "EBX",
  73. "ESI",
  74. "EDI",
  75. "R8D",
  76. "R9D",
  77. "R10D",
  78. "R11D",
  79. "R12D",
  80. "R13D",
  81. "R14D",
  82. "R15D",
  83. "AX",
  84. "DX",
  85. "CX",
  86. "BX",
  87. "SI",
  88. "DI",
  89. "R8W",
  90. "R9W",
  91. "R10W",
  92. "R11W",
  93. "R12W",
  94. "R13W",
  95. "R14W",
  96. "R15W",
  97. "AL",
  98. "DL",
  99. "CL",
  100. "BL",
  101. "AH",
  102. "DH",
  103. "CH",
  104. "BH",
  105. "SIL",
  106. "DIL",
  107. "R8B",
  108. "R9B",
  109. "R10B",
  110. "R11B",
  111. "R12B",
  112. "R13B",
  113. "R14B",
  114. "R15B",
  115. // fpu registers (80-bit st(#) reg stack)
  116. "FPST0",
  117. "FPST1",
  118. "FPST2",
  119. "FPST3",
  120. "FPST4",
  121. "FPST5",
  122. "FPST6",
  123. "FPST7",
  124. // mmx registers (alias to the low 64 bits of the matching st(#) register)
  125. "MM0",
  126. "MM1",
  127. "MM2",
  128. "MM3",
  129. "MM4",
  130. "MM5",
  131. "MM6",
  132. "MM7",
  133. "XMM0_f64",
  134. "XMM1_f64",
  135. "XMM2_f64",
  136. "XMM3_f64",
  137. "XMM4_f64",
  138. "XMM5_f64",
  139. "XMM6_f64",
  140. "XMM7_f64",
  141. "XMM8_f64",
  142. "XMM9_f64",
  143. "XMM10_f64",
  144. "XMM11_f64",
  145. "XMM12_f64",
  146. "XMM13_f64",
  147. "XMM14_f64",
  148. "XMM15_f64",
  149. "XMM0_f32",
  150. "XMM1_f32",
  151. "XMM2_f32",
  152. "XMM3_f32",
  153. "XMM4_f32",
  154. "XMM5_f32",
  155. "XMM6_f32",
  156. "XMM7_f32",
  157. "XMM8_f32",
  158. "XMM9_f32",
  159. "XMM10_f32",
  160. "XMM11_f32",
  161. "XMM12_f32",
  162. "XMM13_f32",
  163. "XMM14_f32",
  164. "XMM15_f32",
  165. // xmm registers
  166. "XMM00",
  167. "XMM01",
  168. "XMM02",
  169. "XMM03",
  170. "XMM10",
  171. "XMM11",
  172. "XMM12",
  173. "XMM13",
  174. "XMM20",
  175. "XMM21",
  176. "XMM22",
  177. "XMM23",
  178. "XMM30",
  179. "XMM31",
  180. "XMM32",
  181. "XMM33",
  182. "XMM40",
  183. "XMM41",
  184. "XMM42",
  185. "XMM43",
  186. "XMM50",
  187. "XMM51",
  188. "XMM52",
  189. "XMM53",
  190. "XMM60",
  191. "XMM61",
  192. "XMM62",
  193. "XMM63",
  194. "XMM70",
  195. "XMM71",
  196. "XMM72",
  197. "XMM73",
  198. "XMM80",
  199. "XMM81",
  200. "XMM82",
  201. "XMM83",
  202. "XMM90",
  203. "XMM91",
  204. "XMM92",
  205. "XMM93",
  206. "XMM100",
  207. "XMM101",
  208. "XMM102",
  209. "XMM103",
  210. "XMM110",
  211. "XMM111",
  212. "XMM112",
  213. "XMM13",
  214. "XMM120",
  215. "XMM121",
  216. "XMM122",
  217. "XMM123",
  218. "XMM130",
  219. "XMM131",
  220. "XMM132",
  221. "XMM133",
  222. "XMM140",
  223. "XMM141",
  224. "XMM142",
  225. "XMM143",
  226. "XMM150",
  227. "XMM151",
  228. "XMM152",
  229. "XMM153",
  230. // xmm 128-bit macro-registers (no stored data with these", they're symbolic for use as higher-level constructs", aliases to the individual xmm regs above)
  231. "XMM0",
  232. "XMM1",
  233. "XMM2",
  234. "XMM3",
  235. "XMM4",
  236. "XMM5",
  237. "XMM6",
  238. "XMM7",
  239. "XMM8",
  240. "XMM9",
  241. "XMM10",
  242. "XMM11",
  243. "XMM12",
  244. "XMM13",
  245. "XMM14",
  246. "XMM15",
  247. "CF_CARRY",
  248. "PF_PARITY",
  249. "AF_ADJUST",
  250. "ZF_ZERO",
  251. "SF_SIGN",
  252. "IF_INTERRUPT",
  253. "DF_DIRECTION",
  254. "OF_OVERFLOW",
  255. // category macro-registers
  256. "ALLREGS",
  257. "IREGS",
  258. "FPREGS",
  259. "MMREGS",
  260. "XMMREGS",
  261. "FLAGS",
  262. };
  263. using namespace Beefy;
  264. using namespace llvm;
  265. namespace Beefy
  266. {
  267. //
  268. // The memory object created by LLVMDisasmInstruction().
  269. //
  270. //class DisasmMemoryObject : public MemoryObject
  271. //{
  272. // uint8_t *Bytes;
  273. // uint64_t Size;
  274. // uint64_t BasePC;
  275. //public:
  276. // DisasmMemoryObject(uint8_t *bytes, uint64_t size, uint64_t basePC) :
  277. // Bytes(bytes), Size(size), BasePC(basePC) {}
  278. // bool isValidAddress(uint64_t address) const override { return address >= BasePC && address < BasePC + Size; }
  279. // uint64_t getExtent() const override { return Size; }
  280. // uint64_t readBytes(uint8_t *Buf, uint64_t Size,
  281. // uint64_t Address) const override {
  282. // /*if (Addr - BasePC >= Size)
  283. // return -1;
  284. // *Byte = Bytes[Addr - BasePC];
  285. // return 0;*/
  286. // memcpy(Buf, Bytes + (Address - BasePC), Size);
  287. // return Size;
  288. // }
  289. // virtual const uint8_t *getPointer(uint64_t address, uint64_t size) const override
  290. // {
  291. // return Bytes + (address - BasePC);
  292. // }
  293. //};
  294. } // end anonymous namespace
  295. //using namespace X86Disassembler;
  296. int X64Instr::GetLength()
  297. {
  298. return mSize;
  299. }
  300. bool X64Instr::IsBranch()
  301. {
  302. const MCInstrDesc &instDesc = mX64->mInstrInfo->get(mMCInst.getOpcode());
  303. return (instDesc.getFlags() & (1 << MCID::Branch)) != 0;
  304. }
  305. bool X64Instr::IsCall()
  306. {
  307. const MCInstrDesc &instDesc = mX64->mInstrInfo->get(mMCInst.getOpcode());
  308. return (instDesc.getFlags() & (1 << MCID::Call)) != 0;
  309. }
  310. bool X64Instr::IsRep(bool& isPrefixOnly)
  311. {
  312. auto instFlags = mMCInst.getFlags();
  313. if ((instFlags & (X86::IP_HAS_REPEAT_NE | X86::IP_HAS_REPEAT)) != 0)
  314. {
  315. isPrefixOnly = false;
  316. return true;
  317. }
  318. auto opCode = mMCInst.getOpcode();
  319. if ((opCode >= X86::REPNE_PREFIX) && (opCode <= X86::REP_MOVSW_64))
  320. {
  321. isPrefixOnly = true;
  322. return true;
  323. }
  324. return false;
  325. }
  326. bool X64Instr::IsReturn()
  327. {
  328. const MCInstrDesc &instDesc = mX64->mInstrInfo->get(mMCInst.getOpcode());
  329. return (instDesc.getFlags() & (1 << MCID::Return)) != 0;
  330. }
  331. bool X64Instr::IsLoadAddress()
  332. {
  333. const MCInstrDesc &instDesc = mX64->mInstrInfo->get(mMCInst.getOpcode());
  334. if (instDesc.NumOperands >= 6)
  335. {
  336. if ((instDesc.operands()[0].OperandType == MCOI::OPERAND_REGISTER) &&
  337. (instDesc.operands()[4].OperandType == MCOI::OPERAND_MEMORY))
  338. return true;
  339. }
  340. return false;
  341. }
  342. static int ConvertRegNum(const MCOperand& operand)
  343. {
  344. if (!operand.isReg())
  345. return -1;
  346. switch (operand.getReg())
  347. {
  348. case llvm::X86::AL:
  349. case llvm::X86::AH:
  350. case llvm::X86::EAX:
  351. case llvm::X86::RAX:
  352. return X64Reg_RAX;
  353. case llvm::X86::CL:
  354. case llvm::X86::CH:
  355. case llvm::X86::ECX:
  356. case llvm::X86::RCX:
  357. return X64Reg_RCX;
  358. case llvm::X86::DL:
  359. case llvm::X86::DH:
  360. case llvm::X86::EDX:
  361. case llvm::X86::RDX:
  362. return X64Reg_RDX;
  363. case llvm::X86::BL:
  364. case llvm::X86::BH:
  365. case llvm::X86::EBX:
  366. case llvm::X86::RBX:
  367. return X64Reg_RBX;
  368. case llvm::X86::RBP:
  369. return X64Reg_RBP;
  370. case llvm::X86::RSP:
  371. return X64Reg_RSP;
  372. case llvm::X86::R8:
  373. case llvm::X86::R8D:
  374. case llvm::X86::R8W:
  375. case llvm::X86::R8B:
  376. return X64Reg_R8;
  377. case llvm::X86::R9:
  378. case llvm::X86::R9D:
  379. case llvm::X86::R9W:
  380. case llvm::X86::R9B:
  381. return X64Reg_R9;
  382. case llvm::X86::R10:
  383. case llvm::X86::R10D:
  384. case llvm::X86::R10W:
  385. case llvm::X86::R10B:
  386. return X64Reg_R10;
  387. case llvm::X86::R11:
  388. case llvm::X86::R11D:
  389. case llvm::X86::R11W:
  390. case llvm::X86::R11B:
  391. return X64Reg_R11;
  392. case llvm::X86::R12:
  393. case llvm::X86::R12D:
  394. case llvm::X86::R12W:
  395. case llvm::X86::R12B:
  396. return X64Reg_R12;
  397. case llvm::X86::R13:
  398. case llvm::X86::R13D:
  399. case llvm::X86::R13W:
  400. case llvm::X86::R13B:
  401. return X64Reg_R13;
  402. case llvm::X86::R14:
  403. case llvm::X86::R14D:
  404. case llvm::X86::R14W:
  405. case llvm::X86::R14B:
  406. return X64Reg_R14;
  407. case llvm::X86::R15:
  408. case llvm::X86::R15D:
  409. case llvm::X86::R15W:
  410. case llvm::X86::R15B:
  411. return X64Reg_R15;
  412. case llvm::X86::RSI:
  413. case llvm::X86::ESI:
  414. case llvm::X86::SI:
  415. case llvm::X86::SIL:
  416. return X64Reg_RSI;
  417. case llvm::X86::RDI:
  418. case llvm::X86::EDI:
  419. case llvm::X86::DI:
  420. case llvm::X86::DIL:
  421. return X64Reg_RDI;
  422. case llvm::X86::RIP:
  423. return X64Reg_RIP;
  424. case llvm::X86::EFLAGS:
  425. return X64Reg_EFL;
  426. case llvm::X86::ST0:
  427. return X64Reg_FPST0;
  428. case llvm::X86::ST1:
  429. return X64Reg_FPST1;
  430. case llvm::X86::ST2:
  431. return X64Reg_FPST2;
  432. case llvm::X86::ST3:
  433. return X64Reg_FPST3;
  434. case llvm::X86::ST4:
  435. return X64Reg_FPST4;
  436. case llvm::X86::ST5:
  437. return X64Reg_FPST5;
  438. case llvm::X86::ST6:
  439. return X64Reg_FPST6;
  440. case llvm::X86::ST7:
  441. return X64Reg_FPST7;
  442. case llvm::X86::XMM0:
  443. return X64Reg_M128_XMM0;
  444. case llvm::X86::XMM1:
  445. return X64Reg_M128_XMM1;
  446. case llvm::X86::XMM2:
  447. return X64Reg_M128_XMM2;
  448. case llvm::X86::XMM3:
  449. return X64Reg_M128_XMM3;
  450. case llvm::X86::XMM4:
  451. return X64Reg_M128_XMM4;
  452. case llvm::X86::XMM5:
  453. return X64Reg_M128_XMM5;
  454. case llvm::X86::XMM6:
  455. return X64Reg_M128_XMM6;
  456. case llvm::X86::XMM7:
  457. return X64Reg_M128_XMM7;
  458. case llvm::X86::XMM8:
  459. return X64Reg_M128_XMM8;
  460. case llvm::X86::XMM9:
  461. return X64Reg_M128_XMM9;
  462. case llvm::X86::XMM10:
  463. return X64Reg_M128_XMM10;
  464. case llvm::X86::XMM11:
  465. return X64Reg_M128_XMM11;
  466. case llvm::X86::XMM12:
  467. return X64Reg_M128_XMM12;
  468. case llvm::X86::XMM13:
  469. return X64Reg_M128_XMM13;
  470. case llvm::X86::XMM14:
  471. return X64Reg_M128_XMM14;
  472. case llvm::X86::XMM15:
  473. return X64Reg_M128_XMM15;
  474. }
  475. return -1;
  476. }
  477. bool X64Instr::GetIndexRegisterAndOffset(int* outRegister, int* outOffset)
  478. {
  479. const MCInstrDesc &instDesc = mX64->mInstrInfo->get(mMCInst.getOpcode());
  480. auto form = (instDesc.TSFlags & llvm::X86II::FormMask);
  481. if ((form == llvm::X86II::MRMDestMem) || (form == llvm::X86II::MRMSrcMem) ||
  482. ((form >= llvm::X86II::MRM0m) && (form <= llvm::X86II::MRM7m)))
  483. {
  484. int regOffset = 0;
  485. if (form == llvm::X86II::MRMSrcMem)
  486. regOffset = 1;
  487. auto baseReg = mMCInst.getOperand(regOffset + llvm::X86::AddrBaseReg);
  488. auto scaleAmt = mMCInst.getOperand(regOffset + llvm::X86::AddrScaleAmt);
  489. auto indexReg = mMCInst.getOperand(regOffset + llvm::X86::AddrIndexReg);
  490. auto addrDisp = mMCInst.getOperand(regOffset + llvm::X86::AddrDisp);
  491. /*bool a = baseReg.isReg();
  492. bool b = scaleAmt.isImm();
  493. int c = scaleAmt.getImm();
  494. bool d = indexReg.isReg();
  495. int e = indexReg.getReg();
  496. bool f = addrDisp.isImm();*/
  497. bool isValid = false;
  498. // Look for [reg+offset] form
  499. if ((baseReg.isReg()) &&
  500. (scaleAmt.isImm()) && (scaleAmt.getImm() == 1) &&
  501. (indexReg.isReg()) && (indexReg.getReg() == llvm::X86::NoRegister) &&
  502. (addrDisp.isImm()))
  503. {
  504. int regNum = ConvertRegNum(baseReg);
  505. if (regNum == -1)
  506. return false;
  507. *outRegister = regNum;
  508. *outOffset = (int)addrDisp.getImm();
  509. return true;
  510. }
  511. }
  512. return false;
  513. }
  514. bool X64Instr::GetImmediate(uint64* outImm)
  515. {
  516. const MCInstrDesc &instDesc = mX64->mInstrInfo->get(mMCInst.getOpcode());
  517. auto immediateType = (instDesc.TSFlags & llvm::X86II::ImmMask);
  518. if ((immediateType == 0) && (mMCInst.getNumOperands() < 6))
  519. return false;
  520. auto immOp = mMCInst.getOperand(5);
  521. if (!immOp.isImm())
  522. return false;
  523. *outImm = immOp.getImm();
  524. return true;
  525. }
  526. int X64Instr::GetJmpState(int flags)
  527. {
  528. const MCInstrDesc &instDesc = mX64->mInstrInfo->get(mMCInst.getOpcode());
  529. if ((instDesc.getFlags() & (1 << MCID::Branch)) == 0)
  530. return -1;
  531. if (mMCInst.getNumOperands() < 1)
  532. return 0;
  533. #define FLAGVAR(abbr, name) int flag##abbr = ((flags & ((uint64)1 << X64CPURegisters::GetFlagBitForRegister(X64Reg_FLAG_##abbr##_##name))) != 0) ? 1 : 0
  534. FLAGVAR(CF, CARRY);
  535. FLAGVAR(PF, PARITY);
  536. FLAGVAR(AF, ADJUST);
  537. FLAGVAR(ZF, ZERO);
  538. FLAGVAR(SF, SIGN);
  539. FLAGVAR(IF, INTERRUPT);
  540. FLAGVAR(DF, DIRECTION);
  541. FLAGVAR(OF, OVERFLOW);
  542. #undef FLAGVAR
  543. int baseOpCode = llvm::X86II::getBaseOpcodeFor(instDesc.TSFlags);
  544. switch (baseOpCode)
  545. {
  546. case 0x70: // JO
  547. return (!flagOF) ? 1 : 0;
  548. case 0x71: // JNO
  549. return (!flagOF) ? 1 : 0;
  550. case 0x72: // JB
  551. return (flagCF) ? 1 : 0;
  552. case 0x73: // JAE
  553. return (!flagCF) ? 1 : 0;
  554. case 0x74: // JE
  555. return (flagZF) ? 1 : 0;
  556. case 0x75: // JNE
  557. return (!flagZF) ? 1 : 0;
  558. case 0x76: // JBE
  559. return ((flagCF) || (flagZF)) ? 1 : 0;
  560. case 0x77: // JA
  561. return ((!flagCF) && (!flagZF)) ? 1 : 0;
  562. case 0x78: // JNP
  563. return (flagSF) ? 1 : 0;
  564. case 0x79: // JNS
  565. return (!flagSF) ? 1 : 0;
  566. case 0x7A: // JP
  567. return (flagPF) ? 1 : 0;
  568. case 0x7B: // JPO
  569. return (!flagPF) ? 1 : 0;
  570. case 0x7C: // JL
  571. return (flagSF != flagOF) ? 1 : 0;
  572. case 0x7D: // JGE
  573. return (flagSF == flagOF) ? 1 : 0;
  574. case 0x7E: // JLE
  575. return ((flagZF) || (flagSF != flagOF)) ? 1 : 0;
  576. case 0x7F: // JG
  577. return ((!flagZF) && (flagSF == flagOF)) ? 1 : 0;
  578. case 0xEB: // JMP
  579. return 1;
  580. }
  581. return -1;
  582. }
  583. void X64Instr::MarkRegsUsed(Array<RegForm>& regsUsed, bool overrideForm)
  584. {
  585. const MCInstrDesc &instDesc = mX64->mInstrInfo->get(mMCInst.getOpcode());
  586. //String dbgStr = mX64->InstructionToString(this, 0);
  587. int opCode = instDesc.getOpcode();
  588. auto form = (instDesc.TSFlags & llvm::X86II::FormMask);
  589. /*if (opCode == 1724)
  590. {
  591. // MOVAPSrr is emitted for all moves between XMM registers, regardless of
  592. // their actual format, so we just copy the actual RegForm form here
  593. if (instDesc.getNumOperands() != 2)
  594. return;
  595. auto operand = mMCInst.getOperand(0);
  596. int regNumTo = ConvertRegNum(operand);
  597. operand = mMCInst.getOperand(1);
  598. int regNumFrom = ConvertRegNum(operand);
  599. if (regNumFrom == -1) // ??
  600. return;
  601. while (std::max(regNumFrom, regNumTo) >= (int)regsUsed.size())
  602. regsUsed.push_back(RegForm_Invalid);
  603. if ((regsUsed[regNumTo] <= RegForm_Unknown) || (overrideForm))
  604. regsUsed[regNumTo] = regsUsed[regNumFrom];
  605. return;
  606. }
  607. else if (opCode == 1722)
  608. {
  609. // MOVAPSmr is actually emitted for all moves from XMM reg to memory
  610. // So ignore the format
  611. return;
  612. }
  613. else if (opCode == 1723)
  614. {
  615. // MOVAPSrm is actually emitted for all moves from XMM reg to memory
  616. // So ignore the format
  617. return;
  618. }*/
  619. int checkIdx = opCode * 3;
  620. //const MCInstrDesc &instDesc = mX64->mInstrInfo->get(mMCInst.getOpcode());
  621. //auto form = (instDesc.TSFlags & llvm::X86II::FormMask);
  622. for (int opIdx = 0; opIdx < std::min((int)instDesc.getNumOperands(), 3); opIdx++)
  623. {
  624. auto operand = mMCInst.getOperand(opIdx);
  625. int regNum = ConvertRegNum(operand);
  626. if (regNum != -1)
  627. {
  628. while (regNum >= (int)regsUsed.size())
  629. regsUsed.push_back(RegForm_Invalid);
  630. RegForm regForm = (RegForm)X86Instr::sRegForm[checkIdx];
  631. if ((regsUsed[regNum] <= RegForm_Unknown) || (overrideForm))
  632. regsUsed[regNum] = regForm;
  633. checkIdx++;
  634. }
  635. }
  636. }
  637. uint64 X64Instr::GetTarget(Debugger* debugger, X64CPURegisters* registers)
  638. {
  639. const MCInstrDesc &instDesc = mX64->mInstrInfo->get(mMCInst.getOpcode());
  640. if (mMCInst.getNumOperands() < 1)
  641. return 0;
  642. /*if ((debugger != NULL) && (registers != NULL))
  643. {
  644. int regNum = 0;
  645. int offset = 0;
  646. if (GetIndexRegisterAndOffset(&regNum, &offset))
  647. {
  648. uint64 addr = registers->mIntRegsArray[regNum] + offset;
  649. uint64 val = 0;
  650. debugger->ReadMemory(addr, 8, &val);
  651. return val;
  652. }
  653. }*/
  654. int opIdx = 0;
  655. auto operand = mMCInst.getOperand(0);
  656. if (mMCInst.getNumOperands() > 4)
  657. {
  658. if ((instDesc.operands()[0].OperandType == MCOI::OPERAND_REGISTER) && (instDesc.operands()[4].OperandType == MCOI::OPERAND_MEMORY))
  659. {
  660. opIdx = 4;
  661. operand = mMCInst.getOperand(opIdx);
  662. }
  663. }
  664. if (operand.isImm())
  665. {
  666. auto targetAddr = (uint64)operand.getImm();
  667. if (instDesc.operands()[opIdx].OperandType == MCOI::OPERAND_PCREL)
  668. targetAddr += mAddress + mSize;
  669. return targetAddr;
  670. }
  671. return 0;
  672. }
  673. bool X64Instr::PartialSimulate(Debugger* debugger, X64CPURegisters* registers)
  674. {
  675. // const MCInstrDesc &instDesc = mX64->mInstrInfo->get(mMCInst.getOpcode());
  676. //
  677. // for (int i = 0; i < instDesc.NumOperands; i++)
  678. // {
  679. // auto regInfo = mMCInst.getOperand(i);
  680. // NOP;
  681. // }
  682. //
  683. // if (instDesc.getOpcode() == X86::MOV64rm)
  684. // {
  685. // auto form = (instDesc.TSFlags & llvm::X86II::FormMask);
  686. //
  687. // if ((form == llvm::X86II::MRMSrcMem) && (instDesc.NumOperands == 6))
  688. // {
  689. // auto destReg = mMCInst.getOperand(llvm::X86::AddrBaseReg);
  690. // if (destReg.isReg())
  691. // {
  692. // int regNum = 0;
  693. // int offset = 0;
  694. // if (GetIndexRegisterAndOffset(&regNum, &offset))
  695. // {
  696. // uint64 addr = registers->mIntRegsArray[regNum] + offset;
  697. // uint64 val = 0;
  698. // debugger->ReadMemory(addr, 8, &val);
  699. //
  700. // switch (destReg.getReg())
  701. // {
  702. //
  703. // }
  704. // }
  705. // }
  706. // }
  707. //
  708. //// if ((form == llvm::X86II::MRMDestMem) || (form == llvm::X86II::MRMSrcMem) ||
  709. //// ((form >= llvm::X86II::MRM0m) && (form <= llvm::X86II::MRM7m)))
  710. //// {
  711. //// }
  712. // }
  713. //
  714. // if (instDesc.getOpcode() == X86::XOR8rr)
  715. // {
  716. // if (instDesc.NumOperands == 3)
  717. // {
  718. // auto destReg = mMCInst.getOperand(0);
  719. // auto srcReg = mMCInst.getOperand(1);
  720. //
  721. // if ((destReg.isReg()) && (srcReg.isReg()))
  722. // {
  723. // if (destReg.getReg() == srcReg.getReg())
  724. // {
  725. // switch (destReg.getReg())
  726. // {
  727. // case X86::AL:
  728. // ((uint8*)&registers->mIntRegs.rax)[0] = 0;
  729. // break;
  730. // }
  731. // }
  732. // }
  733. // }
  734. // }
  735. return false;
  736. }
  737. X64CPU::X64CPU() :
  738. mWarningStream(mWarningString),
  739. mCommentStream(mCommentString)
  740. {
  741. mDisAsm = NULL;
  742. mRegisterInfo = NULL;
  743. mAsmInfo = NULL;
  744. mInstrInfo = NULL;
  745. mInstPrinter = NULL;
  746. //InitializeAllTargets();
  747. auto& TheX86_64Target = llvm::getTheX86_64Target();
  748. const char* triple = "x86_64-pc-mingw32";
  749. mSubtargetInfo = TheX86_64Target.createMCSubtargetInfo(triple, "x86-64", "");
  750. mRegisterInfo = TheX86_64Target.createMCRegInfo(triple);
  751. if (!mRegisterInfo)
  752. return;
  753. MCTargetOptions options;
  754. // Get the assembler info needed to setup the MCContext.
  755. mAsmInfo = TheX86_64Target.createMCAsmInfo(*mRegisterInfo, triple, options);
  756. if (!mAsmInfo)
  757. return;
  758. mInstrInfo = TheX86_64Target.createMCInstrInfo();
  759. mMCContext = new MCContext(Triple(triple), mAsmInfo, mRegisterInfo, mSubtargetInfo);
  760. mMCObjectFileInfo = TheX86_64Target.createMCObjectFileInfo(*mMCContext, false);
  761. if (!mMCObjectFileInfo)
  762. return;
  763. mMCContext->setObjectFileInfo(mMCObjectFileInfo);
  764. MCDisassembler *disAsm = TheX86_64Target.createMCDisassembler(*mSubtargetInfo, *mMCContext);
  765. mDisAsm = disAsm;
  766. mInstPrinter = TheX86_64Target.createMCInstPrinter(Triple(triple), 1, *mAsmInfo,
  767. *mInstrInfo, *mRegisterInfo);
  768. mInstPrinter->setPrintImmHex(true);
  769. for (const X86StringToOpcodeEntry* entry = &gX86StringToOpcodeTable[0]; entry->Name != nullptr; ++entry)
  770. {
  771. mStringToOpcodeMap.insert(StringToOpcodeMap::value_type(entry->Name, entry->Opcode));
  772. }
  773. }
  774. extern "C" void LLVMShutdown();
  775. X64CPU::~X64CPU()
  776. {
  777. delete mInstPrinter;
  778. delete mDisAsm;
  779. delete mMCContext;
  780. delete mMCObjectFileInfo;
  781. delete mInstrInfo;
  782. delete mAsmInfo;
  783. delete mRegisterInfo;
  784. delete mSubtargetInfo;
  785. LLVMShutdown();
  786. }
  787. bool X64CPU::Decode(uint64 address, DbgModuleMemoryCache* memoryCache, X64Instr* inst)
  788. {
  789. inst->mAddress = address;
  790. inst->mX64 = this;
  791. uint64 size = 0;
  792. uint8 data[15];
  793. memoryCache->Read(address, data, 15);
  794. mDisAsm->CommentStream = &inst->mAnnotationStream;
  795. ArrayRef<uint8_t> dataArrayRef(data, data + 15);
  796. MCDisassembler::DecodeStatus S = mDisAsm->getInstruction(inst->mMCInst, size, dataArrayRef, address, nulls());
  797. inst->mSize = (int)size;
  798. return S == MCDisassembler::Success;
  799. }
  800. bool X64CPU::Decode(uint64 baseAddress, const uint8* dataBase, int dataLength, const uint8* dataPtr, X64Instr* inst)
  801. {
  802. //X86GenericDisassembler assembler;
  803. //DisasmMemoryObject region((uint8*)dataBase, dataLength, baseAddress);
  804. //std::memorystream
  805. uint64 address = baseAddress + (dataPtr - dataBase);
  806. inst->mAddress = address;
  807. inst->mX64 = this;
  808. uint64 size = 0;
  809. //TODO: LLVM3.8
  810. //MCDisassembler::DecodeStatus S = mDisAsm->getInstruction(inst->mMCInst, size, region, address, nulls(), inst->mAnnotationStream);
  811. mDisAsm->CommentStream = &inst->mAnnotationStream;
  812. ArrayRef<uint8_t> dataArrayRef(dataPtr, dataLength - (dataPtr - dataBase));
  813. MCDisassembler::DecodeStatus S = mDisAsm->getInstruction(inst->mMCInst, size, dataArrayRef, address, nulls());
  814. inst->mSize = (int)size;
  815. return S == MCDisassembler::Success;
  816. }
  817. uint64 X64CPU::DecodeThunk(uint64 address, DbgModuleMemoryCache* memoryCache)
  818. {
  819. uint8 inst = 0;
  820. memoryCache->Read(address, &inst, 1);
  821. if (inst == 0xE9)
  822. {
  823. int32 offset = 0;
  824. memoryCache->Read(address + 1, (uint8*)&offset, sizeof(int32));
  825. return address + offset + 5;
  826. }
  827. return 0;
  828. }
  829. void X64CPU::GetNextPC(uint64 baseAddress, const uint8* dataBase, int dataLength, const uint8* dataPtr, uint32* regs, uint64 nextPCs[2])
  830. {
  831. //DisasmMemoryObject region((uint8*)dataBase, dataLength, baseAddress);
  832. uint64 address = baseAddress + (dataPtr - dataBase);
  833. uint64 size = 0;
  834. MCInst mcInst;
  835. //MCDisassembler::DecodeStatus S = mDisAsm->getInstruction(mcInst, size, region, address, nulls(), nulls());
  836. mDisAsm->CommentStream = &nulls();
  837. ArrayRef<uint8_t> dataArrayRef(dataPtr, dataLength - (dataPtr - dataBase));
  838. MCDisassembler::DecodeStatus S = mDisAsm->getInstruction(mcInst, size, dataArrayRef, address, nulls());
  839. }
  840. bool X64CPU::IsReturnInstruction(X64Instr* inst)
  841. {
  842. const MCInstrDesc &instDesc = mInstrInfo->get(inst->mMCInst.getOpcode());
  843. return (instDesc.getFlags() & (1 << MCID::Return)) != 0;
  844. }
  845. String X64CPU::InstructionToString(X64Instr* inst, uint64 addr)
  846. {
  847. StringRef annotationsStr;
  848. SmallVector<char, 256> insnStr;
  849. raw_svector_ostream OS(insnStr);
  850. //mInstPrinter->CurPCRelImmOffset = addr + inst->GetLength();
  851. mInstPrinter->printInst(&inst->mMCInst, addr, annotationsStr, *mSubtargetInfo, OS);
  852. //OS.flush();
  853. //llvm::StringRef str = OS.str();
  854. String result;
  855. for (int idx = 0; idx < (int)insnStr.size(); idx++)
  856. {
  857. char c = insnStr[idx];
  858. if (c == '\t')
  859. {
  860. if (idx != 0)
  861. {
  862. int numSpaces = 10 - ((int)result.length() % 10);
  863. result.Append(' ', numSpaces);
  864. }
  865. }
  866. else
  867. result.Append(c);
  868. }
  869. if (result.StartsWith("rep "))
  870. {
  871. while ((result.length() > 10) && (result[10] == ' '))
  872. result.Remove(10);
  873. }
  874. /*String result = String(insnStr.data(), insnStr.size());
  875. for (int i = 0; i < (int)result.length(); i++)
  876. {
  877. if (result[i] == '\t')
  878. result[i] = ' ';
  879. }*/
  880. return result;
  881. }
  882. DbgBreakKind X64CPU::GetDbgBreakKind(uint64 address, DbgModuleMemoryCache* memoryCache, int64* regs, int64* outObjectPtr)
  883. {
  884. // We've looking for a CMP BYTE PTR [<reg>], -0x80
  885. // if <reg> is R12 then encoding takes an extra 2 bytes
  886. X64Instr inst;
  887. for (int checkLen = 5; checkLen >= 3; checkLen--)
  888. {
  889. int offset = -3 - checkLen;
  890. if (!Decode(address + offset, memoryCache, &inst))
  891. continue;
  892. if (inst.GetLength() != checkLen)
  893. continue;
  894. const MCInstrDesc &instDesc = mInstrInfo->get(inst.mMCInst.getOpcode());
  895. if (!instDesc.isCompare())
  896. continue;
  897. auto immediateType = (instDesc.TSFlags & llvm::X86II::ImmMask);
  898. if ((immediateType == llvm::X86II::Imm8) && (inst.mMCInst.getNumOperands() == 2))
  899. {
  900. // We're checking for a TEST [<reg>], 1
  901. if (inst.mMCInst.getOpcode() != llvm::X86::TEST8ri)
  902. continue;
  903. auto immOp = inst.mMCInst.getOperand(1);
  904. if (!immOp.isImm())
  905. continue;
  906. if (immOp.getImm() != 1)
  907. continue;
  908. return DbgBreakKind_ArithmeticOverflow;
  909. }
  910. if ((immediateType == 0) || (inst.mMCInst.getNumOperands() < 6))
  911. continue;
  912. auto form = (instDesc.TSFlags & llvm::X86II::FormMask);
  913. auto baseReg = inst.mMCInst.getOperand(llvm::X86::AddrBaseReg);
  914. /*auto scaleAmt = inst.mMCInst.getOperand(llvm::X86::AddrScaleAmt);
  915. auto indexReg = inst.mMCInst.getOperand(llvm::X86::AddrIndexReg);
  916. auto addrDisp = inst.mMCInst.getOperand(llvm::X86::AddrDisp);*/
  917. auto immOp = inst.mMCInst.getOperand(5);
  918. if (!immOp.isImm())
  919. continue;
  920. if (immOp.getImm() != -0x80)
  921. continue;
  922. int regNum = ConvertRegNum(baseReg);
  923. if (regNum == -1)
  924. continue;
  925. *outObjectPtr = (uint64)regs[regNum];
  926. return DbgBreakKind_ObjectAccess;
  927. }
  928. // check jno/jnb
  929. for (int offset = 3; offset <= 3; offset++)
  930. {
  931. if (!Decode(address - offset, memoryCache, &inst))
  932. continue;
  933. if (inst.GetLength() != 2)
  934. continue;
  935. const MCInstrDesc &instDesc = mInstrInfo->get(inst.mMCInst.getOpcode());
  936. if (!instDesc.isBranch())
  937. continue;
  938. auto immediateType = (instDesc.TSFlags & llvm::X86II::ImmMask);
  939. if ((immediateType == llvm::X86II::Imm8PCRel) && (inst.mMCInst.getNumOperands() == 2))
  940. {
  941. auto immOp = inst.mMCInst.getOperand(1);
  942. if (!immOp.isImm())
  943. continue;
  944. if ((immOp.getImm() != 1) && (immOp.getImm() != 3))
  945. continue;
  946. return DbgBreakKind_ArithmeticOverflow;
  947. }
  948. }
  949. return DbgBreakKind_None;
  950. }
  951. int X64CPU::GetOpcodesForMnemonic(const StringImpl& mnemonic, Array<int>& outOpcodes)
  952. {
  953. String s(mnemonic);
  954. std::transform(s.begin(), s.end(), s.begin(), ::tolower);
  955. std::pair<StringToOpcodeMap::iterator, StringToOpcodeMap::iterator> range = mStringToOpcodeMap.equal_range(s);
  956. outOpcodes.Clear();
  957. for (StringToOpcodeMap::iterator it = range.first; it != range.second; ++it)
  958. outOpcodes.push_back(it->second);
  959. return (int)outOpcodes.size();
  960. }
  961. void X64CPU::GetClobbersForMnemonic(const StringImpl& mnemonic, int argCount, Array<int>& outImplicitClobberRegNums, int& outClobberArgCount, bool& outMayClobberMem)
  962. {
  963. outImplicitClobberRegNums.Clear();
  964. outClobberArgCount = 0;
  965. outMayClobberMem = false;
  966. Array<int> opcodes;
  967. if (!GetOpcodesForMnemonic(mnemonic, opcodes))
  968. return;
  969. HashSet<int> impRegs;
  970. for (int op : opcodes)
  971. {
  972. const MCInstrDesc& desc = mInstrInfo->get(op);
  973. //if ((desc.getNumOperands() != argCount) && !desc.isVariadic())
  974. //continue; // not an operand form that we care about
  975. outClobberArgCount = std::max(outClobberArgCount, (int)desc.getNumDefs());
  976. if (!outMayClobberMem && desc.mayStore())
  977. outMayClobberMem = true;
  978. int numImplicits = (int)desc.implicit_defs().size();
  979. auto& impPtr = desc.implicit_defs();
  980. for (int iImp = 0; iImp<numImplicits; ++iImp)
  981. impRegs.Add(impPtr[iImp]);
  982. }
  983. for (auto const& r : impRegs)
  984. {
  985. int regNum = ConvertRegNum(MCOperand::createReg(r));
  986. if (regNum != -1)
  987. outImplicitClobberRegNums.push_back(regNum);
  988. }
  989. }
  990. bool X64CPU::ParseInlineAsmInstructionLLVM(const StringImpl&asmInst, String& outError)
  991. {
  992. struct LocalThunk
  993. {
  994. std::function<void(const SMDiagnostic &)> mFunc;
  995. void Thunk(const SMDiagnostic& diag)
  996. {
  997. mFunc(diag);
  998. }
  999. static void StaticThunk(const SMDiagnostic& diag, void* diagInfo)
  1000. {
  1001. ((LocalThunk*)diagInfo)->Thunk(diag);
  1002. }
  1003. };
  1004. String diagMessage, diagLineContents;
  1005. std::function<void(const SMDiagnostic &)> diagHandler = [&](const SMDiagnostic &diag)
  1006. {
  1007. if (diag.getKind() == SourceMgr::DK_Error)
  1008. {
  1009. diagMessage = diag.getMessage().data();
  1010. diagLineContents = diag.getLineContents().data();
  1011. }
  1012. };
  1013. LocalThunk localThunk;
  1014. localThunk.mFunc = diagHandler;
  1015. auto& TheX86_64Target = getTheX86_64Target();
  1016. llvm::SourceMgr srcMgr;
  1017. srcMgr.setDiagHandler(LocalThunk::StaticThunk, &localThunk);
  1018. SmallString<512> asmString;
  1019. asmString.assign(asmInst.c_str());
  1020. //asmString.push_back('\n');
  1021. asmString.push_back('\0');
  1022. asmString.pop_back();
  1023. std::unique_ptr<llvm::MemoryBuffer> buffer = llvm::MemoryBuffer::getMemBuffer(asmString, "inline asm");
  1024. srcMgr.AddNewSourceBuffer(std::move(buffer), llvm::SMLoc());
  1025. llvm::MCTargetOptions options;
  1026. std::unique_ptr<llvm::MCStreamer> streamer(createNullStreamer(*mMCContext));
  1027. std::unique_ptr<llvm::MCAsmParser> parser(createMCAsmParser(srcMgr, *mMCContext, *streamer.get(), *mAsmInfo));
  1028. std::unique_ptr<llvm::MCTargetAsmParser> asmParser(TheX86_64Target.createMCAsmParser(*mSubtargetInfo, *parser.get(), *mInstrInfo, options));
  1029. parser->setAssemblerDialect(llvm::InlineAsm::AD_Intel);
  1030. parser->setTargetParser(*asmParser);
  1031. bool result = parser->Run(false, true) == 0;
  1032. if (result)
  1033. outError.clear();
  1034. else
  1035. outError = diagMessage.c_str(); // we can ignore diagLineContents in this situation since we're only doing one line at a time anyway
  1036. //outError = StrFormat("%s: \"%s\"", diagMessage.c_str(), diagLineContents.c_str());
  1037. return result;
  1038. }