/ assembler / ProbeFrame.h
ProbeFrame.h
 1  /*
 2   * Copyright (C) 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   * 1. Redistributions of source code must retain the above copyright
 8   *    notice, this list of conditions and the following disclaimer.
 9   * 2. Redistributions in binary form must reproduce the above copyright
10   *    notice, this list of conditions and the following disclaimer in the
11   *    documentation and/or other materials provided with the distribution.
12   *
13   * THIS SOFTWARE IS PROVIDED BY APPLE INC. ``AS IS'' AND ANY
14   * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
15   * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
16   * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL APPLE INC. OR
17   * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
18   * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
19   * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
20   * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
21   * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
22   * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
23   * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
24   */
25  
26  #pragma once
27  
28  #if ENABLE(MASM_PROBE)
29  
30  #include "CallFrame.h"
31  #include "ProbeStack.h"
32  
33  namespace JSC {
34  namespace Probe {
35  
36  class Frame {
37  public:
38      Frame(void* frameBase, Stack& stack)
39          : m_frameBase { reinterpret_cast<uint8_t*>(frameBase) }
40          , m_stack { stack }
41      { }
42  
43      template<typename T = JSValue>
44      T argument(int argument)
45      {
46          return get<T>(CallFrame::argumentOffset(argument) * sizeof(Register));
47      }
48      template<typename T = JSValue>
49      T operand(VirtualRegister operand)
50      {
51          return get<T>(operand.offset() * sizeof(Register));
52      }
53      template<typename T = JSValue>
54      T operand(VirtualRegister operand, ptrdiff_t offset)
55      {
56          return get<T>(operand.offset() * sizeof(Register) + offset);
57      }
58  
59      template<typename T>
60      void setArgument(int argument, T value)
61      {
62          return set<T>(CallFrame::argumentOffset(argument) * sizeof(Register), value);
63      }
64      template<typename T>
65      void setOperand(VirtualRegister operand, T value)
66      {
67          set<T>(operand.offset() * sizeof(Register), value);
68      }
69      template<typename T>
70      void setOperand(VirtualRegister operand, ptrdiff_t offset, T value)
71      {
72          set<T>(operand.offset() * sizeof(Register) + offset, value);
73      }
74  
75      template<typename T = JSValue>
76      T get(ptrdiff_t offset)
77      {
78          return m_stack.get<T>(m_frameBase + offset);
79      }
80      template<typename T>
81      void set(ptrdiff_t offset, T value)
82      {
83          m_stack.set<T>(m_frameBase + offset, value);
84      }
85  
86  private:
87      uint8_t* m_frameBase;
88      Stack& m_stack;
89  };
90  
91  } // namespace Probe
92  } // namespace JSC
93  
94  #endif // ENABLE(MASM_PROBE)