зеркало из https://github.com/mozilla/gecko-dev.git
Bug 1353420: Register the JIT region with mozglue so it can avoid stack-walking that code. r=luke
This commit is contained in:
Родитель
a5aa8f775e
Коммит
e97b534db7
|
@ -217,7 +217,10 @@ ReserveProcessExecutableMemory(size_t bytes)
|
|||
}
|
||||
|
||||
p = (uint8_t*)p + pageSize;
|
||||
bytes -= pageSize;
|
||||
}
|
||||
|
||||
RegisterJitCodeRegion((uint8_t*)p, bytes);
|
||||
# endif
|
||||
|
||||
return p;
|
||||
|
@ -227,6 +230,8 @@ static void
|
|||
DeallocateProcessExecutableMemory(void* addr, size_t bytes)
|
||||
{
|
||||
# ifdef HAVE_64BIT_BUILD
|
||||
UnregisterJitCodeRegion((uint8_t*)addr, bytes);
|
||||
|
||||
if (sJitExceptionHandler) {
|
||||
size_t pageSize = gc::SystemPageSize();
|
||||
addr = (uint8_t*)addr - pageSize;
|
||||
|
|
|
@ -222,6 +222,11 @@ struct WalkStackData
|
|||
DWORD gStackWalkThread;
|
||||
CRITICAL_SECTION gDbgHelpCS;
|
||||
|
||||
#ifdef _M_AMD64
|
||||
static uint8_t* sJitCodeRegionStart;
|
||||
static size_t sJitCodeRegionSize;
|
||||
#endif
|
||||
|
||||
// Routine to print an error message to standard error.
|
||||
static void
|
||||
PrintError(const char* aPrefix)
|
||||
|
@ -397,6 +402,14 @@ WalkStackMain64(struct WalkStackData* aData)
|
|||
}
|
||||
|
||||
#elif defined(_M_AMD64)
|
||||
// If we reach a frame in JIT code, we don't have enough information to
|
||||
// unwind, so we have to give up.
|
||||
if (sJitCodeRegionStart &&
|
||||
(uint8_t*)context.Rip >= sJitCodeRegionStart &&
|
||||
(uint8_t*)context.Rip < sJitCodeRegionStart + sJitCodeRegionSize) {
|
||||
break;
|
||||
}
|
||||
|
||||
// 64-bit frame unwinding.
|
||||
// Try to look up unwind metadata for the current function.
|
||||
ULONG64 imageBase;
|
||||
|
@ -500,6 +513,33 @@ ReleaseStackWalkWorkaroundLock()
|
|||
#endif
|
||||
}
|
||||
|
||||
MFBT_API void
|
||||
RegisterJitCodeRegion(uint8_t* aStart, size_t aSize)
|
||||
{
|
||||
#ifdef _M_AMD64
|
||||
// Currently we can only handle one JIT code region at a time
|
||||
MOZ_RELEASE_ASSERT(!sJitCodeRegionStart);
|
||||
|
||||
sJitCodeRegionStart = aStart;
|
||||
sJitCodeRegionSize = aSize;
|
||||
#endif
|
||||
}
|
||||
|
||||
MFBT_API void
|
||||
UnregisterJitCodeRegion(uint8_t* aStart, size_t aSize)
|
||||
{
|
||||
#ifdef _M_AMD64
|
||||
// Currently we can only handle one JIT code region at a time
|
||||
MOZ_RELEASE_ASSERT(sJitCodeRegionStart &&
|
||||
sJitCodeRegionStart == aStart &&
|
||||
sJitCodeRegionSize == aSize);
|
||||
|
||||
sJitCodeRegionStart = nullptr;
|
||||
sJitCodeRegionSize = 0;
|
||||
#endif
|
||||
}
|
||||
|
||||
|
||||
static unsigned int WINAPI
|
||||
WalkStackThread(void* aData)
|
||||
{
|
||||
|
|
|
@ -18,4 +18,10 @@ TryAcquireStackWalkWorkaroundLock();
|
|||
MFBT_API void
|
||||
ReleaseStackWalkWorkaroundLock();
|
||||
|
||||
MFBT_API void
|
||||
RegisterJitCodeRegion(uint8_t* aStart, size_t size);
|
||||
|
||||
MFBT_API void
|
||||
UnregisterJitCodeRegion(uint8_t* aStart, size_t size);
|
||||
|
||||
#endif // mozilla_StackWalk_windows_h
|
||||
|
|
Загрузка…
Ссылка в новой задаче