1// Copyright (c) 2017, 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_BIN_MAIN_OPTIONS_H_
6#define RUNTIME_BIN_MAIN_OPTIONS_H_
7
8#include "bin/dartutils.h"
9#include "bin/dfe.h"
10#include "platform/globals.h"
11#include "platform/growable_array.h"
12#include "platform/hashmap.h"
13
14namespace dart {
15namespace bin {
16
17// A list of options taking string arguments. Organized as:
18// V(flag_name, field_name)
19// The value of the flag can then be accessed with Options::field_name().
20#define STRING_OPTIONS_LIST(V) \
21 V(packages, packages_file) \
22 V(snapshot, snapshot_filename) \
23 V(snapshot_depfile, snapshot_deps_filename) \
24 V(depfile, depfile) \
25 V(depfile_output_filename, depfile_output_filename) \
26 V(save_compilation_trace, save_compilation_trace_filename) \
27 V(load_compilation_trace, load_compilation_trace_filename) \
28 V(save_type_feedback, save_type_feedback_filename) \
29 V(load_type_feedback, load_type_feedback_filename) \
30 V(root_certs_file, root_certs_file) \
31 V(root_certs_cache, root_certs_cache) \
32 V(namespace, namespc) \
33 V(write_service_info, vm_write_service_info_filename)
34
35// As STRING_OPTIONS_LIST but for boolean valued options. The default value is
36// always false, and the presence of the flag switches the value to true.
37#define BOOL_OPTIONS_LIST(V) \
38 V(version, version_option) \
39 V(compile_all, compile_all) \
40 V(disable_service_origin_check, vm_service_dev_mode) \
41 V(disable_service_auth_codes, vm_service_auth_disabled) \
42 V(deterministic, deterministic) \
43 V(trace_loading, trace_loading) \
44 V(short_socket_read, short_socket_read) \
45 V(short_socket_write, short_socket_write) \
46 V(disable_exit, exit_disabled) \
47 V(preview_dart_2, nop_option) \
48 V(suppress_core_dump, suppress_core_dump) \
49 V(enable_service_port_fallback, enable_service_port_fallback) \
50 V(disable_dart_dev, disable_dart_dev)
51
52// Boolean flags that have a short form.
53#define SHORT_BOOL_OPTIONS_LIST(V) \
54 V(h, help, help_option) \
55 V(v, verbose, verbose_option)
56
57#define DEBUG_BOOL_OPTIONS_LIST(V) \
58 V(force_load_elf_from_memory, force_load_elf_from_memory)
59
60// A list of flags taking arguments from an enum. Organized as:
61// V(flag_name, enum_type, field_name)
62// In main_options.cc there must be a list of strings that matches the enum
63// called k{enum_type}Names. The field is not automatically declared in
64// main_options.cc. It must be explicitly declared.
65#define ENUM_OPTIONS_LIST(V) V(snapshot_kind, SnapshotKind, gen_snapshot_kind)
66
67// Callbacks passed to DEFINE_CB_OPTION().
68#define CB_OPTIONS_LIST(V) \
69 V(ProcessEnvironmentOption) \
70 V(ProcessEnableVmServiceOption) \
71 V(ProcessObserveOption) \
72 V(ProcessEnableExperimentOption) \
73 V(ProcessVMDebuggingOptions)
74
75// This enum must match the strings in kSnapshotKindNames in main_options.cc.
76enum SnapshotKind {
77 kNone,
78 kKernel,
79 kAppJIT,
80};
81
82class Options {
83 public:
84 static int ParseArguments(int argc,
85 char** argv,
86 bool vm_run_app_shapshot,
87 CommandLineOptions* vm_options,
88 char** script_name,
89 CommandLineOptions* dart_options,
90 bool* print_flags_seen,
91 bool* verbose_debug_seen);
92
93#define STRING_OPTION_GETTER(flag, variable) \
94 static const char* variable() { return variable##_; }
95 STRING_OPTIONS_LIST(STRING_OPTION_GETTER)
96#undef STRING_OPTION_GETTER
97
98#define BOOL_OPTION_GETTER(flag, variable) \
99 static bool variable() { return variable##_; }
100 BOOL_OPTIONS_LIST(BOOL_OPTION_GETTER)
101#if defined(DEBUG)
102 DEBUG_BOOL_OPTIONS_LIST(BOOL_OPTION_GETTER)
103#endif
104#undef BOOL_OPTION_GETTER
105
106#define SHORT_BOOL_OPTION_GETTER(short_name, long_name, variable) \
107 static bool variable() { return variable##_; }
108 SHORT_BOOL_OPTIONS_LIST(SHORT_BOOL_OPTION_GETTER)
109#undef SHORT_BOOL_OPTION_GETTER
110
111#define ENUM_OPTIONS_GETTER(flag, type, variable) \
112 static type variable() { return variable##_; }
113 ENUM_OPTIONS_LIST(ENUM_OPTIONS_GETTER)
114#undef ENUM_OPTIONS_GETTER
115
116// Callbacks have to be public.
117#define CB_OPTIONS_DECL(callback) \
118 static bool callback(const char* arg, CommandLineOptions* vm_options);
119 CB_OPTIONS_LIST(CB_OPTIONS_DECL)
120#undef CB_OPTIONS_DECL
121
122 static bool preview_dart_2() { return true; }
123
124 static dart::SimpleHashMap* environment() { return environment_; }
125
126 static const char* vm_service_server_ip() { return vm_service_server_ip_; }
127 static int vm_service_server_port() { return vm_service_server_port_; }
128
129#if !defined(DART_PRECOMPILED_RUNTIME)
130 static DFE* dfe() { return dfe_; }
131 static void set_dfe(DFE* dfe) { dfe_ = dfe; }
132#endif // !defined(DART_PRECOMPILED_RUNTIME)
133
134 static void PrintUsage();
135 static void PrintVersion();
136
137 static void DestroyEnvironment();
138
139 private:
140#define STRING_OPTION_DECL(flag, variable) static const char* variable##_;
141 STRING_OPTIONS_LIST(STRING_OPTION_DECL)
142#undef STRING_OPTION_DECL
143
144#define BOOL_OPTION_DECL(flag, variable) static bool variable##_;
145 BOOL_OPTIONS_LIST(BOOL_OPTION_DECL)
146#if defined(DEBUG)
147 DEBUG_BOOL_OPTIONS_LIST(BOOL_OPTION_DECL)
148#endif
149#undef BOOL_OPTION_DECL
150
151#define SHORT_BOOL_OPTION_DECL(short_name, long_name, variable) \
152 static bool variable##_;
153 SHORT_BOOL_OPTIONS_LIST(SHORT_BOOL_OPTION_DECL)
154#undef SHORT_BOOL_OPTION_DECL
155
156#define ENUM_OPTION_DECL(flag, type, variable) static type variable##_;
157 ENUM_OPTIONS_LIST(ENUM_OPTION_DECL)
158#undef ENUM_OPTION_DECL
159
160 static dart::SimpleHashMap* environment_;
161
162// Frontend argument processing.
163#if !defined(DART_PRECOMPILED_RUNTIME)
164 static DFE* dfe_;
165#endif // !defined(DART_PRECOMPILED_RUNTIME)
166
167 // VM Service argument processing.
168 static const char* vm_service_server_ip_;
169 static bool enable_vm_service_;
170 static int vm_service_server_port_;
171 static bool ExtractPortAndAddress(const char* option_value,
172 int* out_port,
173 const char** out_ip,
174 int default_port,
175 const char* default_ip);
176
177 static MallocGrowableArray<const char*> enabled_experiments_;
178
179#define OPTION_FRIEND(flag, variable) friend class OptionProcessor_##flag;
180 STRING_OPTIONS_LIST(OPTION_FRIEND)
181 BOOL_OPTIONS_LIST(OPTION_FRIEND)
182#if defined(DEBUG)
183 DEBUG_BOOL_OPTIONS_LIST(OPTION_FRIEND)
184#endif
185#undef OPTION_FRIEND
186
187#define SHORT_BOOL_OPTION_FRIEND(short_name, long_name, variable) \
188 friend class OptionProcessor_##long_name;
189 SHORT_BOOL_OPTIONS_LIST(SHORT_BOOL_OPTION_FRIEND)
190#undef SHORT_BOOL_OPTION_FRIEND
191
192#define ENUM_OPTION_FRIEND(flag, type, variable) \
193 friend class OptionProcessor_##flag;
194 ENUM_OPTIONS_LIST(ENUM_OPTION_FRIEND)
195#undef ENUM_OPTION_FRIEND
196
197 DISALLOW_ALLOCATION();
198 DISALLOW_IMPLICIT_CONSTRUCTORS(Options);
199};
200
201} // namespace bin
202} // namespace dart
203
204#endif // RUNTIME_BIN_MAIN_OPTIONS_H_
205