CrashRecoveryContext on Windows

By default, calls to abort() in the MS CRT do not trigger an exception and forcefully terminate the process, making CrashRecoveryContext not very useful on Windows for catching abort(), and consequently, assert(). One solution is to create a custom abort() handler that calls RaiseException(), which will be caught by the handler in CrashRecoveryContext.

The relevant client-side code is:

void win_abort_handler(int) {

RaiseException(0, 0, 0, NULL);
}

void handle_llvm_fatal(void *User, const std::string &Reason) {
std::cerr << "Caught LLVM ERROR: " << Reason << “\n”;
abort(); // Chains to win_abort_handler on Windows
}

int main() {
install_fatal_error_handler(handle_llvm_crash, NULL);

signal(SIGABRT, win_abort_handler);
_set_abort_behavior(0, _WRITE_ABORT_MSG | _CALL_REPORTFAULT);

llvm_start_multithreaded();

ContextRecoveryContext::Enable();
// “safe” calls with RunSafely()
ContextRecoveryContext::Disable();

return 0;
}

Do you think it is a good idea to fold the abort signal handler and signal/_set_abort_handler into CrashRecoveryContext? The handler can be registered in Enable() and removed in Disable(), like it is done in the POSIX implementation.