mirror of
https://github.com/RPCS3/llvm.git
synced 2025-05-16 02:16:23 +00:00

This implements a new table-gen emitter to create tables for a wasm disassembler, and a dissassembler to use them. Comes with 2 tests, that tests a few instructions manually. Is also able to disassemble large .wasm files with objdump reasonably. Not working so well, to be addressed in followups: - objdump appears to be passing an incorrect starting point. - since the disassembler works an instruction at a time, and it is disassembling stack instruction, it has no idea of pseudo register assignments. These registers are required for the instruction printing code that follows. For now, all such registers appear in the output as $0. Patch by Wouter van Oortmerssen Differential Revision: https://reviews.llvm.org/D45848 git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@332052 91177308-0d34-0410-b5e6-96231b3b80d8
108 lines
3.4 KiB
C++
108 lines
3.4 KiB
C++
//===- llvm/unittest/Object/Disassembler.cpp ------------------------------===//
|
|
//
|
|
// The LLVM Compiler Infrastructure
|
|
//
|
|
// This file is distributed under the University of Illinois Open Source
|
|
// License. See LICENSE.TXT for details.
|
|
//
|
|
//===----------------------------------------------------------------------===//
|
|
|
|
#include "llvm-c/Disassembler.h"
|
|
#include "llvm/Support/TargetSelect.h"
|
|
#include "gtest/gtest.h"
|
|
|
|
using namespace llvm;
|
|
|
|
static const char *symbolLookupCallback(void *DisInfo, uint64_t ReferenceValue,
|
|
uint64_t *ReferenceType,
|
|
uint64_t ReferencePC,
|
|
const char **ReferenceName) {
|
|
*ReferenceType = LLVMDisassembler_ReferenceType_InOut_None;
|
|
return nullptr;
|
|
}
|
|
|
|
TEST(Disassembler, X86Test) {
|
|
llvm::InitializeAllTargetInfos();
|
|
llvm::InitializeAllTargetMCs();
|
|
llvm::InitializeAllDisassemblers();
|
|
|
|
uint8_t Bytes[] = {0x90, 0x90, 0xeb, 0xfd};
|
|
uint8_t *BytesP = Bytes;
|
|
const char OutStringSize = 100;
|
|
char OutString[OutStringSize];
|
|
LLVMDisasmContextRef DCR = LLVMCreateDisasm("x86_64-pc-linux", nullptr, 0,
|
|
nullptr, symbolLookupCallback);
|
|
if (!DCR)
|
|
return;
|
|
|
|
size_t InstSize;
|
|
unsigned NumBytes = sizeof(Bytes);
|
|
unsigned PC = 0;
|
|
|
|
InstSize = LLVMDisasmInstruction(DCR, BytesP, NumBytes, PC, OutString,
|
|
OutStringSize);
|
|
EXPECT_EQ(InstSize, 1U);
|
|
EXPECT_EQ(StringRef(OutString), "\tnop");
|
|
PC += InstSize;
|
|
BytesP += InstSize;
|
|
NumBytes -= InstSize;
|
|
|
|
InstSize = LLVMDisasmInstruction(DCR, BytesP, NumBytes, PC, OutString,
|
|
OutStringSize);
|
|
EXPECT_EQ(InstSize, 1U);
|
|
EXPECT_EQ(StringRef(OutString), "\tnop");
|
|
PC += InstSize;
|
|
BytesP += InstSize;
|
|
NumBytes -= InstSize;
|
|
|
|
InstSize = LLVMDisasmInstruction(DCR, BytesP, NumBytes, PC, OutString,
|
|
OutStringSize);
|
|
EXPECT_EQ(InstSize, 2U);
|
|
EXPECT_EQ(StringRef(OutString), "\tjmp\t0x1");
|
|
|
|
LLVMDisasmDispose(DCR);
|
|
}
|
|
|
|
TEST(Disassembler, WebAssemblyTest) {
|
|
llvm::InitializeAllTargetInfos();
|
|
llvm::InitializeAllTargetMCs();
|
|
llvm::InitializeAllDisassemblers();
|
|
|
|
uint8_t Bytes[] = {0x6a, 0x42, 0x7F, 0x35, 0x01, 0x10};
|
|
uint8_t *BytesP = Bytes;
|
|
const char OutStringSize = 100;
|
|
char OutString[OutStringSize];
|
|
LLVMDisasmContextRef DCR = LLVMCreateDisasm(
|
|
"wasm32-unknown-unknown-elf", nullptr, 0, nullptr, symbolLookupCallback);
|
|
if (!DCR)
|
|
return;
|
|
|
|
size_t InstSize;
|
|
unsigned NumBytes = sizeof(Bytes);
|
|
unsigned PC = 0;
|
|
|
|
InstSize = LLVMDisasmInstruction(DCR, BytesP, NumBytes, PC, OutString,
|
|
OutStringSize);
|
|
EXPECT_EQ(InstSize, 1U);
|
|
EXPECT_EQ(StringRef(OutString), "\ti32.add \t$0=, $0, $0");
|
|
PC += InstSize;
|
|
BytesP += InstSize;
|
|
NumBytes -= InstSize;
|
|
|
|
InstSize = LLVMDisasmInstruction(DCR, BytesP, NumBytes, PC, OutString,
|
|
OutStringSize);
|
|
EXPECT_EQ(InstSize, 2U);
|
|
EXPECT_EQ(StringRef(OutString), "\ti64.const\t$0=, -1");
|
|
|
|
PC += InstSize;
|
|
BytesP += InstSize;
|
|
NumBytes -= InstSize;
|
|
|
|
InstSize = LLVMDisasmInstruction(DCR, BytesP, NumBytes, PC, OutString,
|
|
OutStringSize);
|
|
EXPECT_EQ(InstSize, 3U);
|
|
EXPECT_EQ(StringRef(OutString), "\ti64.load32_u\t$0=, 16($0):p2align=1");
|
|
|
|
LLVMDisasmDispose(DCR);
|
|
}
|