| 1 | // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file | 
|---|
| 2 | // for details. All rights reserved. Use of this source code is governed by a | 
|---|
| 3 | // BSD-style license that can be found in the LICENSE file. | 
|---|
| 4 |  | 
|---|
| 5 | #ifndef RUNTIME_VM_FLAG_LIST_H_ | 
|---|
| 6 | #define RUNTIME_VM_FLAG_LIST_H_ | 
|---|
| 7 |  | 
|---|
| 8 | #include "platform/thread_sanitizer.h" | 
|---|
| 9 |  | 
|---|
| 10 | // Don't use USING_PRODUCT outside of this file. | 
|---|
| 11 | #if defined(PRODUCT) | 
|---|
| 12 | #define USING_PRODUCT true | 
|---|
| 13 | #else | 
|---|
| 14 | #define USING_PRODUCT false | 
|---|
| 15 | #endif | 
|---|
| 16 |  | 
|---|
| 17 | #if defined(DART_PRECOMPILED_RUNTIME) | 
|---|
| 18 | constexpr bool kDartPrecompiledRuntime = true; | 
|---|
| 19 | #else | 
|---|
| 20 | constexpr bool kDartPrecompiledRuntime = false; | 
|---|
| 21 | #endif | 
|---|
| 22 |  | 
|---|
| 23 | #if defined(DART_USE_BYTECODE) | 
|---|
| 24 | constexpr bool kDartUseBytecode = true; | 
|---|
| 25 | #else | 
|---|
| 26 | constexpr bool kDartUseBytecode = false; | 
|---|
| 27 | #endif | 
|---|
| 28 |  | 
|---|
| 29 | #if defined(USING_THREAD_SANITIZER) | 
|---|
| 30 | // TODO(39611): Address races in the background compiler. | 
|---|
| 31 | constexpr bool kDartUseBackgroundCompilation = false; | 
|---|
| 32 | #else | 
|---|
| 33 | constexpr bool kDartUseBackgroundCompilation = true; | 
|---|
| 34 | #endif | 
|---|
| 35 |  | 
|---|
| 36 | // The disassembler might be force included even in product builds so we need | 
|---|
| 37 | // to conditionally make these into product flags to make the disassembler | 
|---|
| 38 | // usable in product mode. | 
|---|
| 39 | #if defined(FORCE_INCLUDE_DISASSEMBLER) | 
|---|
| 40 | #define DISASSEMBLE_FLAGS(P, R, C, D)                                          \ | 
|---|
| 41 | P(disassemble, bool, false, "Disassemble dart code.")                        \ | 
|---|
| 42 | P(disassemble_optimized, bool, false, "Disassemble optimized code.")         \ | 
|---|
| 43 | P(disassemble_relative, bool, false, "Use offsets instead of absolute PCs")  \ | 
|---|
| 44 | P(support_disassembler, bool, true, "Support the disassembler.") | 
|---|
| 45 | #else | 
|---|
| 46 | #define DISASSEMBLE_FLAGS(P, R, C, D)                                          \ | 
|---|
| 47 | R(disassemble, false, bool, false, "Disassemble dart code.")                 \ | 
|---|
| 48 | R(disassemble_optimized, false, bool, false, "Disassemble optimized code.")  \ | 
|---|
| 49 | R(disassemble_relative, false, bool, false,                                  \ | 
|---|
| 50 | "Use offsets instead of absolute PCs")                                     \ | 
|---|
| 51 | R(support_disassembler, false, bool, true, "Support the disassembler.") | 
|---|
| 52 | #endif | 
|---|
| 53 |  | 
|---|
| 54 | // List of VM-global (i.e. non-isolate specific) flags. | 
|---|
| 55 | // | 
|---|
| 56 | // The value used for those flags at snapshot generation time needs to be the | 
|---|
| 57 | // same as during runtime. Currently, only boolean flags are supported. | 
|---|
| 58 | // | 
|---|
| 59 | // The syntax used is the same as that for FLAG_LIST below, as these flags are | 
|---|
| 60 | // automatically included in FLAG_LIST. | 
|---|
| 61 | #define VM_GLOBAL_FLAG_LIST(P, R, C, D)                                        \ | 
|---|
| 62 | P(dwarf_stack_traces_mode, bool, false,                                      \ | 
|---|
| 63 | "Use --[no-]dwarf-stack-traces instead.")                                  \ | 
|---|
| 64 | P(causal_async_stacks, bool, !USING_PRODUCT, "Improved async stacks")        \ | 
|---|
| 65 | P(lazy_async_stacks, bool, false, "Reconstruct async stacks from listeners") \ | 
|---|
| 66 | P(lazy_dispatchers, bool, true, "Generate dispatchers lazily")               \ | 
|---|
| 67 | P(use_bare_instructions, bool, true, "Enable bare instructions mode.")       \ | 
|---|
| 68 | R(dedup_instructions, true, bool, false,                                     \ | 
|---|
| 69 | "Canonicalize instructions when precompiling.") | 
|---|
| 70 |  | 
|---|
| 71 | // List of all flags in the VM. | 
|---|
| 72 | // Flags can be one of four categories: | 
|---|
| 73 | // * P roduct flags: Can be set in any of the deployment modes, including in | 
|---|
| 74 | //   production. | 
|---|
| 75 | // * R elease flags: Generally available flags except when building product. | 
|---|
| 76 | // * pre C ompile flags: Generally available flags except when building product | 
|---|
| 77 | //   or precompiled runtime. | 
|---|
| 78 | // * D ebug flags: Can only be set in debug VMs, which also have C++ assertions | 
|---|
| 79 | //   enabled. | 
|---|
| 80 | // | 
|---|
| 81 | // Usage: | 
|---|
| 82 | //   P(name, type, default_value, comment) | 
|---|
| 83 | //   R(name, product_value, type, default_value, comment) | 
|---|
| 84 | //   C(name, precompiled_value, product_value, type, default_value, comment) | 
|---|
| 85 | //   D(name, type, default_value, comment) | 
|---|
| 86 | #define FLAG_LIST(P, R, C, D)                                                  \ | 
|---|
| 87 | VM_GLOBAL_FLAG_LIST(P, R, C, D)                                              \ | 
|---|
| 88 | DISASSEMBLE_FLAGS(P, R, C, D)                                                \ | 
|---|
| 89 | P(abort_on_oom, bool, false,                                                 \ | 
|---|
| 90 | "Abort if memory allocation fails - use only with --old-gen-heap-size")    \ | 
|---|
| 91 | C(async_debugger, false, false, bool, true,                                  \ | 
|---|
| 92 | "Debugger support async functions.")                                       \ | 
|---|
| 93 | P(async_igoto_threshold, int, 5,                                             \ | 
|---|
| 94 | "Number of continuations after which igoto-based async is used."           \ | 
|---|
| 95 | "-1 means never.")                                                         \ | 
|---|
| 96 | P(background_compilation, bool, kDartUseBackgroundCompilation,               \ | 
|---|
| 97 | "Run optimizing compilation in background")                                \ | 
|---|
| 98 | R(code_comments, false, bool, false,                                         \ | 
|---|
| 99 | "Include comments into code and disassembly.")                             \ | 
|---|
| 100 | P(collect_code, bool, false, "Attempt to GC infrequently used code.")        \ | 
|---|
| 101 | P(collect_dynamic_function_names, bool, true,                                \ | 
|---|
| 102 | "Collects all dynamic function names to identify unique targets")          \ | 
|---|
| 103 | P(compactor_tasks, int, 2,                                                   \ | 
|---|
| 104 | "The number of tasks to use for parallel compaction.")                     \ | 
|---|
| 105 | P(compilation_counter_threshold, int, 10,                                    \ | 
|---|
| 106 | "Function's usage-counter value before interpreted function is compiled, " \ | 
|---|
| 107 | "-1 means never")                                                          \ | 
|---|
| 108 | P(concurrent_mark, bool, true, "Concurrent mark for old generation.")        \ | 
|---|
| 109 | P(concurrent_sweep, bool, true, "Concurrent sweep for old generation.")      \ | 
|---|
| 110 | C(deoptimize_alot, false, false, bool, false,                                \ | 
|---|
| 111 | "Deoptimizes we are about to return to Dart code from native entries.")    \ | 
|---|
| 112 | C(deoptimize_every, 0, 0, int, 0,                                            \ | 
|---|
| 113 | "Deoptimize on every N stack overflow checks")                             \ | 
|---|
| 114 | R(disable_alloc_stubs_after_gc, false, bool, false, "Stress testing flag.")  \ | 
|---|
| 115 | R(dump_megamorphic_stats, false, bool, false,                                \ | 
|---|
| 116 | "Dump megamorphic cache statistics")                                       \ | 
|---|
| 117 | R(dump_symbol_stats, false, bool, false, "Dump symbol table statistics")     \ | 
|---|
| 118 | R(enable_asserts, false, bool, false, "Enable assert statements.")           \ | 
|---|
| 119 | R(null_assertions, false, bool, false,                                       \ | 
|---|
| 120 | "Enable null assertions for parameters.")                                  \ | 
|---|
| 121 | P(enable_kernel_expression_compilation, bool, true,                          \ | 
|---|
| 122 | "Compile expressions with the Kernel front-end.")                          \ | 
|---|
| 123 | P(enable_mirrors, bool, true,                                                \ | 
|---|
| 124 | "Disable to make importing dart:mirrors an error.")                        \ | 
|---|
| 125 | P(enable_ffi, bool, true, "Disable to make importing dart:ffi an error.")    \ | 
|---|
| 126 | P(fields_may_be_reset, bool, false,                                          \ | 
|---|
| 127 | "Don't optimize away static field initialization")                         \ | 
|---|
| 128 | C(force_clone_compiler_objects, false, false, bool, false,                   \ | 
|---|
| 129 | "Force cloning of objects needed in compiler (ICData and Field).")         \ | 
|---|
| 130 | P(getter_setter_ratio, int, 13,                                              \ | 
|---|
| 131 | "Ratio of getter/setter usage used for double field unboxing heuristics")  \ | 
|---|
| 132 | P(guess_icdata_cid, bool, true,                                              \ | 
|---|
| 133 | "Artificially create type feedback for arithmetic etc. operations")        \ | 
|---|
| 134 | P(huge_method_cutoff_in_tokens, int, 20000,                                  \ | 
|---|
| 135 | "Huge method cutoff in tokens: Disables optimizations for huge methods.")  \ | 
|---|
| 136 | P(idle_timeout_micros, int, 1000 * kMicrosecondsPerMillisecond,              \ | 
|---|
| 137 | "Consider thread pool isolates for idle tasks after this long.")           \ | 
|---|
| 138 | P(idle_duration_micros, int, 500 * kMicrosecondsPerMillisecond,              \ | 
|---|
| 139 | "Allow idle tasks to run for this long.")                                  \ | 
|---|
| 140 | P(interpret_irregexp, bool, false, "Use irregexp bytecode interpreter")      \ | 
|---|
| 141 | P(link_natives_lazily, bool, false, "Link native calls lazily")              \ | 
|---|
| 142 | R(log_marker_tasks, false, bool, false,                                      \ | 
|---|
| 143 | "Log debugging information for old gen GC marking tasks.")                 \ | 
|---|
| 144 | P(scavenger_tasks, int, 2,                                                   \ | 
|---|
| 145 | "The number of tasks to spawn during scavenging (0 means "                 \ | 
|---|
| 146 | "perform all marking on main thread).")                                    \ | 
|---|
| 147 | P(marker_tasks, int, 2,                                                      \ | 
|---|
| 148 | "The number of tasks to spawn during old gen GC marking (0 means "         \ | 
|---|
| 149 | "perform all marking on main thread).")                                    \ | 
|---|
| 150 | P(max_polymorphic_checks, int, 4,                                            \ | 
|---|
| 151 | "Maximum number of polymorphic check, otherwise it is megamorphic.")       \ | 
|---|
| 152 | P(max_equality_polymorphic_checks, int, 32,                                  \ | 
|---|
| 153 | "Maximum number of polymorphic checks in equality operator,")              \ | 
|---|
| 154 | P(new_gen_semi_max_size, int, (kWordSize <= 4) ? 8 : 16,                     \ | 
|---|
| 155 | "Max size of new gen semi space in MB")                                    \ | 
|---|
| 156 | P(new_gen_semi_initial_size, int, (kWordSize <= 4) ? 1 : 2,                  \ | 
|---|
| 157 | "Initial size of new gen semi space in MB")                                \ | 
|---|
| 158 | P(optimization_counter_threshold, int, 30000,                                \ | 
|---|
| 159 | "Function's usage-counter value before it is optimized, -1 means never")   \ | 
|---|
| 160 | R(randomize_optimization_counter, false, bool, false,                        \ | 
|---|
| 161 | "Randomize optimization counter thresholds on a per-function basis (for "  \ | 
|---|
| 162 | "testing).")                                                               \ | 
|---|
| 163 | P(optimization_level, int, 2,                                                \ | 
|---|
| 164 | "Optimization level: 1 (favor size), 2 (default), 3 (favor speed)")        \ | 
|---|
| 165 | P(old_gen_heap_size, int, kDefaultMaxOldGenHeapSize,                         \ | 
|---|
| 166 | "Max size of old gen heap size in MB, or 0 for unlimited,"                 \ | 
|---|
| 167 | "e.g: --old_gen_heap_size=1024 allows up to 1024MB old gen heap")          \ | 
|---|
| 168 | R(pause_isolates_on_start, false, bool, false,                               \ | 
|---|
| 169 | "Pause isolates before starting.")                                         \ | 
|---|
| 170 | R(pause_isolates_on_exit, false, bool, false, "Pause isolates exiting.")     \ | 
|---|
| 171 | R(pause_isolates_on_unhandled_exceptions, false, bool, false,                \ | 
|---|
| 172 | "Pause isolates on unhandled exceptions.")                                 \ | 
|---|
| 173 | P(polymorphic_with_deopt, bool, true,                                        \ | 
|---|
| 174 | "Polymorphic calls with deoptimization / megamorphic call")                \ | 
|---|
| 175 | P(precompiled_mode, bool, false, "Precompilation compiler mode")             \ | 
|---|
| 176 | P(print_snapshot_sizes, bool, false, "Print sizes of generated snapshots.")  \ | 
|---|
| 177 | P(print_snapshot_sizes_verbose, bool, false,                                 \ | 
|---|
| 178 | "Print cluster sizes of generated snapshots.")                             \ | 
|---|
| 179 | P(print_benchmarking_metrics, bool, false,                                   \ | 
|---|
| 180 | "Print additional memory and latency metrics for benchmarking.")           \ | 
|---|
| 181 | R(print_ssa_liveranges, false, bool, false,                                  \ | 
|---|
| 182 | "Print live ranges after allocation.")                                     \ | 
|---|
| 183 | R(print_stacktrace_at_api_error, false, bool, false,                         \ | 
|---|
| 184 | "Attempt to print a native stack trace when an API error is created.")     \ | 
|---|
| 185 | D(print_variable_descriptors, bool, false,                                   \ | 
|---|
| 186 | "Print variable descriptors in disassembly.")                              \ | 
|---|
| 187 | R(profiler, false, bool, false, "Enable the profiler.")                      \ | 
|---|
| 188 | R(profiler_native_memory, false, bool, false,                                \ | 
|---|
| 189 | "Enable native memory statistic collection.")                              \ | 
|---|
| 190 | P(reorder_basic_blocks, bool, true, "Reorder basic blocks")                  \ | 
|---|
| 191 | C(stress_async_stacks, false, false, bool, false,                            \ | 
|---|
| 192 | "Stress test async stack traces")                                          \ | 
|---|
| 193 | P(use_table_dispatch, bool, true, "Enable dispatch table based calls.")      \ | 
|---|
| 194 | P(retain_function_objects, bool, true,                                       \ | 
|---|
| 195 | "Serialize function objects for all code objects even if not otherwise "   \ | 
|---|
| 196 | "needed in the precompiled runtime.")                                      \ | 
|---|
| 197 | P(enable_isolate_groups, bool, false, "Enable isolate group support.")       \ | 
|---|
| 198 | P(show_invisible_frames, bool, false,                                        \ | 
|---|
| 199 | "Show invisible frames in stack traces.")                                  \ | 
|---|
| 200 | R(show_invisible_isolates, false, bool, false,                               \ | 
|---|
| 201 | "Show invisible isolates in the vm-service.")                              \ | 
|---|
| 202 | R(support_il_printer, false, bool, true, "Support the IL printer.")          \ | 
|---|
| 203 | D(trace_cha, bool, false, "Trace CHA operations")                            \ | 
|---|
| 204 | R(trace_field_guards, false, bool, false, "Trace changes in field's cids.")  \ | 
|---|
| 205 | D(trace_ic, bool, false, "Trace IC handling")                                \ | 
|---|
| 206 | D(trace_ic_miss_in_optimized, bool, false,                                   \ | 
|---|
| 207 | "Trace IC miss in optimized code")                                         \ | 
|---|
| 208 | C(trace_irregexp, false, false, bool, false, "Trace irregexps.")             \ | 
|---|
| 209 | D(trace_intrinsified_natives, bool, false,                                   \ | 
|---|
| 210 | "Report if any of the intrinsified natives are called")                    \ | 
|---|
| 211 | D(trace_isolates, bool, false, "Trace isolate creation and shut down.")      \ | 
|---|
| 212 | D(trace_handles, bool, false, "Traces allocation of handles.")               \ | 
|---|
| 213 | D(trace_kernel_binary, bool, false, "Trace Kernel reader/writer.")           \ | 
|---|
| 214 | D(trace_natives, bool, false, "Trace invocation of natives")                 \ | 
|---|
| 215 | D(trace_optimization, bool, false, "Print optimization details.")            \ | 
|---|
| 216 | R(trace_profiler, false, bool, false, "Profiler trace")                      \ | 
|---|
| 217 | D(trace_profiler_verbose, bool, false, "Verbose profiler trace")             \ | 
|---|
| 218 | D(trace_runtime_calls, bool, false, "Trace runtime calls.")                  \ | 
|---|
| 219 | R(trace_ssa_allocator, false, bool, false,                                   \ | 
|---|
| 220 | "Trace register allocation over SSA.")                                     \ | 
|---|
| 221 | P(trace_strong_mode_types, bool, false,                                      \ | 
|---|
| 222 | "Trace optimizations based on strong mode types.")                         \ | 
|---|
| 223 | D(trace_type_checks, bool, false, "Trace runtime type checks.")              \ | 
|---|
| 224 | D(trace_patching, bool, false, "Trace patching of code.")                    \ | 
|---|
| 225 | D(trace_optimized_ic_calls, bool, false,                                     \ | 
|---|
| 226 | "Trace IC calls in optimized code.")                                       \ | 
|---|
| 227 | D(trace_zones, bool, false, "Traces allocation sizes in the zone.")          \ | 
|---|
| 228 | P(truncating_left_shift, bool, true,                                         \ | 
|---|
| 229 | "Optimize left shift to truncate if possible")                             \ | 
|---|
| 230 | P(use_bytecode_compiler, bool, kDartUseBytecode, "Compile from bytecode")    \ | 
|---|
| 231 | P(use_compactor, bool, false, "Compact the heap during old-space GC.")       \ | 
|---|
| 232 | P(use_cha_deopt, bool, true,                                                 \ | 
|---|
| 233 | "Use class hierarchy analysis even if it can cause deoptimization.")       \ | 
|---|
| 234 | P(use_field_guards, bool, true, "Use field guards and track field types")    \ | 
|---|
| 235 | C(use_osr, false, true, bool, true, "Use OSR")                               \ | 
|---|
| 236 | R(verbose_gc, false, bool, false, "Enables verbose GC.")                     \ | 
|---|
| 237 | R(verbose_gc_hdr, 40, int, 40, "Print verbose GC header interval.")          \ | 
|---|
| 238 | R(verify_after_gc, false, bool, false,                                       \ | 
|---|
| 239 | "Enables heap verification after GC.")                                     \ | 
|---|
| 240 | R(verify_before_gc, false, bool, false,                                      \ | 
|---|
| 241 | "Enables heap verification before GC.")                                    \ | 
|---|
| 242 | R(verify_store_buffer, false, bool, false,                                   \ | 
|---|
| 243 | "Enables store buffer verification before and after scavenges.")           \ | 
|---|
| 244 | P(enable_slow_path_sharing, bool, true, "Enable sharing of slow-path code.") \ | 
|---|
| 245 | P(shared_slow_path_triggers_gc, bool, false,                                 \ | 
|---|
| 246 | "TESTING: slow-path triggers a GC.")                                       \ | 
|---|
| 247 | P(enable_multiple_entrypoints, bool, true,                                   \ | 
|---|
| 248 | "Enable multiple entrypoints per-function and related optimizations.")     \ | 
|---|
| 249 | P(enable_testing_pragmas, bool, false,                                       \ | 
|---|
| 250 | "Enable magical pragmas for testing purposes. Use at your own risk!")      \ | 
|---|
| 251 | R(eliminate_type_checks, true, bool, true,                                   \ | 
|---|
| 252 | "Eliminate type checks when allowed by static type analysis.")             \ | 
|---|
| 253 | P(enable_interpreter, bool, false, "Enable interpreting kernel bytecode.")   \ | 
|---|
| 254 | D(support_rr, bool, false, "Support running within RR.")                     \ | 
|---|
| 255 | P(verify_entry_points, bool, false,                                          \ | 
|---|
| 256 | "Throw API error on invalid member access throuh native API. See "         \ | 
|---|
| 257 | "entry_point_pragma.md") | 
|---|
| 258 |  | 
|---|
| 259 | #endif  // RUNTIME_VM_FLAG_LIST_H_ | 
|---|
| 260 |  | 
|---|