1*f5c631daSSadaf Ebrahimi // Copyright 2016, VIXL authors 2*f5c631daSSadaf Ebrahimi // All rights reserved. 3*f5c631daSSadaf Ebrahimi // 4*f5c631daSSadaf Ebrahimi // Redistribution and use in source and binary forms, with or without 5*f5c631daSSadaf Ebrahimi // modification, are permitted provided that the following conditions are met: 6*f5c631daSSadaf Ebrahimi // 7*f5c631daSSadaf Ebrahimi // * Redistributions of source code must retain the above copyright notice, 8*f5c631daSSadaf Ebrahimi // this list of conditions and the following disclaimer. 9*f5c631daSSadaf Ebrahimi // * Redistributions in binary form must reproduce the above copyright notice, 10*f5c631daSSadaf Ebrahimi // this list of conditions and the following disclaimer in the documentation 11*f5c631daSSadaf Ebrahimi // and/or other materials provided with the distribution. 12*f5c631daSSadaf Ebrahimi // * Neither the name of ARM Limited nor the names of its contributors may be 13*f5c631daSSadaf Ebrahimi // used to endorse or promote products derived from this software without 14*f5c631daSSadaf Ebrahimi // specific prior written permission. 15*f5c631daSSadaf Ebrahimi // 16*f5c631daSSadaf Ebrahimi // THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS CONTRIBUTORS "AS IS" AND 17*f5c631daSSadaf Ebrahimi // ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED 18*f5c631daSSadaf Ebrahimi // WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE 19*f5c631daSSadaf Ebrahimi // DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE 20*f5c631daSSadaf Ebrahimi // FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL 21*f5c631daSSadaf Ebrahimi // DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR 22*f5c631daSSadaf Ebrahimi // SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER 23*f5c631daSSadaf Ebrahimi // CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, 24*f5c631daSSadaf Ebrahimi // OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE 25*f5c631daSSadaf Ebrahimi // OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 26*f5c631daSSadaf Ebrahimi 27*f5c631daSSadaf Ebrahimi #ifndef VIXL_ASSEMBLER_BASE_H 28*f5c631daSSadaf Ebrahimi #define VIXL_ASSEMBLER_BASE_H 29*f5c631daSSadaf Ebrahimi 30*f5c631daSSadaf Ebrahimi #include "code-buffer-vixl.h" 31*f5c631daSSadaf Ebrahimi 32*f5c631daSSadaf Ebrahimi namespace vixl { 33*f5c631daSSadaf Ebrahimi 34*f5c631daSSadaf Ebrahimi class CodeBufferCheckScope; 35*f5c631daSSadaf Ebrahimi 36*f5c631daSSadaf Ebrahimi namespace internal { 37*f5c631daSSadaf Ebrahimi 38*f5c631daSSadaf Ebrahimi class AssemblerBase { 39*f5c631daSSadaf Ebrahimi public: AssemblerBase()40*f5c631daSSadaf Ebrahimi AssemblerBase() : allow_assembler_(false) {} AssemblerBase(size_t capacity)41*f5c631daSSadaf Ebrahimi explicit AssemblerBase(size_t capacity) 42*f5c631daSSadaf Ebrahimi : buffer_(capacity), allow_assembler_(false) {} AssemblerBase(byte * buffer,size_t capacity)43*f5c631daSSadaf Ebrahimi AssemblerBase(byte* buffer, size_t capacity) 44*f5c631daSSadaf Ebrahimi : buffer_(buffer, capacity), allow_assembler_(false) {} 45*f5c631daSSadaf Ebrahimi ~AssemblerBase()46*f5c631daSSadaf Ebrahimi virtual ~AssemblerBase() {} 47*f5c631daSSadaf Ebrahimi 48*f5c631daSSadaf Ebrahimi // Finalize a code buffer of generated instructions. This function must be 49*f5c631daSSadaf Ebrahimi // called before executing or copying code from the buffer. FinalizeCode()50*f5c631daSSadaf Ebrahimi void FinalizeCode() { GetBuffer()->SetClean(); } 51*f5c631daSSadaf Ebrahimi GetCursorOffset()52*f5c631daSSadaf Ebrahimi ptrdiff_t GetCursorOffset() const { return GetBuffer().GetCursorOffset(); } 53*f5c631daSSadaf Ebrahimi 54*f5c631daSSadaf Ebrahimi // Return the address of the cursor. 55*f5c631daSSadaf Ebrahimi template <typename T> GetCursorAddress()56*f5c631daSSadaf Ebrahimi T GetCursorAddress() const { 57*f5c631daSSadaf Ebrahimi VIXL_STATIC_ASSERT(sizeof(T) >= sizeof(uintptr_t)); 58*f5c631daSSadaf Ebrahimi return GetBuffer().GetOffsetAddress<T>(GetCursorOffset()); 59*f5c631daSSadaf Ebrahimi } 60*f5c631daSSadaf Ebrahimi GetSizeOfCodeGenerated()61*f5c631daSSadaf Ebrahimi size_t GetSizeOfCodeGenerated() const { return GetCursorOffset(); } 62*f5c631daSSadaf Ebrahimi 63*f5c631daSSadaf Ebrahimi // Accessors. GetBuffer()64*f5c631daSSadaf Ebrahimi CodeBuffer* GetBuffer() { return &buffer_; } GetBuffer()65*f5c631daSSadaf Ebrahimi const CodeBuffer& GetBuffer() const { return buffer_; } AllowAssembler()66*f5c631daSSadaf Ebrahimi bool AllowAssembler() const { return allow_assembler_; } 67*f5c631daSSadaf Ebrahimi 68*f5c631daSSadaf Ebrahimi protected: SetAllowAssembler(bool allow)69*f5c631daSSadaf Ebrahimi void SetAllowAssembler(bool allow) { allow_assembler_ = allow; } 70*f5c631daSSadaf Ebrahimi 71*f5c631daSSadaf Ebrahimi // CodeBufferCheckScope must be able to temporarily allow the assembler. 72*f5c631daSSadaf Ebrahimi friend class vixl::CodeBufferCheckScope; 73*f5c631daSSadaf Ebrahimi 74*f5c631daSSadaf Ebrahimi // Buffer where the code is emitted. 75*f5c631daSSadaf Ebrahimi CodeBuffer buffer_; 76*f5c631daSSadaf Ebrahimi 77*f5c631daSSadaf Ebrahimi private: 78*f5c631daSSadaf Ebrahimi bool allow_assembler_; 79*f5c631daSSadaf Ebrahimi 80*f5c631daSSadaf Ebrahimi public: 81*f5c631daSSadaf Ebrahimi // Deprecated public interface. 82*f5c631daSSadaf Ebrahimi 83*f5c631daSSadaf Ebrahimi // Return the address of an offset in the buffer. 84*f5c631daSSadaf Ebrahimi template <typename T> 85*f5c631daSSadaf Ebrahimi VIXL_DEPRECATED("GetBuffer().GetOffsetAddress<T>(offset)", 86*f5c631daSSadaf Ebrahimi T GetOffsetAddress(ptrdiff_t offset) const) { 87*f5c631daSSadaf Ebrahimi return GetBuffer().GetOffsetAddress<T>(offset); 88*f5c631daSSadaf Ebrahimi } 89*f5c631daSSadaf Ebrahimi 90*f5c631daSSadaf Ebrahimi // Return the address of the start of the buffer. 91*f5c631daSSadaf Ebrahimi template <typename T> 92*f5c631daSSadaf Ebrahimi VIXL_DEPRECATED("GetBuffer().GetStartAddress<T>()", 93*f5c631daSSadaf Ebrahimi T GetStartAddress() const) { 94*f5c631daSSadaf Ebrahimi return GetBuffer().GetOffsetAddress<T>(0); 95*f5c631daSSadaf Ebrahimi } 96*f5c631daSSadaf Ebrahimi }; 97*f5c631daSSadaf Ebrahimi 98*f5c631daSSadaf Ebrahimi } // namespace internal 99*f5c631daSSadaf Ebrahimi } // namespace vixl 100*f5c631daSSadaf Ebrahimi 101*f5c631daSSadaf Ebrahimi #endif // VIXL_ASSEMBLER_BASE_H 102