Skip to content

Commit 6e34fa1

Browse files
mkustermanncommit-bot@chromium.org
authored andcommitted
[VM] Allow run_vm_tests to load like we do in normal dart
Our build files use non-appjit snapshots for kernel-service for certain architectures, e.g. simulators. Issue #31585 Change-Id: I5162b8fe266f97710c50c347ae20b53cd66cf75d Reviewed-on: https://dart-review.googlesource.com/29240 Commit-Queue: Martin Kustermann <[email protected]> Reviewed-by: Vyacheslav Egorov <[email protected]>
1 parent 3ab2914 commit 6e34fa1

File tree

4 files changed

+90
-25
lines changed

4 files changed

+90
-25
lines changed

runtime/bin/dartutils.cc

Lines changed: 35 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,7 @@
2020
#include "platform/assert.h"
2121
#include "platform/globals.h"
2222
#include "platform/memory_sanitizer.h"
23+
#include "platform/utils.h"
2324

2425
// Return the error from the containing function if handle is in error handle.
2526
#define RETURN_IF_ERROR(handle) \
@@ -49,13 +50,7 @@ const char* const DartUtils::kUriLibURL = "dart:uri";
4950
const char* const DartUtils::kHttpScheme = "http:";
5051
const char* const DartUtils::kVMServiceLibURL = "dart:vmservice";
5152

52-
struct MagicNumberData {
53-
static const intptr_t kMaxLength = 4;
54-
55-
intptr_t length;
56-
const uint8_t bytes[kMaxLength];
57-
};
58-
53+
MagicNumberData appjit_magic_number = {8, {0xdc, 0xdc, 0xf6, 0xf6, 0, 0, 0, 0}};
5954
MagicNumberData snapshot_magic_number = {4, {0xf5, 0xf5, 0xdc, 0xdc}};
6055
MagicNumberData kernel_magic_number = {4, {0x90, 0xab, 0xcd, 0xef}};
6156
MagicNumberData gzip_magic_number = {2, {0x1f, 0x8b, 0, 0}};
@@ -356,12 +351,41 @@ static bool CheckMagicNumber(const uint8_t* buffer,
356351
return false;
357352
}
358353

354+
DartUtils::MagicNumber DartUtils::SniffForMagicNumber(const char* filename) {
355+
MagicNumber magic_number = DartUtils::kUnknownMagicNumber;
356+
if (File::GetType(NULL, filename, true) == File::kIsFile) {
357+
File* file = File::Open(NULL, filename, File::kRead);
358+
if (file != NULL) {
359+
intptr_t max_magic_length = 0;
360+
max_magic_length =
361+
Utils::Maximum(max_magic_length, snapshot_magic_number.length);
362+
max_magic_length =
363+
Utils::Maximum(max_magic_length, appjit_magic_number.length);
364+
max_magic_length =
365+
Utils::Maximum(max_magic_length, kernel_magic_number.length);
366+
max_magic_length =
367+
Utils::Maximum(max_magic_length, gzip_magic_number.length);
368+
ASSERT(max_magic_length <= 8);
369+
uint8_t header[8];
370+
if (file->ReadFully(&header, max_magic_length)) {
371+
magic_number = DartUtils::SniffForMagicNumber(header, sizeof(header));
372+
}
373+
file->Close();
374+
}
375+
}
376+
return magic_number;
377+
}
378+
359379
DartUtils::MagicNumber DartUtils::SniffForMagicNumber(const uint8_t* buffer,
360380
intptr_t buffer_length) {
361381
if (CheckMagicNumber(buffer, buffer_length, snapshot_magic_number)) {
362382
return kSnapshotMagicNumber;
363383
}
364384

385+
if (CheckMagicNumber(buffer, buffer_length, appjit_magic_number)) {
386+
return kAppJITMagicNumber;
387+
}
388+
365389
if (CheckMagicNumber(buffer, buffer_length, kernel_magic_number)) {
366390
return kKernelMagicNumber;
367391
}
@@ -370,6 +394,10 @@ DartUtils::MagicNumber DartUtils::SniffForMagicNumber(const uint8_t* buffer,
370394
return kGzipMagicNumber;
371395
}
372396

397+
if (CheckMagicNumber(buffer, buffer_length, gzip_magic_number)) {
398+
return kGzipMagicNumber;
399+
}
400+
373401
return kUnknownMagicNumber;
374402
}
375403

runtime/bin/dartutils.h

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -202,11 +202,15 @@ class DartUtils {
202202

203203
enum MagicNumber {
204204
kSnapshotMagicNumber,
205+
kAppJITMagicNumber,
205206
kKernelMagicNumber,
206207
kGzipMagicNumber,
207208
kUnknownMagicNumber
208209
};
209210

211+
// Checks if the buffer is a script snapshot, kernel file, or gzip file.
212+
static MagicNumber SniffForMagicNumber(const char* filename);
213+
210214
// Checks if the buffer is a script snapshot, kernel file, or gzip file.
211215
static MagicNumber SniffForMagicNumber(const uint8_t* text_buffer,
212216
intptr_t buffer_len);
@@ -644,6 +648,18 @@ class ScopedMemBuffer {
644648
DISALLOW_COPY_AND_ASSIGN(ScopedMemBuffer);
645649
};
646650

651+
struct MagicNumberData {
652+
static const intptr_t kMaxLength = 8;
653+
654+
intptr_t length;
655+
const uint8_t bytes[kMaxLength];
656+
};
657+
658+
extern MagicNumberData appjit_magic_number;
659+
extern MagicNumberData snapshot_magic_number;
660+
extern MagicNumberData kernel_magic_number;
661+
extern MagicNumberData gzip_magic_number;
662+
647663
} // namespace bin
648664
} // namespace dart
649665

runtime/bin/run_vm_tests.cc

Lines changed: 35 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -137,25 +137,33 @@ static Dart_Isolate CreateIsolateAndSetup(const char* script_uri,
137137
}
138138
script_uri = kernel_snapshot;
139139

140-
bin::AppSnapshot* app_snapshot =
141-
bin::Snapshot::TryReadAppSnapshot(script_uri);
142-
if (app_snapshot == NULL) {
143-
*error = strdup("Failed to read kernel service app snapshot");
144-
return NULL;
145-
}
146-
140+
// Kernel isolate uses an app snapshot or the core libraries snapshot.
141+
bool isolate_run_script_snapshot = false;
147142
const uint8_t* isolate_snapshot_data = bin::core_isolate_snapshot_data;
148143
const uint8_t* isolate_snapshot_instructions =
149144
bin::core_isolate_snapshot_instructions;
150-
151-
const uint8_t* ignore_vm_snapshot_data;
152-
const uint8_t* ignore_vm_snapshot_instructions;
153-
app_snapshot->SetBuffers(
154-
&ignore_vm_snapshot_data, &ignore_vm_snapshot_instructions,
155-
&isolate_snapshot_data, &isolate_snapshot_instructions);
156-
145+
bin::AppSnapshot* app_snapshot = NULL;
146+
switch (bin::DartUtils::SniffForMagicNumber(script_uri)) {
147+
case bin::DartUtils::kAppJITMagicNumber: {
148+
app_snapshot = bin::Snapshot::TryReadAppSnapshot(script_uri);
149+
ASSERT(app_snapshot != NULL);
150+
151+
const uint8_t* ignore_vm_snapshot_data;
152+
const uint8_t* ignore_vm_snapshot_instructions;
153+
app_snapshot->SetBuffers(
154+
&ignore_vm_snapshot_data, &ignore_vm_snapshot_instructions,
155+
&isolate_snapshot_data, &isolate_snapshot_instructions);
156+
break;
157+
}
158+
case bin::DartUtils::kSnapshotMagicNumber: {
159+
isolate_run_script_snapshot = true;
160+
break;
161+
}
162+
default:
163+
return NULL;
164+
}
157165
bin::IsolateData* isolate_data = new bin::IsolateData(
158-
script_uri, package_root, packages_config, NULL /* app_snapshot */);
166+
script_uri, package_root, packages_config, app_snapshot);
159167
Dart_Isolate isolate = Dart_CreateIsolate(
160168
DART_KERNEL_ISOLATE_NAME, main, isolate_snapshot_data,
161169
isolate_snapshot_instructions, flags, isolate_data, error);
@@ -167,6 +175,18 @@ static Dart_Isolate CreateIsolateAndSetup(const char* script_uri,
167175

168176
Dart_EnterScope();
169177

178+
if (isolate_run_script_snapshot) {
179+
const uint8_t* payload;
180+
intptr_t payload_length;
181+
void* file = bin::DartUtils::OpenFile(script_uri, false);
182+
bin::DartUtils::ReadFile(&payload, &payload_length, file);
183+
bin::DartUtils::CloseFile(file);
184+
185+
bin::DartUtils::SkipSnapshotMagicNumber(&payload, &payload_length);
186+
Dart_Handle result = Dart_LoadScriptFromSnapshot(payload, payload_length);
187+
CHECK_RESULT(result);
188+
}
189+
170190
bin::DartUtils::SetOriginalWorkingDirectory();
171191
Dart_Handle result = bin::DartUtils::PrepareForScriptLoading(
172192
false /* is_service_isolate */, false /* trace_loading */);

runtime/bin/snapshot_utils.cc

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -21,7 +21,6 @@ extern const char* kIsolateSnapshotDataSymbolName;
2121
extern const char* kIsolateSnapshotInstructionsSymbolName;
2222

2323
static const int64_t kAppSnapshotHeaderSize = 5 * kInt64Size;
24-
static const int64_t kAppSnapshotMagicNumber = 0xf6f6dcdc;
2524
static const int64_t kAppSnapshotPageSize = 4 * KB;
2625

2726
class MappedAppSnapshot : public AppSnapshot {
@@ -86,7 +85,9 @@ static AppSnapshot* TryReadAppSnapshotBlobs(const char* script_name) {
8685
file->Release();
8786
return NULL;
8887
}
89-
if (header[0] != kAppSnapshotMagicNumber) {
88+
ASSERT(sizeof(header[0]) == appjit_magic_number.length);
89+
if (memcmp(&header[0], appjit_magic_number.bytes,
90+
appjit_magic_number.length) != 0) {
9091
file->Release();
9192
return NULL;
9293
}
@@ -287,7 +288,7 @@ static void WriteAppSnapshot(const char* filename,
287288
ErrorExit(kErrorExitCode, "Unable to write snapshot file '%s'\n", filename);
288289
}
289290

290-
file->WriteFully(&kAppSnapshotMagicNumber, sizeof(kAppSnapshotMagicNumber));
291+
file->WriteFully(appjit_magic_number.bytes, appjit_magic_number.length);
291292
WriteInt64(file, vm_data_size);
292293
WriteInt64(file, vm_instructions_size);
293294
WriteInt64(file, isolate_data_size);

0 commit comments

Comments
 (0)