v8
V8 is Google’s open source high-performance JavaScript and WebAssembly engine, written in C++.
Loading...
Searching...
No Matches
ic-stats.cc
Go to the documentation of this file.
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#include "src/ic/ic-stats.h"
6
7#include "src/init/v8.h"
12
13namespace v8 {
14namespace internal {
15
18
19ICStats::ICStats() : ic_infos_(MAX_IC_INFO), pos_(0) {
21}
22
27
29 if (base::Relaxed_Load(&enabled_) != 1) return;
30 ++pos_;
31 if (pos_ == MAX_IC_INFO) {
32 Dump();
33 }
35}
36
38 for (auto& ic_info : ic_infos_) {
39 ic_info.Reset();
40 }
41 pos_ = 0;
42}
43
46 value->BeginArray("data");
47 for (int i = 0; i < pos_; ++i) {
48 ic_infos_[i].AppendToTracedValue(value.get());
49 }
50 value->EndArray();
51
52 TRACE_EVENT_INSTANT1(TRACE_DISABLED_BY_DEFAULT("v8.ic_stats"), "V8.ICStats",
53 TRACE_EVENT_SCOPE_THREAD, "ic-stats", std::move(value));
54 Reset();
55}
56
58 Address script_ptr = script.ptr();
59 if (script_name_map_.find(script_ptr) != script_name_map_.end()) {
60 return script_name_map_[script_ptr].get();
61 }
62 Tagged<Object> script_name_raw = script->name();
63 if (IsString(script_name_raw)) {
64 Tagged<String> script_name = Cast<String>(script_name_raw);
65 char* c_script_name = script_name->ToCString().release();
66 script_name_map_.insert(
67 std::make_pair(script_ptr, std::unique_ptr<char[]>(c_script_name)));
68 return c_script_name;
69 }
70 script_name_map_.insert(
71 std::make_pair(script_ptr, std::unique_ptr<char[]>(nullptr)));
72 return nullptr;
73}
74
76 Tagged<JSFunction> function) {
77 Address function_ptr = function.ptr();
78 // Lookup the function name or add a null unique_ptr if no entry exists.
79 std::unique_ptr<char[]>& function_name = function_name_map_[function_ptr];
80 if (!function_name) {
81 ic_infos_[pos_].is_optimized = function->HasAttachedOptimizedCode(isolate);
82 // Update the map entry with the actual debug name.
83 function_name = function->shared()->DebugNameCStr();
84 }
85 return function_name.get();
86}
87
89 : function_name(nullptr),
90 script_offset(0),
91 script_name(nullptr),
92 line_num(-1),
93 column_num(-1),
94 is_constructor(false),
95 is_optimized(false),
96 map(nullptr),
97 is_dictionary_map(false),
98 number_of_own_descriptors(0) {}
99
101 type.clear();
102 function_name = nullptr;
103 script_offset = 0;
104 script_name = nullptr;
105 line_num = -1;
106 column_num = -1;
107 is_constructor = false;
108 is_optimized = false;
109 state.clear();
110 map = nullptr;
111 is_dictionary_map = false;
113 instance_type.clear();
114}
115
117 value->BeginDictionary();
118 value->SetString("type", type);
119 if (function_name) {
120 value->SetString("functionName", function_name);
121 if (is_optimized) {
122 value->SetInteger("optimized", is_optimized);
123 }
124 }
125 if (script_offset) value->SetInteger("offset", script_offset);
126 if (script_name) value->SetString("scriptName", script_name);
127 if (line_num != -1) value->SetInteger("lineNum", line_num);
128 if (column_num != -1) value->SetInteger("columnNum", column_num);
129 if (is_constructor) value->SetInteger("constructor", is_constructor);
130 if (!state.empty()) value->SetString("state", state);
131 if (map) {
132 // V8 cannot represent integer above 2^53 - 1 in JavaScript from JSON,
133 // thus `map` should be converted to a string rather than an integer.
134 std::stringstream ss;
135 ss << map;
136 value->SetString("map", ss.str());
137 }
138 if (map) value->SetInteger("dict", is_dictionary_map);
139 if (map) value->SetInteger("own", number_of_own_descriptors);
140 if (!instance_type.empty()) value->SetString("instanceType", instance_type);
141 value->EndDictionary();
142}
143
144} // namespace internal
145} // namespace v8
int pos_
const char * GetOrCacheScriptName(Tagged< Script > script)
Definition ic-stats.cc:57
std::vector< ICInfo > ic_infos_
Definition ic-stats.h:74
std::unordered_map< Address, std::unique_ptr< char[]> > script_name_map_
Definition ic-stats.h:76
std::unordered_map< Address, std::unique_ptr< char[]> > function_name_map_
Definition ic-stats.h:78
const int MAX_IC_INFO
Definition ic-stats.h:55
const char * GetOrCacheFunctionName(IsolateForSandbox isolate, Tagged< JSFunction > function)
Definition ic-stats.cc:75
base::Atomic32 enabled_
Definition ic-stats.h:73
static base::LazyInstance< ICStats >::type instance_
Definition ic-stats.h:72
static std::unique_ptr< TracedValue > Create()
#define LAZY_INSTANCE_INITIALIZER
void Relaxed_Store(volatile Atomic8 *ptr, Atomic8 value)
Definition atomicops.h:189
Atomic8 Relaxed_Load(volatile const Atomic8 *ptr)
Definition atomicops.h:234
Tagged< To > Cast(Tagged< From > value, const v8::SourceLocation &loc=INIT_SOURCE_LOCATION_IN_DEBUG)
Definition casting.h:150
typename LazyStaticInstance< T, CreateTrait, InitOnceTrait, DestroyTrait >::type type
unsigned number_of_own_descriptors
Definition ic-stats.h:49
const char * function_name
Definition ic-stats.h:36
std::string instance_type
Definition ic-stats.h:50
void AppendToTracedValue(v8::tracing::TracedValue *value) const
Definition ic-stats.cc:116
const char * script_name
Definition ic-stats.h:38
static bool is_ic_stats_enabled()
#define TRACE_EVENT_INSTANT1(category_group, name, scope, arg1_name, arg1_val)
#define TRACE_EVENT_SCOPE_THREAD
#define TRACE_DISABLED_BY_DEFAULT(name)
#define V8_LIKELY(condition)
Definition v8config.h:661