| Index: src/serialize.cc
|
| diff --git a/src/serialize.cc b/src/serialize.cc
|
| index 4933a19f01976b2203c97f582610c09683829851..5e6de03f63dd53ab4be51f08908084b0b309e3b8 100644
|
| --- a/src/serialize.cc
|
| +++ b/src/serialize.cc
|
| @@ -1184,13 +1184,8 @@ void Deserializer::ReadData(Object** current, Object** limit, int source_space,
|
| // Find a builtin and write a pointer to it to the current object.
|
| CASE_STATEMENT(kBuiltin, kPlain, kStartOfObject, 0)
|
| CASE_BODY(kBuiltin, kPlain, kStartOfObject, 0)
|
| -#if V8_OOL_CONSTANT_POOL
|
| - // Find a builtin code entry and write a pointer to it to the current
|
| - // object.
|
| CASE_STATEMENT(kBuiltin, kPlain, kInnerPointer, 0)
|
| CASE_BODY(kBuiltin, kPlain, kInnerPointer, 0)
|
| -#endif
|
| - // Find a builtin and write a pointer to it in the current code object.
|
| CASE_STATEMENT(kBuiltin, kFromCode, kInnerPointer, 0)
|
| CASE_BODY(kBuiltin, kFromCode, kInnerPointer, 0)
|
| // Find an object in the attached references and write a pointer to it to
|
| @@ -1963,12 +1958,18 @@ ScriptData* CodeSerializer::Serialize(Isolate* isolate,
|
| Handle<String> source) {
|
| base::ElapsedTimer timer;
|
| if (FLAG_profile_deserialization) timer.Start();
|
| + if (FLAG_serializer_trace_level > 0) {
|
| + PrintF("[Serializing from");
|
| + Object* script = info->script();
|
| + if (script->IsScript()) Script::cast(script)->name()->ShortPrint();
|
| + PrintF("]\n");
|
| + }
|
|
|
| // Serialize code object.
|
| List<byte> payload;
|
| ListSnapshotSink list_sink(&payload);
|
| DebugSnapshotSink debug_sink(&list_sink);
|
| - SnapshotByteSink* sink = FLAG_trace_code_serializer
|
| + SnapshotByteSink* sink = FLAG_serializer_trace_level > 1
|
| ? static_cast<SnapshotByteSink*>(&debug_sink)
|
| : static_cast<SnapshotByteSink*>(&list_sink);
|
| CodeSerializer cs(isolate, sink, *source, info->code());
|
| @@ -1997,13 +1998,16 @@ void CodeSerializer::SerializeObject(Object* o, HowToCode how_to_code,
|
|
|
| int root_index;
|
| if ((root_index = RootIndex(heap_object, how_to_code)) != kInvalidRootIndex) {
|
| + if (FLAG_serializer_trace_level > 0) {
|
| + PrintF(" Encoding root: %d\n", root_index);
|
| + }
|
| PutRoot(root_index, heap_object, how_to_code, where_to_point, skip);
|
| return;
|
| }
|
|
|
| if (address_mapper_.IsMapped(heap_object)) {
|
| - if (FLAG_trace_code_serializer) {
|
| - PrintF("Encoding back reference to: ");
|
| + if (FLAG_serializer_trace_level > 0) {
|
| + PrintF(" Encoding back reference to: ");
|
| heap_object->ShortPrint();
|
| PrintF("\n");
|
| }
|
| @@ -2026,30 +2030,30 @@ void CodeSerializer::SerializeObject(Object* o, HowToCode how_to_code,
|
| case Code::NUMBER_OF_KINDS: // Pseudo enum value.
|
| CHECK(false);
|
| case Code::BUILTIN:
|
| - SerializeBuiltin(code_object, how_to_code, where_to_point);
|
| + SerializeBuiltin(code_object->builtin_index(), how_to_code,
|
| + where_to_point);
|
| return;
|
| case Code::STUB:
|
| - SerializeCodeStub(code_object, how_to_code, where_to_point);
|
| + SerializeCodeStub(code_object->stub_key(), how_to_code, where_to_point);
|
| return;
|
| #define IC_KIND_CASE(KIND) case Code::KIND:
|
| IC_KIND_LIST(IC_KIND_CASE)
|
| #undef IC_KIND_CASE
|
| - SerializeHeapObject(code_object, how_to_code, where_to_point);
|
| + SerializeIC(code_object, how_to_code, where_to_point);
|
| return;
|
| - // TODO(yangguo): add special handling to canonicalize ICs.
|
| case Code::FUNCTION:
|
| // Only serialize the code for the toplevel function. Replace code
|
| // of included function literals by the lazy compile builtin.
|
| // This is safe, as checked in Compiler::BuildFunctionInfo.
|
| if (code_object != main_code_) {
|
| - Code* lazy = *isolate()->builtins()->CompileLazy();
|
| - SerializeBuiltin(lazy, how_to_code, where_to_point);
|
| + SerializeBuiltin(Builtins::kCompileLazy, how_to_code, where_to_point);
|
| } else {
|
| code_object->MakeYoung();
|
| SerializeHeapObject(code_object, how_to_code, where_to_point);
|
| }
|
| return;
|
| }
|
| + UNREACHABLE();
|
| }
|
|
|
| if (heap_object == source_) {
|
| @@ -2071,8 +2075,8 @@ void CodeSerializer::SerializeObject(Object* o, HowToCode how_to_code,
|
| void CodeSerializer::SerializeHeapObject(HeapObject* heap_object,
|
| HowToCode how_to_code,
|
| WhereToPoint where_to_point) {
|
| - if (FLAG_trace_code_serializer) {
|
| - PrintF("Encoding heap object: ");
|
| + if (FLAG_serializer_trace_level > 0) {
|
| + PrintF(" Encoding heap object: ");
|
| heap_object->ShortPrint();
|
| PrintF("\n");
|
| }
|
| @@ -2084,17 +2088,16 @@ void CodeSerializer::SerializeHeapObject(HeapObject* heap_object,
|
| }
|
|
|
|
|
| -void CodeSerializer::SerializeBuiltin(Code* builtin, HowToCode how_to_code,
|
| +void CodeSerializer::SerializeBuiltin(int builtin_index, HowToCode how_to_code,
|
| WhereToPoint where_to_point) {
|
| DCHECK((how_to_code == kPlain && where_to_point == kStartOfObject) ||
|
| (how_to_code == kPlain && where_to_point == kInnerPointer) ||
|
| (how_to_code == kFromCode && where_to_point == kInnerPointer));
|
| - int builtin_index = builtin->builtin_index();
|
| DCHECK_LT(builtin_index, Builtins::builtin_count);
|
| DCHECK_LE(0, builtin_index);
|
|
|
| - if (FLAG_trace_code_serializer) {
|
| - PrintF("Encoding builtin: %s\n",
|
| + if (FLAG_serializer_trace_level > 0) {
|
| + PrintF(" Encoding builtin: %s\n",
|
| isolate()->builtins()->name(builtin_index));
|
| }
|
|
|
| @@ -2103,19 +2106,18 @@ void CodeSerializer::SerializeBuiltin(Code* builtin, HowToCode how_to_code,
|
| }
|
|
|
|
|
| -void CodeSerializer::SerializeCodeStub(Code* stub, HowToCode how_to_code,
|
| +void CodeSerializer::SerializeCodeStub(uint32_t stub_key, HowToCode how_to_code,
|
| WhereToPoint where_to_point) {
|
| DCHECK((how_to_code == kPlain && where_to_point == kStartOfObject) ||
|
| (how_to_code == kPlain && where_to_point == kInnerPointer) ||
|
| (how_to_code == kFromCode && where_to_point == kInnerPointer));
|
| - uint32_t stub_key = stub->stub_key();
|
| DCHECK(CodeStub::MajorKeyFromKey(stub_key) != CodeStub::NoCache);
|
| DCHECK(!CodeStub::GetCode(isolate(), stub_key).is_null());
|
|
|
| int index = AddCodeStubKey(stub_key) + kCodeStubsBaseIndex;
|
|
|
| - if (FLAG_trace_code_serializer) {
|
| - PrintF("Encoding code stub %s as %d\n",
|
| + if (FLAG_serializer_trace_level > 0) {
|
| + PrintF(" Encoding code stub %s as %d\n",
|
| CodeStub::MajorName(CodeStub::MajorKeyFromKey(stub_key), false),
|
| index);
|
| }
|
| @@ -2125,6 +2127,44 @@ void CodeSerializer::SerializeCodeStub(Code* stub, HowToCode how_to_code,
|
| }
|
|
|
|
|
| +void CodeSerializer::SerializeIC(Code* ic, HowToCode how_to_code,
|
| + WhereToPoint where_to_point) {
|
| + // The IC may be implemented as a stub.
|
| + uint32_t stub_key = ic->stub_key();
|
| + if (stub_key != CodeStub::NoCacheKey()) {
|
| + if (FLAG_serializer_trace_level > 0) {
|
| + PrintF(" %s is a code stub\n", Code::Kind2String(ic->kind()));
|
| + }
|
| + SerializeCodeStub(stub_key, how_to_code, where_to_point);
|
| + return;
|
| + }
|
| + // The IC may be implemented as builtin. Only real builtins have an
|
| + // actual builtin_index value attached (otherwise it's just garbage).
|
| + // Compare to make sure we are really dealing with a builtin.
|
| + int builtin_index = ic->builtin_index();
|
| + if (builtin_index < Builtins::builtin_count) {
|
| + Builtins::Name name = static_cast<Builtins::Name>(builtin_index);
|
| + Code* builtin = isolate()->builtins()->builtin(name);
|
| + if (builtin == ic) {
|
| + if (FLAG_serializer_trace_level > 0) {
|
| + PrintF(" %s is a builtin\n", Code::Kind2String(ic->kind()));
|
| + }
|
| + DCHECK(ic->kind() == Code::KEYED_LOAD_IC ||
|
| + ic->kind() == Code::KEYED_STORE_IC);
|
| + SerializeBuiltin(builtin_index, how_to_code, where_to_point);
|
| + return;
|
| + }
|
| + }
|
| + // The IC may also just be a piece of code kept in the non_monomorphic_cache.
|
| + // In that case, just serialize as a normal code object.
|
| + if (FLAG_serializer_trace_level > 0) {
|
| + PrintF(" %s has no special handling\n", Code::Kind2String(ic->kind()));
|
| + }
|
| + DCHECK(ic->kind() == Code::LOAD_IC || ic->kind() == Code::STORE_IC);
|
| + SerializeHeapObject(ic, how_to_code, where_to_point);
|
| +}
|
| +
|
| +
|
| int CodeSerializer::AddCodeStubKey(uint32_t stub_key) {
|
| // TODO(yangguo) Maybe we need a hash table for a faster lookup than O(n^2).
|
| int index = 0;
|
| @@ -2139,7 +2179,7 @@ int CodeSerializer::AddCodeStubKey(uint32_t stub_key) {
|
|
|
| void CodeSerializer::SerializeSourceObject(HowToCode how_to_code,
|
| WhereToPoint where_to_point) {
|
| - if (FLAG_trace_code_serializer) PrintF("Encoding source object\n");
|
| + if (FLAG_serializer_trace_level > 0) PrintF(" Encoding source object\n");
|
|
|
| DCHECK(how_to_code == kPlain && where_to_point == kStartOfObject);
|
| sink_->Put(kAttachedReference + how_to_code + where_to_point, "Source");
|
|
|