| Index: src/snapshot/serializer.cc | 
| diff --git a/src/snapshot/serializer.cc b/src/snapshot/serializer.cc | 
| index 025283b7b33ee0a20bf1b9800d31d2804ac86db4..5f9002e4e34fc65d77ccbdbab8b2e618e09288f6 100644 | 
| --- a/src/snapshot/serializer.cc | 
| +++ b/src/snapshot/serializer.cc | 
| @@ -5,6 +5,7 @@ | 
| #include "src/snapshot/serializer.h" | 
|  | 
| #include "src/assembler-inl.h" | 
| +#include "src/deoptimizer.h" | 
| #include "src/heap/heap-inl.h" | 
| #include "src/macro-assembler.h" | 
| #include "src/snapshot/natives.h" | 
| @@ -334,6 +335,25 @@ bool Serializer::HasNotExceededFirstPageOfEachSpace() { | 
| return true; | 
| } | 
|  | 
| +bool Serializer::ObjectSerializer::TryEncodeDeoptimizationEntry( | 
| +    HowToCode how_to_code, Address target, int skip) { | 
| +  for (int bailout_type = 0; bailout_type <= Deoptimizer::kLastBailoutType; | 
| +       ++bailout_type) { | 
| +    int id = Deoptimizer::GetDeoptimizationId( | 
| +        serializer_->isolate(), target, | 
| +        static_cast<Deoptimizer::BailoutType>(bailout_type)); | 
| +    if (id == Deoptimizer::kNotDeoptimizationEntry) continue; | 
| +    sink_->Put(how_to_code == kPlain ? kDeoptimizerEntryPlain | 
| +                                     : kDeoptimizerEntryFromCode, | 
| +               "DeoptimizationEntry"); | 
| +    sink_->PutInt(skip, "SkipB4DeoptimizationEntry"); | 
| +    sink_->Put(bailout_type, "BailoutType"); | 
| +    sink_->PutInt(id, "EntryId"); | 
| +    return true; | 
| +  } | 
| +  return false; | 
| +} | 
| + | 
| void Serializer::ObjectSerializer::SerializePrologue(AllocationSpace space, | 
| int size, Map* map) { | 
| if (serializer_->code_address_map_) { | 
| @@ -611,10 +631,12 @@ void Serializer::ObjectSerializer::VisitEmbeddedPointer(RelocInfo* rinfo) { | 
| void Serializer::ObjectSerializer::VisitExternalReference(Address* p) { | 
| int skip = OutputRawData(reinterpret_cast<Address>(p), | 
| kCanReturnSkipInsteadOfSkipping); | 
| -  sink_->Put(kExternalReference + kPlain + kStartOfObject, "ExternalRef"); | 
| -  sink_->PutInt(skip, "SkipB4ExternalRef"); | 
| Address target = *p; | 
| -  sink_->PutInt(serializer_->EncodeExternalReference(target), "reference id"); | 
| +  if (!TryEncodeDeoptimizationEntry(kPlain, target, skip)) { | 
| +    sink_->Put(kExternalReference + kPlain + kStartOfObject, "ExternalRef"); | 
| +    sink_->PutInt(skip, "SkipB4ExternalRef"); | 
| +    sink_->PutInt(serializer_->EncodeExternalReference(target), "reference id"); | 
| +  } | 
| bytes_processed_so_far_ += kPointerSize; | 
| } | 
|  | 
| @@ -622,11 +644,14 @@ void Serializer::ObjectSerializer::VisitExternalReference(RelocInfo* rinfo) { | 
| int skip = OutputRawData(rinfo->target_address_address(), | 
| kCanReturnSkipInsteadOfSkipping); | 
| HowToCode how_to_code = rinfo->IsCodedSpecially() ? kFromCode : kPlain; | 
| -  sink_->Put(kExternalReference + how_to_code + kStartOfObject, "ExternalRef"); | 
| -  sink_->PutInt(skip, "SkipB4ExternalRef"); | 
| Address target = rinfo->target_external_reference(); | 
| -  DCHECK_NOT_NULL(target);  // Code does not reference null. | 
| -  sink_->PutInt(serializer_->EncodeExternalReference(target), "reference id"); | 
| +  if (!TryEncodeDeoptimizationEntry(how_to_code, target, skip)) { | 
| +    sink_->Put(kExternalReference + how_to_code + kStartOfObject, | 
| +               "ExternalRef"); | 
| +    sink_->PutInt(skip, "SkipB4ExternalRef"); | 
| +    DCHECK_NOT_NULL(target);  // Code does not reference null. | 
| +    sink_->PutInt(serializer_->EncodeExternalReference(target), "reference id"); | 
| +  } | 
| bytes_processed_so_far_ += rinfo->target_address_size(); | 
| } | 
|  | 
| @@ -658,10 +683,13 @@ void Serializer::ObjectSerializer::VisitRuntimeEntry(RelocInfo* rinfo) { | 
| int skip = OutputRawData(rinfo->target_address_address(), | 
| kCanReturnSkipInsteadOfSkipping); | 
| HowToCode how_to_code = rinfo->IsCodedSpecially() ? kFromCode : kPlain; | 
| -  sink_->Put(kExternalReference + how_to_code + kStartOfObject, "ExternalRef"); | 
| -  sink_->PutInt(skip, "SkipB4ExternalRef"); | 
| Address target = rinfo->target_address(); | 
| -  sink_->PutInt(serializer_->EncodeExternalReference(target), "reference id"); | 
| +  if (!TryEncodeDeoptimizationEntry(how_to_code, target, skip)) { | 
| +    sink_->Put(kExternalReference + how_to_code + kStartOfObject, | 
| +               "ExternalRef"); | 
| +    sink_->PutInt(skip, "SkipB4ExternalRef"); | 
| +    sink_->PutInt(serializer_->EncodeExternalReference(target), "reference id"); | 
| +  } | 
| bytes_processed_so_far_ += rinfo->target_address_size(); | 
| } | 
|  | 
|  |