| // 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_ |