1 //===- llvm/unittest/Object/Disassembler.cpp ------------------------------===// 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 #include "llvm-c/Disassembler.h" 10 #include "llvm/Support/TargetSelect.h" 11 #include "gtest/gtest.h" 12 13 using namespace llvm; 14 15 static const char *symbolLookupCallback(void *DisInfo, uint64_t ReferenceValue, 16 uint64_t *ReferenceType, 17 uint64_t ReferencePC, 18 const char **ReferenceName) { 19 *ReferenceType = LLVMDisassembler_ReferenceType_InOut_None; 20 return nullptr; 21 } 22 23 TEST(Disassembler, X86Test) { 24 llvm::InitializeAllTargetInfos(); 25 llvm::InitializeAllTargetMCs(); 26 llvm::InitializeAllDisassemblers(); 27 28 uint8_t Bytes[] = {0x90, 0x90, 0xeb, 0xfd}; 29 uint8_t *BytesP = Bytes; 30 const char OutStringSize = 100; 31 char OutString[OutStringSize]; 32 LLVMDisasmContextRef DCR = LLVMCreateDisasm("x86_64-pc-linux", nullptr, 0, 33 nullptr, symbolLookupCallback); 34 if (!DCR) 35 return; 36 37 size_t InstSize; 38 unsigned NumBytes = sizeof(Bytes); 39 unsigned PC = 0; 40 41 InstSize = 42 LLVMDisasmInstruction(DCR, BytesP, 0, PC, OutString, OutStringSize); 43 EXPECT_EQ(InstSize, 0U); 44 45 InstSize = LLVMDisasmInstruction(DCR, BytesP, NumBytes, PC, OutString, 46 OutStringSize); 47 EXPECT_EQ(InstSize, 1U); 48 EXPECT_EQ(StringRef(OutString), "\tnop"); 49 PC += InstSize; 50 BytesP += InstSize; 51 NumBytes -= InstSize; 52 53 InstSize = LLVMDisasmInstruction(DCR, BytesP, NumBytes, PC, OutString, 54 OutStringSize); 55 EXPECT_EQ(InstSize, 1U); 56 EXPECT_EQ(StringRef(OutString), "\tnop"); 57 PC += InstSize; 58 BytesP += InstSize; 59 NumBytes -= InstSize; 60 61 InstSize = LLVMDisasmInstruction(DCR, BytesP, NumBytes, PC, OutString, 62 OutStringSize); 63 EXPECT_EQ(InstSize, 2U); 64 EXPECT_EQ(StringRef(OutString), "\tjmp\t0x1"); 65 66 LLVMDisasmDispose(DCR); 67 } 68 69 TEST(Disassembler, WebAssemblyTest) { 70 llvm::InitializeAllTargetInfos(); 71 llvm::InitializeAllTargetMCs(); 72 llvm::InitializeAllDisassemblers(); 73 74 uint8_t Bytes[] = {0x6a, 0x42, 0x7F, 0x35, 0x01, 0x10}; 75 uint8_t *BytesP = Bytes; 76 const char OutStringSize = 100; 77 char OutString[OutStringSize]; 78 LLVMDisasmContextRef DCR = LLVMCreateDisasm("wasm32-unknown-unknown", nullptr, 79 0, nullptr, symbolLookupCallback); 80 if (!DCR) 81 return; 82 83 size_t InstSize; 84 unsigned NumBytes = sizeof(Bytes); 85 unsigned PC = 0; 86 87 InstSize = LLVMDisasmInstruction(DCR, BytesP, NumBytes, PC, OutString, 88 OutStringSize); 89 EXPECT_EQ(InstSize, 1U); 90 EXPECT_EQ(StringRef(OutString), "\ti32.add "); 91 PC += InstSize; 92 BytesP += InstSize; 93 NumBytes -= InstSize; 94 95 InstSize = LLVMDisasmInstruction(DCR, BytesP, NumBytes, PC, OutString, 96 OutStringSize); 97 EXPECT_EQ(InstSize, 2U); 98 EXPECT_EQ(StringRef(OutString), "\ti64.const\t-1"); 99 100 PC += InstSize; 101 BytesP += InstSize; 102 NumBytes -= InstSize; 103 104 InstSize = LLVMDisasmInstruction(DCR, BytesP, NumBytes, PC, OutString, 105 OutStringSize); 106 EXPECT_EQ(InstSize, 3U); 107 EXPECT_EQ(StringRef(OutString), "\ti64.load32_u\t16:p2align=1"); 108 109 LLVMDisasmDispose(DCR); 110 } 111