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
code-stubs.cc
Go to the documentation of this file.
1 // Copyright 2012 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 "bootstrapper.h"
31 #include "code-stubs.h"
32 #include "stub-cache.h"
33 #include "factory.h"
34 #include "gdb-jit.h"
35 #include "macro-assembler.h"
36 
37 namespace v8 {
38 namespace internal {
39 
40 bool CodeStub::FindCodeInCache(Code** code_out) {
41  Heap* heap = Isolate::Current()->heap();
42  int index = heap->code_stubs()->FindEntry(GetKey());
44  *code_out = Code::cast(heap->code_stubs()->ValueAt(index));
45  return true;
46  }
47  return false;
48 }
49 
50 
51 void CodeStub::GenerateCode(MacroAssembler* masm) {
52  // Update the static counter each time a new code stub is generated.
53  masm->isolate()->counters()->code_stubs()->Increment();
54 
55  // Nested stubs are not allowed for leaves.
56  AllowStubCallsScope allow_scope(masm, false);
57 
58  // Generate the code for the stub.
59  masm->set_generating_stub(true);
60  NoCurrentFrameScope scope(masm);
61  Generate(masm);
62 }
63 
64 
65 SmartArrayPointer<const char> CodeStub::GetName() {
66  char buffer[100];
67  NoAllocationStringAllocator allocator(buffer,
68  static_cast<unsigned>(sizeof(buffer)));
69  StringStream stream(&allocator);
70  PrintName(&stream);
71  return stream.ToCString();
72 }
73 
74 
75 void CodeStub::RecordCodeGeneration(Code* code, MacroAssembler* masm) {
76  Isolate* isolate = masm->isolate();
77  SmartArrayPointer<const char> name = GetName();
78  PROFILE(isolate, CodeCreateEvent(Logger::STUB_TAG, code, *name));
79  GDBJIT(AddCode(GDBJITInterface::STUB, *name, code));
80  Counters* counters = isolate->counters();
81  counters->total_stubs_code_size()->Increment(code->instruction_size());
82 }
83 
84 
85 int CodeStub::GetCodeKind() {
86  return Code::STUB;
87 }
88 
89 
90 Handle<Code> CodeStub::GetCode() {
91  Isolate* isolate = Isolate::Current();
92  Factory* factory = isolate->factory();
93  Heap* heap = isolate->heap();
94  Code* code;
95  if (UseSpecialCache()
96  ? FindCodeInSpecialCache(&code)
97  : FindCodeInCache(&code)) {
98  ASSERT(IsPregenerated() == code->is_pregenerated());
99  return Handle<Code>(code);
100  }
101 
102  {
103  HandleScope scope(isolate);
104 
105  // Generate the new code.
106  MacroAssembler masm(isolate, NULL, 256);
107  GenerateCode(&masm);
108 
109  // Create the code object.
110  CodeDesc desc;
111  masm.GetCode(&desc);
112 
113  // Copy the generated code into a heap object.
115  static_cast<Code::Kind>(GetCodeKind()),
116  GetICState());
117  Handle<Code> new_object = factory->NewCode(
118  desc, flags, masm.CodeObject(), NeedsImmovableCode());
119  new_object->set_major_key(MajorKey());
120  FinishCode(new_object);
121  RecordCodeGeneration(*new_object, &masm);
122 
123 #ifdef ENABLE_DISASSEMBLER
124  if (FLAG_print_code_stubs) {
125  new_object->Disassemble(*GetName());
126  PrintF("\n");
127  }
128 #endif
129 
130  if (UseSpecialCache()) {
131  AddToSpecialCache(new_object);
132  } else {
133  // Update the dictionary and the root in Heap.
134  Handle<UnseededNumberDictionary> dict =
135  factory->DictionaryAtNumberPut(
136  Handle<UnseededNumberDictionary>(heap->code_stubs()),
137  GetKey(),
138  new_object);
139  heap->public_set_code_stubs(*dict);
140  }
141  code = *new_object;
142  }
143 
144  Activate(code);
145  ASSERT(!NeedsImmovableCode() || heap->lo_space()->Contains(code));
146  return Handle<Code>(code, isolate);
147 }
148 
149 
150 const char* CodeStub::MajorName(CodeStub::Major major_key,
151  bool allow_unknown_keys) {
152  switch (major_key) {
153 #define DEF_CASE(name) case name: return #name "Stub";
155 #undef DEF_CASE
156  default:
157  if (!allow_unknown_keys) {
158  UNREACHABLE();
159  }
160  return NULL;
161  }
162 }
163 
164 
165 void CodeStub::PrintName(StringStream* stream) {
166  stream->Add("%s", MajorName(MajorKey(), false));
167 }
168 
169 
170 void ICCompareStub::AddToSpecialCache(Handle<Code> new_object) {
171  ASSERT(*known_map_ != NULL);
172  Isolate* isolate = new_object->GetIsolate();
173  Factory* factory = isolate->factory();
174  return Map::UpdateCodeCache(known_map_,
175  factory->compare_ic_symbol(),
176  new_object);
177 }
178 
179 
180 bool ICCompareStub::FindCodeInSpecialCache(Code** code_out) {
181  Isolate* isolate = known_map_->GetIsolate();
182  Factory* factory = isolate->factory();
184  static_cast<Code::Kind>(GetCodeKind()),
185  UNINITIALIZED);
186  Handle<Object> probe(
187  known_map_->FindInCodeCache(*factory->compare_ic_symbol(), flags));
188  if (probe->IsCode()) {
189  *code_out = Code::cast(*probe);
190  return true;
191  }
192  return false;
193 }
194 
195 
196 int ICCompareStub::MinorKey() {
197  return OpField::encode(op_ - Token::EQ) | StateField::encode(state_);
198 }
199 
200 
202  switch (state_) {
204  GenerateMiss(masm);
205  break;
206  case CompareIC::SMIS:
207  GenerateSmis(masm);
208  break;
210  GenerateHeapNumbers(masm);
211  break;
212  case CompareIC::STRINGS:
213  GenerateStrings(masm);
214  break;
215  case CompareIC::SYMBOLS:
216  GenerateSymbols(masm);
217  break;
218  case CompareIC::OBJECTS:
219  GenerateObjects(masm);
220  break;
222  ASSERT(*known_map_ != NULL);
223  GenerateKnownObjects(masm);
224  break;
225  default:
226  UNREACHABLE();
227  }
228 }
229 
230 
231 void InstanceofStub::PrintName(StringStream* stream) {
232  const char* args = "";
233  if (HasArgsInRegisters()) {
234  args = "_REGS";
235  }
236 
237  const char* inline_check = "";
238  if (HasCallSiteInlineCheck()) {
239  inline_check = "_INLINE";
240  }
241 
242  const char* return_true_false_object = "";
243  if (ReturnTrueFalseObject()) {
244  return_true_false_object = "_TRUEFALSE";
245  }
246 
247  stream->Add("InstanceofStub%s%s%s",
248  args,
249  inline_check,
250  return_true_false_object);
251 }
252 
253 
254 void JSEntryStub::FinishCode(Handle<Code> code) {
255  Handle<FixedArray> handler_table =
256  code->GetIsolate()->factory()->NewFixedArray(1, TENURED);
257  handler_table->set(0, Smi::FromInt(handler_offset_));
258  code->set_handler_table(*handler_table);
259 }
260 
261 
263  switch (elements_kind_) {
264  case FAST_ELEMENTS:
265  case FAST_HOLEY_ELEMENTS:
266  case FAST_SMI_ELEMENTS:
269  break;
273  break;
284  break;
285  case DICTIONARY_ELEMENTS:
287  break;
289  UNREACHABLE();
290  break;
291  }
292 }
293 
294 
296  switch (elements_kind_) {
297  case FAST_ELEMENTS:
298  case FAST_HOLEY_ELEMENTS:
299  case FAST_SMI_ELEMENTS:
302  is_js_array_,
303  elements_kind_,
304  grow_mode_);
305  }
306  break;
310  is_js_array_,
311  grow_mode_);
312  break;
323  break;
324  case DICTIONARY_ELEMENTS:
326  break;
328  UNREACHABLE();
329  break;
330  }
331 }
332 
333 
334 void ArgumentsAccessStub::PrintName(StringStream* stream) {
335  stream->Add("ArgumentsAccessStub_");
336  switch (type_) {
337  case READ_ELEMENT: stream->Add("ReadElement"); break;
338  case NEW_NON_STRICT_FAST: stream->Add("NewNonStrictFast"); break;
339  case NEW_NON_STRICT_SLOW: stream->Add("NewNonStrictSlow"); break;
340  case NEW_STRICT: stream->Add("NewStrict"); break;
341  }
342 }
343 
344 
345 void CallFunctionStub::PrintName(StringStream* stream) {
346  stream->Add("CallFunctionStub_Args%d", argc_);
347  if (ReceiverMightBeImplicit()) stream->Add("_Implicit");
348  if (RecordCallTarget()) stream->Add("_Recording");
349 }
350 
351 
352 void CallConstructStub::PrintName(StringStream* stream) {
353  stream->Add("CallConstructStub");
354  if (RecordCallTarget()) stream->Add("_Recording");
355 }
356 
357 
359  stream->Add("ToBooleanStub_");
360  types_.Print(stream);
361 }
362 
363 
365  if (IsEmpty()) stream->Add("None");
366  if (Contains(UNDEFINED)) stream->Add("Undefined");
367  if (Contains(BOOLEAN)) stream->Add("Bool");
368  if (Contains(NULL_TYPE)) stream->Add("Null");
369  if (Contains(SMI)) stream->Add("Smi");
370  if (Contains(SPEC_OBJECT)) stream->Add("SpecObject");
371  if (Contains(STRING)) stream->Add("String");
372  if (Contains(HEAP_NUMBER)) stream->Add("HeapNumber");
373 }
374 
375 
377  if (!FLAG_trace_ic) return;
378  char buffer[100];
379  NoAllocationStringAllocator allocator(buffer,
380  static_cast<unsigned>(sizeof(buffer)));
381  StringStream stream(&allocator);
382  stream.Add("[ToBooleanIC (");
383  Print(&stream);
384  stream.Add("->");
385  to.Print(&stream);
386  stream.Add(")]\n");
387  stream.OutputToStdOut();
388 }
389 
390 
392  if (object->IsUndefined()) {
393  Add(UNDEFINED);
394  return false;
395  } else if (object->IsBoolean()) {
396  Add(BOOLEAN);
397  return object->IsTrue();
398  } else if (object->IsNull()) {
399  Add(NULL_TYPE);
400  return false;
401  } else if (object->IsSmi()) {
402  Add(SMI);
403  return Smi::cast(*object)->value() != 0;
404  } else if (object->IsSpecObject()) {
405  Add(SPEC_OBJECT);
406  return !object->IsUndetectableObject();
407  } else if (object->IsString()) {
408  Add(STRING);
409  return !object->IsUndetectableObject() &&
410  String::cast(*object)->length() != 0;
411  } else if (object->IsHeapNumber()) {
412  ASSERT(!object->IsUndetectableObject());
413  Add(HEAP_NUMBER);
414  double value = HeapNumber::cast(*object)->value();
415  return value != 0 && !isnan(value);
416  } else {
417  // We should never see an internal object at runtime here!
418  UNREACHABLE();
419  return true;
420  }
421 }
422 
423 
425  return Contains(ToBooleanStub::SPEC_OBJECT)
426  || Contains(ToBooleanStub::STRING)
427  || Contains(ToBooleanStub::HEAP_NUMBER);
428 }
429 
430 
432  return Contains(ToBooleanStub::SPEC_OBJECT)
433  || Contains(ToBooleanStub::STRING);
434 }
435 
436 
437 void ElementsTransitionAndStoreStub::Generate(MacroAssembler* masm) {
438  Label fail;
440  if (!FLAG_trace_elements_transitions) {
442  if (IsFastSmiOrObjectElementsKind(from_)) {
445  } else if (IsFastDoubleElementsKind(from_)) {
448  } else {
449  UNREACHABLE();
450  }
452  is_jsarray_,
453  to_,
454  grow_mode_);
455  } else if (IsFastSmiElementsKind(from_) &&
459  is_jsarray_,
460  grow_mode_);
461  } else if (IsFastDoubleElementsKind(from_)) {
465  } else {
466  UNREACHABLE();
467  }
468  }
469  masm->bind(&fail);
470  KeyedStoreIC::GenerateRuntimeSetProperty(masm, strict_mode_);
471 }
472 
473 } } // namespace v8::internal
void PrintF(const char *format,...)
Definition: v8utils.cc:40
#define DEF_CASE(name)
static String * cast(Object *obj)
static Smi * FromInt(int value)
Definition: objects-inl.h:973
static void GenerateStoreExternalArray(MacroAssembler *masm, ElementsKind elements_kind)
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 void GenerateLoadFastDoubleElement(MacroAssembler *masm)
virtual void PrintName(StringStream *stream)
Definition: code-stubs.cc:358
Flag flags[]
Definition: flags.cc:1467
bool Record(Handle< Object > object)
Definition: code-stubs.cc:391
#define ASSERT(condition)
Definition: checks.h:270
v8::Handle< v8::Value > Print(const v8::Arguments &args)
#define PROFILE(isolate, Call)
Definition: cpu-profiler.h:190
int isnan(double x)
static Code * cast(Object *obj)
static Smi * cast(Object *object)
void Add(Vector< const char > format, Vector< FmtElm > elms)
#define UNREACHABLE()
Definition: checks.h:50
static void GenerateStoreFastElement(MacroAssembler *masm, bool is_js_array, ElementsKind element_kind, KeyedAccessGrowMode grow_mode)
bool IsFastSmiElementsKind(ElementsKind kind)
static void GenerateSmiToDouble(MacroAssembler *masm, Label *fail)
static void GenerateMapChangeElementsTransition(MacroAssembler *masm)
static void GenerateLoadDictionaryElement(MacroAssembler *masm)
static void GenerateLoadExternalArray(MacroAssembler *masm, ElementsKind elements_kind)
bool IsFastSmiOrObjectElementsKind(ElementsKind kind)
#define GDBJIT(action)
Definition: gdb-jit.h:141
static void UpdateCodeCache(Handle< Map > map, Handle< String > name, Handle< Code > code)
Definition: objects.cc:4936
static HeapNumber * cast(Object *obj)
static void GenerateRuntimeSetProperty(MacroAssembler *masm, StrictModeFlag strict_mode)
static void GenerateDoubleToObject(MacroAssembler *masm, Label *fail)
static void GenerateLoadFastElement(MacroAssembler *masm)
static Flags ComputeFlags(Kind kind, InlineCacheState ic_state=UNINITIALIZED, ExtraICState extra_ic_state=kNoExtraICState, PropertyType type=NORMAL, int argc=-1, InlineCacheHolderFlag holder=OWN_MAP)
Definition: objects-inl.h:3312
static void GenerateStoreFastDoubleElement(MacroAssembler *masm, bool is_js_array, KeyedAccessGrowMode grow_mode)
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 Generate(MacroAssembler *masm)
Definition: code-stubs.cc:295
void TraceTransition(Types to) const
Definition: code-stubs.cc:376
bool IsFastHoleyElementsKind(ElementsKind kind)
bool Contains(Type type) const
Definition: code-stubs.h:1050
virtual void Generate(MacroAssembler *masm)
Definition: code-stubs.cc:201
#define CODE_STUB_LIST(V)
Definition: code-stubs.h:100
void Print(StringStream *stream) const
Definition: code-stubs.cc:364
void Generate(MacroAssembler *masm)
Definition: code-stubs.cc:262
bool IsFastDoubleElementsKind(ElementsKind kind)
static void GenerateStoreDictionaryElement(MacroAssembler *masm)
Definition: stub-cache.cc:1409