Fix TSAN issue wrt assertions in the optimizing compiler thread.

R=hpayer@chromium.org

Review URL: https://codereview.chromium.org/212603013

git-svn-id: http://v8.googlecode.com/svn/branches/bleeding_edge@20322 ce2b1a6d-e550-0410-aec6-3dcde31c8c00
This commit is contained in:
yangguo@chromium.org 2014-03-28 08:49:58 +00:00
parent 9e655afdb4
commit 3579968e86
3 changed files with 23 additions and 9 deletions

View File

@ -52,14 +52,15 @@ Handle<T>::Handle(T* obj, Isolate* isolate) {
template <typename T>
inline bool Handle<T>::is_identical_to(const Handle<T> other) const {
inline bool Handle<T>::is_identical_to(const Handle<T> o) const {
ASSERT(location_ == NULL || !(*location_)->IsFailure());
if (location_ == other.location_) return true;
if (location_ == NULL || other.location_ == NULL) return false;
// Dereferencing deferred handles to check object equality is safe.
SLOW_ASSERT(IsDereferenceAllowed(NO_DEFERRED_CHECK) &&
other.IsDereferenceAllowed(NO_DEFERRED_CHECK));
return *location_ == *other.location_;
SLOW_ASSERT(
(location_ == NULL || IsDereferenceAllowed(NO_DEFERRED_CHECK)) &&
(o.location_ == NULL || o.IsDereferenceAllowed(NO_DEFERRED_CHECK)));
if (location_ == o.location_) return true;
if (location_ == NULL || o.location_ == NULL) return false;
return *location_ == *o.location_;
}

View File

@ -84,7 +84,7 @@ void HEnvironmentLivenessAnalysisPhase::ZapEnvironmentSlotsInSuccessors(
}
HSimulate* simulate = first_simulate_.at(successor_id);
if (simulate == NULL) continue;
ASSERT(simulate->closure().is_identical_to(
ASSERT(VerifyClosures(simulate->closure(),
block->last_environment()->closure()));
ZapEnvironmentSlot(i, simulate);
}
@ -97,7 +97,7 @@ void HEnvironmentLivenessAnalysisPhase::ZapEnvironmentSlotsForInstruction(
if (!marker->CheckFlag(HValue::kEndsLiveRange)) return;
HSimulate* simulate = marker->next_simulate();
if (simulate != NULL) {
ASSERT(simulate->closure().is_identical_to(marker->closure()));
ASSERT(VerifyClosures(simulate->closure(), marker->closure()));
ZapEnvironmentSlot(marker->index(), simulate);
}
}
@ -241,4 +241,14 @@ void HEnvironmentLivenessAnalysisPhase::Run() {
}
}
#ifdef DEBUG
bool HEnvironmentLivenessAnalysisPhase::VerifyClosures(
Handle<JSFunction> a, Handle<JSFunction> b) {
Heap::RelocationLock for_heap_access(isolate()->heap());
AllowHandleDereference for_verification;
return a.is_identical_to(b);
}
#endif
} } // namespace v8::internal

View File

@ -55,6 +55,9 @@ class HEnvironmentLivenessAnalysisPhase : public HPhase {
void ZapEnvironmentSlotsForInstruction(HEnvironmentMarker* marker);
void UpdateLivenessAtBlockEnd(HBasicBlock* block, BitVector* live);
void UpdateLivenessAtInstruction(HInstruction* instr, BitVector* live);
#ifdef DEBUG
bool VerifyClosures(Handle<JSFunction> a, Handle<JSFunction> b);
#endif
int block_count_;