From: yangguo Date: Mon, 24 Aug 2015 14:49:22 +0000 (-0700) Subject: Deserializer: flush code cache while code pointers are still valid. X-Git-Tag: upstream/4.7.83~709 X-Git-Url: http://review.tizen.org/git/?a=commitdiff_plain;h=e642fde41408bb744b26b3de2096103f9d5d40b6;p=platform%2Fupstream%2Fv8.git Deserializer: flush code cache while code pointers are still valid. Omitting test case because it would be brittle and become useless soon. R=mlippautz@chromium.org BUG=chromium:523453 LOG=N Review URL: https://codereview.chromium.org/1312763002 Cr-Commit-Position: refs/heads/master@{#30331} --- diff --git a/src/snapshot/serialize.cc b/src/snapshot/serialize.cc index 467f141..0e67276 100644 --- a/src/snapshot/serialize.cc +++ b/src/snapshot/serialize.cc @@ -500,16 +500,19 @@ void Deserializer::DecodeReservation( } -void Deserializer::FlushICacheForNewCodeObjects() { - if (!deserializing_user_code_) { - // The entire isolate is newly deserialized. Simply flush all code pages. - PageIterator it(isolate_->heap()->code_space()); - while (it.has_next()) { - Page* p = it.next(); - CpuFeatures::FlushICache(p->area_start(), - p->area_end() - p->area_start()); - } +void Deserializer::FlushICacheForNewIsolate() { + DCHECK(!deserializing_user_code_); + // The entire isolate is newly deserialized. Simply flush all code pages. + PageIterator it(isolate_->heap()->code_space()); + while (it.has_next()) { + Page* p = it.next(); + CpuFeatures::FlushICache(p->area_start(), p->area_end() - p->area_start()); } +} + + +void Deserializer::FlushICacheForNewCodeObjects() { + DCHECK(deserializing_user_code_); for (Code* code : new_code_objects_) { CpuFeatures::FlushICache(code->instruction_start(), code->instruction_size()); @@ -557,6 +560,7 @@ void Deserializer::Deserialize(Isolate* isolate) { isolate_->heap()->RepairFreeListsAfterDeserialization(); isolate_->heap()->IterateWeakRoots(this, VISIT_ALL); DeserializeDeferredObjects(); + FlushICacheForNewIsolate(); } isolate_->heap()->set_native_contexts_list( @@ -574,8 +578,6 @@ void Deserializer::Deserialize(Isolate* isolate) { ExtraNatives::UpdateSourceCache(isolate_->heap()); CodeStubNatives::UpdateSourceCache(isolate_->heap()); - FlushICacheForNewCodeObjects(); - // Issue code events for newly deserialized code objects. LOG_CODE_EVENT(isolate_, LogCodeObjects()); LOG_CODE_EVENT(isolate_, LogCompiledFunctions()); @@ -631,6 +633,7 @@ MaybeHandle Deserializer::DeserializeCode( Object* root; VisitPointer(&root); DeserializeDeferredObjects(); + FlushICacheForNewCodeObjects(); result = Handle(SharedFunctionInfo::cast(root)); } CommitPostProcessedObjects(isolate); @@ -2625,7 +2628,6 @@ MaybeHandle CodeSerializer::Deserialize( if (FLAG_profile_deserialization) PrintF("[Deserializing failed]\n"); return MaybeHandle(); } - deserializer.FlushICacheForNewCodeObjects(); if (FLAG_profile_deserialization) { double ms = timer.Elapsed().InMillisecondsF(); diff --git a/src/snapshot/serialize.h b/src/snapshot/serialize.h index 49eeb69..2863ede 100644 --- a/src/snapshot/serialize.h +++ b/src/snapshot/serialize.h @@ -547,8 +547,6 @@ class Deserializer: public SerializerDeserializer { // Deserialize a shared function info. Fail gracefully. MaybeHandle DeserializeCode(Isolate* isolate); - void FlushICacheForNewCodeObjects(); - // Pass a vector of externally-provided objects referenced by the snapshot. // The ownership to its backing store is handed over as well. void SetAttachedObjects(Vector > attached_objects) { @@ -576,6 +574,9 @@ class Deserializer: public SerializerDeserializer { void DeserializeDeferredObjects(); + void FlushICacheForNewIsolate(); + void FlushICacheForNewCodeObjects(); + void CommitPostProcessedObjects(Isolate* isolate); // Fills in some heap data in an area from start to end (non-inclusive). The