| // Copyright (c) 2017, the Dart project authors. Please see the AUTHORS file |
| // for details. All rights reserved. Use of this source code is governed by a |
| // BSD-style license that can be found in the LICENSE file. |
| |
| #ifndef RUNTIME_BIN_MAIN_OPTIONS_H_ |
| #define RUNTIME_BIN_MAIN_OPTIONS_H_ |
| |
| #include "bin/dartutils.h" |
| #include "bin/dfe.h" |
| #include "platform/globals.h" |
| #include "platform/growable_array.h" |
| #include "platform/hashmap.h" |
| |
| namespace dart { |
| namespace bin { |
| |
| // A list of options taking string arguments. Organized as: |
| // V(flag_name, field_name) |
| // The value of the flag can then be accessed with Options::field_name(). |
| #define STRING_OPTIONS_LIST(V) \ |
| V(packages, packages_file) \ |
| V(snapshot, snapshot_filename) \ |
| V(snapshot_depfile, snapshot_deps_filename) \ |
| V(depfile, depfile) \ |
| V(depfile_output_filename, depfile_output_filename) \ |
| V(root_certs_file, root_certs_file) \ |
| V(root_certs_cache, root_certs_cache) \ |
| V(namespace, namespc) \ |
| V(write_service_info, vm_write_service_info_filename) |
| |
| // As STRING_OPTIONS_LIST but for boolean valued options. The default value is |
| // always false, and the presence of the flag switches the value to true. |
| #define BOOL_OPTIONS_LIST(V) \ |
| V(version, version_option) \ |
| V(compile_all, compile_all) \ |
| V(disable_service_origin_check, vm_service_dev_mode) \ |
| V(disable_service_auth_codes, vm_service_auth_disabled) \ |
| V(deterministic, deterministic) \ |
| V(trace_loading, trace_loading) \ |
| V(short_socket_read, short_socket_read) \ |
| V(short_socket_write, short_socket_write) \ |
| V(disable_exit, exit_disabled) \ |
| V(preview_dart_2, nop_option) \ |
| V(suppress_core_dump, suppress_core_dump) \ |
| V(enable_service_port_fallback, enable_service_port_fallback) \ |
| V(disable_dart_dev, disable_dart_dev) \ |
| V(no_dds, disable_dds) \ |
| V(long_ssl_cert_evaluation, long_ssl_cert_evaluation) \ |
| V(bypass_trusting_system_roots, bypass_trusting_system_roots) \ |
| V(delayed_filewatch_callback, delayed_filewatch_callback) \ |
| V(mark_main_isolate_as_system_isolate, mark_main_isolate_as_system_isolate) \ |
| V(no_serve_devtools, disable_devtools) \ |
| V(serve_devtools, enable_devtools) \ |
| V(no_serve_observatory, disable_observatory) \ |
| V(serve_observatory, enable_observatory) \ |
| V(print_dtd, print_dtd) |
| |
| // Boolean flags that have a short form. |
| #define SHORT_BOOL_OPTIONS_LIST(V) \ |
| V(h, help, help_option) \ |
| V(v, verbose, verbose_option) |
| |
| #define DEBUG_BOOL_OPTIONS_LIST(V) \ |
| V(force_load_elf_from_memory, force_load_elf_from_memory) |
| |
| // A list of flags taking arguments from an enum. Organized as: |
| // V(flag_name, enum_type, field_name) |
| // In main_options.cc there must be a list of strings that matches the enum |
| // called k{enum_type}Names. The field is not automatically declared in |
| // main_options.cc. It must be explicitly declared. |
| #define ENUM_OPTIONS_LIST(V) \ |
| V(snapshot_kind, SnapshotKind, gen_snapshot_kind) \ |
| V(verbosity, VerbosityLevel, verbosity) |
| |
| // Callbacks passed to DEFINE_CB_OPTION(). |
| #define CB_OPTIONS_LIST(V) \ |
| V(ProcessEnvironmentOption) \ |
| V(ProcessEnableVmServiceOption) \ |
| V(ProcessObserveOption) \ |
| V(ProcessVMDebuggingOptions) |
| |
| // This enum must match the strings in kSnapshotKindNames in main_options.cc. |
| enum SnapshotKind { |
| kNone, |
| kKernel, |
| kAppJIT, |
| }; |
| |
| // This enum must match the strings in kVerbosityLevelNames in main_options.cc. |
| enum VerbosityLevel { |
| kError, |
| kWarning, |
| kInfo, |
| kAll, |
| }; |
| |
| static constexpr const char* DEFAULT_VM_SERVICE_SERVER_IP = "localhost"; |
| static constexpr int DEFAULT_VM_SERVICE_SERVER_PORT = 8181; |
| static constexpr int INVALID_VM_SERVICE_SERVER_PORT = -1; |
| |
| class Options { |
| public: |
| // Returns true if argument parsing succeeded. False otherwise. |
| static bool ParseArguments(int argc, |
| char** argv, |
| bool vm_run_app_snapshot, |
| bool parsing_dart_vm_options, |
| CommandLineOptions* vm_options, |
| char** script_name, |
| CommandLineOptions* dart_options, |
| bool* print_flags_seen, |
| bool* verbose_debug_seen); |
| |
| #define STRING_OPTION_GETTER(flag, variable) \ |
| static const char* variable() { return variable##_; } |
| STRING_OPTIONS_LIST(STRING_OPTION_GETTER) |
| #undef STRING_OPTION_GETTER |
| |
| #define BOOL_OPTION_GETTER(flag, variable) \ |
| static bool variable() { return variable##_; } |
| BOOL_OPTIONS_LIST(BOOL_OPTION_GETTER) |
| #if defined(DEBUG) |
| DEBUG_BOOL_OPTIONS_LIST(BOOL_OPTION_GETTER) |
| #endif |
| #undef BOOL_OPTION_GETTER |
| |
| #define SHORT_BOOL_OPTION_GETTER(short_name, long_name, variable) \ |
| static bool variable() { return variable##_; } |
| SHORT_BOOL_OPTIONS_LIST(SHORT_BOOL_OPTION_GETTER) |
| #undef SHORT_BOOL_OPTION_GETTER |
| |
| #define ENUM_OPTIONS_GETTER(flag, type, variable) \ |
| static type variable() { return variable##_; } |
| ENUM_OPTIONS_LIST(ENUM_OPTIONS_GETTER) |
| #undef ENUM_OPTIONS_GETTER |
| |
| // Callbacks have to be public. |
| #define CB_OPTIONS_DECL(callback) \ |
| static bool callback(const char* arg, CommandLineOptions* vm_options); |
| CB_OPTIONS_LIST(CB_OPTIONS_DECL) |
| #undef CB_OPTIONS_DECL |
| |
| static bool preview_dart_2() { return true; } |
| |
| static dart::SimpleHashMap* environment() { return environment_; } |
| |
| static bool enable_vm_service() { return enable_vm_service_; } |
| static const char* vm_service_server_ip() { return vm_service_server_ip_; } |
| static int vm_service_server_port() { return vm_service_server_port_; } |
| |
| // TODO(bkonyi): remove once DartDev moves to AOT and this flag can be |
| // provided directly to the process spawned by `dart run` and `dart test`. |
| // |
| // See https://github.com/dart-lang/sdk/issues/53576 |
| static void set_mark_main_isolate_as_system_isolate(bool state) { |
| mark_main_isolate_as_system_isolate_ = state; |
| } |
| |
| static Dart_KernelCompilationVerbosityLevel verbosity_level() { |
| return VerbosityLevelToDartAPI(verbosity_); |
| } |
| #if !defined(DART_PRECOMPILED_RUNTIME) |
| static DFE* dfe() { return dfe_; } |
| static void set_dfe(DFE* dfe) { dfe_ = dfe; } |
| #endif // !defined(DART_PRECOMPILED_RUNTIME) |
| |
| static void PrintUsage(); |
| static void PrintVersion(); |
| |
| static void Cleanup(); |
| |
| #if defined(DART_PRECOMPILED_RUNTIME) |
| // Get the list of options in DART_VM_OPTIONS. |
| static char** GetEnvArguments(int* argc); |
| #endif // defined(DART_PRECOMPILED_RUNTIME) |
| |
| private: |
| static void DestroyEnvironment(); |
| #if defined(DART_PRECOMPILED_RUNTIME) |
| static void DestroyEnvArgv(); |
| #endif // defined(DART_PRECOMPILED_RUNTIME) |
| |
| #define STRING_OPTION_DECL(flag, variable) static const char* variable##_; |
| STRING_OPTIONS_LIST(STRING_OPTION_DECL) |
| #undef STRING_OPTION_DECL |
| |
| #define BOOL_OPTION_DECL(flag, variable) static bool variable##_; |
| BOOL_OPTIONS_LIST(BOOL_OPTION_DECL) |
| #if defined(DEBUG) |
| DEBUG_BOOL_OPTIONS_LIST(BOOL_OPTION_DECL) |
| #endif |
| #undef BOOL_OPTION_DECL |
| |
| #define SHORT_BOOL_OPTION_DECL(short_name, long_name, variable) \ |
| static bool variable##_; |
| SHORT_BOOL_OPTIONS_LIST(SHORT_BOOL_OPTION_DECL) |
| #undef SHORT_BOOL_OPTION_DECL |
| |
| #define ENUM_OPTION_DECL(flag, type, variable) static type variable##_; |
| ENUM_OPTIONS_LIST(ENUM_OPTION_DECL) |
| #undef ENUM_OPTION_DECL |
| |
| static dart::SimpleHashMap* environment_; |
| |
| #if defined(DART_PRECOMPILED_RUNTIME) |
| static char** env_argv_; |
| static int env_argc_; |
| #endif // defined(DART_PRECOMPILED_RUNTIME) |
| |
| // Frontend argument processing. |
| #if !defined(DART_PRECOMPILED_RUNTIME) |
| static DFE* dfe_; |
| #endif // !defined(DART_PRECOMPILED_RUNTIME) |
| |
| static Dart_KernelCompilationVerbosityLevel VerbosityLevelToDartAPI( |
| VerbosityLevel level) { |
| switch (level) { |
| case kError: |
| return Dart_KernelCompilationVerbosityLevel_Error; |
| case kWarning: |
| return Dart_KernelCompilationVerbosityLevel_Warning; |
| case kInfo: |
| return Dart_KernelCompilationVerbosityLevel_Info; |
| case kAll: |
| return Dart_KernelCompilationVerbosityLevel_All; |
| default: |
| UNREACHABLE(); |
| } |
| } |
| |
| // VM Service argument processing. |
| static const char* vm_service_server_ip_; |
| static bool enable_vm_service_; |
| static int vm_service_server_port_; |
| static bool ExtractPortAndAddress(const char* option_value, |
| int* out_port, |
| const char** out_ip, |
| int default_port, |
| const char* default_ip); |
| |
| #define OPTION_FRIEND(flag, variable) friend class OptionProcessor_##flag; |
| STRING_OPTIONS_LIST(OPTION_FRIEND) |
| BOOL_OPTIONS_LIST(OPTION_FRIEND) |
| #if defined(DEBUG) |
| DEBUG_BOOL_OPTIONS_LIST(OPTION_FRIEND) |
| #endif |
| #undef OPTION_FRIEND |
| |
| #define SHORT_BOOL_OPTION_FRIEND(short_name, long_name, variable) \ |
| friend class OptionProcessor_##long_name; |
| SHORT_BOOL_OPTIONS_LIST(SHORT_BOOL_OPTION_FRIEND) |
| #undef SHORT_BOOL_OPTION_FRIEND |
| |
| #define ENUM_OPTION_FRIEND(flag, type, variable) \ |
| friend class OptionProcessor_##flag; |
| ENUM_OPTIONS_LIST(ENUM_OPTION_FRIEND) |
| #undef ENUM_OPTION_FRIEND |
| |
| DISALLOW_ALLOCATION(); |
| DISALLOW_IMPLICIT_CONSTRUCTORS(Options); |
| }; |
| |
| } // namespace bin |
| } // namespace dart |
| |
| #endif // RUNTIME_BIN_MAIN_OPTIONS_H_ |