• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 //===- llvm/unittest/Object/Disassembler.cpp ------------------------------===//
2 //
3 //                     The LLVM Compiler Infrastructure
4 //
5 // This file is distributed under the University of Illinois Open Source
6 // License. See LICENSE.TXT for details.
7 //
8 //===----------------------------------------------------------------------===//
9 
10 #include "llvm-c/Disassembler.h"
11 #include "llvm/Support/TargetSelect.h"
12 #include "gtest/gtest.h"
13 
14 using namespace llvm;
15 
symbolLookupCallback(void * DisInfo,uint64_t ReferenceValue,uint64_t * ReferenceType,uint64_t ReferencePC,const char ** ReferenceName)16 static const char *symbolLookupCallback(void *DisInfo, uint64_t ReferenceValue,
17                                         uint64_t *ReferenceType,
18                                         uint64_t ReferencePC,
19                                         const char **ReferenceName) {
20   *ReferenceType = LLVMDisassembler_ReferenceType_InOut_None;
21   return nullptr;
22 }
23 
TEST(Disassembler,Test1)24 TEST(Disassembler, Test1) {
25   llvm::InitializeAllTargetInfos();
26   llvm::InitializeAllTargetMCs();
27   llvm::InitializeAllDisassemblers();
28 
29   uint8_t Bytes[] = {0x90, 0x90, 0xeb, 0xfd};
30   uint8_t *BytesP = Bytes;
31   const char OutStringSize = 100;
32   char OutString[OutStringSize];
33   LLVMDisasmContextRef DCR = LLVMCreateDisasm("x86_64-pc-linux", nullptr, 0,
34                                               nullptr, symbolLookupCallback);
35   if (!DCR)
36     return;
37 
38   size_t InstSize;
39   unsigned NumBytes = sizeof(Bytes);
40   unsigned PC = 0;
41 
42   InstSize = LLVMDisasmInstruction(DCR, BytesP, NumBytes, PC, OutString,
43                                    OutStringSize);
44   EXPECT_EQ(InstSize, 1U);
45   EXPECT_EQ(StringRef(OutString), "\tnop");
46   PC += InstSize;
47   BytesP += InstSize;
48   NumBytes -= InstSize;
49 
50   InstSize = LLVMDisasmInstruction(DCR, BytesP, NumBytes, PC, OutString,
51                                    OutStringSize);
52   EXPECT_EQ(InstSize, 1U);
53   EXPECT_EQ(StringRef(OutString), "\tnop");
54   PC += InstSize;
55   BytesP += InstSize;
56   NumBytes -= InstSize;
57 
58   InstSize = LLVMDisasmInstruction(DCR, BytesP, NumBytes, PC, OutString,
59                                    OutStringSize);
60   EXPECT_EQ(InstSize, 2U);
61   EXPECT_EQ(StringRef(OutString), "\tjmp\t0x1");
62 
63   LLVMDisasmDispose(DCR);
64 }
65