Commit e642fde4 authored by yangguo's avatar yangguo Committed by Commit bot

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}
parent 24544698
...@@ -500,16 +500,19 @@ void Deserializer::DecodeReservation( ...@@ -500,16 +500,19 @@ void Deserializer::DecodeReservation(
} }
void Deserializer::FlushICacheForNewCodeObjects() { void Deserializer::FlushICacheForNewIsolate() {
if (!deserializing_user_code_) { DCHECK(!deserializing_user_code_);
// The entire isolate is newly deserialized. Simply flush all code pages. // The entire isolate is newly deserialized. Simply flush all code pages.
PageIterator it(isolate_->heap()->code_space()); PageIterator it(isolate_->heap()->code_space());
while (it.has_next()) { while (it.has_next()) {
Page* p = it.next(); Page* p = it.next();
CpuFeatures::FlushICache(p->area_start(), CpuFeatures::FlushICache(p->area_start(), p->area_end() - p->area_start());
p->area_end() - p->area_start());
}
} }
}
void Deserializer::FlushICacheForNewCodeObjects() {
DCHECK(deserializing_user_code_);
for (Code* code : new_code_objects_) { for (Code* code : new_code_objects_) {
CpuFeatures::FlushICache(code->instruction_start(), CpuFeatures::FlushICache(code->instruction_start(),
code->instruction_size()); code->instruction_size());
...@@ -557,6 +560,7 @@ void Deserializer::Deserialize(Isolate* isolate) { ...@@ -557,6 +560,7 @@ void Deserializer::Deserialize(Isolate* isolate) {
isolate_->heap()->RepairFreeListsAfterDeserialization(); isolate_->heap()->RepairFreeListsAfterDeserialization();
isolate_->heap()->IterateWeakRoots(this, VISIT_ALL); isolate_->heap()->IterateWeakRoots(this, VISIT_ALL);
DeserializeDeferredObjects(); DeserializeDeferredObjects();
FlushICacheForNewIsolate();
} }
isolate_->heap()->set_native_contexts_list( isolate_->heap()->set_native_contexts_list(
...@@ -574,8 +578,6 @@ void Deserializer::Deserialize(Isolate* isolate) { ...@@ -574,8 +578,6 @@ void Deserializer::Deserialize(Isolate* isolate) {
ExtraNatives::UpdateSourceCache(isolate_->heap()); ExtraNatives::UpdateSourceCache(isolate_->heap());
CodeStubNatives::UpdateSourceCache(isolate_->heap()); CodeStubNatives::UpdateSourceCache(isolate_->heap());
FlushICacheForNewCodeObjects();
// Issue code events for newly deserialized code objects. // Issue code events for newly deserialized code objects.
LOG_CODE_EVENT(isolate_, LogCodeObjects()); LOG_CODE_EVENT(isolate_, LogCodeObjects());
LOG_CODE_EVENT(isolate_, LogCompiledFunctions()); LOG_CODE_EVENT(isolate_, LogCompiledFunctions());
...@@ -631,6 +633,7 @@ MaybeHandle<SharedFunctionInfo> Deserializer::DeserializeCode( ...@@ -631,6 +633,7 @@ MaybeHandle<SharedFunctionInfo> Deserializer::DeserializeCode(
Object* root; Object* root;
VisitPointer(&root); VisitPointer(&root);
DeserializeDeferredObjects(); DeserializeDeferredObjects();
FlushICacheForNewCodeObjects();
result = Handle<SharedFunctionInfo>(SharedFunctionInfo::cast(root)); result = Handle<SharedFunctionInfo>(SharedFunctionInfo::cast(root));
} }
CommitPostProcessedObjects(isolate); CommitPostProcessedObjects(isolate);
...@@ -2625,7 +2628,6 @@ MaybeHandle<SharedFunctionInfo> CodeSerializer::Deserialize( ...@@ -2625,7 +2628,6 @@ MaybeHandle<SharedFunctionInfo> CodeSerializer::Deserialize(
if (FLAG_profile_deserialization) PrintF("[Deserializing failed]\n"); if (FLAG_profile_deserialization) PrintF("[Deserializing failed]\n");
return MaybeHandle<SharedFunctionInfo>(); return MaybeHandle<SharedFunctionInfo>();
} }
deserializer.FlushICacheForNewCodeObjects();
if (FLAG_profile_deserialization) { if (FLAG_profile_deserialization) {
double ms = timer.Elapsed().InMillisecondsF(); double ms = timer.Elapsed().InMillisecondsF();
......
...@@ -547,8 +547,6 @@ class Deserializer: public SerializerDeserializer { ...@@ -547,8 +547,6 @@ class Deserializer: public SerializerDeserializer {
// Deserialize a shared function info. Fail gracefully. // Deserialize a shared function info. Fail gracefully.
MaybeHandle<SharedFunctionInfo> DeserializeCode(Isolate* isolate); MaybeHandle<SharedFunctionInfo> DeserializeCode(Isolate* isolate);
void FlushICacheForNewCodeObjects();
// Pass a vector of externally-provided objects referenced by the snapshot. // Pass a vector of externally-provided objects referenced by the snapshot.
// The ownership to its backing store is handed over as well. // The ownership to its backing store is handed over as well.
void SetAttachedObjects(Vector<Handle<Object> > attached_objects) { void SetAttachedObjects(Vector<Handle<Object> > attached_objects) {
...@@ -576,6 +574,9 @@ class Deserializer: public SerializerDeserializer { ...@@ -576,6 +574,9 @@ class Deserializer: public SerializerDeserializer {
void DeserializeDeferredObjects(); void DeserializeDeferredObjects();
void FlushICacheForNewIsolate();
void FlushICacheForNewCodeObjects();
void CommitPostProcessedObjects(Isolate* isolate); void CommitPostProcessedObjects(Isolate* isolate);
// Fills in some heap data in an area from start to end (non-inclusive). The // Fills in some heap data in an area from start to end (non-inclusive). The
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment