1014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch// Copyright 2015 the V8 project authors. All rights reserved. 2014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch// Use of this source code is governed by a BSD-style license that can be 3014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch// found in the LICENSE file. 4014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch 5014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch#include "src/compiler/frame-states.h" 6014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch 7014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch#include "src/base/functional.h" 8014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch#include "src/handles-inl.h" 962ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch#include "src/objects-inl.h" 10014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch 11014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdochnamespace v8 { 12014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdochnamespace internal { 13014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdochnamespace compiler { 14014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch 15014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdochsize_t hash_value(OutputFrameStateCombine const& sc) { 16014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch return base::hash_combine(sc.kind_, sc.parameter_); 17014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch} 18014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch 19014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch 20014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdochstd::ostream& operator<<(std::ostream& os, OutputFrameStateCombine const& sc) { 21014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch switch (sc.kind_) { 22014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch case OutputFrameStateCombine::kPushOutput: 23014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch if (sc.parameter_ == 0) return os << "Ignore"; 24014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch return os << "Push(" << sc.parameter_ << ")"; 25014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch case OutputFrameStateCombine::kPokeAt: 26014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch return os << "PokeAt(" << sc.parameter_ << ")"; 27014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch } 28014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch UNREACHABLE(); 29014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch return os; 30014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch} 31014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch 32014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch 33014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdochbool operator==(FrameStateInfo const& lhs, FrameStateInfo const& rhs) { 34014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch return lhs.type() == rhs.type() && lhs.bailout_id() == rhs.bailout_id() && 35014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch lhs.state_combine() == rhs.state_combine() && 36014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch lhs.function_info() == rhs.function_info(); 37014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch} 38014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch 39014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch 40014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdochbool operator!=(FrameStateInfo const& lhs, FrameStateInfo const& rhs) { 41014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch return !(lhs == rhs); 42014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch} 43014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch 44014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch 45014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdochsize_t hash_value(FrameStateInfo const& info) { 46014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch return base::hash_combine(static_cast<int>(info.type()), info.bailout_id(), 47014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch info.state_combine()); 48014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch} 49014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch 50014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch 51014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdochstd::ostream& operator<<(std::ostream& os, FrameStateType type) { 52014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch switch (type) { 53014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch case FrameStateType::kJavaScriptFunction: 54014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch os << "JS_FRAME"; 55014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch break; 56014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch case FrameStateType::kInterpretedFunction: 57014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch os << "INTERPRETED_FRAME"; 58014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch break; 59014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch case FrameStateType::kArgumentsAdaptor: 60014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch os << "ARGUMENTS_ADAPTOR"; 61014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch break; 623b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch case FrameStateType::kTailCallerFunction: 633b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch os << "TAIL_CALLER_FRAME"; 643b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch break; 65014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch case FrameStateType::kConstructStub: 66014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch os << "CONSTRUCT_STUB"; 67014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch break; 68f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch case FrameStateType::kGetterStub: 69f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch os << "GETTER_STUB"; 70f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch break; 71f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch case FrameStateType::kSetterStub: 72f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch os << "SETTER_STUB"; 73f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch break; 74014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch } 75014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch return os; 76014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch} 77014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch 78014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch 79014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdochstd::ostream& operator<<(std::ostream& os, FrameStateInfo const& info) { 80014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch os << info.type() << ", " << info.bailout_id() << ", " 81014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch << info.state_combine(); 82014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch Handle<SharedFunctionInfo> shared_info; 83014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch if (info.shared_info().ToHandle(&shared_info)) { 84014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch os << ", " << Brief(*shared_info); 85014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch } 86014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch return os; 87014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch} 88014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch 89014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch} // namespace compiler 90014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch} // namespace internal 91014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch} // namespace v8 92