// Copyright 2016 the V8 project authors. All rights reserved. // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. #ifndef V8_IC_IC_STATS_H_ #define V8_IC_IC_STATS_H_ #include <memory> #include <string> #include <unordered_map> #include <vector> #include "include/v8-internal.h" // For Address. #include "src/base/atomicops.h" #include "src/base/lazy-instance.h" namespace v8 { namespace tracing { class TracedValue; } // namespace tracing namespace internal { class JSFunction; class Script; struct ICInfo { ICInfo(); void Reset(); void AppendToTracedValue(v8::tracing::TracedValue* value) const; std::string type; const char* function_name; int script_offset; const char* script_name; int line_num; int column_num; bool is_constructor; bool is_optimized; std::string state; // Address of the map. void* map; // Whether map is a dictionary map. bool is_dictionary_map; // Number of own descriptors. unsigned number_of_own_descriptors; std::string instance_type; }; class ICStats { public: const int MAX_IC_INFO = 4096; ICStats(); void Dump(); void Begin(); void End(); void Reset(); V8_INLINE ICInfo& Current() { DCHECK(pos_ >= 0 && pos_ < MAX_IC_INFO); return ic_infos_[pos_]; } const char* GetOrCacheScriptName(Script script); const char* GetOrCacheFunctionName(JSFunction function); V8_INLINE static ICStats* instance() { return instance_.Pointer(); } private: static base::LazyInstance<ICStats>::type instance_; base::Atomic32 enabled_; std::vector<ICInfo> ic_infos_; // Keys are Script pointers; uses raw Address to keep includes light. std::unordered_map<Address, std::unique_ptr<char[]>> script_name_map_; // Keys are JSFunction pointers; uses raw Address to keep includes light. std::unordered_map<Address, std::unique_ptr<char[]>> function_name_map_; int pos_; }; } // namespace internal } // namespace v8 #endif // V8_IC_IC_STATS_H_