diff options
Diffstat (limited to 'lib/AsmJit/CodeGenerator.h')
-rw-r--r-- | lib/AsmJit/CodeGenerator.h | 146 |
1 files changed, 146 insertions, 0 deletions
diff --git a/lib/AsmJit/CodeGenerator.h b/lib/AsmJit/CodeGenerator.h new file mode 100644 index 0000000..fc0f5a6 --- /dev/null +++ b/lib/AsmJit/CodeGenerator.h @@ -0,0 +1,146 @@ +// 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_CODEGENERATOR_H +#define _ASMJIT_CODEGENERATOR_H + +// [Dependencies] +#include "Build.h" + +namespace AsmJit { + +// ============================================================================ +// [Forward Declarations] +// ============================================================================ + +struct Assembler; +struct JitCodeGenerator; +struct MemoryManager; + +// ============================================================================ +// [AsmJit::CodeGenerator] +// ============================================================================ + +//! @brief Code generator is core class for changing behavior of code generated +//! by @c Assembler or @c Compiler. +struct ASMJIT_API CodeGenerator +{ + // -------------------------------------------------------------------------- + // [Construction / Destruction] + // -------------------------------------------------------------------------- + + //! @brief Create a @c CodeGenerator instance. + CodeGenerator(); + //! @brief Destroy the @c CodeGenerator instance. + virtual ~CodeGenerator(); + + // -------------------------------------------------------------------------- + // [Interface] + // -------------------------------------------------------------------------- + + //! @brief Allocate memory for code generated in @a assembler and reloc it + //! to target location. + //! + //! This method is universal allowing any pre-process / post-process work + //! with code generated by @c Assembler or @c Compiler. Because @c Compiler + //! always uses @c Assembler it's allowed to access only the @c Assembler + //! instance. + //! + //! This method is always last step when using code generation. You can use + //! it to allocate memory for JIT code, saving code to remote process or a + //! shared library. + //! + //! @retrurn Error value, see @c ERROR_CODE. + virtual uint32_t generate(void** dest, Assembler* assembler) = 0; + + // -------------------------------------------------------------------------- + // [Statics] + // -------------------------------------------------------------------------- + + static CodeGenerator* getGlobal(); + +private: + ASMJIT_DISABLE_COPY(CodeGenerator) +}; + +// ============================================================================ +// [AsmJit::JitCodeGenerator] +// ============================================================================ + +struct JitCodeGenerator : public CodeGenerator +{ + // -------------------------------------------------------------------------- + // [Construction / Destruction] + // -------------------------------------------------------------------------- + + //! @brief Create a @c JitCodeGenerator instance. + JitCodeGenerator(); + //! @brief Destroy the @c JitCodeGenerator instance. + virtual ~JitCodeGenerator(); + + // -------------------------------------------------------------------------- + // [Memory Manager and Alloc Type] + // -------------------------------------------------------------------------- + + // Note: These members can be ignored by all derived classes. They are here + // only to privide default implementation. All other implementations (remote + // code patching or making dynamic loadable libraries/executables) ignore + // members accessed by these accessors. + + //! @brief Get the @c MemoryManager instance. + inline MemoryManager* getMemoryManager() const { return _memoryManager; } + //! @brief Set the @c MemoryManager instance. + inline void setMemoryManager(MemoryManager* memoryManager) { _memoryManager = memoryManager; } + + //! @brief Get the type of allocation. + inline uint32_t getAllocType() const { return _allocType; } + //! @brief Set the type of allocation. + inline void setAllocType(uint32_t allocType) { _allocType = allocType; } + + // -------------------------------------------------------------------------- + // [Interface] + // -------------------------------------------------------------------------- + + virtual uint32_t generate(void** dest, Assembler* assembler); + + // -------------------------------------------------------------------------- + // [Members] + // -------------------------------------------------------------------------- + +protected: + //! @brief Memory manager. + MemoryManager* _memoryManager; + //! @brief Type of allocation. + uint32_t _allocType; + +private: + ASMJIT_DISABLE_COPY(JitCodeGenerator) +}; + +} // AsmJit namespace + +// [Guard] +#endif // _ASMJIT_CODEGENERATOR_H |