1 // Copyright 2016 the V8 project authors. All rights reserved. 2 // Use of this source code is governed by a BSD-style license that can be 3 // found in the LICENSE file. 4 5 #ifndef V8_IC_IC_STATS_H_ 6 #define V8_IC_IC_STATS_H_ 7 8 #include <memory> 9 #include <string> 10 #include <unordered_map> 11 #include <vector> 12 13 #include "src/base/atomicops.h" 14 #include "src/base/lazy-instance.h" 15 16 namespace v8 { 17 18 namespace tracing { 19 class TracedValue; 20 } 21 22 namespace internal { 23 24 class JSFunction; 25 class Script; 26 27 struct ICInfo { 28 ICInfo(); 29 void Reset(); 30 void AppendToTracedValue(v8::tracing::TracedValue* value) const; 31 std::string type; 32 const char* function_name; 33 int script_offset; 34 const char* script_name; 35 int line_num; 36 bool is_constructor; 37 bool is_optimized; 38 std::string state; 39 // Address of the map. 40 void* map; 41 // Whether map is a dictionary map. 42 bool is_dictionary_map; 43 // Number of own descriptors. 44 unsigned number_of_own_descriptors; 45 std::string instance_type; 46 }; 47 48 class ICStats { 49 public: 50 const int MAX_IC_INFO = 4096; 51 52 ICStats(); 53 void Dump(); 54 void Begin(); 55 void End(); 56 void Reset(); Current()57 V8_INLINE ICInfo& Current() { 58 DCHECK(pos_ >= 0 && pos_ < MAX_IC_INFO); 59 return ic_infos_[pos_]; 60 } 61 const char* GetOrCacheScriptName(Script* script); 62 const char* GetOrCacheFunctionName(JSFunction* function); instance()63 V8_INLINE static ICStats* instance() { return instance_.Pointer(); } 64 65 private: 66 static base::LazyInstance<ICStats>::type instance_; 67 base::Atomic32 enabled_; 68 std::vector<ICInfo> ic_infos_; 69 std::unordered_map<Script*, std::unique_ptr<char[]>> script_name_map_; 70 std::unordered_map<JSFunction*, std::unique_ptr<char[]>> function_name_map_; 71 int pos_; 72 }; 73 74 } // namespace internal 75 } // namespace v8 76 77 #endif // V8_IC_IC_STATS_H_ 78