Bug 1778466 part 1 - Use CodeRange kind to check for InterpEntry stub instead of null frame pointer. r=rhunt

This will let us preserve the caller's frame pointer in later patches. It's also more
consistent with what we do for the JitEntry stub.

Differential Revision: https://phabricator.services.mozilla.com/D151246
This commit is contained in:
Jan de Mooij 2022-07-09 17:33:55 +00:00
Родитель f229c914a8
Коммит c1b9b97857
1 изменённых файлов: 15 добавлений и 16 удалений

Просмотреть файл

@ -167,7 +167,12 @@ void WasmFrameIter::popFrame() {
fp_ = fp_->wasmCaller();
resumePCinCurrentFrame_ = prevFP->returnAddress();
if (!fp_) {
void* returnAddress = prevFP->returnAddress();
code_ = LookupCode(returnAddress, &codeRange_);
MOZ_ASSERT(codeRange_);
if (codeRange_->isInterpEntry()) {
fp_ = nullptr;
code_ = nullptr;
codeRange_ = nullptr;
@ -182,10 +187,6 @@ void WasmFrameIter::popFrame() {
return;
}
void* returnAddress = prevFP->returnAddress();
code_ = LookupCode(returnAddress, &codeRange_);
MOZ_ASSERT(codeRange_);
if (codeRange_->isJitEntry()) {
// This wasm function has been called through the generic JIT entry by
// a JIT caller, so the call stack resembles this:
@ -1430,16 +1431,6 @@ void ProfilingFrameIterator::operator++() {
return;
}
if (!callerFP_) {
MOZ_ASSERT(LookupCode(callerPC_, &codeRange_) == code_);
MOZ_ASSERT(codeRange_->kind() == CodeRange::InterpEntry);
exitReason_ = ExitReason(ExitReason::Fixed::FakeInterpEntry);
codeRange_ = nullptr;
callerPC_ = nullptr;
MOZ_ASSERT(!done());
return;
}
code_ = LookupCode(callerPC_, &codeRange_);
if (!code_ && Frame::isExitOrJitEntryFP(callerFP_)) {
@ -1454,6 +1445,15 @@ void ProfilingFrameIterator::operator++() {
MOZ_ASSERT(codeRange_);
if (codeRange_->isInterpEntry()) {
exitReason_ = ExitReason(ExitReason::Fixed::FakeInterpEntry);
codeRange_ = nullptr;
callerPC_ = nullptr;
callerFP_ = nullptr;
MOZ_ASSERT(!done());
return;
}
if (codeRange_->isJitEntry()) {
unwoundJitCallerFP_ = callerFP_;
MOZ_ASSERT(!done());
@ -1480,7 +1480,6 @@ void ProfilingFrameIterator::operator++() {
break;
}
case CodeRange::InterpEntry:
MOZ_CRASH("should have had null caller fp");
case CodeRange::JitEntry:
MOZ_CRASH("should have been guarded above");
case CodeRange::Throw: