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
lithium-codegen-mips.h
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 #ifndef V8_MIPS_LITHIUM_CODEGEN_MIPS_H_
29 #define V8_MIPS_LITHIUM_CODEGEN_MIPS_H_
30 
31 #include "mips/lithium-mips.h"
33 #include "deoptimizer.h"
34 #include "safepoint-table.h"
35 #include "scopes.h"
36 
37 namespace v8 {
38 namespace internal {
39 
40 // Forward declarations.
41 class LDeferredCode;
42 class SafepointGenerator;
43 
44 class LCodeGen BASE_EMBEDDED {
45  public:
46  LCodeGen(LChunk* chunk, MacroAssembler* assembler, CompilationInfo* info,
47  Zone* zone)
48  : chunk_(chunk),
49  masm_(assembler),
50  info_(info),
51  current_block_(-1),
52  current_instruction_(-1),
53  instructions_(chunk->instructions()),
54  deoptimizations_(4, zone),
55  deopt_jump_table_(4, zone),
56  deoptimization_literals_(8, zone),
57  inlined_function_count_(0),
58  scope_(info->scope()),
59  status_(UNUSED),
60  translations_(zone),
61  deferred_(8, zone),
62  osr_pc_offset_(-1),
63  last_lazy_deopt_pc_(0),
64  safepoints_(zone),
65  zone_(zone),
66  resolver_(this),
67  expected_safepoint_kind_(Safepoint::kSimple) {
68  PopulateDeoptimizationLiteralsWithInlinedFunctions();
69  }
70 
71 
72  // Simple accessors.
73  MacroAssembler* masm() const { return masm_; }
74  CompilationInfo* info() const { return info_; }
75  Isolate* isolate() const { return info_->isolate(); }
76  Factory* factory() const { return isolate()->factory(); }
77  Heap* heap() const { return isolate()->heap(); }
78  Zone* zone() const { return zone_; }
79 
80  // Support for converting LOperands to assembler types.
81  // LOperand must be a register.
82  Register ToRegister(LOperand* op) const;
83 
84  // LOperand is loaded into scratch, unless already a register.
85  Register EmitLoadRegister(LOperand* op, Register scratch);
86 
87  // LOperand must be a double register.
88  DoubleRegister ToDoubleRegister(LOperand* op) const;
89 
90  // LOperand is loaded into dbl_scratch, unless already a double register.
91  DoubleRegister EmitLoadDoubleRegister(LOperand* op,
92  FloatRegister flt_scratch,
93  DoubleRegister dbl_scratch);
94  int ToInteger32(LConstantOperand* op) const;
95  double ToDouble(LConstantOperand* op) const;
96  Operand ToOperand(LOperand* op);
97  MemOperand ToMemOperand(LOperand* op) const;
98  // Returns a MemOperand pointing to the high word of a DoubleStackSlot.
99  MemOperand ToHighMemOperand(LOperand* op) const;
100 
101  bool IsInteger32(LConstantOperand* op) const;
102  Handle<Object> ToHandle(LConstantOperand* op) const;
103 
104  // Try to generate code for the entire chunk, but it may fail if the
105  // chunk contains constructs we cannot handle. Returns true if the
106  // code generation attempt succeeded.
107  bool GenerateCode();
108 
109  // Finish the code by setting stack height, safepoint, and bailout
110  // information on it.
111  void FinishCode(Handle<Code> code);
112 
113  void DoDeferredNumberTagD(LNumberTagD* instr);
114  void DoDeferredNumberTagI(LNumberTagI* instr);
115  void DoDeferredTaggedToI(LTaggedToI* instr);
116  void DoDeferredMathAbsTaggedHeapNumber(LUnaryMathOperation* instr);
117  void DoDeferredStackCheck(LStackCheck* instr);
118  void DoDeferredRandom(LRandom* instr);
119  void DoDeferredStringCharCodeAt(LStringCharCodeAt* instr);
120  void DoDeferredStringCharFromCode(LStringCharFromCode* instr);
121  void DoDeferredAllocateObject(LAllocateObject* instr);
122  void DoDeferredInstanceOfKnownGlobal(LInstanceOfKnownGlobal* instr,
123  Label* map_check);
124 
125  void DoCheckMapCommon(Register reg, Register scratch, Handle<Map> map,
126  CompareMapMode mode, LEnvironment* env);
127 
128  // Parallel move support.
129  void DoParallelMove(LParallelMove* move);
130  void DoGap(LGap* instr);
131 
132  // Emit frame translation commands for an environment.
133  void WriteTranslation(LEnvironment* environment, Translation* translation);
134 
135  // Declare methods that deal with the individual node types.
136 #define DECLARE_DO(type) void Do##type(L##type* node);
138 #undef DECLARE_DO
139 
140  private:
141  enum Status {
142  UNUSED,
143  GENERATING,
144  DONE,
145  ABORTED
146  };
147 
148  bool is_unused() const { return status_ == UNUSED; }
149  bool is_generating() const { return status_ == GENERATING; }
150  bool is_done() const { return status_ == DONE; }
151  bool is_aborted() const { return status_ == ABORTED; }
152 
153  StrictModeFlag strict_mode_flag() const {
154  return info()->is_classic_mode() ? kNonStrictMode : kStrictMode;
155  }
156 
157  LChunk* chunk() const { return chunk_; }
158  Scope* scope() const { return scope_; }
159  HGraph* graph() const { return chunk_->graph(); }
160 
161  Register scratch0() { return kLithiumScratchReg; }
162  Register scratch1() { return kLithiumScratchReg2; }
163  DoubleRegister double_scratch0() { return kLithiumScratchDouble; }
164 
165  int GetNextEmittedBlock(int block);
166  LInstruction* GetNextInstruction();
167 
168  void EmitClassOfTest(Label* if_true,
169  Label* if_false,
170  Handle<String> class_name,
171  Register input,
172  Register temporary,
173  Register temporary2);
174 
175  int GetStackSlotCount() const { return chunk()->spill_slot_count(); }
176  int GetParameterCount() const { return scope()->num_parameters(); }
177 
178  void Abort(const char* format, ...);
179  void Comment(const char* format, ...);
180 
181  void AddDeferredCode(LDeferredCode* code) { deferred_.Add(code, zone()); }
182 
183  // Code generation passes. Returns true if code generation should
184  // continue.
185  bool GeneratePrologue();
186  bool GenerateBody();
187  bool GenerateDeferredCode();
188  bool GenerateDeoptJumpTable();
189  bool GenerateSafepointTable();
190 
191  enum SafepointMode {
192  RECORD_SIMPLE_SAFEPOINT,
193  RECORD_SAFEPOINT_WITH_REGISTERS_AND_NO_ARGUMENTS
194  };
195 
196  void CallCode(Handle<Code> code,
197  RelocInfo::Mode mode,
198  LInstruction* instr);
199 
200  void CallCodeGeneric(Handle<Code> code,
201  RelocInfo::Mode mode,
202  LInstruction* instr,
203  SafepointMode safepoint_mode);
204 
205  void CallRuntime(const Runtime::Function* function,
206  int num_arguments,
207  LInstruction* instr);
208 
209  void CallRuntime(Runtime::FunctionId id,
210  int num_arguments,
211  LInstruction* instr) {
212  const Runtime::Function* function = Runtime::FunctionForId(id);
213  CallRuntime(function, num_arguments, instr);
214  }
215 
216  void CallRuntimeFromDeferred(Runtime::FunctionId id,
217  int argc,
218  LInstruction* instr);
219 
220  enum A1State {
221  A1_UNINITIALIZED,
222  A1_CONTAINS_TARGET
223  };
224 
225  // Generate a direct call to a known function. Expects the function
226  // to be in a1.
227  void CallKnownFunction(Handle<JSFunction> function,
228  int arity,
229  LInstruction* instr,
230  CallKind call_kind,
231  A1State a1_state);
232 
233  void LoadHeapObject(Register result, Handle<HeapObject> object);
234 
235  void RecordSafepointWithLazyDeopt(LInstruction* instr,
236  SafepointMode safepoint_mode);
237 
238  void RegisterEnvironmentForDeoptimization(LEnvironment* environment,
239  Safepoint::DeoptMode mode);
240  void DeoptimizeIf(Condition cc,
241  LEnvironment* environment,
242  Register src1 = zero_reg,
243  const Operand& src2 = Operand(zero_reg));
244 
245  void AddToTranslation(Translation* translation,
246  LOperand* op,
247  bool is_tagged);
248  void PopulateDeoptimizationData(Handle<Code> code);
249  int DefineDeoptimizationLiteral(Handle<Object> literal);
250 
251  void PopulateDeoptimizationLiteralsWithInlinedFunctions();
252 
253  Register ToRegister(int index) const;
254  DoubleRegister ToDoubleRegister(int index) const;
255 
256  // Specific math operations - used from DoUnaryMathOperation.
257  void EmitIntegerMathAbs(LUnaryMathOperation* instr);
258  void DoMathAbs(LUnaryMathOperation* instr);
259  void DoMathFloor(LUnaryMathOperation* instr);
260  void DoMathRound(LUnaryMathOperation* instr);
261  void DoMathSqrt(LUnaryMathOperation* instr);
262  void DoMathPowHalf(LUnaryMathOperation* instr);
263  void DoMathLog(LUnaryMathOperation* instr);
264  void DoMathTan(LUnaryMathOperation* instr);
265  void DoMathCos(LUnaryMathOperation* instr);
266  void DoMathSin(LUnaryMathOperation* instr);
267 
268  // Support for recording safepoint and position information.
269  void RecordSafepoint(LPointerMap* pointers,
270  Safepoint::Kind kind,
271  int arguments,
272  Safepoint::DeoptMode mode);
273  void RecordSafepoint(LPointerMap* pointers, Safepoint::DeoptMode mode);
274  void RecordSafepoint(Safepoint::DeoptMode mode);
275  void RecordSafepointWithRegisters(LPointerMap* pointers,
276  int arguments,
277  Safepoint::DeoptMode mode);
278  void RecordSafepointWithRegistersAndDoubles(LPointerMap* pointers,
279  int arguments,
280  Safepoint::DeoptMode mode);
281  void RecordPosition(int position);
282 
283  static Condition TokenToCondition(Token::Value op, bool is_unsigned);
284  void EmitGoto(int block);
285  void EmitBranch(int left_block,
286  int right_block,
287  Condition cc,
288  Register src1,
289  const Operand& src2);
290  void EmitBranchF(int left_block,
291  int right_block,
292  Condition cc,
293  FPURegister src1,
294  FPURegister src2);
295  void EmitCmpI(LOperand* left, LOperand* right);
296  void EmitNumberUntagD(Register input,
297  DoubleRegister result,
298  bool deoptimize_on_undefined,
299  bool deoptimize_on_minus_zero,
300  LEnvironment* env);
301 
302  // Emits optimized code for typeof x == "y". Modifies input register.
303  // Returns the condition on which a final split to
304  // true and false label should be made, to optimize fallthrough.
305  // Returns two registers in cmp1 and cmp2 that can be used in the
306  // Branch instruction after EmitTypeofIs.
307  Condition EmitTypeofIs(Label* true_label,
308  Label* false_label,
309  Register input,
310  Handle<String> type_name,
311  Register& cmp1,
312  Operand& cmp2);
313 
314  // Emits optimized code for %_IsObject(x). Preserves input register.
315  // Returns the condition on which a final split to
316  // true and false label should be made, to optimize fallthrough.
317  Condition EmitIsObject(Register input,
318  Register temp1,
319  Register temp2,
320  Label* is_not_object,
321  Label* is_object);
322 
323  // Emits optimized code for %_IsString(x). Preserves input register.
324  // Returns the condition on which a final split to
325  // true and false label should be made, to optimize fallthrough.
326  Condition EmitIsString(Register input,
327  Register temp1,
328  Label* is_not_string);
329 
330  // Emits optimized code for %_IsConstructCall().
331  // Caller should branch on equal condition.
332  void EmitIsConstructCall(Register temp1, Register temp2);
333 
334  void EmitLoadFieldOrConstantFunction(Register result,
335  Register object,
336  Handle<Map> type,
337  Handle<String> name,
338  LEnvironment* env);
339 
340  // Emits optimized code to deep-copy the contents of statically known
341  // object graphs (e.g. object literal boilerplate).
342  void EmitDeepCopy(Handle<JSObject> object,
343  Register result,
344  Register source,
345  int* offset);
346 
347  struct JumpTableEntry {
348  explicit inline JumpTableEntry(Address entry)
349  : label(),
350  address(entry) { }
351  Label label;
352  Address address;
353  };
354 
355  void EnsureSpaceForLazyDeopt();
356 
357  LChunk* const chunk_;
358  MacroAssembler* const masm_;
359  CompilationInfo* const info_;
360 
361  int current_block_;
362  int current_instruction_;
363  const ZoneList<LInstruction*>* instructions_;
364  ZoneList<LEnvironment*> deoptimizations_;
365  ZoneList<JumpTableEntry> deopt_jump_table_;
366  ZoneList<Handle<Object> > deoptimization_literals_;
367  int inlined_function_count_;
368  Scope* const scope_;
369  Status status_;
370  TranslationBuffer translations_;
371  ZoneList<LDeferredCode*> deferred_;
372  int osr_pc_offset_;
373  int last_lazy_deopt_pc_;
374 
375  // Builder that keeps track of safepoints in the code. The table
376  // itself is emitted at the end of the generated code.
377  SafepointTableBuilder safepoints_;
378 
379  Zone* zone_;
380 
381  // Compiler from a set of parallel moves to a sequential list of moves.
382  LGapResolver resolver_;
383 
384  Safepoint::Kind expected_safepoint_kind_;
385 
386  class PushSafepointRegistersScope BASE_EMBEDDED {
387  public:
388  PushSafepointRegistersScope(LCodeGen* codegen,
389  Safepoint::Kind kind)
390  : codegen_(codegen) {
391  ASSERT(codegen_->expected_safepoint_kind_ == Safepoint::kSimple);
392  codegen_->expected_safepoint_kind_ = kind;
393 
394  switch (codegen_->expected_safepoint_kind_) {
395  case Safepoint::kWithRegisters:
396  codegen_->masm_->PushSafepointRegisters();
397  break;
398  case Safepoint::kWithRegistersAndDoubles:
399  codegen_->masm_->PushSafepointRegistersAndDoubles();
400  break;
401  default:
402  UNREACHABLE();
403  }
404  }
405 
406  ~PushSafepointRegistersScope() {
407  Safepoint::Kind kind = codegen_->expected_safepoint_kind_;
408  ASSERT((kind & Safepoint::kWithRegisters) != 0);
409  switch (kind) {
410  case Safepoint::kWithRegisters:
411  codegen_->masm_->PopSafepointRegisters();
412  break;
413  case Safepoint::kWithRegistersAndDoubles:
414  codegen_->masm_->PopSafepointRegistersAndDoubles();
415  break;
416  default:
417  UNREACHABLE();
418  }
419  codegen_->expected_safepoint_kind_ = Safepoint::kSimple;
420  }
421 
422  private:
423  LCodeGen* codegen_;
424  };
425 
426  friend class LDeferredCode;
427  friend class LEnvironment;
428  friend class SafepointGenerator;
429  DISALLOW_COPY_AND_ASSIGN(LCodeGen);
430 };
431 
432 
433 class LDeferredCode: public ZoneObject {
434  public:
435  explicit LDeferredCode(LCodeGen* codegen)
436  : codegen_(codegen),
437  external_exit_(NULL),
438  instruction_index_(codegen->current_instruction_) {
439  codegen->AddDeferredCode(this);
440  }
441 
442  virtual ~LDeferredCode() { }
443  virtual void Generate() = 0;
444  virtual LInstruction* instr() = 0;
445 
446  void SetExit(Label* exit) { external_exit_ = exit; }
447  Label* entry() { return &entry_; }
448  Label* exit() { return external_exit_ != NULL ? external_exit_ : &exit_; }
449  int instruction_index() const { return instruction_index_; }
450 
451  protected:
452  LCodeGen* codegen() const { return codegen_; }
453  MacroAssembler* masm() const { return codegen_->masm(); }
454 
455  private:
456  LCodeGen* codegen_;
457  Label entry_;
458  Label exit_;
459  Label* external_exit_;
460  int instruction_index_;
461 };
462 
463 } } // namespace v8::internal
464 
465 #endif // V8_MIPS_LITHIUM_CODEGEN_MIPS_H_
byte * Address
Definition: globals.h:172
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
MacroAssembler * masm() const
static const Function * FunctionForId(FunctionId id)
Definition: runtime.cc:13577
#define ASSERT(condition)
Definition: checks.h:270
MacroAssembler * masm() const
#define LITHIUM_CONCRETE_INSTRUCTION_LIST(V)
Definition: lithium-arm.h:49
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 instructions(ARM only)") DEFINE_bool(enable_armv7
#define UNREACHABLE()
Definition: checks.h:50
DwVfpRegister DoubleRegister
#define DISALLOW_COPY_AND_ASSIGN(TypeName)
Definition: globals.h:321
#define BASE_EMBEDDED
Definition: allocation.h:68
#define DECLARE_DO(type)
virtual LInstruction * instr()=0
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
virtual void Generate()=0
CompilationInfo * info() const
LCodeGen(LChunk *chunk, MacroAssembler *assembler, CompilationInfo *info, Zone *zone)
Register ToRegister(int num)
FlagType type() const
Definition: flags.cc:1358