From ed3a686d1ddf76ac506762d2dec11569d2cc4645 Mon Sep 17 00:00:00 2001 From: MerryMage Date: Thu, 25 Aug 2016 18:22:08 +0100 Subject: [PATCH] Implement public header files --- CMakeLists.txt | 9 +++- include/dynarmic/callbacks.h | 35 +++++++++++++++ include/dynarmic/disassembler.h | 19 ++++++++ .../dynarmic/dynarmic.h | 45 ++++++------------- src/CMakeLists.txt | 14 +++--- src/backend_x64/emit_x64.h | 2 +- src/backend_x64/interface_x64.cpp | 2 +- tests/CMakeLists.txt | 9 ++-- tests/arm/fuzz_arm.cpp | 3 +- tests/arm/fuzz_thumb.cpp | 3 +- tests/arm/test_thumb_instructions.cpp | 3 +- .../skyeye_common/armstate.h | 3 +- 12 files changed, 100 insertions(+), 47 deletions(-) create mode 100644 include/dynarmic/callbacks.h create mode 100644 include/dynarmic/disassembler.h rename src/interface/interface.h => include/dynarmic/dynarmic.h (65%) diff --git a/CMakeLists.txt b/CMakeLists.txt index 4c06f063..204b3b43 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -1,5 +1,5 @@ cmake_minimum_required(VERSION 3.4.1) -project(dynarmic) +project(dynarmic CXX) # Dynarmic project options option(DYNARMIC_USE_SYSTEM_BOOST "Use the system boost libraries" ON) @@ -13,6 +13,13 @@ set(CMAKE_CXX_EXTENSIONS OFF) # Warn on CMake API deprecations set(CMAKE_WARN_DEPRECATED ON) +# Disable in-source builds +set(CMAKE_DISABLE_SOURCE_CHANGES ON) +set(CMAKE_DISABLE_IN_SOURCE_BUILD ON) +if ("${CMAKE_SOURCE_DIR}" STREQUAL "${CMAKE_BINARY_DIR}") + message(SEND_ERROR "In-source builds are not allowed.") +endif() + # Signify where the module directories are set(CMAKE_MODULE_PATH ${CMAKE_MODULE_PATH} ${PROJECT_SOURCE_DIR}/CMakeModules) diff --git a/include/dynarmic/callbacks.h b/include/dynarmic/callbacks.h new file mode 100644 index 00000000..7bb1d926 --- /dev/null +++ b/include/dynarmic/callbacks.h @@ -0,0 +1,35 @@ +/* This file is part of the dynarmic project. + * Copyright (c) 2016 MerryMage + * This software may be used and distributed according to the terms of the GNU + * General Public License version 2 or any later version. + */ + +#pragma once + +#include + +namespace Dynarmic { + +class Jit; + +/// These function pointers may be inserted into compiled code. +struct UserCallbacks { + std::uint8_t (*MemoryRead8)(std::uint32_t vaddr); + std::uint16_t (*MemoryRead16)(std::uint32_t vaddr); + std::uint32_t (*MemoryRead32)(std::uint32_t vaddr); + std::uint64_t (*MemoryRead64)(std::uint32_t vaddr); + + void (*MemoryWrite8)(std::uint32_t vaddr, std::uint8_t value); + void (*MemoryWrite16)(std::uint32_t vaddr, std::uint16_t value); + void (*MemoryWrite32)(std::uint32_t vaddr, std::uint32_t value); + void (*MemoryWrite64)(std::uint32_t vaddr, std::uint64_t value); + + bool (*IsReadOnlyMemory)(std::uint32_t vaddr); + + /// The intrepreter must execute only one instruction at PC. + void (*InterpreterFallback)(std::uint32_t pc, Jit* jit); + + bool (*CallSVC)(std::uint32_t swi); +}; + +} // namespace Dynarmic diff --git a/include/dynarmic/disassembler.h b/include/dynarmic/disassembler.h new file mode 100644 index 00000000..51457ed5 --- /dev/null +++ b/include/dynarmic/disassembler.h @@ -0,0 +1,19 @@ +/* This file is part of the dynarmic project. + * Copyright (c) 2016 MerryMage + * This software may be used and distributed according to the terms of the GNU + * General Public License version 2 or any later version. + */ + +#pragma once + +#include +#include + +namespace Dynarmic { +namespace Arm { + +std::string DisassembleArm(std::uint32_t instruction); +std::string DisassembleThumb16(std::uint16_t instruction); + +} // namespace Arm +} // namespace Dynarmic diff --git a/src/interface/interface.h b/include/dynarmic/dynarmic.h similarity index 65% rename from src/interface/interface.h rename to include/dynarmic/dynarmic.h index a3abdd21..83d72d42 100644 --- a/src/interface/interface.h +++ b/include/dynarmic/dynarmic.h @@ -6,9 +6,12 @@ #pragma once +#include +#include +#include #include -#include "common/common_types.h" +#include namespace Dynarmic { @@ -16,28 +19,6 @@ namespace Arm { struct LocationDescriptor; } -class Jit; - -/// These function pointers may be inserted into compiled code. -struct UserCallbacks { - u8 (*MemoryRead8)(u32 vaddr); - u16 (*MemoryRead16)(u32 vaddr); - u32 (*MemoryRead32)(u32 vaddr); - u64 (*MemoryRead64)(u32 vaddr); - - void (*MemoryWrite8)(u32 vaddr, u8 value); - void (*MemoryWrite16)(u32 vaddr, u16 value); - void (*MemoryWrite32)(u32 vaddr, u32 value); - void (*MemoryWrite64)(u32 vaddr, u64 value); - - bool (*IsReadOnlyMemory)(u32 vaddr); - - /// The intrepreter must execute only one instruction at PC. - void (*InterpreterFallback)(u32 pc, Jit* jit); - - bool (*CallSVC)(u32 swi); -}; - class Jit final { public: explicit Jit(Dynarmic::UserCallbacks callbacks); @@ -49,7 +30,7 @@ public: * @param cycle_count Estimated number of cycles to run the CPU for. * @returns Actual cycle count. */ - size_t Run(size_t cycle_count); + std::size_t Run(std::size_t cycle_count); /** * Clears the code cache of all compiled code. @@ -71,18 +52,18 @@ public: void HaltExecution(); /// View and modify registers. - std::array& Regs(); - const std::array& Regs() const; - std::array& ExtRegs(); - const std::array& ExtRegs() const; + std::array& Regs(); + const std::array& Regs() const; + std::array& ExtRegs(); + const std::array& ExtRegs() const; /// View and modify CPSR. - u32& Cpsr(); - u32 Cpsr() const; + std::uint32_t& Cpsr(); + std::uint32_t Cpsr() const; /// View and modify FPSCR. - u32 Fpscr() const; - void SetFpscr(u32 value) const; + std::uint32_t Fpscr() const; + void SetFpscr(std::uint32_t value) const; /** * Returns true if Jit::Run was called but hasn't returned yet. diff --git a/src/CMakeLists.txt b/src/CMakeLists.txt index d664f8bc..44775466 100644 --- a/src/CMakeLists.txt +++ b/src/CMakeLists.txt @@ -1,6 +1,3 @@ -include_directories(.) -include(CreateDirectoryGroups) - set(SRCS backend_x64/abi.cpp backend_x64/block_of_code.cpp @@ -39,6 +36,9 @@ set(SRCS ) set(HEADERS + ../include/dynarmic/dynarmic.h + ../include/dynarmic/callbacks.h + ../include/dynarmic/disassembler.h backend_x64/abi.h backend_x64/block_of_code.h backend_x64/emit_x64.h @@ -54,8 +54,8 @@ set(HEADERS common/mp.h common/scope_exit.h common/string_util.h - frontend/arm_types.h frontend/arm/FPSCR.h + frontend/arm_types.h frontend/decoder/arm.h frontend/decoder/decoder_detail.h frontend/decoder/thumb16.h @@ -70,10 +70,14 @@ set(HEADERS frontend/ir/value.h frontend/translate/translate.h frontend/translate/translate_arm/translate_arm.h - interface/interface.h ir_opt/passes.h ) +include(CreateDirectoryGroups) create_directory_groups(${SRCS} ${HEADERS}) + add_library(dynarmic STATIC ${SRCS} ${HEADERS}) set_target_properties(dynarmic PROPERTIES LINKER_LANGUAGE CXX) +target_include_directories(dynarmic + PUBLIC ../include + PRIVATE .) diff --git a/src/backend_x64/emit_x64.h b/src/backend_x64/emit_x64.h index e04dd8d5..40b7ef04 100644 --- a/src/backend_x64/emit_x64.h +++ b/src/backend_x64/emit_x64.h @@ -15,11 +15,11 @@ #include "backend_x64/block_of_code.h" #include "backend_x64/reg_alloc.h" +#include "dynarmic/callbacks.h" #include "frontend/arm_types.h" #include "frontend/ir/basic_block.h" #include "frontend/ir/microinstruction.h" #include "frontend/ir/terminal.h" -#include "interface/interface.h" namespace Dynarmic { namespace BackendX64 { diff --git a/src/backend_x64/interface_x64.cpp b/src/backend_x64/interface_x64.cpp index eb99f78f..16228cb1 100644 --- a/src/backend_x64/interface_x64.cpp +++ b/src/backend_x64/interface_x64.cpp @@ -19,9 +19,9 @@ #include "common/common_types.h" #include "common/scope_exit.h" #include "common/string_util.h" +#include "dynarmic/dynarmic.h" #include "frontend/arm_types.h" #include "frontend/translate/translate.h" -#include "interface/interface.h" #include "ir_opt/passes.h" namespace Dynarmic { diff --git a/tests/CMakeLists.txt b/tests/CMakeLists.txt index e2f810e3..bb2463de 100644 --- a/tests/CMakeLists.txt +++ b/tests/CMakeLists.txt @@ -1,6 +1,3 @@ -include_directories(. ../src) -include(CreateDirectoryGroups) - set(SRCS arm/fuzz_arm.cpp arm/fuzz_thumb.cpp @@ -34,7 +31,13 @@ set(HEADERS skyeye_interpreter/skyeye_common/vfp/vfp_helper.h ) +include(CreateDirectoryGroups) create_directory_groups(${SRCS} ${HEADERS}) + add_executable(dynarmic_tests ${SRCS}) target_link_libraries(dynarmic_tests dynarmic ${llvm_libs}) set_target_properties(dynarmic_tests PROPERTIES LINKER_LANGUAGE CXX) +target_include_directories(dynarmic_tests + PRIVATE . ../src) + +add_test(dynarmic_tests dynarmic_tests) diff --git a/tests/arm/fuzz_arm.cpp b/tests/arm/fuzz_arm.cpp index db105aa2..7a6a4854 100644 --- a/tests/arm/fuzz_arm.cpp +++ b/tests/arm/fuzz_arm.cpp @@ -15,13 +15,14 @@ #include +#include + #include "common/bit_util.h" #include "common/common_types.h" #include "frontend/arm_types.h" #include "frontend/disassembler/disassembler.h" #include "frontend/ir/basic_block.h" #include "frontend/translate/translate.h" -#include "interface/interface.h" #include "ir_opt/passes.h" #include "rand_int.h" #include "skyeye_interpreter/dyncom/arm_dyncom_interpreter.h" diff --git a/tests/arm/fuzz_thumb.cpp b/tests/arm/fuzz_thumb.cpp index 806a98ca..111ca414 100644 --- a/tests/arm/fuzz_thumb.cpp +++ b/tests/arm/fuzz_thumb.cpp @@ -14,12 +14,13 @@ #include +#include + #include "common/bit_util.h" #include "common/common_types.h" #include "frontend/disassembler/disassembler.h" #include "frontend/ir/basic_block.h" #include "frontend/translate/translate.h" -#include "interface/interface.h" #include "ir_opt/passes.h" #include "rand_int.h" #include "skyeye_interpreter/dyncom/arm_dyncom_interpreter.h" diff --git a/tests/arm/test_thumb_instructions.cpp b/tests/arm/test_thumb_instructions.cpp index 23d97a96..5c96a688 100644 --- a/tests/arm/test_thumb_instructions.cpp +++ b/tests/arm/test_thumb_instructions.cpp @@ -6,8 +6,9 @@ #include +#include + #include "common/common_types.h" -#include "interface/interface.h" #include "skyeye_interpreter/dyncom/arm_dyncom_interpreter.h" #include "skyeye_interpreter/skyeye_common/armstate.h" diff --git a/tests/skyeye_interpreter/skyeye_common/armstate.h b/tests/skyeye_interpreter/skyeye_common/armstate.h index 54063e43..32e475e0 100644 --- a/tests/skyeye_interpreter/skyeye_common/armstate.h +++ b/tests/skyeye_interpreter/skyeye_common/armstate.h @@ -20,8 +20,9 @@ #include #include +#include + #include "common/common_types.h" -#include "interface/interface.h" #include "skyeye_interpreter/skyeye_common/arm_regformat.h" // Signal levels