| Index: runtime/vm/snapshot.h
|
| diff --git a/runtime/vm/snapshot.h b/runtime/vm/snapshot.h
|
| index b1071d61da35dab764cb1388b7546508371e659f..978dbd166def1fec3904f4900df9cf22be31d239 100644
|
| --- a/runtime/vm/snapshot.h
|
| +++ b/runtime/vm/snapshot.h
|
| @@ -224,6 +224,34 @@ class InstructionsSnapshot : ValueObject {
|
| };
|
|
|
|
|
| +class DataSnapshot : ValueObject {
|
| + public:
|
| + explicit DataSnapshot(const void* raw_memory)
|
| + : raw_memory_(raw_memory) {
|
| + ASSERT(Utils::IsAligned(raw_memory, 2 * kWordSize)); // kObjectAlignment
|
| + }
|
| +
|
| + void* data_start() {
|
| + return reinterpret_cast<void*>(
|
| + reinterpret_cast<uword>(raw_memory_) + kHeaderSize);
|
| + }
|
| +
|
| + uword data_size() {
|
| + uword snapshot_size = *reinterpret_cast<const uword*>(raw_memory_);
|
| + return snapshot_size - kHeaderSize;
|
| + }
|
| +
|
| + // Header: data length and padding for alignment. We use the same alignment
|
| + // as for code for now.
|
| + static const intptr_t kHeaderSize = OS::kMaxPreferredCodeAlignment;
|
| +
|
| + private:
|
| + const void* raw_memory_; // The symbol kDataSnapshot.
|
| +
|
| + DISALLOW_COPY_AND_ASSIGN(DataSnapshot);
|
| +};
|
| +
|
| +
|
| class BaseReader {
|
| public:
|
| BaseReader(const uint8_t* buffer, intptr_t size) : stream_(buffer, size) {}
|
| @@ -333,17 +361,22 @@ class BackRefNode : public ValueObject {
|
|
|
| class InstructionsReader : public ZoneAllocated {
|
| public:
|
| - explicit InstructionsReader(const uint8_t* buffer)
|
| - : buffer_(buffer) {
|
| - ASSERT(buffer != NULL);
|
| - ASSERT(Utils::IsAligned(reinterpret_cast<uword>(buffer),
|
| + InstructionsReader(const uint8_t* instructions_buffer,
|
| + const uint8_t* data_buffer)
|
| + : instructions_buffer_(instructions_buffer),
|
| + data_buffer_(data_buffer) {
|
| + ASSERT(instructions_buffer != NULL);
|
| + ASSERT(data_buffer != NULL);
|
| + ASSERT(Utils::IsAligned(reinterpret_cast<uword>(instructions_buffer),
|
| OS::PreferredCodeAlignment()));
|
| }
|
|
|
| RawInstructions* GetInstructionsAt(int32_t offset, uword expected_tags);
|
| + RawObject* GetObjectAt(int32_t offset);
|
|
|
| private:
|
| - const uint8_t* buffer_;
|
| + const uint8_t* instructions_buffer_;
|
| + const uint8_t* data_buffer_;
|
|
|
| DISALLOW_COPY_AND_ASSIGN(InstructionsReader);
|
| };
|
| @@ -456,12 +489,18 @@ class SnapshotReader : public BaseReader {
|
| return instructions_reader_->GetInstructionsAt(offset, expected_tags);
|
| }
|
|
|
| + RawObject* GetObjectAt(int32_t offset) {
|
| + return instructions_reader_->GetObjectAt(offset);
|
| + }
|
| +
|
| const uint8_t* instructions_buffer_;
|
| + const uint8_t* data_buffer_;
|
|
|
| protected:
|
| SnapshotReader(const uint8_t* buffer,
|
| intptr_t size,
|
| const uint8_t* instructions_buffer,
|
| + const uint8_t* data_buffer,
|
| Snapshot::Kind kind,
|
| ZoneGrowableArray<BackRefNode>* backward_references,
|
| Thread* thread);
|
| @@ -608,6 +647,7 @@ class VmIsolateSnapshotReader : public SnapshotReader {
|
| VmIsolateSnapshotReader(const uint8_t* buffer,
|
| intptr_t size,
|
| const uint8_t* instructions_buffer,
|
| + const uint8_t* data_buffer,
|
| Thread* thread);
|
| ~VmIsolateSnapshotReader();
|
|
|
| @@ -623,6 +663,7 @@ class IsolateSnapshotReader : public SnapshotReader {
|
| IsolateSnapshotReader(const uint8_t* buffer,
|
| intptr_t size,
|
| const uint8_t* instructions_buffer,
|
| + const uint8_t* data_buffer,
|
| Thread* thread);
|
| ~IsolateSnapshotReader();
|
|
|
| @@ -811,8 +852,10 @@ class InstructionsWriter : public ZoneAllocated {
|
| intptr_t initial_size)
|
| : stream_(buffer, alloc, initial_size),
|
| next_offset_(InstructionsSnapshot::kHeaderSize),
|
| + next_object_offset_(DataSnapshot::kHeaderSize),
|
| binary_size_(0),
|
| - instructions_() {
|
| + instructions_(),
|
| + objects_() {
|
| ASSERT(buffer != NULL);
|
| ASSERT(alloc != NULL);
|
| }
|
| @@ -824,6 +867,8 @@ class InstructionsWriter : public ZoneAllocated {
|
|
|
| int32_t GetOffsetFor(RawInstructions* instructions);
|
|
|
| + int32_t GetObjectOffsetFor(RawObject* raw_object);
|
| +
|
| void SetInstructionsCode(RawInstructions* insns, RawCode* code) {
|
| for (intptr_t i = 0; i < instructions_.length(); i++) {
|
| if (instructions_[i].raw_insns_ == insns) {
|
| @@ -851,6 +896,16 @@ class InstructionsWriter : public ZoneAllocated {
|
| };
|
| };
|
|
|
| + struct ObjectData {
|
| + explicit ObjectData(RawObject* raw_obj)
|
| + : raw_obj_(raw_obj) { }
|
| +
|
| + union {
|
| + RawObject* raw_obj_;
|
| + const Object* obj_;
|
| + };
|
| + };
|
| +
|
| void WriteWordLiteral(uword value) {
|
| // Padding is helpful for comparing the .S with --disassemble.
|
| #if defined(ARCH_IS_64_BIT)
|
| @@ -863,8 +918,10 @@ class InstructionsWriter : public ZoneAllocated {
|
|
|
| WriteStream stream_;
|
| intptr_t next_offset_;
|
| + intptr_t next_object_offset_;
|
| intptr_t binary_size_;
|
| GrowableArray<InstructionsData> instructions_;
|
| + GrowableArray<ObjectData> objects_;
|
|
|
| DISALLOW_COPY_AND_ASSIGN(InstructionsWriter);
|
| };
|
| @@ -920,6 +977,10 @@ class SnapshotWriter : public BaseWriter {
|
| return instructions_writer_->GetOffsetFor(instructions);
|
| }
|
|
|
| + int32_t GetObjectId(RawObject* raw) {
|
| + return instructions_writer_->GetObjectOffsetFor(raw);
|
| + }
|
| +
|
| void SetInstructionsCode(RawInstructions* instructions, RawCode* code) {
|
| return instructions_writer_->SetInstructionsCode(instructions, code);
|
| }
|
|
|