summaryrefslogtreecommitdiffstatshomepage
path: root/3rdparty/asmjit/src/asmjit/core/jitruntime.cpp
diff options
context:
space:
mode:
Diffstat (limited to '3rdparty/asmjit/src/asmjit/core/jitruntime.cpp')
-rw-r--r--3rdparty/asmjit/src/asmjit/core/jitruntime.cpp96
1 files changed, 28 insertions, 68 deletions
diff --git a/3rdparty/asmjit/src/asmjit/core/jitruntime.cpp b/3rdparty/asmjit/src/asmjit/core/jitruntime.cpp
index 1127c866aad..491c2040fbe 100644
--- a/3rdparty/asmjit/src/asmjit/core/jitruntime.cpp
+++ b/3rdparty/asmjit/src/asmjit/core/jitruntime.cpp
@@ -1,25 +1,7 @@
-// AsmJit - Machine code generation for C++
+// This file is part of AsmJit project <https://asmjit.com>
//
-// * Official AsmJit Home Page: https://asmjit.com
-// * Official Github Repository: https://github.com/asmjit/asmjit
-//
-// Copyright (c) 2008-2020 The AsmJit Authors
-//
-// This software is provided 'as-is', without any express or implied
-// warranty. In no event will the authors be held liable for any damages
-// arising from the use of this software.
-//
-// Permission is granted to anyone to use this software for any purpose,
-// including commercial applications, and to alter it and redistribute it
-// freely, subject to the following restrictions:
-//
-// 1. The origin of this software must not be misrepresented; you must not
-// claim that you wrote the original software. If you use this software
-// in a product, an acknowledgment in the product documentation would be
-// appreciated but is not required.
-// 2. Altered source versions must be plainly marked as such, and must not be
-// misrepresented as being the original software.
-// 3. This notice may not be removed or altered from any source distribution.
+// See asmjit.h or LICENSE.md for license and copyright information
+// SPDX-License-Identifier: Zlib
#include "../core/api-build_p.h"
#ifndef ASMJIT_NO_JIT
@@ -29,36 +11,14 @@
ASMJIT_BEGIN_NAMESPACE
-// ============================================================================
-// [asmjit::JitRuntime - Utilities]
-// ============================================================================
-
-// Only useful on non-x86 architectures.
-static inline void JitRuntime_flushInstructionCache(const void* p, size_t size) noexcept {
-#if defined(_WIN32) && !ASMJIT_ARCH_X86
- // Windows has a built-in support in `kernel32.dll`.
- ::FlushInstructionCache(::GetCurrentProcess(), p, size);
-#else
- DebugUtils::unused(p, size);
-#endif
-}
-
-// ============================================================================
-// [asmjit::JitRuntime - Construction / Destruction]
-// ============================================================================
-
JitRuntime::JitRuntime(const JitAllocator::CreateParams* params) noexcept
: _allocator(params) {
- _environment = hostEnvironment();
- _environment.setFormat(Environment::kFormatJIT);
+ _environment = Environment::host();
+ _environment.setObjectFormat(ObjectFormat::kJIT);
}
JitRuntime::~JitRuntime() noexcept {}
-// ============================================================================
-// [asmjit::JitRuntime - Interface]
-// ============================================================================
-
Error JitRuntime::_add(void** dst, CodeHolder* code) noexcept {
*dst = nullptr;
@@ -69,41 +29,45 @@ Error JitRuntime::_add(void** dst, CodeHolder* code) noexcept {
if (ASMJIT_UNLIKELY(estimatedCodeSize == 0))
return DebugUtils::errored(kErrorNoCodeGenerated);
- uint8_t* ro;
+ uint8_t* rx;
uint8_t* rw;
- ASMJIT_PROPAGATE(_allocator.alloc((void**)&ro, (void**)&rw, estimatedCodeSize));
+ ASMJIT_PROPAGATE(_allocator.alloc((void**)&rx, (void**)&rw, estimatedCodeSize));
// Relocate the code.
- Error err = code->relocateToBase(uintptr_t((void*)ro));
+ Error err = code->relocateToBase(uintptr_t((void*)rx));
if (ASMJIT_UNLIKELY(err)) {
- _allocator.release(ro);
+ _allocator.release(rx);
return err;
}
// Recalculate the final code size and shrink the memory we allocated for it
// in case that some relocations didn't require records in an address table.
size_t codeSize = code->codeSize();
+ if (codeSize < estimatedCodeSize)
+ _allocator.shrink(rx, codeSize);
- for (Section* section : code->_sections) {
- size_t offset = size_t(section->offset());
- size_t bufferSize = size_t(section->bufferSize());
- size_t virtualSize = size_t(section->virtualSize());
+ if (codeSize < estimatedCodeSize)
+ _allocator.shrink(rx, codeSize);
- ASMJIT_ASSERT(offset + bufferSize <= codeSize);
- memcpy(rw + offset, section->data(), bufferSize);
+ {
+ VirtMem::ProtectJitReadWriteScope rwScope(rx, codeSize);
- if (virtualSize > bufferSize) {
- ASMJIT_ASSERT(offset + virtualSize <= codeSize);
- memset(rw + offset + bufferSize, 0, virtualSize - bufferSize);
- }
- }
+ for (Section* section : code->_sections) {
+ size_t offset = size_t(section->offset());
+ size_t bufferSize = size_t(section->bufferSize());
+ size_t virtualSize = size_t(section->virtualSize());
- if (codeSize < estimatedCodeSize)
- _allocator.shrink(ro, codeSize);
+ ASMJIT_ASSERT(offset + bufferSize <= codeSize);
+ memcpy(rw + offset, section->data(), bufferSize);
- flush(ro, codeSize);
- *dst = ro;
+ if (virtualSize > bufferSize) {
+ ASMJIT_ASSERT(offset + virtualSize <= codeSize);
+ memset(rw + offset + bufferSize, 0, virtualSize - bufferSize);
+ }
+ }
+ }
+ *dst = rx;
return kErrorOk;
}
@@ -111,10 +75,6 @@ Error JitRuntime::_release(void* p) noexcept {
return _allocator.release(p);
}
-void JitRuntime::flush(const void* p, size_t size) noexcept {
- JitRuntime_flushInstructionCache(p, size);
-}
-
ASMJIT_END_NAMESPACE
#endif