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
compilation-cache.cc
Go to the documentation of this file.
1 // Copyright 2011 the V8 project authors. All rights reserved.
2 // Redistribution and use in source and binary forms, with or without
3 // modification, are permitted provided that the following conditions are
4 // met:
5 //
6 // * Redistributions of source code must retain the above copyright
7 // notice, this list of conditions and the following disclaimer.
8 // * Redistributions in binary form must reproduce the above
9 // copyright notice, this list of conditions and the following
10 // disclaimer in the documentation and/or other materials provided
11 // with the distribution.
12 // * Neither the name of Google Inc. nor the names of its
13 // contributors may be used to endorse or promote products derived
14 // from this software without specific prior written permission.
15 //
16 // THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
17 // "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
18 // LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
19 // A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
20 // OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
21 // SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
22 // LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
23 // DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
24 // THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
25 // (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
26 // OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
27 
28 #include "v8.h"
29 
30 #include "assembler.h"
31 #include "compilation-cache.h"
32 #include "serialize.h"
33 
34 namespace v8 {
35 namespace internal {
36 
37 
38 // The number of generations for each sub cache.
39 // The number of ScriptGenerations is carefully chosen based on histograms.
40 // See issue 458: http://code.google.com/p/v8/issues/detail?id=458
41 static const int kScriptGenerations = 5;
42 static const int kEvalGlobalGenerations = 2;
43 static const int kEvalContextualGenerations = 2;
44 static const int kRegExpGenerations = 2;
45 
46 // Initial size of each compilation cache table allocated.
47 static const int kInitialCacheSize = 64;
48 
49 
50 CompilationCache::CompilationCache(Isolate* isolate)
51  : isolate_(isolate),
52  script_(isolate, kScriptGenerations),
53  eval_global_(isolate, kEvalGlobalGenerations),
54  eval_contextual_(isolate, kEvalContextualGenerations),
55  reg_exp_(isolate, kRegExpGenerations),
56  enabled_(true) {
57  CompilationSubCache* subcaches[kSubCacheCount] =
58  {&script_, &eval_global_, &eval_contextual_, &reg_exp_};
59  for (int i = 0; i < kSubCacheCount; ++i) {
60  subcaches_[i] = subcaches[i];
61  }
62 }
63 
64 
65 CompilationCache::~CompilationCache() {}
66 
67 
68 static Handle<CompilationCacheTable> AllocateTable(Isolate* isolate, int size) {
69  CALL_HEAP_FUNCTION(isolate,
71  CompilationCacheTable);
72 }
73 
74 
76  ASSERT(generation < generations_);
78  if (tables_[generation]->IsUndefined()) {
79  result = AllocateTable(isolate(), kInitialCacheSize);
80  tables_[generation] = *result;
81  } else {
82  CompilationCacheTable* table =
83  CompilationCacheTable::cast(tables_[generation]);
84  result = Handle<CompilationCacheTable>(table, isolate());
85  }
86  return result;
87 }
88 
90  // Age the generations implicitly killing off the oldest.
91  for (int i = generations_ - 1; i > 0; i--) {
92  tables_[i] = tables_[i - 1];
93  }
94 
95  // Set the first generation as unborn.
96  tables_[0] = isolate()->heap()->undefined_value();
97 }
98 
99 
101  Object* undefined = isolate()->heap()->raw_unchecked_undefined_value();
102  for (int i = 0; i < generations_; i++) {
103  if (tables_[i] != undefined) {
104  reinterpret_cast<CompilationCacheTable*>(tables_[i])->IterateElements(v);
105  }
106  }
107 }
108 
109 
110 void CompilationSubCache::Iterate(ObjectVisitor* v) {
111  v->VisitPointers(&tables_[0], &tables_[generations_]);
112 }
113 
114 
116  MemsetPointer(tables_, isolate()->heap()->undefined_value(), generations_);
117 }
118 
119 
121  // Probe the script generation tables. Make sure not to leak handles
122  // into the caller's handle scope.
123  { HandleScope scope(isolate());
124  for (int generation = 0; generation < generations(); generation++) {
125  Handle<CompilationCacheTable> table = GetTable(generation);
126  table->Remove(*function_info);
127  }
128  }
129 }
130 
131 
133  int generations)
134  : CompilationSubCache(isolate, generations),
135  script_histogram_(NULL),
136  script_histogram_initialized_(false) { }
137 
138 
139 // We only re-use a cached function for some script source code if the
140 // script originates from the same place. This is to avoid issues
141 // when reporting errors, etc.
142 bool CompilationCacheScript::HasOrigin(
143  Handle<SharedFunctionInfo> function_info,
145  int line_offset,
146  int column_offset) {
147  Handle<Script> script =
148  Handle<Script>(Script::cast(function_info->script()), isolate());
149  // If the script name isn't set, the boilerplate script should have
150  // an undefined name to have the same origin.
151  if (name.is_null()) {
152  return script->name()->IsUndefined();
153  }
154  // Do the fast bailout checks first.
155  if (line_offset != script->line_offset()->value()) return false;
156  if (column_offset != script->column_offset()->value()) return false;
157  // Check that both names are strings. If not, no match.
158  if (!name->IsString() || !script->name()->IsString()) return false;
159  // Compare the two name strings for equality.
160  return String::cast(*name)->Equals(String::cast(script->name()));
161 }
162 
163 
164 // TODO(245): Need to allow identical code from different contexts to
165 // be cached in the same script generation. Currently the first use
166 // will be cached, but subsequent code from different source / line
167 // won't.
169  Handle<Object> name,
170  int line_offset,
171  int column_offset) {
172  Object* result = NULL;
173  int generation;
174 
175  // Probe the script generation tables. Make sure not to leak handles
176  // into the caller's handle scope.
177  { HandleScope scope(isolate());
178  for (generation = 0; generation < generations(); generation++) {
179  Handle<CompilationCacheTable> table = GetTable(generation);
180  Handle<Object> probe(table->Lookup(*source), isolate());
181  if (probe->IsSharedFunctionInfo()) {
182  Handle<SharedFunctionInfo> function_info =
184  // Break when we've found a suitable shared function info that
185  // matches the origin.
186  if (HasOrigin(function_info, name, line_offset, column_offset)) {
187  result = *function_info;
188  break;
189  }
190  }
191  }
192  }
193 
194  if (!script_histogram_initialized_) {
195  script_histogram_ = isolate()->stats_table()->CreateHistogram(
196  "V8.ScriptCache",
197  0,
198  kScriptGenerations,
199  kScriptGenerations + 1);
200  script_histogram_initialized_ = true;
201  }
202 
203  if (script_histogram_ != NULL) {
204  // The level NUMBER_OF_SCRIPT_GENERATIONS is equivalent to a cache miss.
205  isolate()->stats_table()->AddHistogramSample(script_histogram_, generation);
206  }
207 
208  // Once outside the manacles of the handle scope, we need to recheck
209  // to see if we actually found a cached script. If so, we return a
210  // handle created in the caller's handle scope.
211  if (result != NULL) {
213  isolate());
214  ASSERT(HasOrigin(shared, name, line_offset, column_offset));
215  // If the script was found in a later generation, we promote it to
216  // the first generation to let it survive longer in the cache.
217  if (generation != 0) Put(source, shared);
218  isolate()->counters()->compilation_cache_hits()->Increment();
219  return shared;
220  } else {
221  isolate()->counters()->compilation_cache_misses()->Increment();
223  }
224 }
225 
226 
227 MaybeObject* CompilationCacheScript::TryTablePut(
228  Handle<String> source,
229  Handle<SharedFunctionInfo> function_info) {
231  return table->Put(*source, *function_info);
232 }
233 
234 
235 Handle<CompilationCacheTable> CompilationCacheScript::TablePut(
236  Handle<String> source,
237  Handle<SharedFunctionInfo> function_info) {
239  TryTablePut(source, function_info),
240  CompilationCacheTable);
241 }
242 
243 
245  Handle<SharedFunctionInfo> function_info) {
246  HandleScope scope(isolate());
247  SetFirstTable(TablePut(source, function_info));
248 }
249 
250 
252  Handle<String> source,
253  Handle<Context> context,
254  LanguageMode language_mode,
255  int scope_position) {
256  // Make sure not to leak the table into the surrounding handle
257  // scope. Otherwise, we risk keeping old tables around even after
258  // having cleared the cache.
259  Object* result = NULL;
260  int generation;
261  { HandleScope scope(isolate());
262  for (generation = 0; generation < generations(); generation++) {
263  Handle<CompilationCacheTable> table = GetTable(generation);
264  result = table->LookupEval(
265  *source, *context, language_mode, scope_position);
266  if (result->IsSharedFunctionInfo()) {
267  break;
268  }
269  }
270  }
271  if (result->IsSharedFunctionInfo()) {
273  function_info(SharedFunctionInfo::cast(result), isolate());
274  if (generation != 0) {
275  Put(source, context, function_info, scope_position);
276  }
277  isolate()->counters()->compilation_cache_hits()->Increment();
278  return function_info;
279  } else {
280  isolate()->counters()->compilation_cache_misses()->Increment();
282  }
283 }
284 
285 
286 MaybeObject* CompilationCacheEval::TryTablePut(
287  Handle<String> source,
288  Handle<Context> context,
289  Handle<SharedFunctionInfo> function_info,
290  int scope_position) {
292  return table->PutEval(*source, *context, *function_info, scope_position);
293 }
294 
295 
296 Handle<CompilationCacheTable> CompilationCacheEval::TablePut(
297  Handle<String> source,
298  Handle<Context> context,
299  Handle<SharedFunctionInfo> function_info,
300  int scope_position) {
302  TryTablePut(
303  source, context, function_info, scope_position),
304  CompilationCacheTable);
305 }
306 
307 
309  Handle<Context> context,
310  Handle<SharedFunctionInfo> function_info,
311  int scope_position) {
312  HandleScope scope(isolate());
313  SetFirstTable(TablePut(source, context, function_info, scope_position));
314 }
315 
316 
319  // Make sure not to leak the table into the surrounding handle
320  // scope. Otherwise, we risk keeping old tables around even after
321  // having cleared the cache.
322  Object* result = NULL;
323  int generation;
324  { HandleScope scope(isolate());
325  for (generation = 0; generation < generations(); generation++) {
326  Handle<CompilationCacheTable> table = GetTable(generation);
327  result = table->LookupRegExp(*source, flags);
328  if (result->IsFixedArray()) {
329  break;
330  }
331  }
332  }
333  if (result->IsFixedArray()) {
335  if (generation != 0) {
336  Put(source, flags, data);
337  }
338  isolate()->counters()->compilation_cache_hits()->Increment();
339  return data;
340  } else {
341  isolate()->counters()->compilation_cache_misses()->Increment();
342  return Handle<FixedArray>::null();
343  }
344 }
345 
346 
347 MaybeObject* CompilationCacheRegExp::TryTablePut(
348  Handle<String> source,
350  Handle<FixedArray> data) {
352  return table->PutRegExp(*source, flags, *data);
353 }
354 
355 
356 Handle<CompilationCacheTable> CompilationCacheRegExp::TablePut(
357  Handle<String> source,
358  JSRegExp::Flags flags,
359  Handle<FixedArray> data) {
361  TryTablePut(source, flags, data),
362  CompilationCacheTable);
363 }
364 
365 
367  JSRegExp::Flags flags,
368  Handle<FixedArray> data) {
369  HandleScope scope(isolate());
370  SetFirstTable(TablePut(source, flags, data));
371 }
372 
373 
375  if (!IsEnabled()) return;
376 
377  eval_global_.Remove(function_info);
378  eval_contextual_.Remove(function_info);
379  script_.Remove(function_info);
380 }
381 
382 
384  Handle<Object> name,
385  int line_offset,
386  int column_offset) {
387  if (!IsEnabled()) {
389  }
390 
391  return script_.Lookup(source, name, line_offset, column_offset);
392 }
393 
394 
396  Handle<String> source,
397  Handle<Context> context,
398  bool is_global,
399  LanguageMode language_mode,
400  int scope_position) {
401  if (!IsEnabled()) {
403  }
404 
406  if (is_global) {
407  result = eval_global_.Lookup(
408  source, context, language_mode, scope_position);
409  } else {
410  ASSERT(scope_position != RelocInfo::kNoPosition);
411  result = eval_contextual_.Lookup(
412  source, context, language_mode, scope_position);
413  }
414  return result;
415 }
416 
417 
419  JSRegExp::Flags flags) {
420  if (!IsEnabled()) {
421  return Handle<FixedArray>::null();
422  }
423 
424  return reg_exp_.Lookup(source, flags);
425 }
426 
427 
429  Handle<SharedFunctionInfo> function_info) {
430  if (!IsEnabled()) {
431  return;
432  }
433 
434  script_.Put(source, function_info);
435 }
436 
437 
439  Handle<Context> context,
440  bool is_global,
441  Handle<SharedFunctionInfo> function_info,
442  int scope_position) {
443  if (!IsEnabled()) {
444  return;
445  }
446 
447  HandleScope scope(isolate());
448  if (is_global) {
449  eval_global_.Put(source, context, function_info, scope_position);
450  } else {
451  ASSERT(scope_position != RelocInfo::kNoPosition);
452  eval_contextual_.Put(source, context, function_info, scope_position);
453  }
454 }
455 
456 
457 
459  JSRegExp::Flags flags,
460  Handle<FixedArray> data) {
461  if (!IsEnabled()) {
462  return;
463  }
464 
465  reg_exp_.Put(source, flags, data);
466 }
467 
468 
470  for (int i = 0; i < kSubCacheCount; i++) {
471  subcaches_[i]->Clear();
472  }
473 }
474 
475 
476 void CompilationCache::Iterate(ObjectVisitor* v) {
477  for (int i = 0; i < kSubCacheCount; i++) {
478  subcaches_[i]->Iterate(v);
479  }
480 }
481 
482 
483 void CompilationCache::IterateFunctions(ObjectVisitor* v) {
484  for (int i = 0; i < kSubCacheCount; i++) {
485  subcaches_[i]->IterateFunctions(v);
486  }
487 }
488 
489 
491  for (int i = 0; i < kSubCacheCount; i++) {
492  subcaches_[i]->Age();
493  }
494 }
495 
496 
498  enabled_ = true;
499 }
500 
501 
503  enabled_ = false;
504  Clear();
505 }
506 
507 
508 } } // namespace v8::internal
void Put(Handle< String > source, Handle< SharedFunctionInfo > function_info)
void Put(Handle< String > source, Handle< Context > context, Handle< SharedFunctionInfo > function_info, int scope_position)
static String * cast(Object *obj)
static MUST_USE_RESULT MaybeObject * Allocate(int at_least_space_for, PretenureFlag pretenure=NOT_TENURED)
StatsTable * stats_table()
Definition: isolate.cc:1885
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 CompilationCacheTable * cast(Object *obj)
static Handle< T > cast(Handle< S > that)
Definition: handles.h:81
Flag flags[]
Definition: flags.cc:1467
Handle< FixedArray > LookupRegExp(Handle< String > source, JSRegExp::Flags flags)
#define ASSERT(condition)
Definition: checks.h:270
void PutEval(Handle< String > source, Handle< Context > context, bool is_global, Handle< SharedFunctionInfo > function_info, int scope_position)
static Script * cast(Object *obj)
static SharedFunctionInfo * cast(Object *obj)
void SetFirstTable(Handle< CompilationCacheTable > value)
Handle< CompilationCacheTable > GetTable(int generation)
bool Equals(String *other)
Definition: objects-inl.h:2275
Handle< SharedFunctionInfo > LookupEval(Handle< String > source, Handle< Context > context, bool is_global, LanguageMode language_mode, int scope_position)
#define CALL_HEAP_FUNCTION(ISOLATE, FUNCTION_CALL, TYPE)
Definition: heap-inl.h:549
void Iterate(ObjectVisitor *v)
void PutRegExp(Handle< String > source, JSRegExp::Flags flags, Handle< FixedArray > data)
Handle< FixedArray > Lookup(Handle< String > source, JSRegExp::Flags flags)
Handle< SharedFunctionInfo > Lookup(Handle< String > source, Handle< Object > name, int line_offset, int column_offset)
bool is_null() const
Definition: handles.h:87
Handle< CompilationCacheTable > GetFirstTable()
static Handle< T > null()
Definition: handles.h:86
void MemsetPointer(T **dest, U *value, int counter)
Definition: v8utils.h:146
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
Definition: flags.cc:274
void IterateFunctions(ObjectVisitor *v)
Counters * counters()
Definition: isolate.h:804
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 true
Definition: flags.cc:157
static FixedArray * cast(Object *obj)
Handle< SharedFunctionInfo > LookupScript(Handle< String > source, Handle< Object > name, int line_offset, int column_offset)
CompilationCacheScript(Isolate *isolate, int generations)
void Remove(Handle< SharedFunctionInfo > function_info)
void * CreateHistogram(const char *name, int min, int max, size_t buckets)
Definition: counters.h:81
void PutScript(Handle< String > source, Handle< SharedFunctionInfo > function_info)
Handle< SharedFunctionInfo > Lookup(Handle< String > source, Handle< Context > context, LanguageMode language_mode, int scope_position)
void AddHistogramSample(void *histogram, int sample)
Definition: counters.h:91
void Remove(Handle< SharedFunctionInfo > function_info)
void IterateFunctions(ObjectVisitor *v)
void Put(Handle< String > source, JSRegExp::Flags flags, Handle< FixedArray > data)