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

Unified Diff: runtime/vm/snapshot.cc

Issue 1808553002: Precompilation: don't include an object header for instructions in the text section. (Closed) Base URL: git@github.com:dart-lang/sdk.git@master
Patch Set: Created 4 years, 9 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/stack_frame.cc » ('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 ea0dce38e500901d107bd7242abed7717da02cf2..183e62f7a20dd13733c4f2fa7f941fccf4dc20bb 100644
--- a/runtime/vm/snapshot.cc
+++ b/runtime/vm/snapshot.cc
@@ -1142,11 +1142,27 @@ RawStacktrace* SnapshotReader::NewStacktrace() {
}
-int32_t InstructionsWriter::GetOffsetFor(RawInstructions* instructions) {
- intptr_t heap_size = instructions->Size();
+int32_t InstructionsWriter::GetOffsetFor(RawInstructions* instructions,
+ RawCode* code) {
+#if defined(PRODUCT)
+ // Instructions are only dedup in product mode because it obfuscates profiler
+ // results.
+ for (intptr_t i = 0; i < instructions_.length(); i++) {
+ if (instructions_[i].raw_insns_ == instructions) {
+ return instructions_[i].offset_;
+ }
+ }
+#endif
+
+ intptr_t payload_size = instructions->ptr()->size_;
+ payload_size = Utils::RoundUp(payload_size, OS::PreferredCodeAlignment());
+
intptr_t offset = next_offset_;
- next_offset_ += heap_size;
- instructions_.Add(InstructionsData(instructions));
+ ASSERT(Utils::IsAligned(next_offset_, OS::PreferredCodeAlignment()));
+ next_offset_ += payload_size;
+ ASSERT(Utils::IsAligned(next_offset_, OS::PreferredCodeAlignment()));
+ instructions_.Add(InstructionsData(instructions, code, offset));
+
return offset;
}
@@ -1213,32 +1229,7 @@ void InstructionsWriter::WriteAssembly() {
ASSERT(insns.raw()->Size() % sizeof(uint64_t) == 0);
- {
- // 1. Write from the header to the entry point.
- NoSafepointScope no_safepoint;
-
- uword beginning = reinterpret_cast<uword>(insns.raw_ptr());
- uword entry = beginning + Instructions::HeaderSize();
-
- ASSERT(Utils::IsAligned(beginning, sizeof(uint64_t)));
- ASSERT(Utils::IsAligned(entry, sizeof(uint64_t)));
-
- // Write Instructions with the mark and VM heap bits set.
- uword marked_tags = insns.raw_ptr()->tags_;
- marked_tags = RawObject::VMHeapObjectTag::update(true, marked_tags);
- marked_tags = RawObject::MarkBit::update(true, marked_tags);
-
- WriteWordLiteral(marked_tags);
- beginning += sizeof(uword);
-
- for (uword* cursor = reinterpret_cast<uword*>(beginning);
- cursor < reinterpret_cast<uword*>(entry);
- cursor++) {
- WriteWordLiteral(*cursor);
- }
- }
-
- // 2. Write a label at the entry point.
+ // 1. Write a label at the entry point.
owner = code.owner();
if (owner.IsNull()) {
const char* name = StubCode::NameOfStub(insns.EntryPoint());
@@ -1257,11 +1248,13 @@ void InstructionsWriter::WriteAssembly() {
}
{
- // 3. Write from the entry point to the end.
+ // 2. Write from the entry point to the end.
NoSafepointScope no_safepoint;
uword beginning = reinterpret_cast<uword>(insns.raw()) - kHeapObjectTag;
uword entry = beginning + Instructions::HeaderSize();
- uword end = beginning + insns.raw()->Size();
+ uword payload_size = insns.size();
+ payload_size = Utils::RoundUp(payload_size, OS::PreferredCodeAlignment());
+ uword end = entry + payload_size;
ASSERT(Utils::IsAligned(beginning, sizeof(uint64_t)));
ASSERT(Utils::IsAligned(entry, sizeof(uint64_t)));
@@ -1313,27 +1306,9 @@ void InstructionsWriter::WriteAssembly() {
}
-RawInstructions* InstructionsReader::GetInstructionsAt(int32_t offset,
- uword expected_tags) {
+uword InstructionsReader::GetInstructionsAt(int32_t offset) {
ASSERT(Utils::IsAligned(offset, OS::PreferredCodeAlignment()));
-
- RawInstructions* result =
- reinterpret_cast<RawInstructions*>(
- 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;
+ return reinterpret_cast<uword>(instructions_buffer_) + offset;
}
« no previous file with comments | « runtime/vm/snapshot.h ('k') | runtime/vm/stack_frame.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698