diff options
| author | auth12 <[email protected]> | 2020-07-19 11:45:43 -0700 |
|---|---|---|
| committer | auth12 <[email protected]> | 2020-07-19 11:45:43 -0700 |
| commit | 4e6a09d486ed462ee4cf38c3735a12d530dc09d4 (patch) | |
| tree | a67ccac41fef7a412b4357fbe54582cc4b692863 /client/asmjit/core/target.h | |
| parent | Deleted asmjit submodule (diff) | |
| download | loader-4e6a09d486ed462ee4cf38c3735a12d530dc09d4.tar.xz loader-4e6a09d486ed462ee4cf38c3735a12d530dc09d4.zip | |
Added asmjit.
Fixed solution file.
Diffstat (limited to 'client/asmjit/core/target.h')
| -rw-r--r-- | client/asmjit/core/target.h | 175 |
1 files changed, 175 insertions, 0 deletions
diff --git a/client/asmjit/core/target.h b/client/asmjit/core/target.h new file mode 100644 index 0000000..4d144c6 --- /dev/null +++ b/client/asmjit/core/target.h @@ -0,0 +1,175 @@ +// AsmJit - Machine code generation for C++ +// +// * 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. + +#ifndef ASMJIT_CORE_TARGET_H_INCLUDED +#define ASMJIT_CORE_TARGET_H_INCLUDED + +#include "../core/arch.h" +#include "../core/func.h" + +ASMJIT_BEGIN_NAMESPACE + +//! \addtogroup asmjit_core +//! \{ + +// ============================================================================ +// [asmjit::CodeInfo] +// ============================================================================ + +#ifndef ASMJIT_NO_DEPRECATED +//! Basic information about a code (or target). It describes its architecture, +//! code generation mode (or optimization level), and base address. +class ASMJIT_DEPRECATED_STRUCT("Use Environment instead of CodeInfo") CodeInfo { +public: + //!< Environment information. + Environment _environment; + //! Base address. + uint64_t _baseAddress; + + //! \name Construction & Destruction + //! \{ + + inline CodeInfo() noexcept + : _environment(), + _baseAddress(Globals::kNoBaseAddress) {} + + inline explicit CodeInfo(uint32_t arch, uint32_t subArch = 0, uint64_t baseAddress = Globals::kNoBaseAddress) noexcept + : _environment(arch, subArch), + _baseAddress(baseAddress) {} + + inline explicit CodeInfo(const Environment& environment, uint64_t baseAddress = Globals::kNoBaseAddress) noexcept + : _environment(environment), + _baseAddress(baseAddress) {} + + + inline CodeInfo(const CodeInfo& other) noexcept { init(other); } + + inline bool isInitialized() const noexcept { + return _environment.arch() != Environment::kArchUnknown; + } + + inline void init(const CodeInfo& other) noexcept { + *this = other; + } + + inline void init(uint32_t arch, uint32_t subArch = 0, uint64_t baseAddress = Globals::kNoBaseAddress) noexcept { + _environment.init(arch, subArch); + _baseAddress = baseAddress; + } + + inline void reset() noexcept { + _environment.reset(); + _baseAddress = Globals::kNoBaseAddress; + } + + //! \} + + //! \name Overloaded Operators + //! \{ + + inline CodeInfo& operator=(const CodeInfo& other) noexcept = default; + + inline bool operator==(const CodeInfo& other) const noexcept { return ::memcmp(this, &other, sizeof(*this)) == 0; } + inline bool operator!=(const CodeInfo& other) const noexcept { return ::memcmp(this, &other, sizeof(*this)) != 0; } + + //! \} + + //! \name Accessors + //! \{ + + //! Returns the target environment information, see \ref Environment. + inline const Environment& environment() const noexcept { return _environment; } + + //! Returns the target architecture, see \ref Environment::Arch. + inline uint32_t arch() const noexcept { return _environment.arch(); } + //! Returns the target sub-architecture, see \ref Environment::SubArch. + inline uint32_t subArch() const noexcept { return _environment.subArch(); } + //! Returns the native size of the target's architecture GP register. + inline uint32_t gpSize() const noexcept { return _environment.registerSize(); } + + //! Tests whether this CodeInfo has a base address set. + inline bool hasBaseAddress() const noexcept { return _baseAddress != Globals::kNoBaseAddress; } + //! Returns the base address or \ref Globals::kNoBaseAddress if it's not set. + inline uint64_t baseAddress() const noexcept { return _baseAddress; } + //! Sets base address to `p`. + inline void setBaseAddress(uint64_t p) noexcept { _baseAddress = p; } + //! Resets base address (implicitly sets it to \ref Globals::kNoBaseAddress). + inline void resetBaseAddress() noexcept { _baseAddress = Globals::kNoBaseAddress; } + + //! \} +}; +#endif // !ASMJIT_NO_DEPRECATED + +// ============================================================================ +// [asmjit::Target] +// ============================================================================ + +//! Target is an abstract class that describes a machine code target. +class ASMJIT_VIRTAPI Target { +public: + ASMJIT_BASE_CLASS(Target) + ASMJIT_NONCOPYABLE(Target) + + //! Target environment information. + Environment _environment; + + //! \name Construction & Destruction + //! \{ + + //! Creates a `Target` instance. + ASMJIT_API Target() noexcept; + //! Destroys the `Target` instance. + ASMJIT_API virtual ~Target() noexcept; + + //! \} + + //! \name Accessors + //! \{ + + //! Returns CodeInfo of this target. + //! + //! CodeInfo can be used to setup a CodeHolder in case you plan to generate a + //! code compatible and executable by this Runtime. + inline const Environment& environment() const noexcept { return _environment; } + + //! Returns the target architecture, see \ref Environment::Arch. + inline uint32_t arch() const noexcept { return _environment.arch(); } + //! Returns the target sub-architecture, see \ref Environment::SubArch. + inline uint32_t subArch() const noexcept { return _environment.subArch(); } + +#ifndef ASMJIT_NO_DEPRECATED + ASMJIT_DEPRECATED("Use environment() instead") + inline CodeInfo codeInfo() const noexcept { return CodeInfo(_environment); } + + ASMJIT_DEPRECATED("Use environment().format() instead") + inline uint32_t targetType() const noexcept { return _environment.format(); } +#endif // !ASMJIT_NO_DEPRECATED + + //! \} +}; + +//! \} + +ASMJIT_END_NAMESPACE + +#endif // ASMJIT_CORE_TARGET_H_INCLUDED |