162ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch// Copyright 2016 the V8 project authors. All rights reserved. 262ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch// Use of this source code is governed by a BSD-style license that can be 362ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch// found in the LICENSE file. 462ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch 562ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch#ifndef V8_IC_IC_STATS_H_ 662ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch#define V8_IC_IC_STATS_H_ 762ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch 862ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch#include <memory> 962ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch#include <string> 1062ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch#include <unordered_map> 1162ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch#include <vector> 1262ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch 1362ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch#include "src/base/atomicops.h" 1462ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch#include "src/base/lazy-instance.h" 1562ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch 1662ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdochnamespace v8 { 1762ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch 1862ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdochnamespace tracing { 1962ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdochclass TracedValue; 2062ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch} 2162ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch 2262ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdochnamespace internal { 2362ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch 2462ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdochclass JSFunction; 2562ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdochclass Script; 2662ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch 2762ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdochstruct ICInfo { 2862ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch ICInfo(); 2962ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch void Reset(); 3062ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch void AppendToTracedValue(v8::tracing::TracedValue* value) const; 3162ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch std::string type; 3262ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch const char* function_name; 3362ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch int script_offset; 3462ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch const char* script_name; 3562ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch int line_num; 3662ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch bool is_constructor; 3762ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch bool is_optimized; 3862ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch std::string state; 3962ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch // Address of the map. 4062ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch void* map; 4162ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch // Whether map is a dictionary map. 4262ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch bool is_dictionary_map; 4362ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch // Number of own descriptors. 4462ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch unsigned number_of_own_descriptors; 4562ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch std::string instance_type; 4662ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch}; 4762ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch 4862ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdochclass ICStats { 4962ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch public: 5062ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch const int MAX_IC_INFO = 4096; 5162ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch 5262ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch ICStats(); 5362ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch void Dump(); 5462ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch void Begin(); 5562ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch void End(); 5662ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch void Reset(); 5762ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch V8_INLINE ICInfo& Current() { 5862ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch DCHECK(pos_ >= 0 && pos_ < MAX_IC_INFO); 5962ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch return ic_infos_[pos_]; 6062ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch } 6162ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch const char* GetOrCacheScriptName(Script* script); 6262ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch const char* GetOrCacheFunctionName(JSFunction* function); 6362ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch V8_INLINE static ICStats* instance() { return instance_.Pointer(); } 6462ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch 6562ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch private: 6662ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch static base::LazyInstance<ICStats>::type instance_; 6762ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch base::Atomic32 enabled_; 6862ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch std::vector<ICInfo> ic_infos_; 6962ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch std::unordered_map<Script*, std::unique_ptr<char[]>> script_name_map_; 7062ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch std::unordered_map<JSFunction*, std::unique_ptr<char[]>> function_name_map_; 7162ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch int pos_; 7262ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch}; 7362ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch 7462ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch} // namespace internal 7562ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch} // namespace v8 7662ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch 7762ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch#endif // V8_IC_IC_STATS_H_ 78