Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(2023)

Unified Diff: runtime/vm/snapshot.cc

Issue 1584443002: VM: Precompiled rodata snapshot. (Closed) Base URL: git@github.com:dart-lang/sdk.git@master
Patch Set: compute string hash if necessary Created 4 years, 10 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
« no previous file with comments | « runtime/vm/snapshot.h ('k') | runtime/vm/virtual_memory.h » ('j') | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: runtime/vm/snapshot.cc
diff --git a/runtime/vm/snapshot.cc b/runtime/vm/snapshot.cc
index bbeef36c2a96bf5720fbf06ccfc9a2666848c1c6..8c002681b21fef5705e1f670a27e0e3806e3f58a 100644
--- a/runtime/vm/snapshot.cc
+++ b/runtime/vm/snapshot.cc
@@ -177,11 +177,13 @@ SnapshotReader::SnapshotReader(
const uint8_t* buffer,
intptr_t size,
const uint8_t* instructions_buffer,
+ const uint8_t* data_buffer,
Snapshot::Kind kind,
ZoneGrowableArray<BackRefNode>* backward_refs,
Thread* thread)
: BaseReader(buffer, size),
instructions_buffer_(instructions_buffer),
+ data_buffer_(data_buffer),
kind_(kind),
snapshot_code_(instructions_buffer != NULL),
thread_(thread),
@@ -211,7 +213,8 @@ SnapshotReader::SnapshotReader(
backward_references_(backward_refs),
instructions_reader_(NULL) {
if (instructions_buffer != NULL) {
- instructions_reader_ = new InstructionsReader(instructions_buffer);
+ instructions_reader_ =
+ new InstructionsReader(instructions_buffer, data_buffer);
}
}
@@ -1133,6 +1136,15 @@ int32_t InstructionsWriter::GetOffsetFor(RawInstructions* instructions) {
}
+int32_t InstructionsWriter::GetObjectOffsetFor(RawObject* raw_object) {
+ intptr_t heap_size = raw_object->Size();
+ intptr_t offset = next_object_offset_;
+ next_object_offset_ += heap_size;
+ objects_.Add(ObjectData(raw_object));
+ return offset;
+}
+
+
static void EnsureIdentifier(char* label) {
for (char c = *label; c != '\0'; c = *++label) {
if (((c >= 'a') && (c <= 'z')) ||
@@ -1156,10 +1168,16 @@ void InstructionsWriter::WriteAssembly() {
ASSERT(data.raw_code_ != NULL);
data.code_ = &Code::Handle(Z, data.raw_code_);
}
+ for (intptr_t i = 0; i < objects_.length(); i++) {
+ ObjectData& data = objects_[i];
+ data.obj_ = &Object::Handle(Z, data.raw_obj_);
+ }
stream_.Print(".text\n");
stream_.Print(".globl _kInstructionsSnapshot\n");
- stream_.Print(".balign %" Pd ", 0\n", OS::kMaxPreferredCodeAlignment);
+ // Start snapshot at page boundary.
+ ASSERT(VirtualMemory::PageSize() >= OS::kMaxPreferredCodeAlignment);
+ stream_.Print(".balign %" Pd ", 0\n", VirtualMemory::PageSize());
stream_.Print("_kInstructionsSnapshot:\n");
// This head also provides the gap to make the instructions snapshot
@@ -1241,6 +1259,41 @@ void InstructionsWriter::WriteAssembly() {
}
}
}
+#if defined(TARGET_OS_LINUX)
+ stream_.Print(".section .rodata\n");
+#elif defined(TARGET_OS_MACOS)
+ stream_.Print(".const\n");
+#else
+#error Unsupported platform
+#endif
+ stream_.Print(".globl _kDataSnapshot\n");
+ // Start snapshot at page boundary.
+ stream_.Print(".balign %" Pd ", 0\n", VirtualMemory::PageSize());
+ stream_.Print("_kDataSnapshot:\n");
+ WriteWordLiteral(next_object_offset_); // Data length.
+ COMPILE_ASSERT(OS::kMaxPreferredCodeAlignment >= kObjectAlignment);
+ stream_.Print(".balign %" Pd ", 0\n", OS::kMaxPreferredCodeAlignment);
+
+ for (intptr_t i = 0; i < objects_.length(); i++) {
+ const Object& obj = *objects_[i].obj_;
+ stream_.Print("Precompiled_Obj_%d:\n", i);
+
+ NoSafepointScope no_safepoint;
+ uword start = reinterpret_cast<uword>(obj.raw()) - kHeapObjectTag;
+ uword end = start + obj.raw()->Size();
+
+ // Write object header with the mark and VM heap bits set.
+ uword marked_tags = obj.raw()->ptr()->tags_;
+ marked_tags = RawObject::VMHeapObjectTag::update(true, marked_tags);
+ marked_tags = RawObject::MarkBit::update(true, marked_tags);
+ WriteWordLiteral(marked_tags);
+ start += sizeof(uword);
+ for (uword* cursor = reinterpret_cast<uword*>(start);
+ cursor < reinterpret_cast<uword*>(end);
+ cursor++) {
+ WriteWordLiteral(*cursor);
+ }
+ }
}
@@ -1250,15 +1303,30 @@ RawInstructions* InstructionsReader::GetInstructionsAt(int32_t offset,
RawInstructions* result =
reinterpret_cast<RawInstructions*>(
- reinterpret_cast<uword>(buffer_) + offset + kHeapObjectTag);
+ reinterpret_cast<uword>(instructions_buffer_) +
+ offset + kHeapObjectTag);
+#ifdef DEBUG
uword actual_tags = result->ptr()->tags_;
if (actual_tags != expected_tags) {
FATAL2("Instructions tag mismatch: expected %" Pd ", saw %" Pd,
expected_tags,
actual_tags);
}
+#endif
+
+ ASSERT(result->IsMarked());
+
+ return result;
+}
+
+
+RawObject* InstructionsReader::GetObjectAt(int32_t offset) {
+ ASSERT(Utils::IsAligned(offset, kWordSize));
+ RawObject* result =
+ reinterpret_cast<RawObject*>(
+ reinterpret_cast<uword>(data_buffer_) + offset + kHeapObjectTag);
ASSERT(result->IsMarked());
return result;
@@ -1489,10 +1557,12 @@ VmIsolateSnapshotReader::VmIsolateSnapshotReader(
const uint8_t* buffer,
intptr_t size,
const uint8_t* instructions_buffer,
+ const uint8_t* data_buffer,
Thread* thread)
: SnapshotReader(buffer,
size,
instructions_buffer,
+ data_buffer,
Snapshot::kFull,
new ZoneGrowableArray<BackRefNode>(
kNumVmIsolateSnapshotReferences),
@@ -1510,6 +1580,7 @@ VmIsolateSnapshotReader::~VmIsolateSnapshotReader() {
}
ResetBackwardReferenceTable();
Dart::set_instructions_snapshot_buffer(instructions_buffer_);
+ Dart::set_data_snapshot_buffer(data_buffer_);
}
@@ -1561,10 +1632,12 @@ RawApiError* VmIsolateSnapshotReader::ReadVmIsolateSnapshot() {
IsolateSnapshotReader::IsolateSnapshotReader(const uint8_t* buffer,
intptr_t size,
const uint8_t* instructions_buffer,
+ const uint8_t* data_buffer,
Thread* thread)
: SnapshotReader(buffer,
size,
instructions_buffer,
+ data_buffer,
Snapshot::kFull,
new ZoneGrowableArray<BackRefNode>(
kNumInitialReferencesInFullSnapshot),
@@ -1584,6 +1657,7 @@ ScriptSnapshotReader::ScriptSnapshotReader(const uint8_t* buffer,
: SnapshotReader(buffer,
size,
NULL, /* instructions_buffer */
+ NULL, /* data_buffer */
Snapshot::kScript,
new ZoneGrowableArray<BackRefNode>(kNumInitialReferences),
thread) {
@@ -1601,6 +1675,7 @@ MessageSnapshotReader::MessageSnapshotReader(const uint8_t* buffer,
: SnapshotReader(buffer,
size,
NULL, /* instructions_buffer */
+ NULL, /* data_buffer */
Snapshot::kMessage,
new ZoneGrowableArray<BackRefNode>(kNumInitialReferences),
thread) {
« no previous file with comments | « runtime/vm/snapshot.h ('k') | runtime/vm/virtual_memory.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698