/ interpreter / CLoopStack.h
CLoopStack.h
  1  /*
  2   * Copyright (C) 2008-2017 Apple Inc. 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
  6   * are met:
  7   *
  8   * 1.  Redistributions of source code must retain the above copyright
  9   *     notice, this list of conditions and the following disclaimer.
 10   * 2.  Redistributions in binary form must reproduce the above copyright
 11   *     notice, this list of conditions and the following disclaimer in the
 12   *     documentation and/or other materials provided with the distribution.
 13   * 3.  Neither the name of Apple Inc. ("Apple") nor the names of
 14   *     its contributors may be used to endorse or promote products derived
 15   *     from this software without specific prior written permission.
 16   *
 17   * THIS SOFTWARE IS PROVIDED BY APPLE AND ITS CONTRIBUTORS "AS IS" AND ANY
 18   * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
 19   * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
 20   * DISCLAIMED. IN NO EVENT SHALL APPLE OR ITS CONTRIBUTORS BE LIABLE FOR ANY
 21   * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
 22   * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
 23   * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
 24   * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
 25   * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
 26   * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
 27   */
 28  
 29  #pragma once
 30  
 31  #if ENABLE(C_LOOP)
 32  
 33  #include "Register.h"
 34  #include <wtf/Noncopyable.h>
 35  #include <wtf/PageReservation.h>
 36  
 37  namespace JSC {
 38  
 39      class CodeBlockSet;
 40      class ConservativeRoots;
 41      class JITStubRoutineSet;
 42      class VM;
 43      class LLIntOffsetsExtractor;
 44  
 45      class CLoopStack {
 46          WTF_MAKE_NONCOPYABLE(CLoopStack);
 47      public:
 48          // Allow 8k of excess registers before we start trying to reap the stack
 49          static constexpr ptrdiff_t maxExcessCapacity = 8 * 1024;
 50  
 51          CLoopStack(VM&);
 52          ~CLoopStack();
 53          
 54          bool ensureCapacityFor(Register* newTopOfStack);
 55  
 56          bool containsAddress(Register* address) { return (lowAddress() <= address && address < highAddress()); }
 57          static size_t committedByteCount();
 58  
 59          void gatherConservativeRoots(ConservativeRoots&, JITStubRoutineSet&, CodeBlockSet&);
 60          void sanitizeStack();
 61  
 62          inline void* currentStackPointer();
 63          void setCurrentStackPointer(void* sp) { m_currentStackPointer = sp; }
 64  
 65          size_t size() const { return highAddress() - lowAddress(); }
 66  
 67          void setSoftReservedZoneSize(size_t);
 68          bool isSafeToRecurse() const;
 69  
 70      private:
 71          Register* lowAddress() const
 72          {
 73              return m_end;
 74          }
 75  
 76          Register* highAddress() const
 77          {
 78              return reinterpret_cast_ptr<Register*>(static_cast<char*>(m_reservation.base()) + m_reservation.size());
 79          }
 80  
 81          Register* reservationTop() const
 82          {
 83              char* reservationTop = static_cast<char*>(m_reservation.base());
 84              return reinterpret_cast_ptr<Register*>(reservationTop);
 85          }
 86  
 87          bool grow(Register* newTopOfStack);
 88          void releaseExcessCapacity();
 89          void addToCommittedByteCount(long);
 90  
 91          void setCLoopStackLimit(Register* newTopOfStack);
 92  
 93          VM& m_vm;
 94          CallFrame*& m_topCallFrame;
 95  
 96          // The following is always true:
 97          //    reservationTop() <= m_commitTop <= m_end <= m_currentStackPointer <= highAddress()
 98          Register* m_end; // lowest address of JS allocatable stack memory.
 99          Register* m_commitTop; // lowest address of committed memory.
100          PageReservation m_reservation;
101          void* m_lastStackPointer;
102          void* m_currentStackPointer;
103          ptrdiff_t m_softReservedZoneSizeInRegisters;
104  
105          friend class LLIntOffsetsExtractor;
106      };
107  
108  } // namespace JSC
109  
110  #endif // ENABLE(C_LOOP)