summaryrefslogtreecommitdiff
path: root/lib/AsmJit/Platform.h
diff options
context:
space:
mode:
Diffstat (limited to 'lib/AsmJit/Platform.h')
-rw-r--r--lib/AsmJit/Platform.h227
1 files changed, 227 insertions, 0 deletions
diff --git a/lib/AsmJit/Platform.h b/lib/AsmJit/Platform.h
new file mode 100644
index 0000000..3665238
--- /dev/null
+++ b/lib/AsmJit/Platform.h
@@ -0,0 +1,227 @@
+// AsmJit - Complete JIT Assembler for C++ Language.
+
+// Copyright (c) 2008-2010, Petr Kobalicek <kobalicek.petr@gmail.com>
+//
+// Permission is hereby granted, free of charge, to any person
+// obtaining a copy of this software and associated documentation
+// files (the "Software"), to deal in the Software without
+// restriction, including without limitation the rights to use,
+// copy, modify, merge, publish, distribute, sublicense, and/or sell
+// copies of the Software, and to permit persons to whom the
+// Software is furnished to do so, subject to the following
+// conditions:
+//
+// The above copyright notice and this permission notice shall be
+// included in all copies or substantial portions of the Software.
+//
+// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
+// EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES
+// OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+// NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT
+// HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
+// WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
+// FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
+// OTHER DEALINGS IN THE SOFTWARE.
+
+// [Guard]
+#ifndef _ASMJIT_PLATFORM_H
+#define _ASMJIT_PLATFORM_H
+
+// [Dependencies]
+#include "Build.h"
+
+#if defined(ASMJIT_WINDOWS)
+#include <windows.h>
+#endif // ASMJIT_WINDOWS
+
+#if defined(ASMJIT_POSIX)
+#include <pthread.h>
+#endif // ASMJIT_POSIX
+
+// [Api-Begin]
+#include "ApiBegin.h"
+
+namespace AsmJit {
+
+//! @addtogroup AsmJit_Util
+//! @{
+
+// ============================================================================
+// [AsmJit::Assert]
+// ============================================================================
+
+//! @brief Called in debug build on assertion failure.
+//! @param file Source file name where it happened.
+//! @param line Line in the source file.
+//! @param exp Expression what failed.
+//!
+//! If you have problems with assertions simply put a breakpoint into
+//! AsmJit::assertionFailure() method (see AsmJit/Platform.cpp file) and see
+//! call stack.
+ASMJIT_API void assertionFailure(const char* file, int line, const char* exp);
+
+// ============================================================================
+// [AsmJit::Lock]
+// ============================================================================
+
+//! @brief Lock - used in thread-safe code for locking.
+struct ASMJIT_HIDDEN Lock
+{
+#if defined(ASMJIT_WINDOWS)
+ typedef CRITICAL_SECTION Handle;
+#endif // ASMJIT_WINDOWS
+#if defined(ASMJIT_POSIX)
+ typedef pthread_mutex_t Handle;
+#endif // ASMJIT_POSIX
+
+ //! @brief Create a new @ref Lock instance.
+ inline Lock() ASMJIT_NOTHROW
+ {
+#if defined(ASMJIT_WINDOWS)
+ InitializeCriticalSection(&_handle);
+ // InitializeLockAndSpinCount(&_handle, 2000);
+#endif // ASMJIT_WINDOWS
+#if defined(ASMJIT_POSIX)
+ pthread_mutex_init(&_handle, NULL);
+#endif // ASMJIT_POSIX
+ }
+
+ //! @brief Destroy the @ref Lock instance.
+ inline ~Lock() ASMJIT_NOTHROW
+ {
+#if defined(ASMJIT_WINDOWS)
+ DeleteCriticalSection(&_handle);
+#endif // ASMJIT_WINDOWS
+#if defined(ASMJIT_POSIX)
+ pthread_mutex_destroy(&_handle);
+#endif // ASMJIT_POSIX
+ }
+
+ //! @brief Get handle.
+ inline Handle& getHandle() ASMJIT_NOTHROW
+ {
+ return _handle;
+ }
+
+ //! @overload
+ inline const Handle& getHandle() const ASMJIT_NOTHROW
+ {
+ return _handle;
+ }
+
+ //! @brief Lock.
+ inline void lock() ASMJIT_NOTHROW
+ {
+#if defined(ASMJIT_WINDOWS)
+ EnterCriticalSection(&_handle);
+#endif // ASMJIT_WINDOWS
+#if defined(ASMJIT_POSIX)
+ pthread_mutex_lock(&_handle);
+#endif // ASMJIT_POSIX
+ }
+
+ //! @brief Unlock.
+ inline void unlock() ASMJIT_NOTHROW
+ {
+#if defined(ASMJIT_WINDOWS)
+ LeaveCriticalSection(&_handle);
+#endif // ASMJIT_WINDOWS
+#if defined(ASMJIT_POSIX)
+ pthread_mutex_unlock(&_handle);
+#endif // ASMJIT_POSIX
+ }
+
+private:
+ //! @brief Handle.
+ Handle _handle;
+
+ // Disable copy.
+ ASMJIT_DISABLE_COPY(Lock)
+};
+
+// ============================================================================
+// [AsmJit::AutoLock]
+// ============================================================================
+
+//! @brief Scope auto locker.
+struct ASMJIT_HIDDEN AutoLock
+{
+ //! @brief Locks @a target.
+ inline AutoLock(Lock& target) ASMJIT_NOTHROW : _target(target)
+ {
+ _target.lock();
+ }
+
+ //! @brief Unlocks target.
+ inline ~AutoLock() ASMJIT_NOTHROW
+ {
+ _target.unlock();
+ }
+
+private:
+ //! @brief Pointer to target (lock).
+ Lock& _target;
+
+ // Disable copy.
+ ASMJIT_DISABLE_COPY(AutoLock)
+};
+
+// ============================================================================
+// [AsmJit::VirtualMemory]
+// ============================================================================
+
+//! @brief Class that helps with allocating memory for executing code
+//! generated by JIT compiler.
+//!
+//! There are defined functions that provides facility to allocate and free
+//! memory where can be executed code. If processor and operating system
+//! supports execution protection then you can't run code from normally
+//! malloc()'ed memory.
+//!
+//! Functions are internally implemented by operating system dependent way.
+//! VirtualAlloc() function is used for Windows operating system and mmap()
+//! for posix ones. If you want to study or create your own functions, look
+//! at VirtualAlloc() or mmap() documentation (depends on you target OS).
+//!
+//! Under posix operating systems is also useable mprotect() function, that
+//! can enable execution protection to malloc()'ed memory block.
+struct ASMJIT_API VirtualMemory
+{
+ //! @brief Allocate virtual memory.
+ //!
+ //! Pages are readable/writeable, but they are not guaranteed to be
+ //! executable unless 'canExecute' is true. Returns the address of
+ //! allocated memory, or NULL if failed.
+ static void* alloc(sysuint_t length, sysuint_t* allocated, bool canExecute) ASMJIT_NOTHROW;
+
+ //! @brief Free memory allocated by @c alloc()
+ static void free(void* addr, sysuint_t length) ASMJIT_NOTHROW;
+
+#if defined(ASMJIT_WINDOWS)
+ //! @brief Allocate virtual memory of @a hProcess.
+ //!
+ //! @note This function is windows specific and unportable.
+ static void* allocProcessMemory(HANDLE hProcess, sysuint_t length, sysuint_t* allocated, bool canExecute) ASMJIT_NOTHROW;
+
+ //! @brief Free virtual memory of @a hProcess.
+ //!
+ //! @note This function is windows specific and unportable.
+ static void freeProcessMemory(HANDLE hProcess, void* addr, sysuint_t length) ASMJIT_NOTHROW;
+#endif // ASMJIT_WINDOWS
+
+ //! @brief Get the alignment guaranteed by alloc().
+ static sysuint_t getAlignment() ASMJIT_NOTHROW;
+
+ //! @brief Get size of single page.
+ static sysuint_t getPageSize() ASMJIT_NOTHROW;
+};
+
+//! @}
+
+} // AsmJit namespace
+
+// [Api-End]
+#include "ApiEnd.h"
+
+// [Guard]
+#endif // _ASMJIT_PLATFORM_H