Add a magic LLVM_DISABLE_CRT_DEBUG environment variable which we check in RegisterHandler and use to disable the Win32 crash dialogs. These are a major blocker to any kind of automated testing.

Also, tweak the 'lit' test runner to set this variable unconditionally.

llvm-svn: 82537
This commit is contained in:
Daniel Dunbar 2009-09-22 09:50:28 +00:00
parent 0570bbbd0f
commit 4c7b0ca05b
2 changed files with 40 additions and 1 deletions

View File

@ -43,6 +43,7 @@ static std::vector<llvm::sys::Path> *FilesToRemove = NULL;
static std::vector<std::pair<void(*)(void*), void*> > *CallBacksToRun = 0;
static bool RegisteredUnhandledExceptionFilter = false;
static bool CleanupExecuted = false;
static bool ExitOnUnhandledExceptions = false;
static PTOP_LEVEL_EXCEPTION_FILTER OldFilter = NULL;
// Windows creates a new thread to execute the console handler when an event
@ -57,6 +58,34 @@ namespace llvm {
//=== and must not be UNIX code
//===----------------------------------------------------------------------===//
/// CRTReportHook - Function called on a CRT debugging event.
static int CRTReportHook(int ReportType, char *Message, int *Return) {
// Don't cause a DebugBreak() on return.
if (Return)
*Return = 0;
switch (ReportType) {
default:
case _CRT_ASSERT:
fprintf(stderr, "CRT assert: %s\n", Message);
// FIXME: Is there a way to just crash? Perhaps throw to the unhandled
// exception code? Perhaps SetErrorMode() handles this.
_exit(3);
break;
case _CRT_ERROR:
fprintf(stderr, "CRT error: %s\n", Message);
// FIXME: Is there a way to just crash? Perhaps throw to the unhandled
// exception code? Perhaps SetErrorMode() handles this.
_exit(3);
break;
case _CRT_WARN:
fprintf(stderr, "CRT warn: %s\n", Message);
break;
}
// Don't call _CrtDbgReport.
return TRUE;
}
static void RegisterHandler() {
if (RegisteredUnhandledExceptionFilter) {
@ -76,6 +105,12 @@ static void RegisterHandler() {
OldFilter = SetUnhandledExceptionFilter(LLVMUnhandledExceptionFilter);
SetConsoleCtrlHandler(LLVMConsoleCtrlHandler, TRUE);
// Environment variable to disable any kind of crash dialog.
if (getenv("LLVM_DISABLE_CRT_DEBUG")) {
_CrtSetReportHook(CRTReportHook);
ExitOnUnhandledExceptions = true;
}
// IMPORTANT NOTE: Caller must call LeaveCriticalSection(&CriticalSection) or
// else multi-threading problems will ensue.
}
@ -235,6 +270,9 @@ static LONG WINAPI LLVMUnhandledExceptionFilter(LPEXCEPTION_POINTERS ep) {
assert(0 && "Crashed in LLVMUnhandledExceptionFilter");
}
if (ExitOnUnhandledExceptions)
_exit(-3);
// Allow dialog box to pop up allowing choice to start debugger.
if (OldFilter)
return (*OldFilter)(ep);

View File

@ -13,6 +13,7 @@ class TestingConfig:
'PATH' : os.pathsep.join(litConfig.path +
[os.environ.get('PATH','')]),
'SYSTEMROOT' : os.environ.get('SYSTEMROOT',''),
'LLVM_DISABLE_CRT_DEBUG' : '1',
}
config = TestingConfig(parent,