diff options
Diffstat (limited to 'chromium/v8/src/compiler/pipeline.cc')
-rw-r--r-- | chromium/v8/src/compiler/pipeline.cc | 22 |
1 files changed, 21 insertions, 1 deletions
diff --git a/chromium/v8/src/compiler/pipeline.cc b/chromium/v8/src/compiler/pipeline.cc index 7b99d07b6b6..a9d28d06db1 100644 --- a/chromium/v8/src/compiler/pipeline.cc +++ b/chromium/v8/src/compiler/pipeline.cc @@ -672,7 +672,10 @@ class PipelineImpl final { // Step D. Run the code finalization pass. MaybeHandle<Code> FinalizeCode(bool retire_broker = true); - // Step E. Install any code dependencies. + // Step E. Ensure all embedded maps are non-deprecated. + bool CheckNoDeprecatedMaps(Handle<Code> code); + + // Step F. Install any code dependencies. bool CommitDependencies(Handle<Code> code); void VerifyGeneratedCodeIsIdempotent(); @@ -1219,6 +1222,9 @@ PipelineCompilationJob::Status PipelineCompilationJob::FinalizeJobImpl( } return FAILED; } + if (!pipeline_.CheckNoDeprecatedMaps(code)) { + return RetryOptimization(BailoutReason::kConcurrentMapDeprecation); + } if (!pipeline_.CommitDependencies(code)) { return RetryOptimization(BailoutReason::kBailedOutDueToDependencyChange); } @@ -3549,6 +3555,20 @@ MaybeHandle<Code> PipelineImpl::GenerateCode(CallDescriptor* call_descriptor) { return FinalizeCode(); } +// We must not embed deprecated maps, as we rely in the compiler on all explicit +// maps not being deprecated. +bool PipelineImpl::CheckNoDeprecatedMaps(Handle<Code> code) { + int mode_mask = RelocInfo::EmbeddedObjectModeMask(); + for (RelocIterator it(*code, mode_mask); !it.done(); it.next()) { + DCHECK(RelocInfo::IsEmbeddedObjectMode(it.rinfo()->rmode())); + HeapObject obj = it.rinfo()->target_object(); + if (obj.IsMap() && Map::cast(obj).is_deprecated()) { + return false; + } + } + return true; +} + bool PipelineImpl::CommitDependencies(Handle<Code> code) { return data_->dependencies() == nullptr || data_->dependencies()->Commit(code); |