backend/x64: Make ExceptionHandler its own class

This commit is contained in:
MerryMage 2020-04-08 11:57:53 +01:00
parent 325808949f
commit 9d60d92692
8 changed files with 50 additions and 27 deletions

View file

@ -46,6 +46,7 @@ protected:
const A32::UserConfig config; const A32::UserConfig config;
A32::Jit* jit_interface; A32::Jit* jit_interface;
BlockRangeInformation<u32> block_ranges; BlockRangeInformation<u32> block_ranges;
ExceptionHandler exception_handler;
struct FastDispatchEntry { struct FastDispatchEntry {
u64 location_descriptor; u64 location_descriptor;

View file

@ -83,7 +83,6 @@ BlockOfCode::BlockOfCode(RunCodeCallbacks cb, JitStateInfo jsi)
{ {
EnableWriting(); EnableWriting();
GenRunCode(); GenRunCode();
exception_handler.Register(*this);
} }
void BlockOfCode::PreludeComplete() { void BlockOfCode::PreludeComplete() {
@ -286,6 +285,10 @@ CodePtr BlockOfCode::GetCodeBegin() const {
return near_code_begin; return near_code_begin;
} }
size_t BlockOfCode::GetTotalCodeSize() const {
return maxSize_;
}
void* BlockOfCode::AllocateFromCodeSpace(size_t alloc_size) { void* BlockOfCode::AllocateFromCodeSpace(size_t alloc_size) {
if (size_ + alloc_size >= maxSize_) { if (size_ + alloc_size >= maxSize_) {
throw Xbyak::Error(Xbyak::ERR_CODE_IS_TOO_BIG); throw Xbyak::Error(Xbyak::ERR_CODE_IS_TOO_BIG);

View file

@ -98,6 +98,7 @@ public:
void SwitchToNearCode(); void SwitchToNearCode();
CodePtr GetCodeBegin() const; CodePtr GetCodeBegin() const;
size_t GetTotalCodeSize() const;
const void* GetReturnFromRunCodeAddress() const { const void* GetReturnFromRunCodeAddress() const {
return return_from_run_code[0]; return return_from_run_code[0];
@ -163,18 +164,6 @@ private:
std::array<const void*, 4> return_from_run_code; std::array<const void*, 4> return_from_run_code;
void GenRunCode(); void GenRunCode();
class ExceptionHandler final {
public:
ExceptionHandler();
~ExceptionHandler();
void Register(BlockOfCode& code);
private:
struct Impl;
std::unique_ptr<Impl> impl;
};
ExceptionHandler exception_handler;
Xbyak::util::Cpu cpu_info; Xbyak::util::Cpu cpu_info;
}; };

View file

@ -33,8 +33,9 @@ void EmitContext::EraseInstruction(IR::Inst* inst) {
inst->ClearArgs(); inst->ClearArgs();
} }
EmitX64::EmitX64(BlockOfCode& code) EmitX64::EmitX64(BlockOfCode& code) : code(code) {
: code(code) {} exception_handler.Register(code);
}
EmitX64::~EmitX64() = default; EmitX64::~EmitX64() = default;

View file

@ -16,6 +16,7 @@
#include <xbyak_util.h> #include <xbyak_util.h>
#include "backend/x64/exception_handler.h"
#include "backend/x64/reg_alloc.h" #include "backend/x64/reg_alloc.h"
#include "common/bit_util.h" #include "common/bit_util.h"
#include "common/fp/fpcr.h" #include "common/fp/fpcr.h"
@ -58,7 +59,7 @@ public:
size_t size; // Length in bytes of emitted code size_t size; // Length in bytes of emitted code
}; };
EmitX64(BlockOfCode& code); explicit EmitX64(BlockOfCode& code);
virtual ~EmitX64(); virtual ~EmitX64();
/// Looks up an emitted host block in the cache. /// Looks up an emitted host block in the cache.
@ -114,6 +115,7 @@ protected:
// State // State
BlockOfCode& code; BlockOfCode& code;
ExceptionHandler exception_handler;
std::unordered_map<IR::LocationDescriptor, BlockDescriptor> block_descriptors; std::unordered_map<IR::LocationDescriptor, BlockDescriptor> block_descriptors;
std::unordered_map<IR::LocationDescriptor, PatchInformation> patch_information; std::unordered_map<IR::LocationDescriptor, PatchInformation> patch_information;
}; };

View file

@ -0,0 +1,26 @@
/* This file is part of the dynarmic project.
* Copyright (c) 2020 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 <memory>
namespace Dynarmic::Backend::X64 {
class BlockOfCode;
class ExceptionHandler final {
public:
ExceptionHandler();
~ExceptionHandler();
void Register(BlockOfCode& code);
private:
struct Impl;
std::unique_ptr<Impl> impl;
};
} // namespace Dynarmic::Backend::X64

View file

@ -4,17 +4,17 @@
* General Public License version 2 or any later version. * General Public License version 2 or any later version.
*/ */
#include "backend/x64/block_of_code.h" #include "backend/x64/exception_handler.h"
namespace Dynarmic::Backend::X64 { namespace Dynarmic::Backend::X64 {
struct BlockOfCode::ExceptionHandler::Impl final { struct ExceptionHandler::Impl final {
}; };
BlockOfCode::ExceptionHandler::ExceptionHandler() = default; ExceptionHandler::ExceptionHandler() = default;
BlockOfCode::ExceptionHandler::~ExceptionHandler() = default; ExceptionHandler::~ExceptionHandler() = default;
void BlockOfCode::ExceptionHandler::Register(BlockOfCode&) { void ExceptionHandler::Register(BlockOfCode&) {
// Do nothing // Do nothing
} }

View file

@ -11,6 +11,7 @@
#include <windows.h> #include <windows.h>
#include "backend/x64/block_of_code.h" #include "backend/x64/block_of_code.h"
#include "backend/x64/exception_handler.h"
#include "common/assert.h" #include "common/assert.h"
#include "common/common_types.h" #include "common/common_types.h"
@ -156,7 +157,7 @@ static PrologueInformation GetPrologueInformation() {
return ret; return ret;
} }
struct BlockOfCode::ExceptionHandler::Impl final { struct ExceptionHandler::Impl final {
Impl(RUNTIME_FUNCTION* rfuncs_, const u8* base_ptr) : rfuncs(rfuncs_) { Impl(RUNTIME_FUNCTION* rfuncs_, const u8* base_ptr) : rfuncs(rfuncs_) {
RtlAddFunctionTable(rfuncs, 1, reinterpret_cast<DWORD64>(base_ptr)); RtlAddFunctionTable(rfuncs, 1, reinterpret_cast<DWORD64>(base_ptr));
} }
@ -169,10 +170,10 @@ private:
RUNTIME_FUNCTION* rfuncs = nullptr; RUNTIME_FUNCTION* rfuncs = nullptr;
}; };
BlockOfCode::ExceptionHandler::ExceptionHandler() = default; ExceptionHandler::ExceptionHandler() = default;
BlockOfCode::ExceptionHandler::~ExceptionHandler() = default; ExceptionHandler::~ExceptionHandler() = default;
void BlockOfCode::ExceptionHandler::Register(BlockOfCode& code) { void ExceptionHandler::Register(BlockOfCode& code) {
const auto prolog_info = GetPrologueInformation(); const auto prolog_info = GetPrologueInformation();
code.align(16); code.align(16);
@ -190,8 +191,8 @@ void BlockOfCode::ExceptionHandler::Register(BlockOfCode& code) {
code.align(16); code.align(16);
RUNTIME_FUNCTION* rfuncs = static_cast<RUNTIME_FUNCTION*>(code.AllocateFromCodeSpace(sizeof(RUNTIME_FUNCTION))); RUNTIME_FUNCTION* rfuncs = static_cast<RUNTIME_FUNCTION*>(code.AllocateFromCodeSpace(sizeof(RUNTIME_FUNCTION)));
rfuncs->BeginAddress = static_cast<DWORD>(reinterpret_cast<u8*>(code.run_code) - code.getCode()); rfuncs->BeginAddress = static_cast<DWORD>(0);
rfuncs->EndAddress = static_cast<DWORD>(code.maxSize_); rfuncs->EndAddress = static_cast<DWORD>(code.GetTotalCodeSize());
rfuncs->UnwindData = static_cast<DWORD>(reinterpret_cast<u8*>(unwind_info) - code.getCode()); rfuncs->UnwindData = static_cast<DWORD>(reinterpret_cast<u8*>(unwind_info) - code.getCode());
impl = std::make_unique<Impl>(rfuncs, code.getCode()); impl = std::make_unique<Impl>(rfuncs, code.getCode());