/ b3 / B3StackmapValue.cpp
B3StackmapValue.cpp
  1  /*
  2   * Copyright (C) 2015-2018 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  #include "config.h"
 27  #include "B3StackmapValue.h"
 28  
 29  #if ENABLE(B3_JIT)
 30  
 31  #include "B3ValueInlines.h"
 32  
 33  namespace JSC { namespace B3 {
 34  
 35  StackmapValue::~StackmapValue()
 36  {
 37  }
 38  
 39  void StackmapValue::append(Value* value, const ValueRep& rep)
 40  {
 41      if (rep == ValueRep::ColdAny) {
 42          childrenVector().append(value);
 43          return;
 44      }
 45  
 46      while (m_reps.size() < numChildren())
 47          m_reps.append(ValueRep::ColdAny);
 48  
 49      childrenVector().append(value);
 50      m_reps.append(rep);
 51  }
 52  
 53  void StackmapValue::appendSomeRegister(Value* value)
 54  {
 55      append(ConstrainedValue(value, ValueRep::SomeRegister));
 56  }
 57  
 58  void StackmapValue::appendSomeRegisterWithClobber(Value* value)
 59  {
 60      append(ConstrainedValue(value, ValueRep::SomeRegisterWithClobber));
 61  }
 62  
 63  void StackmapValue::setConstrainedChild(unsigned index, const ConstrainedValue& constrainedValue)
 64  {
 65      child(index) = constrainedValue.value();
 66      setConstraint(index, constrainedValue.rep());
 67  }
 68  
 69  void StackmapValue::setConstraint(unsigned index, const ValueRep& rep)
 70  {
 71      if (rep == ValueRep(ValueRep::ColdAny))
 72          return;
 73  
 74      while (m_reps.size() <= index)
 75          m_reps.append(ValueRep::ColdAny);
 76  
 77      m_reps[index] = rep;
 78  }
 79  
 80  void StackmapValue::dumpChildren(CommaPrinter& comma, PrintStream& out) const
 81  {
 82      for (ConstrainedValue value : constrainedChildren())
 83          out.print(comma, value);
 84  }
 85  
 86  void StackmapValue::dumpMeta(CommaPrinter& comma, PrintStream& out) const
 87  {
 88      out.print(
 89          comma, "generator = ", RawPointer(m_generator.get()), ", earlyClobbered = ", m_earlyClobbered,
 90          ", lateClobbered = ", m_lateClobbered, ", usedRegisters = ", m_usedRegisters);
 91  }
 92  
 93  StackmapValue::StackmapValue(CheckedOpcodeTag, Kind kind, Type type, Origin origin)
 94      : Value(CheckedOpcode, kind, type, VarArgs, origin)
 95  {
 96      ASSERT(accepts(kind));
 97  }
 98  
 99  } } // namespace JSC::B3
100  
101  #endif // ENABLE(B3_JIT)
102