Bug 1353420: Register the JIT region with mozglue so it can avoid stack-walking that code. r=luke

This commit is contained in:
David Major 2017-04-18 18:52:04 -04:00
Родитель a5aa8f775e
Коммит e97b534db7
3 изменённых файлов: 51 добавлений и 0 удалений

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

@ -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