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

Unified Diff: runtime/vm/snapshot.h

Issue 1915853004: Option to output precompiled instructions as a blob for use with mmap instead of assembly for use i… (Closed) Base URL: git@github.com:dart-lang/sdk.git@master
Patch Set: Created 4 years, 8 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/raw_object.h ('k') | runtime/vm/snapshot.cc » ('j') | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: runtime/vm/snapshot.h
diff --git a/runtime/vm/snapshot.h b/runtime/vm/snapshot.h
index 25dab12a4fd17212286ac1b44d88f306439f1f18..f9822b8e68b8dbc89aa5c9e89dc9142bd5bbe10e 100644
--- a/runtime/vm/snapshot.h
+++ b/runtime/vm/snapshot.h
@@ -844,31 +844,22 @@ class ForwardList {
class InstructionsWriter : public ZoneAllocated {
public:
- InstructionsWriter(uint8_t** buffer,
- ReAlloc alloc,
- intptr_t initial_size)
- : stream_(buffer, alloc, initial_size),
- next_offset_(InstructionsSnapshot::kHeaderSize),
+ InstructionsWriter()
+ : next_offset_(InstructionsSnapshot::kHeaderSize),
next_object_offset_(DataSnapshot::kHeaderSize),
- binary_size_(0),
instructions_(),
objects_() {
- ASSERT(buffer != NULL);
- ASSERT(alloc != NULL);
}
-
- // Size of the snapshot (assembly code).
- intptr_t BytesWritten() const { return stream_.bytes_written(); }
-
- intptr_t binary_size() { return binary_size_; }
+ virtual ~InstructionsWriter() { }
int32_t GetOffsetFor(RawInstructions* instructions, RawCode* code);
int32_t GetObjectOffsetFor(RawObject* raw_object);
- void WriteAssembly();
+ virtual void Write() = 0;
+ virtual intptr_t binary_size() = 0;
- private:
+ protected:
struct InstructionsData {
explicit InstructionsData(RawInstructions* insns,
RawCode* code,
@@ -896,24 +887,76 @@ class InstructionsWriter : public ZoneAllocated {
};
};
+ intptr_t next_offset_;
+ intptr_t next_object_offset_;
+ GrowableArray<InstructionsData> instructions_;
+ GrowableArray<ObjectData> objects_;
+
+ private:
+ DISALLOW_COPY_AND_ASSIGN(InstructionsWriter);
+};
+
+
+class AssemblyInstructionsWriter : public InstructionsWriter {
+ public:
+ AssemblyInstructionsWriter(uint8_t** assembly_buffer,
+ ReAlloc alloc,
+ intptr_t initial_size)
+ : InstructionsWriter(),
+ assembly_stream_(assembly_buffer, alloc, initial_size) {
+ }
+
+ virtual void Write();
+ virtual intptr_t binary_size() { return binary_size_; }
+
+ intptr_t AssemblySize() const { return assembly_stream_.bytes_written(); }
+
+ private:
void WriteWordLiteral(uword value) {
// Padding is helpful for comparing the .S with --disassemble.
#if defined(ARCH_IS_64_BIT)
- stream_.Print(".quad 0x%0.16" Px "\n", value);
+ assembly_stream_.Print(".quad 0x%0.16" Px "\n", value);
#else
- stream_.Print(".long 0x%0.8" Px "\n", value);
+ assembly_stream_.Print(".long 0x%0.8" Px "\n", value);
#endif
binary_size_ += sizeof(value);
}
- WriteStream stream_;
- intptr_t next_offset_;
- intptr_t next_object_offset_;
+ WriteStream assembly_stream_;
intptr_t binary_size_;
- GrowableArray<InstructionsData> instructions_;
- GrowableArray<ObjectData> objects_;
- DISALLOW_COPY_AND_ASSIGN(InstructionsWriter);
+ DISALLOW_COPY_AND_ASSIGN(AssemblyInstructionsWriter);
+};
+
+
+class BlobInstructionsWriter : public InstructionsWriter {
+ public:
+ BlobInstructionsWriter(uint8_t** instructions_blob_buffer,
+ uint8_t** rodata_blob_buffer,
+ ReAlloc alloc,
+ intptr_t initial_size)
+ : InstructionsWriter(),
+ instructions_blob_stream_(instructions_blob_buffer, alloc, initial_size),
+ rodata_blob_stream_(rodata_blob_buffer, alloc, initial_size) {
+ }
+
+ virtual void Write();
+ virtual intptr_t binary_size() {
+ return InstructionsBlobSize() + RodataBlobSize();
+ }
+
+ intptr_t InstructionsBlobSize() const {
+ return instructions_blob_stream_.bytes_written();
+ }
+ intptr_t RodataBlobSize() const {
+ return rodata_blob_stream_.bytes_written();
+ }
+
+ private:
+ WriteStream instructions_blob_stream_;
+ WriteStream rodata_blob_stream_;
+
+ DISALLOW_COPY_AND_ASSIGN(BlobInstructionsWriter);
};
@@ -1070,8 +1113,8 @@ class FullSnapshotWriter {
static const intptr_t kInitialSize = 64 * KB;
FullSnapshotWriter(uint8_t** vm_isolate_snapshot_buffer,
uint8_t** isolate_snapshot_buffer,
- uint8_t** instructions_snapshot_buffer,
ReAlloc alloc,
+ InstructionsWriter* instructions_writer,
bool snapshot_code,
bool vm_isolate_is_symbolic);
~FullSnapshotWriter();
@@ -1098,9 +1141,6 @@ class FullSnapshotWriter {
intptr_t IsolateSnapshotSize() const {
return isolate_snapshot_size_;
}
- intptr_t InstructionsSnapshotSize() const {
- return instructions_snapshot_size_;
- }
private:
// Writes a snapshot of the VM Isolate.
@@ -1112,11 +1152,9 @@ class FullSnapshotWriter {
Thread* thread_;
uint8_t** vm_isolate_snapshot_buffer_;
uint8_t** isolate_snapshot_buffer_;
- uint8_t** instructions_snapshot_buffer_;
ReAlloc alloc_;
intptr_t vm_isolate_snapshot_size_;
intptr_t isolate_snapshot_size_;
- intptr_t instructions_snapshot_size_;
ForwardList* forward_list_;
InstructionsWriter* instructions_writer_;
Array& scripts_;
@@ -1132,8 +1170,8 @@ class PrecompiledSnapshotWriter : public FullSnapshotWriter {
public:
PrecompiledSnapshotWriter(uint8_t** vm_isolate_snapshot_buffer,
uint8_t** isolate_snapshot_buffer,
- uint8_t** instructions_snapshot_buffer,
- ReAlloc alloc);
+ ReAlloc alloc,
+ InstructionsWriter* instructions_writer);
~PrecompiledSnapshotWriter();
};
« no previous file with comments | « runtime/vm/raw_object.h ('k') | runtime/vm/snapshot.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698