Home | History | Annotate | Download | only in MC
      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 
     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 
     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