Make SEH exception handling work on 32- and 64-bit Windows.

Also change the expected mangling to reflect in-progress Clang changes.
main
David Chisnall 8 years ago
parent d4278a009c
commit 6e52cbbbe8

@ -65,9 +65,9 @@ namespace
static std::string mangleObjcObject()
{
#if defined(__SIZEOF_POINTER__) && __SIZEOF_POINTER__ == 8
return ".PEAUobjc_object@@";
return ".PEAU.objc_object@@";
#else
return ".PAUobjc_object@@";
return ".PAU.objc_object@@";
#endif
}
@ -80,9 +80,9 @@ static std::string mangleStructNamed(const char* className)
//return
auto r =
#if defined(__SIZEOF_POINTER__) && __SIZEOF_POINTER__ == 8
std::string(".PEAU") +
std::string(".PEAU.objc_cls_") +
#else
std::string(".PAU") +
std::string(".PAU.objc_cls_") +
#endif
className + "@@";
return r;
@ -183,14 +183,23 @@ PUBLIC extern "C" void objc_exception_throw(id object)
exception.ExceptionFlags = EXCEPTION_NONCONTINUABLE;
exception.ExceptionRecord = nullptr;
exception.ExceptionAddress = nullptr;
exception.NumberParameters = 4;
// The fourth parameter is the base address of the image (for us, this stack
// frame), but we only use image-relative 32-bit addresses on 64-bit
// platforms. On 32-bit platforms, we use 32-bit absolute addresses.
exception.NumberParameters = sizeof(void*) == 4 ? 3 : 4;
exception.ExceptionInformation[0] = EH_MAGIC_NUMBER1;
exception.ExceptionInformation[1] = reinterpret_cast<ULONG_PTR>(&object);
exception.ExceptionInformation[2] = reinterpret_cast<ULONG_PTR>(&ti);
exception.ExceptionInformation[3] = reinterpret_cast<ULONG_PTR>(&x);
#ifdef _WIN64
RtlRaiseException(&exception);
#else
RaiseException(exception.ExceptionCode,
exception.ExceptionFlags,
exception.NumberParameters,
exception.ExceptionInformation);
#endif
__builtin_unreachable();
}

Loading…
Cancel
Save