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
flags.cc
Go to the documentation of this file.
1 // Copyright 2006-2008 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 <ctype.h>
29 #include <stdlib.h>
30 
31 #include "v8.h"
32 
33 #include "platform.h"
34 #include "smart-array-pointer.h"
35 #include "string-stream.h"
36 
37 
38 namespace v8 {
39 namespace internal {
40 
41 // Define all of our flags.
42 #define FLAG_MODE_DEFINE
43 #include "flag-definitions.h"
44 
45 // Define all of our flags default values.
46 #define FLAG_MODE_DEFINE_DEFAULTS
47 #include "flag-definitions.h"
48 
49 namespace {
50 
51 // This structure represents a single entry in the flag system, with a pointer
52 // to the actual flag, default value, comment, etc. This is designed to be POD
53 // initialized as to avoid requiring static constructors.
54 struct Flag {
55  enum FlagType { TYPE_BOOL, TYPE_INT, TYPE_FLOAT, TYPE_STRING, TYPE_ARGS };
56 
57  FlagType type_; // What type of flag, bool, int, or string.
58  const char* name_; // Name of the flag, ex "my_flag".
59  void* valptr_; // Pointer to the global flag variable.
60  const void* defptr_; // Pointer to the default value.
61  const char* cmt_; // A comment about the flags purpose.
62  bool owns_ptr_; // Does the flag own its string value?
63 
64  FlagType type() const { return type_; }
65 
66  const char* name() const { return name_; }
67 
68  const char* comment() const { return cmt_; }
69 
70  bool* bool_variable() const {
71  ASSERT(type_ == TYPE_BOOL);
72  return reinterpret_cast<bool*>(valptr_);
73  }
74 
75  int* int_variable() const {
76  ASSERT(type_ == TYPE_INT);
77  return reinterpret_cast<int*>(valptr_);
78  }
79 
80  double* float_variable() const {
81  ASSERT(type_ == TYPE_FLOAT);
82  return reinterpret_cast<double*>(valptr_);
83  }
84 
85  const char* string_value() const {
86  ASSERT(type_ == TYPE_STRING);
87  return *reinterpret_cast<const char**>(valptr_);
88  }
89 
90  void set_string_value(const char* value, bool owns_ptr) {
91  ASSERT(type_ == TYPE_STRING);
92  const char** ptr = reinterpret_cast<const char**>(valptr_);
93  if (owns_ptr_ && *ptr != NULL) DeleteArray(*ptr);
94  *ptr = value;
95  owns_ptr_ = owns_ptr;
96  }
97 
98  JSArguments* args_variable() const {
99  ASSERT(type_ == TYPE_ARGS);
100  return reinterpret_cast<JSArguments*>(valptr_);
101  }
102 
103  bool bool_default() const {
104  ASSERT(type_ == TYPE_BOOL);
105  return *reinterpret_cast<const bool*>(defptr_);
106  }
107 
108  int int_default() const {
109  ASSERT(type_ == TYPE_INT);
110  return *reinterpret_cast<const int*>(defptr_);
111  }
112 
113  double float_default() const {
114  ASSERT(type_ == TYPE_FLOAT);
115  return *reinterpret_cast<const double*>(defptr_);
116  }
117 
118  const char* string_default() const {
119  ASSERT(type_ == TYPE_STRING);
120  return *reinterpret_cast<const char* const *>(defptr_);
121  }
122 
123  JSArguments args_default() const {
124  ASSERT(type_ == TYPE_ARGS);
125  return *reinterpret_cast<const JSArguments*>(defptr_);
126  }
127 
128  // Compare this flag's current value against the default.
129  bool IsDefault() const {
130  switch (type_) {
131  case TYPE_BOOL:
132  return *bool_variable() == bool_default();
133  case TYPE_INT:
134  return *int_variable() == int_default();
135  case TYPE_FLOAT:
137  case TYPE_STRING: {
138  const char* str1 = string_value();
139  const char* str2 = string_default();
140  if (str2 == NULL) return str1 == NULL;
141  if (str1 == NULL) return str2 == NULL;
142  return strcmp(str1, str2) == 0;
143  }
144  case TYPE_ARGS:
145  return args_variable()->argc() == 0;
146  }
147  UNREACHABLE();
148  return true;
149  }
150 
151  // Set a flag back to it's default value.
152  void Reset() {
153  switch (type_) {
154  case TYPE_BOOL:
156  break;
157  case TYPE_INT:
158  *int_variable() = int_default();
159  break;
160  case TYPE_FLOAT:
162  break;
163  case TYPE_STRING:
165  break;
166  case TYPE_ARGS:
168  break;
169  }
170  }
171 };
172 
173 Flag flags[] = {
174 #define FLAG_MODE_META
175 #include "flag-definitions.h"
176 };
177 
178 const size_t num_flags = sizeof(flags) / sizeof(*flags);
179 
180 } // namespace
181 
182 
183 static const char* Type2String(Flag::FlagType type) {
184  switch (type) {
185  case Flag::TYPE_BOOL: return "bool";
186  case Flag::TYPE_INT: return "int";
187  case Flag::TYPE_FLOAT: return "float";
188  case Flag::TYPE_STRING: return "string";
189  case Flag::TYPE_ARGS: return "arguments";
190  }
191  UNREACHABLE();
192  return NULL;
193 }
194 
195 
196 static SmartArrayPointer<const char> ToString(Flag* flag) {
197  HeapStringAllocator string_allocator;
198  StringStream buffer(&string_allocator);
199  switch (flag->type()) {
200  case Flag::TYPE_BOOL:
201  buffer.Add("%s", (*flag->bool_variable() ? "true" : "false"));
202  break;
203  case Flag::TYPE_INT:
204  buffer.Add("%d", *flag->int_variable());
205  break;
206  case Flag::TYPE_FLOAT:
207  buffer.Add("%f", FmtElm(*flag->float_variable()));
208  break;
209  case Flag::TYPE_STRING: {
210  const char* str = flag->string_value();
211  buffer.Add("%s", str ? str : "NULL");
212  break;
213  }
214  case Flag::TYPE_ARGS: {
215  JSArguments args = *flag->args_variable();
216  if (args.argc() > 0) {
217  buffer.Add("%s", args[0]);
218  for (int i = 1; i < args.argc(); i++) {
219  buffer.Add(" %s", args[i]);
220  }
221  }
222  break;
223  }
224  }
225  return buffer.ToCString();
226 }
227 
228 
229 // static
230 List<const char*>* FlagList::argv() {
231  List<const char*>* args = new List<const char*>(8);
232  Flag* args_flag = NULL;
233  for (size_t i = 0; i < num_flags; ++i) {
234  Flag* f = &flags[i];
235  if (!f->IsDefault()) {
236  if (f->type() == Flag::TYPE_ARGS) {
237  ASSERT(args_flag == NULL);
238  args_flag = f; // Must be last in arguments.
239  continue;
240  }
241  HeapStringAllocator string_allocator;
242  StringStream buffer(&string_allocator);
243  if (f->type() != Flag::TYPE_BOOL || *(f->bool_variable())) {
244  buffer.Add("--%s", f->name());
245  } else {
246  buffer.Add("--no%s", f->name());
247  }
248  args->Add(buffer.ToCString().Detach());
249  if (f->type() != Flag::TYPE_BOOL) {
250  args->Add(ToString(f).Detach());
251  }
252  }
253  }
254  if (args_flag != NULL) {
255  HeapStringAllocator string_allocator;
256  StringStream buffer(&string_allocator);
257  buffer.Add("--%s", args_flag->name());
258  args->Add(buffer.ToCString().Detach());
259  JSArguments jsargs = *args_flag->args_variable();
260  for (int j = 0; j < jsargs.argc(); j++) {
261  args->Add(StrDup(jsargs[j]));
262  }
263  }
264  return args;
265 }
266 
267 
268 // Helper function to parse flags: Takes an argument arg and splits it into
269 // a flag name and flag value (or NULL if they are missing). is_bool is set
270 // if the arg started with "-no" or "--no". The buffer may be used to NUL-
271 // terminate the name, it must be large enough to hold any possible name.
272 static void SplitArgument(const char* arg,
273  char* buffer,
274  int buffer_size,
275  const char** name,
276  const char** value,
277  bool* is_bool) {
278  *name = NULL;
279  *value = NULL;
280  *is_bool = false;
281 
282  if (arg != NULL && *arg == '-') {
283  // find the begin of the flag name
284  arg++; // remove 1st '-'
285  if (*arg == '-') {
286  arg++; // remove 2nd '-'
287  if (arg[0] == '\0') {
288  const char* kJSArgumentsFlagName = "js_arguments";
289  *name = kJSArgumentsFlagName;
290  return;
291  }
292  }
293  if (arg[0] == 'n' && arg[1] == 'o') {
294  arg += 2; // remove "no"
295  *is_bool = true;
296  }
297  *name = arg;
298 
299  // find the end of the flag name
300  while (*arg != '\0' && *arg != '=')
301  arg++;
302 
303  // get the value if any
304  if (*arg == '=') {
305  // make a copy so we can NUL-terminate flag name
306  size_t n = arg - *name;
307  CHECK(n < static_cast<size_t>(buffer_size)); // buffer is too small
308  memcpy(buffer, *name, n);
309  buffer[n] = '\0';
310  *name = buffer;
311  // get the value
312  *value = arg + 1;
313  }
314  }
315 }
316 
317 
318 inline char NormalizeChar(char ch) {
319  return ch == '_' ? '-' : ch;
320 }
321 
322 
323 static bool EqualNames(const char* a, const char* b) {
324  for (int i = 0; NormalizeChar(a[i]) == NormalizeChar(b[i]); i++) {
325  if (a[i] == '\0') {
326  return true;
327  }
328  }
329  return false;
330 }
331 
332 
333 static Flag* FindFlag(const char* name) {
334  for (size_t i = 0; i < num_flags; ++i) {
335  if (EqualNames(name, flags[i].name()))
336  return &flags[i];
337  }
338  return NULL;
339 }
340 
341 
342 // static
343 int FlagList::SetFlagsFromCommandLine(int* argc,
344  char** argv,
345  bool remove_flags) {
346  // parse arguments
347  for (int i = 1; i < *argc;) {
348  int j = i; // j > 0
349  const char* arg = argv[i++];
350 
351  // split arg into flag components
352  char buffer[1*KB];
353  const char* name;
354  const char* value;
355  bool is_bool;
356  SplitArgument(arg, buffer, sizeof buffer, &name, &value, &is_bool);
357 
358  if (name != NULL) {
359  // lookup the flag
360  Flag* flag = FindFlag(name);
361  if (flag == NULL) {
362  if (remove_flags) {
363  // We don't recognize this flag but since we're removing
364  // the flags we recognize we assume that the remaining flags
365  // will be processed somewhere else so this flag might make
366  // sense there.
367  continue;
368  } else {
369  fprintf(stderr, "Error: unrecognized flag %s\n"
370  "Try --help for options\n", arg);
371  return j;
372  }
373  }
374 
375  // if we still need a flag value, use the next argument if available
376  if (flag->type() != Flag::TYPE_BOOL &&
377  flag->type() != Flag::TYPE_ARGS &&
378  value == NULL) {
379  if (i < *argc) {
380  value = argv[i++];
381  } else {
382  fprintf(stderr, "Error: missing value for flag %s of type %s\n"
383  "Try --help for options\n",
384  arg, Type2String(flag->type()));
385  return j;
386  }
387  }
388 
389  // set the flag
390  char* endp = const_cast<char*>(""); // *endp is only read
391  switch (flag->type()) {
392  case Flag::TYPE_BOOL:
393  *flag->bool_variable() = !is_bool;
394  break;
395  case Flag::TYPE_INT:
396  *flag->int_variable() = strtol(value, &endp, 10); // NOLINT
397  break;
398  case Flag::TYPE_FLOAT:
399  *flag->float_variable() = strtod(value, &endp);
400  break;
401  case Flag::TYPE_STRING:
402  flag->set_string_value(value ? StrDup(value) : NULL, true);
403  break;
404  case Flag::TYPE_ARGS: {
405  int start_pos = (value == NULL) ? i : i - 1;
406  int js_argc = *argc - start_pos;
407  const char** js_argv = NewArray<const char*>(js_argc);
408  if (value != NULL) {
409  js_argv[0] = StrDup(value);
410  }
411  for (int k = i; k < *argc; k++) {
412  js_argv[k - start_pos] = StrDup(argv[k]);
413  }
414  *flag->args_variable() = JSArguments::Create(js_argc, js_argv);
415  i = *argc; // Consume all arguments
416  break;
417  }
418  }
419 
420  // handle errors
421  if ((flag->type() == Flag::TYPE_BOOL && value != NULL) ||
422  (flag->type() != Flag::TYPE_BOOL && is_bool) ||
423  *endp != '\0') {
424  fprintf(stderr, "Error: illegal value for flag %s of type %s\n"
425  "Try --help for options\n",
426  arg, Type2String(flag->type()));
427  return j;
428  }
429 
430  // remove the flag & value from the command
431  if (remove_flags) {
432  while (j < i) {
433  argv[j++] = NULL;
434  }
435  }
436  }
437  }
438 
439  // shrink the argument list
440  if (remove_flags) {
441  int j = 1;
442  for (int i = 1; i < *argc; i++) {
443  if (argv[i] != NULL)
444  argv[j++] = argv[i];
445  }
446  *argc = j;
447  }
448 
449  if (FLAG_help) {
450  PrintHelp();
451  exit(0);
452  }
453  // parsed all flags successfully
454  return 0;
455 }
456 
457 
458 static char* SkipWhiteSpace(char* p) {
459  while (*p != '\0' && isspace(*p) != 0) p++;
460  return p;
461 }
462 
463 
464 static char* SkipBlackSpace(char* p) {
465  while (*p != '\0' && isspace(*p) == 0) p++;
466  return p;
467 }
468 
469 
470 // static
471 int FlagList::SetFlagsFromString(const char* str, int len) {
472  // make a 0-terminated copy of str
473  ScopedVector<char> copy0(len + 1);
474  memcpy(copy0.start(), str, len);
475  copy0[len] = '\0';
476 
477  // strip leading white space
478  char* copy = SkipWhiteSpace(copy0.start());
479 
480  // count the number of 'arguments'
481  int argc = 1; // be compatible with SetFlagsFromCommandLine()
482  for (char* p = copy; *p != '\0'; argc++) {
483  p = SkipBlackSpace(p);
484  p = SkipWhiteSpace(p);
485  }
486 
487  // allocate argument array
488  ScopedVector<char*> argv(argc);
489 
490  // split the flags string into arguments
491  argc = 1; // be compatible with SetFlagsFromCommandLine()
492  for (char* p = copy; *p != '\0'; argc++) {
493  argv[argc] = p;
494  p = SkipBlackSpace(p);
495  if (*p != '\0') *p++ = '\0'; // 0-terminate argument
496  p = SkipWhiteSpace(p);
497  }
498 
499  // set the flags
500  int result = SetFlagsFromCommandLine(&argc, argv.start(), false);
501 
502  return result;
503 }
504 
505 
506 // static
507 void FlagList::ResetAllFlags() {
508  for (size_t i = 0; i < num_flags; ++i) {
509  flags[i].Reset();
510  }
511 }
512 
513 
514 // static
515 void FlagList::PrintHelp() {
516  printf("Usage:\n");
517  printf(" shell [options] -e string\n");
518  printf(" execute string in V8\n");
519  printf(" shell [options] file1 file2 ... filek\n");
520  printf(" run JavaScript scripts in file1, file2, ..., filek\n");
521  printf(" shell [options]\n");
522  printf(" shell [options] --shell [file1 file2 ... filek]\n");
523  printf(" run an interactive JavaScript shell\n");
524  printf(" d8 [options] file1 file2 ... filek\n");
525  printf(" d8 [options]\n");
526  printf(" d8 [options] --shell [file1 file2 ... filek]\n");
527  printf(" run the new debugging shell\n\n");
528  printf("Options:\n");
529  for (size_t i = 0; i < num_flags; ++i) {
530  Flag* f = &flags[i];
531  SmartArrayPointer<const char> value = ToString(f);
532  printf(" --%s (%s)\n type: %s default: %s\n",
533  f->name(), f->comment(), Type2String(f->type()), *value);
534  }
535 }
536 
537 
538 void FlagList::EnforceFlagImplications() {
539 #define FLAG_MODE_DEFINE_IMPLICATIONS
540 #include "flag-definitions.h"
541 }
542 
543 } } // namespace v8::internal
bool bool_default() const
Definition: flags.cc:1397
void Reset()
Definition: flags.cc:1446
int int_default() const
Definition: flags.cc:1402
double float_default() const
Definition: flags.cc:1407
const int KB
Definition: globals.h:221
double * float_variable() const
Definition: flags.cc:1374
const char * string_default() const
Definition: flags.cc:1412
const char * string_value() const
Definition: flags.cc:1379
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
Flag flags[]
Definition: flags.cc:1467
void * valptr_
Definition: flags.cc:1353
FlagType type_
Definition: flags.cc:1351
#define ASSERT(condition)
Definition: checks.h:270
char NormalizeChar(char ch)
Definition: flags.cc:318
const char * comment() const
Definition: flags.cc:1362
bool * bool_variable() const
Definition: flags.cc:1364
int * int_variable() const
Definition: flags.cc:1369
#define CHECK(condition)
Definition: checks.h:56
const void * defptr_
Definition: flags.cc:1354
const char * cmt_
Definition: flags.cc:1355
#define UNREACHABLE()
Definition: checks.h:50
JSArguments * args_variable() const
Definition: flags.cc:1392
static JSArguments Create(int argc, const char **argv)
Definition: flags.h:102
int argc() const
Definition: flags.h:88
JSArguments args_default() const
Definition: flags.cc:1417
kPropertyAccessorsOffset kNamedPropertyHandlerOffset kInstanceTemplateOffset kAccessCheckInfoOffset kEvalFrominstructionsOffsetOffset kThisPropertyAssignmentsOffset flag
Definition: objects-inl.h:3682
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
const size_t num_flags
Definition: flags.cc:178
void set_string_value(const char *value, bool owns_ptr)
Definition: flags.cc:1384
bool owns_ptr_
Definition: flags.cc:1356
char * StrDup(const char *str)
Definition: allocation.cc:85
const char * name_
Definition: flags.cc:1352
bool IsDefault() const
Definition: flags.cc:1423
void DeleteArray(T *array)
Definition: allocation.h:91
FlagType type() const
Definition: flags.cc:1358