Skip to content

Commit e642fde

Browse files
hashseedCommit bot
authored andcommitted
Deserializer: flush code cache while code pointers are still valid.
Omitting test case because it would be brittle and become useless soon. [email protected] BUG=chromium:523453 LOG=N Review URL: https://codereview.chromium.org/1312763002 Cr-Commit-Position: refs/heads/master@{#30331}
1 parent 2454469 commit e642fde

File tree

2 files changed

+17
-14
lines changed

2 files changed

+17
-14
lines changed

src/snapshot/serialize.cc

Lines changed: 14 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -500,16 +500,19 @@ void Deserializer::DecodeReservation(
500500
}
501501

502502

503-
void Deserializer::FlushICacheForNewCodeObjects() {
504-
if (!deserializing_user_code_) {
505-
// The entire isolate is newly deserialized. Simply flush all code pages.
506-
PageIterator it(isolate_->heap()->code_space());
507-
while (it.has_next()) {
508-
Page* p = it.next();
509-
CpuFeatures::FlushICache(p->area_start(),
510-
p->area_end() - p->area_start());
511-
}
503+
void Deserializer::FlushICacheForNewIsolate() {
504+
DCHECK(!deserializing_user_code_);
505+
// The entire isolate is newly deserialized. Simply flush all code pages.
506+
PageIterator it(isolate_->heap()->code_space());
507+
while (it.has_next()) {
508+
Page* p = it.next();
509+
CpuFeatures::FlushICache(p->area_start(), p->area_end() - p->area_start());
512510
}
511+
}
512+
513+
514+
void Deserializer::FlushICacheForNewCodeObjects() {
515+
DCHECK(deserializing_user_code_);
513516
for (Code* code : new_code_objects_) {
514517
CpuFeatures::FlushICache(code->instruction_start(),
515518
code->instruction_size());
@@ -557,6 +560,7 @@ void Deserializer::Deserialize(Isolate* isolate) {
557560
isolate_->heap()->RepairFreeListsAfterDeserialization();
558561
isolate_->heap()->IterateWeakRoots(this, VISIT_ALL);
559562
DeserializeDeferredObjects();
563+
FlushICacheForNewIsolate();
560564
}
561565

562566
isolate_->heap()->set_native_contexts_list(
@@ -574,8 +578,6 @@ void Deserializer::Deserialize(Isolate* isolate) {
574578
ExtraNatives::UpdateSourceCache(isolate_->heap());
575579
CodeStubNatives::UpdateSourceCache(isolate_->heap());
576580

577-
FlushICacheForNewCodeObjects();
578-
579581
// Issue code events for newly deserialized code objects.
580582
LOG_CODE_EVENT(isolate_, LogCodeObjects());
581583
LOG_CODE_EVENT(isolate_, LogCompiledFunctions());
@@ -631,6 +633,7 @@ MaybeHandle<SharedFunctionInfo> Deserializer::DeserializeCode(
631633
Object* root;
632634
VisitPointer(&root);
633635
DeserializeDeferredObjects();
636+
FlushICacheForNewCodeObjects();
634637
result = Handle<SharedFunctionInfo>(SharedFunctionInfo::cast(root));
635638
}
636639
CommitPostProcessedObjects(isolate);
@@ -2625,7 +2628,6 @@ MaybeHandle<SharedFunctionInfo> CodeSerializer::Deserialize(
26252628
if (FLAG_profile_deserialization) PrintF("[Deserializing failed]\n");
26262629
return MaybeHandle<SharedFunctionInfo>();
26272630
}
2628-
deserializer.FlushICacheForNewCodeObjects();
26292631

26302632
if (FLAG_profile_deserialization) {
26312633
double ms = timer.Elapsed().InMillisecondsF();

src/snapshot/serialize.h

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -547,8 +547,6 @@ class Deserializer: public SerializerDeserializer {
547547
// Deserialize a shared function info. Fail gracefully.
548548
MaybeHandle<SharedFunctionInfo> DeserializeCode(Isolate* isolate);
549549

550-
void FlushICacheForNewCodeObjects();
551-
552550
// Pass a vector of externally-provided objects referenced by the snapshot.
553551
// The ownership to its backing store is handed over as well.
554552
void SetAttachedObjects(Vector<Handle<Object> > attached_objects) {
@@ -576,6 +574,9 @@ class Deserializer: public SerializerDeserializer {
576574

577575
void DeserializeDeferredObjects();
578576

577+
void FlushICacheForNewIsolate();
578+
void FlushICacheForNewCodeObjects();
579+
579580
void CommitPostProcessedObjects(Isolate* isolate);
580581

581582
// Fills in some heap data in an area from start to end (non-inclusive). The

0 commit comments

Comments
 (0)