mirror of
https://github.com/hedge-dev/XenonRecomp.git
synced 2025-11-04 14:57:09 +00:00
Remove capstone, use libopcodes
This commit is contained in:
@@ -2,4 +2,4 @@ project("PowerUtils")
|
||||
add_library(PowerUtils "disasm.h" "disasm.cpp" "file.h" "xex.cpp" "image.h" "image.cpp" "elf.h" "ppc_context.h" "symbol.h" "symbol_table.h" "section.h")
|
||||
|
||||
target_include_directories(PowerUtils PUBLIC .)
|
||||
target_link_libraries(PowerUtils PUBLIC capstone)
|
||||
target_link_libraries(PowerUtils PUBLIC disasm)
|
||||
|
||||
@@ -1,23 +1,24 @@
|
||||
#include "disasm.h"
|
||||
|
||||
DisassemblerEngine ppc::gPPCBigEndianDisassembler{ CS_ARCH_PPC, CS_MODE_BIG_ENDIAN };
|
||||
thread_local ppc::DisassemblerEngine ppc::gBigEndianDisassembler{ BFD_ENDIAN_BIG, "cell 32"};
|
||||
|
||||
DisassemblerEngine::DisassemblerEngine(cs_arch arch, cs_mode mode)
|
||||
ppc::DisassemblerEngine::DisassemblerEngine(bfd_endian endian, const char* options)
|
||||
{
|
||||
cs_open(arch, mode, &handle);
|
||||
INIT_DISASSEMBLE_INFO(info, stdout, fprintf);
|
||||
info.arch = bfd_arch_powerpc;
|
||||
info.endian = endian;
|
||||
info.disassembler_options = options;
|
||||
}
|
||||
|
||||
size_t DisassemblerEngine::Disassemble(const uint8_t* code, size_t size, uint64_t base, size_t count, cs_insn** instructions) const
|
||||
int ppc::DisassemblerEngine::Disassemble(const void* code, size_t size, uint64_t base, ppc_insn& out)
|
||||
{
|
||||
return cs_disasm(handle, code, size, base, count, instructions);
|
||||
}
|
||||
if (size < 4)
|
||||
{
|
||||
return 0;
|
||||
}
|
||||
|
||||
void DisassemblerEngine::SetOption(cs_opt_type option, size_t value)
|
||||
{
|
||||
cs_option(handle, option, value);
|
||||
}
|
||||
|
||||
DisassemblerEngine::~DisassemblerEngine()
|
||||
{
|
||||
cs_close(&handle);
|
||||
info.buffer = (bfd_byte*)code;
|
||||
info.buffer_vma = base;
|
||||
info.buffer_length = size;
|
||||
return decode_insn_ppc(base, &info, &out);
|
||||
}
|
||||
|
||||
@@ -1,43 +1,27 @@
|
||||
#pragma once
|
||||
#include <capstone/capstone.h>
|
||||
|
||||
struct DisassemblerEngine
|
||||
{
|
||||
csh handle{};
|
||||
|
||||
DisassemblerEngine(const DisassemblerEngine&) = default;
|
||||
DisassemblerEngine& operator=(const DisassemblerEngine&) = delete;
|
||||
|
||||
DisassemblerEngine(cs_arch arch, cs_mode mode);
|
||||
~DisassemblerEngine();
|
||||
size_t Disassemble(const uint8_t* code, size_t size, uint64_t base, size_t count, cs_insn** instructions) const;
|
||||
void SetOption(cs_opt_type option, size_t value);
|
||||
|
||||
void SetDetail(bool value)
|
||||
{
|
||||
SetOption(CS_OPT_DETAIL, value);
|
||||
}
|
||||
};
|
||||
#include <dis-asm.h>
|
||||
|
||||
namespace ppc
|
||||
{
|
||||
extern DisassemblerEngine gPPCBigEndianDisassembler;
|
||||
|
||||
static size_t Disassemble(const uint8_t* code, size_t size, uint64_t base, size_t count, cs_insn** instructions)
|
||||
struct DisassemblerEngine
|
||||
{
|
||||
return gPPCBigEndianDisassembler.Disassemble(code, size, base, count, instructions);
|
||||
}
|
||||
disassemble_info info{};
|
||||
DisassemblerEngine(const DisassemblerEngine&) = default;
|
||||
DisassemblerEngine& operator=(const DisassemblerEngine&) = delete;
|
||||
|
||||
static cs_insn* DisassembleSingle(const uint8_t* code, uint64_t base)
|
||||
DisassemblerEngine(bfd_endian endian, const char* options);
|
||||
~DisassemblerEngine() = default;
|
||||
|
||||
/**
|
||||
* \return Numbers of bytes decoded
|
||||
*/
|
||||
int Disassemble(const void* code, size_t size, uint64_t base, ppc_insn& out);
|
||||
};
|
||||
|
||||
thread_local extern DisassemblerEngine gBigEndianDisassembler;
|
||||
|
||||
static int Disassemble(const void* code, size_t size, uint64_t base, ppc_insn& out)
|
||||
{
|
||||
cs_insn* instruction{};
|
||||
gPPCBigEndianDisassembler.Disassemble(code, 4, base, 1, &instruction);
|
||||
|
||||
return instruction;
|
||||
return gBigEndianDisassembler.Disassemble(code, size, base, out);
|
||||
}
|
||||
|
||||
static void SetDetail(bool value)
|
||||
{
|
||||
gPPCBigEndianDisassembler.SetDetail(value);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user