From fe0582c2621d300dc84952bf7d5bcc740593a587 Mon Sep 17 00:00:00 2001 From: "ulan@chromium.org" Date: Mon, 28 Jan 2013 10:25:38 +0000 Subject: [PATCH] Put making embedded maps in optimized code weak behind a flag. Disable the flag by default because of Chrome crashes. BUG=172488,172489 R=mstarzinger@chromium.org Review URL: https://chromiumcodereview.appspot.com/12091018 git-svn-id: http://v8.googlecode.com/svn/branches/bleeding_edge@13523 ce2b1a6d-e550-0410-aec6-3dcde31c8c00 --- src/flag-definitions.h | 2 ++ src/lithium.cc | 4 +++- src/mark-compact.cc | 3 ++- src/objects-visiting-inl.h | 3 ++- 4 files changed, 9 insertions(+), 3 deletions(-) diff --git a/src/flag-definitions.h b/src/flag-definitions.h index 3bf32a9..0b0332a 100644 --- a/src/flag-definitions.h +++ b/src/flag-definitions.h @@ -402,6 +402,8 @@ DEFINE_bool(trace_external_memory, false, "it is adjusted.") DEFINE_bool(collect_maps, true, "garbage collect maps from which no objects can be reached") +DEFINE_bool(weak_embedded_maps_in_optimized_code, false, + "make maps embedded in optimized code weak") DEFINE_bool(flush_code, true, "flush code that we expect not to use again (during full gc)") DEFINE_bool(flush_code_incrementally, true, diff --git a/src/lithium.cc b/src/lithium.cc index 81944b2..108eb7f 100644 --- a/src/lithium.cc +++ b/src/lithium.cc @@ -429,7 +429,9 @@ Handle LChunk::Codegen(Code::Kind kind) { Handle code = CodeGenerator::MakeCodeEpilogue(&assembler, flags, info()); generator.FinishCode(code); - RegisterDependentCodeForEmbeddedMaps(code); + if (FLAG_weak_embedded_maps_in_optimized_code) { + RegisterDependentCodeForEmbeddedMaps(code); + } CodeGenerator::PrintCode(code, info()); return code; } diff --git a/src/mark-compact.cc b/src/mark-compact.cc index 7d611c1..bfb4031 100644 --- a/src/mark-compact.cc +++ b/src/mark-compact.cc @@ -85,7 +85,8 @@ class VerifyMarkingVisitor: public ObjectVisitor { void VisitEmbeddedPointer(RelocInfo* rinfo) { ASSERT(rinfo->rmode() == RelocInfo::EMBEDDED_OBJECT); - if (rinfo->host()->kind() != Code::OPTIMIZED_FUNCTION || + if (!FLAG_weak_embedded_maps_in_optimized_code || + rinfo->host()->kind() != Code::OPTIMIZED_FUNCTION || !rinfo->target_object()->IsMap() || !Map::cast(rinfo->target_object())->CanTransition()) { VisitPointer(rinfo->target_object_address()); diff --git a/src/objects-visiting-inl.h b/src/objects-visiting-inl.h index e2b0e25..7332a0c 100644 --- a/src/objects-visiting-inl.h +++ b/src/objects-visiting-inl.h @@ -175,7 +175,8 @@ void StaticMarkingVisitor::VisitEmbeddedPointer( ASSERT(rinfo->rmode() == RelocInfo::EMBEDDED_OBJECT); ASSERT(!rinfo->target_object()->IsConsString()); HeapObject* object = HeapObject::cast(rinfo->target_object()); - if (!FLAG_collect_maps || rinfo->host()->kind() != Code::OPTIMIZED_FUNCTION || + if (!FLAG_weak_embedded_maps_in_optimized_code || + !FLAG_collect_maps || rinfo->host()->kind() != Code::OPTIMIZED_FUNCTION || !object->IsMap() || !Map::cast(object)->CanTransition()) { heap->mark_compact_collector()->RecordRelocSlot(rinfo, object); StaticVisitor::MarkObject(heap, object); -- 2.7.4