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