runtime/disassembler-x64-test.cpp (44 lines of code) (raw):

// Copyright (c) Facebook, Inc. and its affiliates. (http://www.facebook.com) #include "disassembler.h" #include "gtest/gtest.h" #include "assembler-x64.h" namespace py { namespace x64 { namespace testing { static const int kMaxDisassemblySize = 4096; std::string disassembleToString(View<byte> code) { // Some padding in case it's longer than expected. char buffer[kMaxDisassemblySize]; std::memset(buffer, 0, sizeof buffer); DisassembleToMemory formatter(buffer, sizeof buffer); Disassembler::disassemble( reinterpret_cast<uword>(code.data()), reinterpret_cast<uword>(code.data()) + code.length(), &formatter); return buffer; } static byte modrm(byte mod, byte reg, byte rm) { return ((mod & 0x3) << 6) | ((reg & 0x7) << 3) | (rm & 0x7); } TEST(DisassemblerTest, Cmpb) { byte code[] = {0x41, 0x80, modrm(3, 7, R10), 0x78, 0x80, modrm(3, 7, RBX), 0x34}; EXPECT_EQ(disassembleToString(code), R"(cmpb r10,0X78 cmpb rbx,0X34 )"); } TEST(DisassemblerTest, Movq) { byte code[] = {0xc7, modrm(3, 0, RBX), 0xaa, 0xbb, 0xcc, 0x0d}; EXPECT_EQ(disassembleToString(code), "movl rbx,0X0DCCBBAA\n"); } TEST(DisassemblerTest, Orb) { byte code[] = {0x41, 0x80, modrm(3, 1, R10), 0x78, 0x80, modrm(3, 1, RBX), 0x34}; EXPECT_EQ(disassembleToString(code), R"(orb r10,0X78 orb rbx,0X34 )"); } TEST(DisassemblerTest, Ud2) { byte code[] = {0x0f, 0x0b}; EXPECT_EQ(disassembleToString(code), "ud2\n"); } } // namespace testing } // namespace x64 } // namespace py