v8  3.11.10(node0.8.26)
V8 is Google's open source JavaScript engine
 All Data Structures Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Macros Pages
test-cpu-profiler.cc
Go to the documentation of this file.
1 // Copyright 2010 the V8 project authors. All rights reserved.
2 //
3 // Tests of profiles generator and utilities.
4 
5 #include "v8.h"
6 #include "cpu-profiler-inl.h"
7 #include "cctest.h"
8 #include "../include/v8-profiler.h"
9 
10 using i::CodeEntry;
11 using i::CpuProfile;
12 using i::CpuProfiler;
15 using i::ProfileNode;
17 using i::TokenEnumerator;
18 
19 
20 TEST(StartStop) {
21  CpuProfilesCollection profiles;
22  ProfileGenerator generator(&profiles);
23  ProfilerEventsProcessor processor(&generator);
24  processor.Start();
25  processor.Stop();
26  processor.Join();
27 }
28 
30 
31 static void InitializeVM() {
32  if (env.IsEmpty()) env = v8::Context::New();
33  v8::HandleScope scope;
34  env->Enter();
35 }
36 
37 static inline i::Address ToAddress(int n) {
38  return reinterpret_cast<i::Address>(n);
39 }
40 
41 static void EnqueueTickSampleEvent(ProfilerEventsProcessor* proc,
42  i::Address frame1,
43  i::Address frame2 = NULL,
44  i::Address frame3 = NULL) {
45  i::TickSample* sample = proc->TickSampleEvent();
46  sample->pc = frame1;
47  sample->tos = frame1;
48  sample->frames_count = 0;
49  if (frame2 != NULL) {
50  sample->stack[0] = frame2;
51  sample->frames_count = 1;
52  }
53  if (frame3 != NULL) {
54  sample->stack[1] = frame3;
55  sample->frames_count = 2;
56  }
57 }
58 
59 namespace {
60 
61 class TestSetup {
62  public:
63  TestSetup()
64  : old_flag_prof_browser_mode_(i::FLAG_prof_browser_mode) {
65  i::FLAG_prof_browser_mode = false;
66  }
67 
68  ~TestSetup() {
69  i::FLAG_prof_browser_mode = old_flag_prof_browser_mode_;
70  }
71 
72  private:
73  bool old_flag_prof_browser_mode_;
74 };
75 
76 } // namespace
77 
78 TEST(CodeEvents) {
79  InitializeVM();
80  TestSetup test_setup;
81  CpuProfilesCollection profiles;
82  profiles.StartProfiling("", 1);
83  ProfileGenerator generator(&profiles);
84  ProfilerEventsProcessor processor(&generator);
85  processor.Start();
86 
87  // Enqueue code creation events.
88  i::HandleScope scope;
89  const char* aaa_str = "aaa";
90  i::Handle<i::String> aaa_name = FACTORY->NewStringFromAscii(
91  i::Vector<const char>(aaa_str, i::StrLength(aaa_str)));
92  processor.CodeCreateEvent(i::Logger::FUNCTION_TAG,
93  *aaa_name,
94  HEAP->empty_string(),
95  0,
96  ToAddress(0x1000),
97  0x100,
98  ToAddress(0x10000));
99  processor.CodeCreateEvent(i::Logger::BUILTIN_TAG,
100  "bbb",
101  ToAddress(0x1200),
102  0x80);
103  processor.CodeCreateEvent(i::Logger::STUB_TAG, 5, ToAddress(0x1300), 0x10);
104  processor.CodeCreateEvent(i::Logger::BUILTIN_TAG,
105  "ddd",
106  ToAddress(0x1400),
107  0x80);
108  processor.CodeMoveEvent(ToAddress(0x1400), ToAddress(0x1500));
109  processor.CodeCreateEvent(i::Logger::STUB_TAG, 3, ToAddress(0x1600), 0x10);
110  processor.CodeCreateEvent(i::Logger::STUB_TAG, 4, ToAddress(0x1605), 0x10);
111  // Enqueue a tick event to enable code events processing.
112  EnqueueTickSampleEvent(&processor, ToAddress(0x1000));
113 
114  processor.Stop();
115  processor.Join();
116 
117  // Check the state of profile generator.
118  CodeEntry* entry1 = generator.code_map()->FindEntry(ToAddress(0x1000));
119  CHECK_NE(NULL, entry1);
120  CHECK_EQ(aaa_str, entry1->name());
121  CodeEntry* entry2 = generator.code_map()->FindEntry(ToAddress(0x1200));
122  CHECK_NE(NULL, entry2);
123  CHECK_EQ("bbb", entry2->name());
124  CodeEntry* entry3 = generator.code_map()->FindEntry(ToAddress(0x1300));
125  CHECK_NE(NULL, entry3);
126  CHECK_EQ("5", entry3->name());
127  CHECK_EQ(NULL, generator.code_map()->FindEntry(ToAddress(0x1400)));
128  CodeEntry* entry4 = generator.code_map()->FindEntry(ToAddress(0x1500));
129  CHECK_NE(NULL, entry4);
130  CHECK_EQ("ddd", entry4->name());
131  CHECK_EQ(NULL, generator.code_map()->FindEntry(ToAddress(0x1600)));
132 }
133 
134 
135 template<typename T>
136 static int CompareProfileNodes(const T* p1, const T* p2) {
137  return strcmp((*p1)->entry()->name(), (*p2)->entry()->name());
138 }
139 
140 TEST(TickEvents) {
141  TestSetup test_setup;
142  CpuProfilesCollection profiles;
143  profiles.StartProfiling("", 1);
144  ProfileGenerator generator(&profiles);
145  ProfilerEventsProcessor processor(&generator);
146  processor.Start();
147 
148  processor.CodeCreateEvent(i::Logger::BUILTIN_TAG,
149  "bbb",
150  ToAddress(0x1200),
151  0x80);
152  processor.CodeCreateEvent(i::Logger::STUB_TAG, 5, ToAddress(0x1300), 0x10);
153  processor.CodeCreateEvent(i::Logger::BUILTIN_TAG,
154  "ddd",
155  ToAddress(0x1400),
156  0x80);
157  EnqueueTickSampleEvent(&processor, ToAddress(0x1210));
158  EnqueueTickSampleEvent(&processor, ToAddress(0x1305), ToAddress(0x1220));
159  EnqueueTickSampleEvent(&processor,
160  ToAddress(0x1404),
161  ToAddress(0x1305),
162  ToAddress(0x1230));
163 
164  processor.Stop();
165  processor.Join();
166  CpuProfile* profile =
167  profiles.StopProfiling(TokenEnumerator::kNoSecurityToken, "", 1);
168  CHECK_NE(NULL, profile);
169 
170  // Check call trees.
171  const i::List<ProfileNode*>* top_down_root_children =
172  profile->top_down()->root()->children();
173  CHECK_EQ(1, top_down_root_children->length());
174  CHECK_EQ("bbb", top_down_root_children->last()->entry()->name());
175  const i::List<ProfileNode*>* top_down_bbb_children =
176  top_down_root_children->last()->children();
177  CHECK_EQ(1, top_down_bbb_children->length());
178  CHECK_EQ("5", top_down_bbb_children->last()->entry()->name());
179  const i::List<ProfileNode*>* top_down_stub_children =
180  top_down_bbb_children->last()->children();
181  CHECK_EQ(1, top_down_stub_children->length());
182  CHECK_EQ("ddd", top_down_stub_children->last()->entry()->name());
183  const i::List<ProfileNode*>* top_down_ddd_children =
184  top_down_stub_children->last()->children();
185  CHECK_EQ(0, top_down_ddd_children->length());
186 
187  const i::List<ProfileNode*>* bottom_up_root_children_unsorted =
188  profile->bottom_up()->root()->children();
189  CHECK_EQ(3, bottom_up_root_children_unsorted->length());
190  i::List<ProfileNode*> bottom_up_root_children(3);
191  bottom_up_root_children.AddAll(*bottom_up_root_children_unsorted);
192  bottom_up_root_children.Sort(&CompareProfileNodes);
193  CHECK_EQ("5", bottom_up_root_children[0]->entry()->name());
194  CHECK_EQ("bbb", bottom_up_root_children[1]->entry()->name());
195  CHECK_EQ("ddd", bottom_up_root_children[2]->entry()->name());
196  const i::List<ProfileNode*>* bottom_up_stub_children =
197  bottom_up_root_children[0]->children();
198  CHECK_EQ(1, bottom_up_stub_children->length());
199  CHECK_EQ("bbb", bottom_up_stub_children->last()->entry()->name());
200  const i::List<ProfileNode*>* bottom_up_bbb_children =
201  bottom_up_root_children[1]->children();
202  CHECK_EQ(0, bottom_up_bbb_children->length());
203  const i::List<ProfileNode*>* bottom_up_ddd_children =
204  bottom_up_root_children[2]->children();
205  CHECK_EQ(1, bottom_up_ddd_children->length());
206  CHECK_EQ("5", bottom_up_ddd_children->last()->entry()->name());
207  const i::List<ProfileNode*>* bottom_up_ddd_stub_children =
208  bottom_up_ddd_children->last()->children();
209  CHECK_EQ(1, bottom_up_ddd_stub_children->length());
210  CHECK_EQ("bbb", bottom_up_ddd_stub_children->last()->entry()->name());
211 }
212 
213 
214 // http://crbug/51594
215 // This test must not crash.
216 TEST(CrashIfStoppingLastNonExistentProfile) {
217  InitializeVM();
218  TestSetup test_setup;
219  CpuProfiler::SetUp();
220  CpuProfiler::StartProfiling("1");
221  CpuProfiler::StopProfiling("2");
222  CpuProfiler::StartProfiling("1");
223  CpuProfiler::StopProfiling("");
224  CpuProfiler::TearDown();
225 }
226 
227 
228 // http://code.google.com/p/v8/issues/detail?id=1398
229 // Long stacks (exceeding max frames limit) must not be erased.
230 TEST(Issue1398) {
231  TestSetup test_setup;
232  CpuProfilesCollection profiles;
233  profiles.StartProfiling("", 1);
234  ProfileGenerator generator(&profiles);
235  ProfilerEventsProcessor processor(&generator);
236  processor.Start();
237 
238  processor.CodeCreateEvent(i::Logger::BUILTIN_TAG,
239  "bbb",
240  ToAddress(0x1200),
241  0x80);
242 
243  i::TickSample* sample = processor.TickSampleEvent();
244  sample->pc = ToAddress(0x1200);
245  sample->tos = 0;
247  for (int i = 0; i < sample->frames_count; ++i) {
248  sample->stack[i] = ToAddress(0x1200);
249  }
250 
251  processor.Stop();
252  processor.Join();
253  CpuProfile* profile =
254  profiles.StopProfiling(TokenEnumerator::kNoSecurityToken, "", 1);
255  CHECK_NE(NULL, profile);
256 
257  int actual_depth = 0;
258  const ProfileNode* node = profile->top_down()->root();
259  while (node->children()->length() > 0) {
260  node = node->children()->last();
261  ++actual_depth;
262  }
263 
264  CHECK_EQ(1 + i::TickSample::kMaxFramesCount, actual_depth); // +1 for PC.
265 }
266 
267 
268 TEST(DeleteAllCpuProfiles) {
269  InitializeVM();
270  TestSetup test_setup;
271  CpuProfiler::SetUp();
272  CHECK_EQ(0, CpuProfiler::GetProfilesCount());
273  CpuProfiler::DeleteAllProfiles();
274  CHECK_EQ(0, CpuProfiler::GetProfilesCount());
275 
276  CpuProfiler::StartProfiling("1");
277  CpuProfiler::StopProfiling("1");
278  CHECK_EQ(1, CpuProfiler::GetProfilesCount());
279  CpuProfiler::DeleteAllProfiles();
280  CHECK_EQ(0, CpuProfiler::GetProfilesCount());
281  CpuProfiler::StartProfiling("1");
282  CpuProfiler::StartProfiling("2");
283  CpuProfiler::StopProfiling("2");
284  CpuProfiler::StopProfiling("1");
285  CHECK_EQ(2, CpuProfiler::GetProfilesCount());
286  CpuProfiler::DeleteAllProfiles();
287  CHECK_EQ(0, CpuProfiler::GetProfilesCount());
288 
289  // Test profiling cancellation by the 'delete' command.
290  CpuProfiler::StartProfiling("1");
291  CpuProfiler::StartProfiling("2");
292  CHECK_EQ(0, CpuProfiler::GetProfilesCount());
293  CpuProfiler::DeleteAllProfiles();
294  CHECK_EQ(0, CpuProfiler::GetProfilesCount());
295 
296  CpuProfiler::TearDown();
297 }
298 
299 
300 TEST(DeleteCpuProfile) {
301  v8::HandleScope scope;
302  LocalContext env;
303 
308  CHECK_NE(NULL, p1);
310  unsigned uid1 = p1->GetUid();
312  const_cast<v8::CpuProfile*>(p1)->Delete();
313  CHECK_EQ(0, CpuProfiler::GetProfilesCount());
315 
319  CHECK_NE(NULL, p2);
321  unsigned uid2 = p2->GetUid();
322  CHECK_NE(static_cast<int>(uid1), static_cast<int>(uid2));
328  CHECK_NE(NULL, p3);
330  unsigned uid3 = p3->GetUid();
331  CHECK_NE(static_cast<int>(uid1), static_cast<int>(uid3));
334  const_cast<v8::CpuProfile*>(p2)->Delete();
338  const_cast<v8::CpuProfile*>(p3)->Delete();
339  CHECK_EQ(0, CpuProfiler::GetProfilesCount());
343 }
344 
345 
346 TEST(DeleteCpuProfileDifferentTokens) {
347  v8::HandleScope scope;
348  LocalContext env;
349 
354  CHECK_NE(NULL, p1);
356  unsigned uid1 = p1->GetUid();
358  v8::Local<v8::String> token1 = v8::String::New("token1");
359  const v8::CpuProfile* p1_t1 = v8::CpuProfiler::FindProfile(uid1, token1);
360  CHECK_NE(NULL, p1_t1);
361  CHECK_NE(p1, p1_t1);
363  const_cast<v8::CpuProfile*>(p1)->Delete();
364  CHECK_EQ(0, CpuProfiler::GetProfilesCount());
367  const_cast<v8::CpuProfile*>(p1_t1)->Delete();
368  CHECK_EQ(0, CpuProfiler::GetProfilesCount());
369 
372  v8::Local<v8::String> token2 = v8::String::New("token2");
373  const v8::CpuProfile* p2_t2 = v8::CpuProfiler::StopProfiling(name2, token2);
374  CHECK_NE(NULL, p2_t2);
376  unsigned uid2 = p2_t2->GetUid();
377  CHECK_NE(static_cast<int>(uid1), static_cast<int>(uid2));
379  CHECK_NE(p2_t2, p2);
383  CHECK_NE(NULL, p3);
385  unsigned uid3 = p3->GetUid();
386  CHECK_NE(static_cast<int>(uid1), static_cast<int>(uid3));
388  const_cast<v8::CpuProfile*>(p2_t2)->Delete();
392  const_cast<v8::CpuProfile*>(p2)->Delete();
396  const_cast<v8::CpuProfile*>(p3)->Delete();
397  CHECK_EQ(0, CpuProfiler::GetProfilesCount());
399 }
byte * Address
Definition: globals.h:172
#define CHECK_EQ(expected, value)
Definition: checks.h:219
TEST(StartStop)
value format" "after each garbage collection") DEFINE_bool(print_cumulative_gc_stat, false, "print cumulative GC statistics in name=value format on exit") DEFINE_bool(trace_gc_verbose, false, "print more details following each garbage collection") DEFINE_bool(trace_fragmentation, false, "report fragmentation for old pointer and data pages") DEFINE_bool(collect_maps, true, "garbage collect maps from which no objects can be reached") DEFINE_bool(flush_code, true, "flush code that we expect not to use again before full gc") DEFINE_bool(incremental_marking, true, "use incremental marking") DEFINE_bool(incremental_marking_steps, true, "do incremental marking steps") DEFINE_bool(trace_incremental_marking, false, "trace progress of the incremental marking") DEFINE_bool(use_idle_notification, true, "Use idle notification to reduce memory footprint.") DEFINE_bool(send_idle_notification, false, "Send idle notifcation between stress runs.") DEFINE_bool(use_ic, true, "use inline caching") DEFINE_bool(native_code_counters, false, "generate extra code for manipulating stats counters") DEFINE_bool(always_compact, false, "Perform compaction on every full GC") DEFINE_bool(lazy_sweeping, true, "Use lazy sweeping for old pointer and data spaces") DEFINE_bool(never_compact, false, "Never perform compaction on full GC-testing only") DEFINE_bool(compact_code_space, true, "Compact code space on full non-incremental collections") DEFINE_bool(cleanup_code_caches_at_gc, true, "Flush inline caches prior to mark compact collection and" "flush code caches in maps during mark compact cycle.") DEFINE_int(random_seed, 0, "Default seed for initializing random generator" "(0, the default, means to use system random).") DEFINE_bool(use_verbose_printer, true, "allows verbose printing") DEFINE_bool(allow_natives_syntax, false, "allow natives syntax") DEFINE_bool(trace_sim, false, "Trace simulator execution") DEFINE_bool(check_icache, false, "Check icache flushes in ARM and MIPS simulator") DEFINE_int(stop_sim_at, 0, "Simulator stop after x number of instructions") DEFINE_int(sim_stack_alignment, 8, "Stack alingment in bytes in simulator(4 or 8, 8 is default)") DEFINE_bool(trace_exception, false, "print stack trace when throwing exceptions") DEFINE_bool(preallocate_message_memory, false, "preallocate some memory to build stack traces.") DEFINE_bool(randomize_hashes, true, "randomize hashes to avoid predictable hash collisions" "(with snapshots this option cannot override the baked-in seed)") DEFINE_int(hash_seed, 0, "Fixed seed to use to hash property keys(0 means random)" "(with snapshots this option cannot override the baked-in seed)") DEFINE_bool(preemption, false, "activate a 100ms timer that switches between V8 threads") DEFINE_bool(regexp_optimization, true, "generate optimized regexp code") DEFINE_bool(testing_bool_flag, true, "testing_bool_flag") DEFINE_int(testing_int_flag, 13, "testing_int_flag") DEFINE_float(testing_float_flag, 2.5, "float-flag") DEFINE_string(testing_string_flag, "Hello, world!", "string-flag") DEFINE_int(testing_prng_seed, 42, "Seed used for threading test randomness") DEFINE_string(testing_serialization_file, "/tmp/serdes", "file in which to serialize heap") DEFINE_bool(help, false, "Print usage message, including flags, on console") DEFINE_bool(dump_counters, false, "Dump counters on exit") DEFINE_string(map_counters, "", "Map counters to a file") DEFINE_args(js_arguments, JSARGUMENTS_INIT, "Pass all remaining arguments to the script.Alias for\"--\".") DEFINE_bool(debug_compile_events, true,"Enable debugger compile events") DEFINE_bool(debug_script_collected_events, true,"Enable debugger script collected events") DEFINE_bool(gdbjit, false,"enable GDBJIT interface (disables compacting GC)") DEFINE_bool(gdbjit_full, false,"enable GDBJIT interface for all code objects") DEFINE_bool(gdbjit_dump, false,"dump elf objects with debug info to disk") DEFINE_string(gdbjit_dump_filter,"","dump only objects containing this substring") DEFINE_bool(force_marking_deque_overflows, false,"force overflows of marking deque by reducing it's size ""to 64 words") DEFINE_bool(stress_compaction, false,"stress the GC compactor to flush out bugs (implies ""--force_marking_deque_overflows)")#define FLAG DEFINE_bool(enable_slow_asserts, false,"enable asserts that are slow to execute") DEFINE_bool(trace_codegen, false,"print name of functions for which code is generated") DEFINE_bool(print_source, false,"pretty print source code") DEFINE_bool(print_builtin_source, false,"pretty print source code for builtins") DEFINE_bool(print_ast, false,"print source AST") DEFINE_bool(print_builtin_ast, false,"print source AST for builtins") DEFINE_string(stop_at,"","function name where to insert a breakpoint") DEFINE_bool(print_builtin_scopes, false,"print scopes for builtins") DEFINE_bool(print_scopes, false,"print scopes") DEFINE_bool(trace_contexts, false,"trace contexts operations") DEFINE_bool(gc_greedy, false,"perform GC prior to some allocations") DEFINE_bool(gc_verbose, false,"print stuff during garbage collection") DEFINE_bool(heap_stats, false,"report heap statistics before and after GC") DEFINE_bool(code_stats, false,"report code statistics after GC") DEFINE_bool(verify_heap, false,"verify heap pointers before and after GC") DEFINE_bool(print_handles, false,"report handles after GC") DEFINE_bool(print_global_handles, false,"report global handles after GC") DEFINE_bool(trace_ic, false,"trace inline cache state transitions") DEFINE_bool(print_interfaces, false,"print interfaces") DEFINE_bool(print_interface_details, false,"print interface inference details") DEFINE_int(print_interface_depth, 5,"depth for printing interfaces") DEFINE_bool(trace_normalization, false,"prints when objects are turned into dictionaries.") DEFINE_bool(trace_lazy, false,"trace lazy compilation") DEFINE_bool(collect_heap_spill_statistics, false,"report heap spill statistics along with heap_stats ""(requires heap_stats)") DEFINE_bool(trace_isolates, false,"trace isolate state changes") DEFINE_bool(log_state_changes, false,"Log state changes.") DEFINE_bool(regexp_possessive_quantifier, false,"enable possessive quantifier syntax for testing") DEFINE_bool(trace_regexp_bytecodes, false,"trace regexp bytecode execution") DEFINE_bool(trace_regexp_assembler, false,"trace regexp macro assembler calls.")#define FLAG DEFINE_bool(log, false,"Minimal logging (no API, code, GC, suspect, or handles samples).") DEFINE_bool(log_all, false,"Log all events to the log file.") DEFINE_bool(log_runtime, false,"Activate runtime system %Log call.") DEFINE_bool(log_api, false,"Log API events to the log file.") DEFINE_bool(log_code, false,"Log code events to the log file without profiling.") DEFINE_bool(log_gc, false,"Log heap samples on garbage collection for the hp2ps tool.") DEFINE_bool(log_handles, false,"Log global handle events.") DEFINE_bool(log_snapshot_positions, false,"log positions of (de)serialized objects in the snapshot.") DEFINE_bool(log_suspect, false,"Log suspect operations.") DEFINE_bool(prof, false,"Log statistical profiling information (implies --log-code).") DEFINE_bool(prof_auto, true,"Used with --prof, starts profiling automatically") DEFINE_bool(prof_lazy, false,"Used with --prof, only does sampling and logging"" when profiler is active (implies --noprof_auto).") DEFINE_bool(prof_browser_mode, true,"Used with --prof, turns on browser-compatible mode for profiling.") DEFINE_bool(log_regexp, false,"Log regular expression execution.") DEFINE_bool(sliding_state_window, false,"Update sliding state window counters.") DEFINE_string(logfile,"v8.log","Specify the name of the log file.") DEFINE_bool(ll_prof, false,"Enable low-level linux profiler.")#define FLAG DEFINE_bool(trace_elements_transitions, false,"trace elements transitions") DEFINE_bool(print_code_stubs, false,"print code stubs") DEFINE_bool(test_secondary_stub_cache, false,"test secondary stub cache by disabling the primary one") DEFINE_bool(test_primary_stub_cache, false,"test primary stub cache by disabling the secondary one") DEFINE_bool(print_code, false,"print generated code") DEFINE_bool(print_opt_code, false,"print optimized code") DEFINE_bool(print_unopt_code, false,"print unoptimized code before ""printing optimized code based on it") DEFINE_bool(print_code_verbose, false,"print more information for code") DEFINE_bool(print_builtin_code, false,"print generated code for builtins")#43"/Users/thlorenz/dev/dx/v8-perf/build/v8/src/flags.cc"2#define FLAG_MODE_DEFINE_DEFAULTS#1"/Users/thlorenz/dev/dx/v8-perf/build/v8/src/flag-definitions.h"1#define FLAG_FULL(ftype, ctype, nam, def, cmt)#define FLAG_READONLY(ftype, ctype, nam, def, cmt)#define DEFINE_implication(whenflag, thenflag)#define DEFINE_bool(nam, def, cmt)#define DEFINE_int(nam, def, cmt)#define DEFINE_float(nam, def, cmt)#define DEFINE_string(nam, def, cmt)#define DEFINE_args(nam, def, cmt)#define FLAG DEFINE_bool(use_strict, false,"enforce strict mode") DEFINE_bool(es5_readonly, false,"activate correct semantics for inheriting readonliness") DEFINE_bool(es52_globals, false,"activate new semantics for global var declarations") DEFINE_bool(harmony_typeof, false,"enable harmony semantics for typeof") DEFINE_bool(harmony_scoping, false,"enable harmony block scoping") DEFINE_bool(harmony_modules, false,"enable harmony modules (implies block scoping)") DEFINE_bool(harmony_proxies, false,"enable harmony proxies") DEFINE_bool(harmony_collections, false,"enable harmony collections (sets, maps, and weak maps)") DEFINE_bool(harmony, false,"enable all harmony features (except typeof)") DEFINE_implication(harmony, harmony_scoping) DEFINE_implication(harmony, harmony_modules) DEFINE_implication(harmony, harmony_proxies) DEFINE_implication(harmony, harmony_collections) DEFINE_implication(harmony_modules, harmony_scoping) DEFINE_bool(packed_arrays, false,"optimizes arrays that have no holes") DEFINE_bool(smi_only_arrays, true,"tracks arrays with only smi values") DEFINE_bool(clever_optimizations, true,"Optimize object size, Array shift, DOM strings and string +") DEFINE_bool(unbox_double_arrays, true,"automatically unbox arrays of doubles") DEFINE_bool(string_slices, true,"use string slices") DEFINE_bool(crankshaft, true,"use crankshaft") DEFINE_string(hydrogen_filter,"","optimization filter") DEFINE_bool(use_range, true,"use hydrogen range analysis") DEFINE_bool(eliminate_dead_phis, true,"eliminate dead phis") DEFINE_bool(use_gvn, true,"use hydrogen global value numbering") DEFINE_bool(use_canonicalizing, true,"use hydrogen instruction canonicalizing") DEFINE_bool(use_inlining, true,"use function inlining") DEFINE_int(max_inlined_source_size, 600,"maximum source size in bytes considered for a single inlining") DEFINE_int(max_inlined_nodes, 196,"maximum number of AST nodes considered for a single inlining") DEFINE_int(max_inlined_nodes_cumulative, 196,"maximum cumulative number of AST nodes considered for inlining") DEFINE_bool(loop_invariant_code_motion, true,"loop invariant code motion") DEFINE_bool(collect_megamorphic_maps_from_stub_cache, true,"crankshaft harvests type feedback from stub cache") DEFINE_bool(hydrogen_stats, false,"print statistics for hydrogen") DEFINE_bool(trace_hydrogen, false,"trace generated hydrogen to file") DEFINE_string(trace_phase,"Z","trace generated IR for specified phases") DEFINE_bool(trace_inlining, false,"trace inlining decisions") DEFINE_bool(trace_alloc, false,"trace register allocator") DEFINE_bool(trace_all_uses, false,"trace all use positions") DEFINE_bool(trace_range, false,"trace range analysis") DEFINE_bool(trace_gvn, false,"trace global value numbering") DEFINE_bool(trace_representation, false,"trace representation types") DEFINE_bool(stress_pointer_maps, false,"pointer map for every instruction") DEFINE_bool(stress_environments, false,"environment for every instruction") DEFINE_int(deopt_every_n_times, 0,"deoptimize every n times a deopt point is passed") DEFINE_bool(trap_on_deopt, false,"put a break point before deoptimizing") DEFINE_bool(deoptimize_uncommon_cases, true,"deoptimize uncommon cases") DEFINE_bool(polymorphic_inlining, true,"polymorphic inlining") DEFINE_bool(use_osr, true,"use on-stack replacement") DEFINE_bool(array_bounds_checks_elimination, false,"perform array bounds checks elimination") DEFINE_bool(array_index_dehoisting, false,"perform array index dehoisting") DEFINE_bool(trace_osr, false,"trace on-stack replacement") DEFINE_int(stress_runs, 0,"number of stress runs") DEFINE_bool(optimize_closures, true,"optimize closures") DEFINE_bool(inline_construct, true,"inline constructor calls") DEFINE_bool(inline_arguments, true,"inline functions with arguments object") DEFINE_int(loop_weight, 1,"loop weight for representation inference") DEFINE_bool(optimize_for_in, true,"optimize functions containing for-in loops") DEFINE_bool(experimental_profiler, true,"enable all profiler experiments") DEFINE_bool(watch_ic_patching, false,"profiler considers IC stability") DEFINE_int(frame_count, 1,"number of stack frames inspected by the profiler") DEFINE_bool(self_optimization, false,"primitive functions trigger their own optimization") DEFINE_bool(direct_self_opt, false,"call recompile stub directly when self-optimizing") DEFINE_bool(retry_self_opt, false,"re-try self-optimization if it failed") DEFINE_bool(count_based_interrupts, false,"trigger profiler ticks based on counting instead of timing") DEFINE_bool(interrupt_at_exit, false,"insert an interrupt check at function exit") DEFINE_bool(weighted_back_edges, false,"weight back edges by jump distance for interrupt triggering") DEFINE_int(interrupt_budget, 5900,"execution budget before interrupt is triggered") DEFINE_int(type_info_threshold, 15,"percentage of ICs that must have type info to allow optimization") DEFINE_int(self_opt_count, 130,"call count before self-optimization") DEFINE_implication(experimental_profiler, watch_ic_patching) DEFINE_implication(experimental_profiler, self_optimization) DEFINE_implication(experimental_profiler, retry_self_opt) DEFINE_implication(experimental_profiler, count_based_interrupts) DEFINE_implication(experimental_profiler, interrupt_at_exit) DEFINE_implication(experimental_profiler, weighted_back_edges) DEFINE_bool(trace_opt_verbose, false,"extra verbose compilation tracing") DEFINE_implication(trace_opt_verbose, trace_opt) DEFINE_bool(debug_code, false,"generate extra code (assertions) for debugging") DEFINE_bool(code_comments, false,"emit comments in code disassembly") DEFINE_bool(enable_sse2, true,"enable use of SSE2 instructions if available") DEFINE_bool(enable_sse3, true,"enable use of SSE3 instructions if available") DEFINE_bool(enable_sse4_1, true,"enable use of SSE4.1 instructions if available") DEFINE_bool(enable_cmov, true,"enable use of CMOV instruction if available") DEFINE_bool(enable_rdtsc, true,"enable use of RDTSC instruction if available") DEFINE_bool(enable_sahf, true,"enable use of SAHF instruction if available (X64 only)") DEFINE_bool(enable_vfp3, true,"enable use of VFP3 instructions if available - this implies ""enabling ARMv7 instructions (ARM only)") DEFINE_bool(enable_armv7, true,"enable use of ARMv7 instructions if available (ARM only)") DEFINE_bool(enable_fpu, true,"enable use of MIPS FPU instructions if available (MIPS only)") DEFINE_string(expose_natives_as, NULL,"expose natives in global object") DEFINE_string(expose_debug_as, NULL,"expose debug in global object") DEFINE_bool(expose_gc, false,"expose gc extension") DEFINE_bool(expose_externalize_string, false,"expose externalize string extension") DEFINE_int(stack_trace_limit, 10,"number of stack frames to capture") DEFINE_bool(builtins_in_stack_traces, false,"show built-in functions in stack traces") DEFINE_bool(disable_native_files, false,"disable builtin natives files") DEFINE_bool(inline_new, true,"use fast inline allocation") DEFINE_bool(stack_trace_on_abort, true,"print a stack trace if an assertion failure occurs") DEFINE_bool(trace, false,"trace function calls") DEFINE_bool(mask_constants_with_cookie, true,"use random jit cookie to mask large constants") DEFINE_bool(lazy, true,"use lazy compilation") DEFINE_bool(trace_opt, false,"trace lazy optimization") DEFINE_bool(trace_opt_stats, false,"trace lazy optimization statistics") DEFINE_bool(opt, true,"use adaptive optimizations") DEFINE_bool(always_opt, false,"always try to optimize functions") DEFINE_bool(prepare_always_opt, false,"prepare for turning on always opt") DEFINE_bool(trace_deopt, false,"trace deoptimization") DEFINE_int(min_preparse_length, 1024,"minimum length for automatic enable preparsing") DEFINE_bool(always_full_compiler, false,"try to use the dedicated run-once backend for all code") DEFINE_bool(trace_bailout, false,"print reasons for falling back to using the classic V8 backend") DEFINE_bool(compilation_cache, true,"enable compilation cache") DEFINE_bool(cache_prototype_transitions, true,"cache prototype transitions") DEFINE_bool(trace_debug_json, false,"trace debugging JSON request/response") DEFINE_bool(debugger_auto_break, true,"automatically set the debug break flag when debugger commands are ""in the queue") DEFINE_bool(enable_liveedit, true,"enable liveedit experimental feature") DEFINE_bool(break_on_abort, true,"always cause a debug break before aborting") DEFINE_int(stack_size, kPointerSize *123,"default size of stack region v8 is allowed to use (in kBytes)") DEFINE_int(max_stack_trace_source_length, 300,"maximum length of function source code printed in a stack trace.") DEFINE_bool(always_inline_smi_code, false,"always inline smi code in non-opt code") DEFINE_int(max_new_space_size, 0,"max size of the new generation (in kBytes)") DEFINE_int(max_old_space_size, 0,"max size of the old generation (in Mbytes)") DEFINE_int(max_executable_size, 0,"max size of executable memory (in Mbytes)") DEFINE_bool(gc_global, false,"always perform global GCs") DEFINE_int(gc_interval,-1,"garbage collect after <n> allocations") DEFINE_bool(trace_gc, false,"print one trace line following each garbage collection") DEFINE_bool(trace_gc_nvp, false,"print one detailed trace line in name=value format ""after each garbage collection") DEFINE_bool(print_cumulative_gc_stat, false,"print cumulative GC statistics in name=value format on exit") DEFINE_bool(trace_gc_verbose, false,"print more details following each garbage collection") DEFINE_bool(trace_fragmentation, false,"report fragmentation for old pointer and data pages") DEFINE_bool(collect_maps, true,"garbage collect maps from which no objects can be reached") DEFINE_bool(flush_code, true,"flush code that we expect not to use again before full gc") DEFINE_bool(incremental_marking, true,"use incremental marking") DEFINE_bool(incremental_marking_steps, true,"do incremental marking steps") DEFINE_bool(trace_incremental_marking, false,"trace progress of the incremental marking") DEFINE_bool(use_idle_notification, true,"Use idle notification to reduce memory footprint.") DEFINE_bool(send_idle_notification, false,"Send idle notifcation between stress runs.") DEFINE_bool(use_ic, true,"use inline caching") DEFINE_bool(native_code_counters, false,"generate extra code for manipulating stats counters") DEFINE_bool(always_compact, false,"Perform compaction on every full GC") DEFINE_bool(lazy_sweeping, true,"Use lazy sweeping for old pointer and data spaces") DEFINE_bool(never_compact, false,"Never perform compaction on full GC - testing only") DEFINE_bool(compact_code_space, true,"Compact code space on full non-incremental collections") DEFINE_bool(cleanup_code_caches_at_gc, true,"Flush inline caches prior to mark compact collection and ""flush code caches in maps during mark compact cycle.") DEFINE_int(random_seed, 0,"Default seed for initializing random generator ""(0, the default, means to use system random).") DEFINE_bool(use_verbose_printer, true,"allows verbose printing") DEFINE_bool(allow_natives_syntax, false,"allow natives syntax") DEFINE_bool(trace_sim, false,"Trace simulator execution") DEFINE_bool(check_icache, false,"Check icache flushes in ARM and MIPS simulator") DEFINE_int(stop_sim_at, 0,"Simulator stop after x number of instructions") DEFINE_int(sim_stack_alignment, 8,"Stack alingment in bytes in simulator (4 or 8, 8 is default)") DEFINE_bool(trace_exception, false,"print stack trace when throwing exceptions") DEFINE_bool(preallocate_message_memory, false,"preallocate some memory to build stack traces.") DEFINE_bool(randomize_hashes, true,"randomize hashes to avoid predictable hash collisions ""(with snapshots this option cannot override the baked-in seed)") DEFINE_int(hash_seed, 0,"Fixed seed to use to hash property keys (0 means random)""(with snapshots this option cannot override the baked-in seed)") DEFINE_bool(preemption, false,"activate a 100ms timer that switches between V8 threads") DEFINE_bool(regexp_optimization, true,"generate optimized regexp code") DEFINE_bool(testing_bool_flag, true,"testing_bool_flag") DEFINE_int(testing_int_flag, 13,"testing_int_flag") DEFINE_float(testing_float_flag, 2.5,"float-flag") DEFINE_string(testing_string_flag,"Hello, world!","string-flag") DEFINE_int(testing_prng_seed, 42,"Seed used for threading test randomness") DEFINE_string(testing_serialization_file,"/tmp/serdes","file in which to serialize heap") DEFINE_bool(help, false,"Print usage message, including flags, on console") DEFINE_bool(dump_counters, false,"Dump counters on exit") DEFINE_string(map_counters,"","Map counters to a file") DEFINE_args(js_arguments, JSARGUMENTS_INIT,"Pass all remaining arguments to the script. Alias for \"--\".") DEFINE_bool(debug_compile_events, true,"Enable debugger compile events") DEFINE_bool(debug_script_collected_events, true,"Enable debugger script collected events") DEFINE_bool(gdbjit, false,"enable GDBJIT interface (disables compacting GC)") DEFINE_bool(gdbjit_full, false,"enable GDBJIT interface for all code objects") DEFINE_bool(gdbjit_dump, false,"dump elf objects with debug info to disk") DEFINE_string(gdbjit_dump_filter,"","dump only objects containing this substring") DEFINE_bool(force_marking_deque_overflows, false,"force overflows of marking deque by reducing it's size ""to 64 words") DEFINE_bool(stress_compaction, false,"stress the GC compactor to flush out bugs (implies ""--force_marking_deque_overflows)")#define FLAG DEFINE_bool(enable_slow_asserts, false,"enable asserts that are slow to execute") DEFINE_bool(trace_codegen, false,"print name of functions for which code is generated") DEFINE_bool(print_source, false,"pretty print source code") DEFINE_bool(print_builtin_source, false,"pretty print source code for builtins") DEFINE_bool(print_ast, false,"print source AST") DEFINE_bool(print_builtin_ast, false,"print source AST for builtins") DEFINE_string(stop_at,"","function name where to insert a breakpoint") DEFINE_bool(print_builtin_scopes, false,"print scopes for builtins") DEFINE_bool(print_scopes, false,"print scopes") DEFINE_bool(trace_contexts, false,"trace contexts operations") DEFINE_bool(gc_greedy, false,"perform GC prior to some allocations") DEFINE_bool(gc_verbose, false,"print stuff during garbage collection") DEFINE_bool(heap_stats, false,"report heap statistics before and after GC") DEFINE_bool(code_stats, false,"report code statistics after GC") DEFINE_bool(verify_heap, false,"verify heap pointers before and after GC") DEFINE_bool(print_handles, false,"report handles after GC") DEFINE_bool(print_global_handles, false,"report global handles after GC") DEFINE_bool(trace_ic, false,"trace inline cache state transitions") DEFINE_bool(print_interfaces, false,"print interfaces") DEFINE_bool(print_interface_details, false,"print interface inference details") DEFINE_int(print_interface_depth, 5,"depth for printing interfaces") DEFINE_bool(trace_normalization, false,"prints when objects are turned into dictionaries.") DEFINE_bool(trace_lazy, false,"trace lazy compilation") DEFINE_bool(collect_heap_spill_statistics, false,"report heap spill statistics along with heap_stats ""(requires heap_stats)") DEFINE_bool(trace_isolates, false,"trace isolate state changes") DEFINE_bool(log_state_changes, false,"Log state changes.") DEFINE_bool(regexp_possessive_quantifier, false,"enable possessive quantifier syntax for testing") DEFINE_bool(trace_regexp_bytecodes, false,"trace regexp bytecode execution") DEFINE_bool(trace_regexp_assembler, false,"trace regexp macro assembler calls.")#define FLAG DEFINE_bool(log, false,"Minimal logging (no API, code, GC, suspect, or handles samples).") DEFINE_bool(log_all, false,"Log all events to the log file.") DEFINE_bool(log_runtime, false,"Activate runtime system %Log call.") DEFINE_bool(log_api, false,"Log API events to the log file.") DEFINE_bool(log_code, false,"Log code events to the log file without profiling.") DEFINE_bool(log_gc, false,"Log heap samples on garbage collection for the hp2ps tool.") DEFINE_bool(log_handles, false,"Log global handle events.") DEFINE_bool(log_snapshot_positions, false,"log positions of (de)serialized objects in the snapshot.") DEFINE_bool(log_suspect, false,"Log suspect operations.") DEFINE_bool(prof, false,"Log statistical profiling information (implies --log-code).") DEFINE_bool(prof_auto, true,"Used with --prof, starts profiling automatically") DEFINE_bool(prof_lazy, false,"Used with --prof, only does sampling and logging"" when profiler is active (implies --noprof_auto).") DEFINE_bool(prof_browser_mode, true,"Used with --prof, turns on browser-compatible mode for profiling.") DEFINE_bool(log_regexp, false,"Log regular expression execution.") DEFINE_bool(sliding_state_window, false,"Update sliding state window counters.") DEFINE_string(logfile,"v8.log","Specify the name of the log file.") DEFINE_bool(ll_prof, false,"Enable low-level linux profiler.")#define FLAG DEFINE_bool(trace_elements_transitions, false,"trace elements transitions") DEFINE_bool(print_code_stubs, false,"print code stubs") DEFINE_bool(test_secondary_stub_cache, false,"test secondary stub cache by disabling the primary one") DEFINE_bool(test_primary_stub_cache, false,"test primary stub cache by disabling the secondary one") DEFINE_bool(print_code, false,"print generated code") DEFINE_bool(print_opt_code, false,"print optimized code") DEFINE_bool(print_unopt_code, false,"print unoptimized code before ""printing optimized code based on it") DEFINE_bool(print_code_verbose, false,"print more information for code") DEFINE_bool(print_builtin_code, false,"print generated code for builtins")#47"/Users/thlorenz/dev/dx/v8-perf/build/v8/src/flags.cc"2 namespace{struct Flag{enum FlagType{TYPE_BOOL, TYPE_INT, TYPE_FLOAT, TYPE_STRING, TYPE_ARGS} name
Definition: flags.cc:1349
static V8EXPORT Local< String > New(const char *data, int length=-1)
Definition: api.cc:4655
TickSample * sample
static const CpuProfile * FindProfile(unsigned uid, Handle< Value > security_token=Handle< Value >())
Definition: api.cc:5941
Address stack[kMaxFramesCount]
Definition: platform.h:701
T & last() const
Definition: list.h:86
static void StartProfiling(Handle< String > title)
Definition: api.cc:5952
activate correct semantics for inheriting readonliness enable harmony semantics for typeof enable harmony enable harmony proxies enable all harmony harmony_scoping harmony_proxies harmony_scoping tracks arrays with only smi values automatically unbox arrays of doubles use crankshaft use hydrogen range analysis use hydrogen global value numbering use function inlining maximum number of AST nodes considered for a single inlining loop invariant code motion print statistics for hydrogen trace generated IR for specified phases trace register allocator trace range analysis trace representation types environment for every instruction put a break point before deoptimizing polymorphic inlining perform array bounds checks elimination trace on stack replacement optimize closures functions with arguments object optimize functions containing for in loops profiler considers IC stability primitive functions trigger their own optimization re try self optimization if it failed insert an interrupt check at function exit execution budget before interrupt is triggered call count before self optimization self_optimization count_based_interrupts weighted_back_edges trace_opt emit comments in code disassembly enable use of SSE3 instructions if available enable use of CMOV instruction if available enable use of SAHF instruction if enable use of VFP3 instructions if available this implies enabling ARMv7 enable use of ARMv7 instructions if enable use of MIPS FPU instructions if NULL
#define CHECK_NE(unexpected, value)
Definition: checks.h:223
int StrLength(const char *string)
Definition: utils.h:234
#define T(name, string, precedence)
Definition: token.cc:48
static const int kMaxFramesCount
Definition: platform.h:700
#define HEAP
Definition: isolate.h:1408
static int GetProfilesCount()
Definition: api.cc:5923
bool IsEmpty() const
Definition: v8.h:208
#define FACTORY
Definition: isolate.h:1409
unsigned GetUid() const
Definition: api.cc:5891
static Persistent< Context > New(ExtensionConfiguration *extensions=NULL, Handle< ObjectTemplate > global_template=Handle< ObjectTemplate >(), Handle< Value > global_object=Handle< Value >())
Definition: api.cc:4308
static const CpuProfile * StopProfiling(Handle< String > title, Handle< Value > security_token=Handle< Value >())
Definition: api.cc:5959
Definition: v8.h:105