GN Build fixes for Flutter + gen_snapshot fix

1. Add "dart_runtime_mode" GN argument. This is an enum with three valid values: "release", "profile", and "develop".
   *) "release" builds product precompiled-runtime.
   *) "profile" builds non-product precompiled-runtime.
   *) "develop" builds non-product non-precompiled-runtime.

2. Remove the redundant "dart_product" GN argument.

3. Kill all *precompiled_runtime static library variants and the related config.

4. Always include the precompiler in gen_snapshot.

5. Support multiple --embedder_entry_points_manifest arguments to gen_snapshot.

6. Update our test harness to use gen_snapshot and pass the same kinds of command line arguments the Flutter folks are using.

7. ASSERT that both DART_PRECOMPILED_RUNTIME and DART_PRECOMPILER are not set at the same time.

R=fschneider@google.com, rmacnak@google.com

Review URL: https://codereview.chromium.org/1903583002 .
This commit is contained in:
John McCutchan 2016-04-22 07:00:03 -07:00
parent 1889b1a581
commit 0cfd4f5cd5
8 changed files with 386 additions and 200 deletions

View file

@ -12,9 +12,15 @@ declare_args() {
# while themselves doing a Debug build. # while themselves doing a Debug build.
dart_debug = false dart_debug = false
# Product mode drops many features (e.g. debugger, profiler, etc) in order to # Set the runtime mode. This affects how the runtime is built and what
# shrink download size and decrease memory and cpu usage. # features it has. Valid values are:
dart_product = false # 'develop' (the default) - VM is built to run as a JIT with all development
# features enabled.
# 'profile' - The VM is built to run with AOT compiled code with only the
# CPU profiling features enabled.
# 'release' - The VM is built to run with AOT compiled code with no developer
# features enabled.
dart_runtime_mode = "develop"
# Explicitly set the target architecture in case of precompilation. Leaving # Explicitly set the target architecture in case of precompilation. Leaving
# this unspecified results in automatic target architecture detection. # this unspecified results in automatic target architecture detection.
@ -28,6 +34,58 @@ config("dart_public_config") {
] ]
} }
# Controls PRODUCT #define.
config("dart_product_config") {
defines = []
if ((dart_runtime_mode != "develop") &&
(dart_runtime_mode != "profile") &&
(dart_runtime_mode != "release")) {
print("Invalid |dart_runtime_mode|")
assert(false)
}
if (dart_runtime_mode == "release") {
if (dart_debug) {
print("Debug and release mode are mutually exclusive.")
}
assert(!dart_debug)
defines += ["PRODUCT"]
}
}
# Controls DART_PRECOMPILED_RUNTIME #define.
config("dart_precompiled_runtime_config") {
defines = []
if ((dart_runtime_mode != "develop") &&
(dart_runtime_mode != "profile") &&
(dart_runtime_mode != "release")) {
print("Invalid |dart_runtime_mode|")
assert(false)
}
if (dart_runtime_mode == "release") {
if (dart_debug) {
print("Debug and release mode are mutually exclusive.")
}
assert(!dart_debug)
defines += ["DART_PRECOMPILED_RUNTIME"]
} else if (dart_runtime_mode == "profile") {
if (dart_debug) {
print("Debug and profile mode are mutually exclusive.")
}
assert(!dart_debug)
defines += ["DART_PRECOMPILED_RUNTIME"]
}
}
# Controls DART_PRECOMPILER #define.
config("dart_precompiler_config") {
defines = []
defines += ["DART_PRECOMPILER"]
}
config("dart_config") { config("dart_config") {
defines = [] defines = []
@ -56,17 +114,6 @@ config("dart_config") {
defines += ["NDEBUG"] defines += ["NDEBUG"]
} }
if (dart_product) {
if (dart_debug) {
print("Debug and product mode are mutually exclusive.")
}
assert(!dart_debug)
defines += ["PRODUCT"]
}
# Ideally this would only be enabled for gen_snapshot
defines += ["DART_PRECOMPILER"]
cflags = [ cflags = [
"-Werror", "-Werror",
"-Wall", "-Wall",
@ -100,78 +147,10 @@ config("dart_config") {
} }
} }
config("dart_config_no_precompiler") {
defines = []
if (dart_target_arch != "") {
if (dart_target_arch == "arm") {
defines += [ "TARGET_ARCH_ARM" ]
} else if (dart_target_arch == "arm64") {
defines += [ "TARGET_ARCH_ARM64" ]
} else if (dart_target_arch == "mips") {
defines += [ "TARGET_ARCH_MIPS" ]
} else if (dart_target_arch == "x64") {
defines += [ "TARGET_ARCH_X64" ]
} else if (dart_target_arch == "ia32") {
defines += [ "TARGET_ARCH_IA32" ]
} else if (dart_target_arch == "dbc") {
defines += [ "TARGET_ARCH_DBC" ]
} else {
print("Invalid |dart_target_arch|")
assert(false)
}
}
if (dart_debug) {
defines += ["DEBUG"]
} else {
defines += ["NDEBUG"]
}
if (dart_product) {
if (dart_debug) {
print("Debug and product mode are mutually exclusive.")
}
assert(!dart_debug)
defines += ["PRODUCT"]
}
cflags = [
"-Werror",
"-Wall",
"-Wextra", # Also known as -W.
"-Wno-unused-parameter",
"-Wnon-virtual-dtor",
"-Wvla",
"-Wno-conversion-null",
"-Woverloaded-virtual",
"-g3",
"-ggdb3",
"-fno-rtti",
"-fno-exceptions",
]
if (dart_debug) {
cflags += [
"-O1",
]
} else {
cflags += [
"-O3",
]
}
if (is_asan) {
ldflags = [
"-Wl,-u_sanitizer_options_link_helper",
"-fsanitize=address",
]
}
}
static_library("libdart") { static_library("libdart") {
configs += [":dart_config"] configs += [":dart_config",
":dart_product_config",
":dart_precompiled_runtime_config"]
deps = [ deps = [
"vm:libdart_lib", "vm:libdart_lib",
"vm:libdart_vm", "vm:libdart_vm",
@ -196,37 +175,6 @@ static_library("libdart") {
] ]
} }
static_library("libdart_precompiled_runtime") {
configs += [":dart_config_no_precompiler"]
deps = [
"vm:libdart_lib_precompiled_runtime",
"vm:libdart_vm_precompiled_runtime",
"third_party/double-conversion/src:libdouble_conversion",
":generate_version_cc_file",
]
include_dirs = [
".",
]
public_configs = [":dart_public_config"]
sources = [
"include/dart_api.h",
"include/dart_mirrors_api.h",
"include/dart_native_api.h",
"include/dart_tools_api.h",
"vm/dart_api_impl.cc",
"vm/debugger_api_impl.cc",
"vm/mirrors_api_impl.cc",
"vm/native_api_impl.cc",
"vm/version.h",
"$target_gen_dir/version.cc",
]
defines = [
"DART_PRECOMPILED_RUNTIME",
]
}
action("generate_version_cc_file") { action("generate_version_cc_file") {
deps = [ deps = [
":libdart_dependency_helper", ":libdart_dependency_helper",
@ -251,7 +199,9 @@ action("generate_version_cc_file") {
executable("libdart_dependency_helper") { executable("libdart_dependency_helper") {
configs += [":dart_config"] configs += [":dart_config",
":dart_product_config",
":dart_precompiled_runtime_config"]
deps = [ deps = [
"vm:libdart_lib_nosnapshot", "vm:libdart_lib_nosnapshot",
"vm:libdart_lib", "vm:libdart_lib",

View file

@ -119,7 +119,7 @@ builtin_impl_sources_gypi =
["builtin_impl_sources.gypi"]) ["builtin_impl_sources.gypi"])
static_library("libdart_builtin") { static_library("libdart_builtin") {
configs += ["..:dart_config"] configs += ["..:dart_config", "..:dart_product_config"]
public_configs = [":libdart_builtin_config"] public_configs = [":libdart_builtin_config"]
deps = [ deps = [
":generate_builtin_cc_file", ":generate_builtin_cc_file",
@ -140,7 +140,9 @@ static_library("libdart_builtin") {
static_library("libdart_nosnapshot") { static_library("libdart_nosnapshot") {
configs += ["..:dart_config"] configs += ["..:dart_config",
"..:dart_product_config",
"..:dart_precompiled_runtime_config"]
deps = [ deps = [
"../vm:libdart_lib_nosnapshot", "../vm:libdart_lib_nosnapshot",
"../vm:libdart_vm_nosnapshot", "../vm:libdart_vm_nosnapshot",
@ -171,8 +173,44 @@ static_library("libdart_nosnapshot") {
} }
static_library("libdart_nosnapshot_with_precompiler") {
configs += ["..:dart_config",
"..:dart_product_config",
"..:dart_precompiler_config"]
deps = [
"../vm:libdart_lib_nosnapshot_with_precompiler",
"../vm:libdart_vm_nosnapshot_with_precompiler",
"../vm:libdart_platform",
"../third_party/double-conversion/src:libdouble_conversion",
"..:generate_version_cc_file",
]
sources = [
"../include/dart_api.h",
"../include/dart_mirrors_api.h",
"../include/dart_native_api.h",
"../include/dart_tools_api.h",
"../vm/dart_api_impl.cc",
"../vm/debugger_api_impl.cc",
"../vm/mirrors_api_impl.cc",
"../vm/native_api_impl.cc",
"$target_gen_dir/../version.cc",
]
include_dirs = [
"..",
]
defines = [
"DART_SHARED_LIB",
]
}
executable("gen_snapshot") { executable("gen_snapshot") {
configs += ["..:dart_config"] configs += ["..:dart_config",
"..:dart_product_config",
"..:dart_precompiler_config"]
deps = [ deps = [
":gen_resources_cc", ":gen_resources_cc",
":gen_snapshot_dart_io", ":gen_snapshot_dart_io",
@ -180,7 +218,7 @@ executable("gen_snapshot") {
":generate_io_cc_file", ":generate_io_cc_file",
":generate_io_patch_cc_file", ":generate_io_patch_cc_file",
":libdart_builtin", ":libdart_builtin",
":libdart_nosnapshot", ":libdart_nosnapshot_with_precompiler",
] ]
sources = [ sources = [
@ -207,7 +245,9 @@ executable("gen_snapshot") {
source_set("libdart_embedder_noio") { source_set("libdart_embedder_noio") {
configs += ["..:dart_config",] configs += ["..:dart_config",
"..:dart_product_config",
"..:dart_precompiled_runtime_config"]
deps = [ deps = [
"..:libdart", "..:libdart",
"../vm:libdart_platform", "../vm:libdart_platform",
@ -224,7 +264,9 @@ io_impl_sources_gypi =
# A source set for the implementation of 'dart:io' library # A source set for the implementation of 'dart:io' library
# (without secure sockets) suitable for linking with gen_snapshot. # (without secure sockets) suitable for linking with gen_snapshot.
source_set("gen_snapshot_dart_io") { source_set("gen_snapshot_dart_io") {
configs += ["..:dart_config",] configs += ["..:dart_config",
"..:dart_product_config",
"..:dart_precompiler_config"]
deps = [ deps = [
"//third_party/zlib", "//third_party/zlib",
@ -263,7 +305,9 @@ source_set("gen_snapshot_dart_io") {
# A source set for the implementation of 'dart:io' library # A source set for the implementation of 'dart:io' library
# (without secure sockets). # (without secure sockets).
source_set("embedded_dart_io") { source_set("embedded_dart_io") {
configs += ["..:dart_config",] configs += ["..:dart_config",
"..:dart_product_config",
"..:dart_precompiled_runtime_config"]
custom_sources_filter = [ custom_sources_filter = [
"*_test.cc", "*_test.cc",

View file

@ -0,0 +1 @@
dart:vmservice_io,::,main

View file

@ -0,0 +1,27 @@
dart:_builtin,::,_getMainClosure
dart:_builtin,::,_getPrintClosure
dart:_builtin,::,_getUriBaseClosure
dart:_builtin,::,_resolveUri
dart:_builtin,::,_setWorkingDirectory
dart:_builtin,::,_setPackageRoot
dart:_builtin,::,_loadPackagesMap
dart:_builtin,::,_loadDataAsync
dart:io,::,_makeUint8ListView
dart:io,::,_makeDatagram
dart:io,::,_setupHooks
dart:io,::,_getWatchSignalInternal
dart:io,CertificateException,CertificateException.
dart:io,Directory,Directory.
dart:io,File,File.
dart:io,FileSystemException,FileSystemException.
dart:io,HandshakeException,HandshakeException.
dart:io,Link,Link.
dart:io,OSError,OSError.
dart:io,TlsException,TlsException.
dart:io,X509Certificate,X509Certificate._
dart:io,_ExternalBuffer,set:data
dart:io,_Platform,set:_nativeScript
dart:io,_ProcessStartStatus,set:_errorCode
dart:io,_ProcessStartStatus,set:_errorMessage
dart:io,_SecureFilterImpl,get:ENCRYPTED_SIZE
dart:io,_SecureFilterImpl,get:SIZE

View file

@ -22,18 +22,38 @@
#include "include/dart_api.h" #include "include/dart_api.h"
#include "platform/hashmap.h"
#include "platform/globals.h" #include "platform/globals.h"
namespace dart { namespace dart {
namespace bin { namespace bin {
// Exit code indicating an API error.
static const int kApiErrorExitCode = 253;
// Exit code indicating a compilation error.
static const int kCompilationErrorExitCode = 254;
// Exit code indicating an unhandled error that is not a compilation error.
static const int kErrorExitCode = 255;
// Exit code indicating a vm restart request. Never returned to the user.
static const int kRestartRequestExitCode = 1000;
#define CHECK_RESULT(result) \ #define CHECK_RESULT(result) \
if (Dart_IsError(result)) { \ if (Dart_IsError(result)) { \
intptr_t exit_code = 0; \
Log::PrintErr("Error: %s", Dart_GetError(result)); \ Log::PrintErr("Error: %s", Dart_GetError(result)); \
if (Dart_IsCompilationError(result)) { \
exit_code = kCompilationErrorExitCode; \
} else if (Dart_IsApiError(result)) { \
exit_code = kApiErrorExitCode; \
} else if (Dart_IsVMRestartRequest(result)) { \
exit_code = kRestartRequestExitCode; \
} else { \
exit_code = kErrorExitCode; \
} \
Dart_ExitScope(); \ Dart_ExitScope(); \
Dart_ShutdownIsolate(); \ Dart_ShutdownIsolate(); \
exit(255); \ exit(exit_code); \
} \ }
// Global state that indicates whether a snapshot is to be created and // Global state that indicates whether a snapshot is to be created and
@ -41,7 +61,6 @@ namespace bin {
static const char* vm_isolate_snapshot_filename = NULL; static const char* vm_isolate_snapshot_filename = NULL;
static const char* isolate_snapshot_filename = NULL; static const char* isolate_snapshot_filename = NULL;
static const char* instructions_snapshot_filename = NULL; static const char* instructions_snapshot_filename = NULL;
static const char* embedder_entry_points_manifest = NULL;
static const char* package_root = NULL; static const char* package_root = NULL;
@ -54,6 +73,10 @@ static char* app_script_name = NULL;
// Global state that captures the URL mappings specified on the command line. // Global state that captures the URL mappings specified on the command line.
static CommandLineOptions* url_mapping = NULL; static CommandLineOptions* url_mapping = NULL;
// Global state that captures the entry point manifest files specified on the
// command line.
static CommandLineOptions* entry_points_files = NULL;
static bool IsValidFlag(const char* name, static bool IsValidFlag(const char* name,
const char* prefix, const char* prefix,
intptr_t prefix_length) { intptr_t prefix_length) {
@ -63,6 +86,93 @@ static bool IsValidFlag(const char* name,
} }
// The environment provided through the command line using -D options.
static dart::HashMap* environment = NULL;
static void* GetHashmapKeyFromString(char* key) {
return reinterpret_cast<void*>(key);
}
static bool ProcessEnvironmentOption(const char* arg) {
ASSERT(arg != NULL);
if (*arg == '\0') {
return false;
}
if (*arg != '-') {
return false;
}
if (*(arg + 1) != 'D') {
return false;
}
arg = arg + 2;
if (*arg == '\0') {
return true;
}
if (environment == NULL) {
environment = new HashMap(&HashMap::SameStringValue, 4);
}
// Split the name=value part of the -Dname=value argument.
char* name;
char* value = NULL;
const char* equals_pos = strchr(arg, '=');
if (equals_pos == NULL) {
// No equal sign (name without value) currently not supported.
Log::PrintErr("No value given to -D option\n");
return false;
} else {
int name_len = equals_pos - arg;
if (name_len == 0) {
Log::PrintErr("No name given to -D option\n");
return false;
}
// Split name=value into name and value.
name = reinterpret_cast<char*>(malloc(name_len + 1));
strncpy(name, arg, name_len);
name[name_len] = '\0';
value = strdup(equals_pos + 1);
}
HashMap::Entry* entry = environment->Lookup(
GetHashmapKeyFromString(name), HashMap::StringHash(name), true);
ASSERT(entry != NULL); // Lookup adds an entry if key not found.
entry->value = value;
return true;
}
static Dart_Handle EnvironmentCallback(Dart_Handle name) {
uint8_t* utf8_array;
intptr_t utf8_len;
Dart_Handle result = Dart_Null();
Dart_Handle handle = Dart_StringToUTF8(name, &utf8_array, &utf8_len);
if (Dart_IsError(handle)) {
handle = Dart_ThrowException(
DartUtils::NewDartArgumentError(Dart_GetError(handle)));
} else {
char* name_chars = reinterpret_cast<char*>(malloc(utf8_len + 1));
memmove(name_chars, utf8_array, utf8_len);
name_chars[utf8_len] = '\0';
const char* value = NULL;
printf("Looking for %s\n", name_chars);
if (environment != NULL) {
HashMap::Entry* entry = environment->Lookup(
GetHashmapKeyFromString(name_chars),
HashMap::StringHash(name_chars),
false);
if (entry != NULL) {
value = reinterpret_cast<char*>(entry->value);
}
}
if (value != NULL) {
result = Dart_NewStringFromUTF8(reinterpret_cast<const uint8_t*>(value),
strlen(value));
}
free(name_chars);
}
return result;
}
static const char* ProcessOption(const char* option, const char* name) { static const char* ProcessOption(const char* option, const char* name) {
const intptr_t length = strlen(name); const intptr_t length = strlen(name);
if (strncmp(option, name, length) == 0) { if (strncmp(option, name, length) == 0) {
@ -105,7 +215,7 @@ static bool ProcessInstructionsSnapshotOption(const char* option) {
static bool ProcessEmbedderEntryPointsManifestOption(const char* option) { static bool ProcessEmbedderEntryPointsManifestOption(const char* option) {
const char* name = ProcessOption(option, "--embedder_entry_points_manifest="); const char* name = ProcessOption(option, "--embedder_entry_points_manifest=");
if (name != NULL) { if (name != NULL) {
embedder_entry_points_manifest = name; entry_points_files->AddArgument(name);
return true; return true;
} }
return false; return false;
@ -114,6 +224,9 @@ static bool ProcessEmbedderEntryPointsManifestOption(const char* option) {
static bool ProcessPackageRootOption(const char* option) { static bool ProcessPackageRootOption(const char* option) {
const char* name = ProcessOption(option, "--package_root="); const char* name = ProcessOption(option, "--package_root=");
if (name == NULL) {
name = ProcessOption(option, "--package-root=");
}
if (name != NULL) { if (name != NULL) {
package_root = name; package_root = name;
return true; return true;
@ -141,7 +254,7 @@ static int ParseArguments(int argc,
char** argv, char** argv,
CommandLineOptions* vm_options, CommandLineOptions* vm_options,
char** script_name) { char** script_name) {
const char* kPrefix = "--"; const char* kPrefix = "-";
const intptr_t kPrefixLen = strlen(kPrefix); const intptr_t kPrefixLen = strlen(kPrefix);
// Skip the binary name. // Skip the binary name.
@ -154,7 +267,8 @@ static int ParseArguments(int argc,
ProcessInstructionsSnapshotOption(argv[i]) || ProcessInstructionsSnapshotOption(argv[i]) ||
ProcessEmbedderEntryPointsManifestOption(argv[i]) || ProcessEmbedderEntryPointsManifestOption(argv[i]) ||
ProcessURLmappingOption(argv[i]) || ProcessURLmappingOption(argv[i]) ||
ProcessPackageRootOption(argv[i])) { ProcessPackageRootOption(argv[i]) ||
ProcessEnvironmentOption(argv[i])) {
i += 1; i += 1;
continue; continue;
} }
@ -181,14 +295,14 @@ static int ParseArguments(int argc,
} }
if ((instructions_snapshot_filename != NULL) && if ((instructions_snapshot_filename != NULL) &&
(embedder_entry_points_manifest == NULL)) { (entry_points_files->count() == 0)) {
Log::PrintErr( Log::PrintErr(
"Specifying an instructions snapshot filename indicates precompilation" "Specifying an instructions snapshot filename indicates precompilation"
". But no embedder entry points manifest was specified.\n\n"); ". But no embedder entry points manifest was specified.\n\n");
return -1; return -1;
} }
if ((embedder_entry_points_manifest != NULL) && if ((entry_points_files->count() > 0) &&
(instructions_snapshot_filename == NULL)) { (instructions_snapshot_filename == NULL)) {
Log::PrintErr( Log::PrintErr(
"Specifying the embedder entry points manifest indicates " "Specifying the embedder entry points manifest indicates "
@ -201,8 +315,8 @@ static int ParseArguments(int argc,
static bool IsSnapshottingForPrecompilation(void) { static bool IsSnapshottingForPrecompilation(void) {
return embedder_entry_points_manifest != NULL && return (entry_points_files->count() > 0) &&
instructions_snapshot_filename != NULL; (instructions_snapshot_filename != NULL);
} }
@ -510,9 +624,7 @@ static void VerifyLoaded(Dart_Handle library) {
if (Dart_IsError(library)) { if (Dart_IsError(library)) {
const char* err_msg = Dart_GetError(library); const char* err_msg = Dart_GetError(library);
Log::PrintErr("Errors encountered while loading: %s\n", err_msg); Log::PrintErr("Errors encountered while loading: %s\n", err_msg);
Dart_ExitScope(); CHECK_RESULT(library);
Dart_ShutdownIsolate();
exit(255);
} }
ASSERT(Dart_IsLibrary(library)); ASSERT(Dart_IsLibrary(library));
} }
@ -781,31 +893,34 @@ int64_t ParseEntryPointsManifestLines(FILE* file,
} }
static Dart_QualifiedFunctionName* ParseEntryPointsManifestFile( static Dart_QualifiedFunctionName* ParseEntryPointsManifestFiles() {
const char* path) { // Total number of entries across all manifest files.
if (path == NULL) { int64_t entry_count = 0;
return NULL;
}
FILE* file = fopen(path, "r"); // Parse the files once but don't store the results. This is done to first
if (file == NULL) {
Log::PrintErr("Could not open entry points manifest file\n");
return NULL;
}
// Parse the file once but don't store the results. This is done to first
// determine the number of entries in the manifest // determine the number of entries in the manifest
int64_t entry_count = ParseEntryPointsManifestLines(file, NULL); for (intptr_t i = 0; i < entry_points_files->count(); i++) {
const char* path = entry_points_files->GetArgument(i);
if (entry_count <= 0) { FILE* file = fopen(path, "r");
Log::PrintErr(
"Manifest file specified is invalid or contained no entries\n"); if (file == NULL) {
Log::PrintErr("Could not open entry points manifest file `%s`\n", path);
return NULL;
}
int64_t entries = ParseEntryPointsManifestLines(file, NULL);
fclose(file); fclose(file);
return NULL;
}
rewind(file); if (entries <= 0) {
Log::PrintErr(
"Manifest file `%s` specified is invalid or contained no entries\n",
path);
return NULL;
}
entry_count += entries;
}
// Allocate enough storage for the entries in the file plus a termination // Allocate enough storage for the entries in the file plus a termination
// sentinel and parse it again to populate the allocation // sentinel and parse it again to populate the allocation
@ -813,10 +928,16 @@ static Dart_QualifiedFunctionName* ParseEntryPointsManifestFile(
reinterpret_cast<Dart_QualifiedFunctionName*>( reinterpret_cast<Dart_QualifiedFunctionName*>(
calloc(entry_count + 1, sizeof(Dart_QualifiedFunctionName))); calloc(entry_count + 1, sizeof(Dart_QualifiedFunctionName)));
int64_t parsed_entry_count = ParseEntryPointsManifestLines(file, entries); int64_t parsed_entry_count = 0;
ASSERT(parsed_entry_count == entry_count); for (intptr_t i = 0; i < entry_points_files->count(); i++) {
const char* path = entry_points_files->GetArgument(i);
FILE* file = fopen(path, "r");
parsed_entry_count +=
ParseEntryPointsManifestLines(file, &entries[parsed_entry_count]);
fclose(file);
}
fclose(file); ASSERT(parsed_entry_count == entry_count);
// The entries allocation must be explicitly cleaned up via // The entries allocation must be explicitly cleaned up via
// |CleanupEntryPointsCollection| // |CleanupEntryPointsCollection|
@ -825,8 +946,7 @@ static Dart_QualifiedFunctionName* ParseEntryPointsManifestFile(
static Dart_QualifiedFunctionName* ParseEntryPointsManifestIfPresent() { static Dart_QualifiedFunctionName* ParseEntryPointsManifestIfPresent() {
Dart_QualifiedFunctionName* entries = Dart_QualifiedFunctionName* entries = ParseEntryPointsManifestFiles();
ParseEntryPointsManifestFile(embedder_entry_points_manifest);
if ((entries == NULL) && IsSnapshottingForPrecompilation()) { if ((entries == NULL) && IsSnapshottingForPrecompilation()) {
Log::PrintErr( Log::PrintErr(
"Could not find native embedder entry points during precompilation\n"); "Could not find native embedder entry points during precompilation\n");
@ -998,6 +1118,10 @@ int main(int argc, char** argv) {
CommandLineOptions url_mapping_array(argc); CommandLineOptions url_mapping_array(argc);
url_mapping = &url_mapping_array; url_mapping = &url_mapping_array;
// Initialize the entrypoints array.
CommandLineOptions entry_points_files_array(argc);
entry_points_files = &entry_points_files_array;
// Parse command line arguments. // Parse command line arguments.
if (ParseArguments(argc, if (ParseArguments(argc,
argv, argv,
@ -1067,6 +1191,9 @@ int main(int argc, char** argv) {
Dart_Handle library; Dart_Handle library;
Dart_EnterScope(); Dart_EnterScope();
result = Dart_SetEnvironmentCallback(EnvironmentCallback);
CHECK_RESULT(result);
ASSERT(vm_isolate_snapshot_filename != NULL); ASSERT(vm_isolate_snapshot_filename != NULL);
ASSERT(isolate_snapshot_filename != NULL); ASSERT(isolate_snapshot_filename != NULL);
// Load up the script before a snapshot is created. // Load up the script before a snapshot is created.
@ -1108,6 +1235,8 @@ int main(int argc, char** argv) {
exit(255); exit(255);
} }
Dart_EnterScope(); Dart_EnterScope();
result = Dart_SetEnvironmentCallback(EnvironmentCallback);
CHECK_RESULT(result);
// Set up the library tag handler in such a manner that it will use the // Set up the library tag handler in such a manner that it will use the
// URL mapping specified on the command line to load the libraries. // URL mapping specified on the command line to load the libraries.
@ -1129,8 +1258,7 @@ int main(int argc, char** argv) {
result = Dart_FinalizeLoading(false); result = Dart_FinalizeLoading(false);
CHECK_RESULT(result); CHECK_RESULT(result);
if (entry_points == NULL) { if (!IsSnapshottingForPrecompilation()) {
ASSERT(!IsSnapshottingForPrecompilation());
CreateAndWriteSnapshot(); CreateAndWriteSnapshot();
} else { } else {
CreateAndWritePrecompiledSnapshot(entry_points); CreateAndWritePrecompiledSnapshot(entry_points);

View file

@ -2,8 +2,8 @@
// for details. All rights reserved. Use of this source code is governed by a // 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. // BSD-style license that can be found in the LICENSE file.
#ifndef PLATFORM_GLOBALS_H_ #ifndef RUNTIME_PLATFORM_GLOBALS_H_
#define PLATFORM_GLOBALS_H_ #define RUNTIME_PLATFORM_GLOBALS_H_
// __STDC_FORMAT_MACROS has to be defined before including <inttypes.h> to // __STDC_FORMAT_MACROS has to be defined before including <inttypes.h> to
// enable platform independent printf format specifiers. // enable platform independent printf format specifiers.
@ -136,6 +136,10 @@
#endif // defined(PRODUCT) #endif // defined(PRODUCT)
#if defined(DART_PRECOMPILED_RUNTIME) && defined(DART_PRECOMPILER)
#error DART_PRECOMPILED_RUNTIME and DART_PRECOMPILER are mutually exclusive
#endif // defined(DART_PRECOMPILED_RUNTIME) && defined(DART_PRECOMPILER)
namespace dart { namespace dart {
struct simd128_value_t { struct simd128_value_t {
@ -674,4 +678,4 @@ static inline T ReadUnaligned(const T* ptr) {
} // namespace dart } // namespace dart
#endif // PLATFORM_GLOBALS_H_ #endif // RUNTIME_PLATFORM_GLOBALS_H_

View file

@ -18,7 +18,7 @@ config("libdart_vm_config") {
static_library("libdart_platform") { static_library("libdart_platform") {
configs += ["..:dart_config"] configs += ["..:dart_config", "..:dart_product_config"]
public_configs = [":libdart_vm_config"] public_configs = [":libdart_vm_config"]
platform_headers_gypi = platform_headers_gypi =
@ -43,9 +43,10 @@ static_library("libdart_platform") {
] ]
} }
static_library("libdart_vm") { static_library("libdart_vm") {
configs += ["..:dart_config"] configs += ["..:dart_config",
"..:dart_product_config",
"..:dart_precompiled_runtime_config"]
public_configs = [":libdart_vm_config"] public_configs = [":libdart_vm_config"]
vm_sources_list = exec_script("../../tools/gypi_to_gn.py", vm_sources_list = exec_script("../../tools/gypi_to_gn.py",
@ -61,25 +62,29 @@ static_library("libdart_vm") {
} }
static_library("libdart_vm_precompiled_runtime") {
configs += ["..:dart_config_no_precompiler"]
public_configs = [":libdart_vm_config"]
defines = ["DART_PRECOMPILED_RUNTIME"]
vm_sources_list = exec_script("../../tools/gypi_to_gn.py",
[rebase_path("vm_sources.gypi")],
"scope",
["vm_sources.gypi"])
set_sources_assignment_filter(["*_test.cc", "*_test.h"])
sources = vm_sources_list.sources
include_dirs = [
"..",
]
}
static_library("libdart_vm_nosnapshot") { static_library("libdart_vm_nosnapshot") {
configs += ["..:dart_config"] configs += ["..:dart_config",
"..:dart_product_config",
"..:dart_precompiled_runtime_config"]
public_configs = [":libdart_vm_config"]
defines = [ "DART_NO_SNAPSHOT" ]
vm_sources_list = exec_script("../../tools/gypi_to_gn.py",
[rebase_path("vm_sources.gypi")],
"scope",
["vm_sources.gypi"])
set_sources_assignment_filter(["*_test.cc", "*_test.h"])
sources = vm_sources_list.sources
include_dirs = [
"..",
]
}
static_library("libdart_vm_nosnapshot_with_precompiler") {
configs += ["..:dart_config",
"..:dart_product_config",
"..:dart_precompiler_config"]
public_configs = [":libdart_vm_config"] public_configs = [":libdart_vm_config"]
defines = [ "DART_NO_SNAPSHOT" ] defines = [ "DART_NO_SNAPSHOT" ]
vm_sources_list = exec_script("../../tools/gypi_to_gn.py", vm_sources_list = exec_script("../../tools/gypi_to_gn.py",
@ -185,24 +190,30 @@ template("generate_core_libraries") {
} }
static_library("libdart_lib_nosnapshot") { static_library("libdart_lib_nosnapshot") {
configs += ["..:dart_config"] configs += ["..:dart_config",
"..:dart_product_config",
"..:dart_precompiled_runtime_config"]
deps = libdeps deps = libdeps
sources = libsources + ["bootstrap.cc"] + liboutputs sources = libsources + ["bootstrap.cc"] + liboutputs
include_dirs = [ include_dirs = [
"..", "..",
] ]
} }
static_library("libdart_lib") { static_library("libdart_lib_nosnapshot_with_precompiler") {
configs += ["..:dart_config"] configs += ["..:dart_config",
sources = libsources + [ "bootstrap_nocore.cc", ] "..:dart_product_config",
"..:dart_precompiler_config" ]
deps = libdeps
sources = libsources + [ "bootstrap.cc"] + liboutputs
include_dirs = [ include_dirs = [
"..", "..",
] ]
} }
static_library("libdart_lib_precompiled_runtime") { static_library("libdart_lib") {
configs += ["..:dart_config_no_precompiler"] configs += ["..:dart_config",
defines = ["DART_PRECOMPILED_RUNTIME"] "..:dart_product_config",
sources = libsources + [ "bootstrap_nocore.cc", ] "..:dart_precompiled_runtime_config"]
sources = libsources + [ "bootstrap_nocore.cc"]
include_dirs = [ include_dirs = [
"..", "..",
] ]

View file

@ -4,7 +4,7 @@
library compiler_configuration; library compiler_configuration;
import 'dart:io' show Platform; import 'dart:io' show Directory, Platform;
import 'runtime_configuration.dart' show RuntimeConfiguration; import 'runtime_configuration.dart' show RuntimeConfiguration;
@ -47,6 +47,7 @@ abstract class CompilerConfiguration {
// which can eventually completely replace the Map-based configuration // which can eventually completely replace the Map-based configuration
// object. // object.
bool isDebug = configuration['mode'] == 'debug'; bool isDebug = configuration['mode'] == 'debug';
bool isProduct = configuration['mode'] == 'product';
bool isChecked = configuration['checked']; bool isChecked = configuration['checked'];
bool isHostChecked = configuration['host_checked']; bool isHostChecked = configuration['host_checked'];
bool useSdk = configuration['use_sdk']; bool useSdk = configuration['use_sdk'];
@ -77,6 +78,7 @@ abstract class CompilerConfiguration {
return new PrecompilerCompilerConfiguration( return new PrecompilerCompilerConfiguration(
isDebug: isDebug, isDebug: isDebug,
isChecked: isChecked, isChecked: isChecked,
isProduct: isProduct,
arch: configuration['arch']); arch: configuration['arch']);
case 'none': case 'none':
return new NoneCompilerConfiguration( return new NoneCompilerConfiguration(
@ -299,9 +301,12 @@ class Dart2jsCompilerConfiguration extends Dart2xCompilerConfiguration {
class PrecompilerCompilerConfiguration extends CompilerConfiguration { class PrecompilerCompilerConfiguration extends CompilerConfiguration {
final String arch; final String arch;
final bool isProduct;
PrecompilerCompilerConfiguration({bool isDebug, bool isChecked, String arch}) PrecompilerCompilerConfiguration(
{bool isDebug, bool isChecked, bool isProduct, String arch})
: super._subclass(isDebug: isDebug, isChecked: isChecked), : super._subclass(isDebug: isDebug, isChecked: isChecked),
isProduct = isProduct,
arch = arch; arch = arch;
int computeTimeoutMultiplier() { int computeTimeoutMultiplier() {
@ -333,9 +338,25 @@ class PrecompilerCompilerConfiguration extends CompilerConfiguration {
CommandBuilder commandBuilder, CommandBuilder commandBuilder,
List arguments, List arguments,
Map<String, String> environmentOverrides) { Map<String, String> environmentOverrides) {
var exec = "$buildDir/dart_bootstrap"; var sourceDir = Directory.current.path;
var exec = "$buildDir/gen_snapshot";
var args = new List(); var args = new List();
args.add("--gen-precompiled-snapshot=$tempDir");
var precompiledVMIsolate = "$tempDir/precompiled.vmisolate";
var precompiledIsolate = "$tempDir/precompiled.isolate";
var precompiledInstructions = "$tempDir/precompiled.S";
var dartProductEntries = "$sourceDir/runtime/bin/dart_product_entries.txt";
var dartEntries = "$sourceDir/runtime/bin/dart_entries.txt";
var vmServiceIoMain = "$sourceDir/runtime/bin/vmservice/vmservice_io.dart";
args.add("--embedder_entry_points_manifest=$dartProductEntries");
if (!isProduct) {
args.add("--embedder_entry_points_manifest=$dartEntries");
}
args.add("--vm_isolate_snapshot=$precompiledVMIsolate");
args.add("--isolate_snapshot=$precompiledIsolate");
args.add("--instructions_snapshot=$precompiledInstructions");
args.add("--url_mapping=dart:vmservice_io,$vmServiceIoMain");
args.addAll(arguments); args.addAll(arguments);
return commandBuilder.getCompilationCommand('precompiler', tempDir, !useSdk, return commandBuilder.getCompilationCommand('precompiler', tempDir, !useSdk,