[General] Fix compiler complaining about using inline assembly inside of a lambda.
Apparently that isn't allowed anymore? Go figure.
This commit is contained in:
parent
b1966a3d2d
commit
7167836964
@ -176,6 +176,54 @@ namespace Components
|
||||
}
|
||||
}
|
||||
|
||||
// this isn't in a lambda because the compiler complains when we use inline assembly inside of a lambda
|
||||
void Exception::DebugMinidumpCommand(Command::Params*)
|
||||
{
|
||||
#pragma warning(push)
|
||||
#pragma warning(disable:4740) // flow in or out of inline asm code suppresses global optimization
|
||||
// The following code was taken from VC++ 8.0 CRT (invarg.c: line 104)
|
||||
|
||||
CONTEXT ContextRecord;
|
||||
EXCEPTION_RECORD ExceptionRecord;
|
||||
ZeroMemory(&ContextRecord, sizeof(CONTEXT));
|
||||
|
||||
__asm
|
||||
{
|
||||
mov[ContextRecord.Eax], eax
|
||||
mov[ContextRecord.Ecx], ecx
|
||||
mov[ContextRecord.Edx], edx
|
||||
mov[ContextRecord.Ebx], ebx
|
||||
mov[ContextRecord.Esi], esi
|
||||
mov[ContextRecord.Edi], edi
|
||||
mov word ptr[ContextRecord.SegSs], ss
|
||||
mov word ptr[ContextRecord.SegCs], cs
|
||||
mov word ptr[ContextRecord.SegDs], ds
|
||||
mov word ptr[ContextRecord.SegEs], es
|
||||
mov word ptr[ContextRecord.SegFs], fs
|
||||
mov word ptr[ContextRecord.SegGs], gs
|
||||
|
||||
pushfd
|
||||
pop[ContextRecord.EFlags]
|
||||
}
|
||||
|
||||
ContextRecord.ContextFlags = CONTEXT_CONTROL;
|
||||
ContextRecord.Eip = reinterpret_cast<DWORD>(_ReturnAddress());
|
||||
ContextRecord.Esp = reinterpret_cast<DWORD>(_AddressOfReturnAddress());
|
||||
ContextRecord.Ebp = *reinterpret_cast<DWORD*>(_AddressOfReturnAddress()) - 1;
|
||||
|
||||
ZeroMemory(&ExceptionRecord, sizeof(EXCEPTION_RECORD));
|
||||
|
||||
ExceptionRecord.ExceptionCode = EXCEPTION_BREAKPOINT;
|
||||
ExceptionRecord.ExceptionAddress = _ReturnAddress();
|
||||
|
||||
EXCEPTION_POINTERS eptr;
|
||||
eptr.ExceptionRecord = &ExceptionRecord;
|
||||
eptr.ContextRecord = &ContextRecord;
|
||||
|
||||
Exception::ExceptionFilter(&eptr);
|
||||
#pragma warning(pop)
|
||||
}
|
||||
|
||||
Exception::Exception()
|
||||
{
|
||||
Exception::SetMiniDumpType(Flags::HasFlag("bigminidumps"), Flags::HasFlag("reallybigminidumps"));
|
||||
@ -232,52 +280,8 @@ namespace Components
|
||||
Logger::Print("Old exception handler was 0x%010X.\n", oldHandler);
|
||||
});
|
||||
|
||||
#pragma warning(push)
|
||||
#pragma warning(disable:4740) // flow in or out of inline asm code suppresses global optimization
|
||||
Command::Add("debug_minidump", [](Command::Params*)
|
||||
{
|
||||
// The following code was taken from VC++ 8.0 CRT (invarg.c: line 104)
|
||||
|
||||
CONTEXT ContextRecord;
|
||||
EXCEPTION_RECORD ExceptionRecord;
|
||||
ZeroMemory(&ContextRecord, sizeof(CONTEXT));
|
||||
|
||||
__asm
|
||||
{
|
||||
mov [ContextRecord.Eax], eax
|
||||
mov [ContextRecord.Ecx], ecx
|
||||
mov [ContextRecord.Edx], edx
|
||||
mov [ContextRecord.Ebx], ebx
|
||||
mov [ContextRecord.Esi], esi
|
||||
mov [ContextRecord.Edi], edi
|
||||
mov word ptr [ContextRecord.SegSs], ss
|
||||
mov word ptr [ContextRecord.SegCs], cs
|
||||
mov word ptr [ContextRecord.SegDs], ds
|
||||
mov word ptr [ContextRecord.SegEs], es
|
||||
mov word ptr [ContextRecord.SegFs], fs
|
||||
mov word ptr [ContextRecord.SegGs], gs
|
||||
|
||||
pushfd
|
||||
pop [ContextRecord.EFlags]
|
||||
}
|
||||
|
||||
ContextRecord.ContextFlags = CONTEXT_CONTROL;
|
||||
ContextRecord.Eip = reinterpret_cast<DWORD>(_ReturnAddress());
|
||||
ContextRecord.Esp = reinterpret_cast<DWORD>(_AddressOfReturnAddress());
|
||||
ContextRecord.Ebp = *reinterpret_cast<DWORD*>(_AddressOfReturnAddress()) - 1;
|
||||
|
||||
ZeroMemory(&ExceptionRecord, sizeof(EXCEPTION_RECORD));
|
||||
|
||||
ExceptionRecord.ExceptionCode = EXCEPTION_BREAKPOINT;
|
||||
ExceptionRecord.ExceptionAddress = _ReturnAddress();
|
||||
|
||||
EXCEPTION_POINTERS eptr;
|
||||
eptr.ExceptionRecord = &ExceptionRecord;
|
||||
eptr.ContextRecord = &ContextRecord;
|
||||
|
||||
Exception::ExceptionFilter(&eptr);
|
||||
});
|
||||
#pragma warning(pop)
|
||||
Command::Add("debug_minidump", Exception::DebugMinidumpCommand);
|
||||
|
||||
// Check if folder exists && crash-helper exists
|
||||
|
||||
|
@ -18,6 +18,7 @@ namespace Components
|
||||
static LPTOP_LEVEL_EXCEPTION_FILTER WINAPI SetUnhandledExceptionFilterStub(LPTOP_LEVEL_EXCEPTION_FILTER lpTopLevelExceptionFilter);
|
||||
static __declspec(noreturn) void ErrorLongJmp(jmp_buf _Buf, int _Value);
|
||||
static __declspec(noreturn) void LongJmp(jmp_buf _Buf, int _Value);
|
||||
static void DebugMinidumpCommand(Command::Params*);
|
||||
|
||||
static int MiniDumpType;
|
||||
static Utils::Hook SetFilterHook;
|
||||
|
Loading…
Reference in New Issue
Block a user