diff options
Diffstat (limited to 'llvm/tools/llvm-c-test/diagnostic.c')
-rw-r--r-- | llvm/tools/llvm-c-test/diagnostic.c | 89 |
1 files changed, 89 insertions, 0 deletions
diff --git a/llvm/tools/llvm-c-test/diagnostic.c b/llvm/tools/llvm-c-test/diagnostic.c new file mode 100644 index 00000000000..16d51747323 --- /dev/null +++ b/llvm/tools/llvm-c-test/diagnostic.c @@ -0,0 +1,89 @@ +//===-- diagnostic.cpp - tool for testing libLLVM and llvm-c API ----------===// +// +// The LLVM Compiler Infrastructure +// +// This file is distributed under the University of Illinois Open Source +// License. See LICENSE.TXT for details. +// +//===----------------------------------------------------------------------===// +// +// This file implements the --test-diagnostic-handler command in llvm-c-test. +// +// This command uses the C API to read a module with a custom diagnostic +// handler set to test the diagnostic handler functionality. +// +//===----------------------------------------------------------------------===// + +#include "llvm-c-test.h" +#include "llvm-c/BitReader.h" +#include "llvm-c/Core.h" + +#include <stdio.h> + +static void diagnosticHandler(LLVMDiagnosticInfoRef DI, void *C) { + fprintf(stderr, "Executing diagnostic handler\n"); + + fprintf(stderr, "Diagnostic severity is of type "); + switch (LLVMGetDiagInfoSeverity(DI)) { + case LLVMDSError: + fprintf(stderr, "error"); + break; + case LLVMDSWarning: + fprintf(stderr, "warning"); + break; + case LLVMDSRemark: + fprintf(stderr, "remark"); + break; + case LLVMDSNote: + fprintf(stderr, "note"); + break; + } + fprintf(stderr, "\n"); + + (*(int *)C) = 1; +} + +static int handlerCalled = 0; + +int llvm_test_diagnostic_handler(void) { + LLVMContextRef C = LLVMGetGlobalContext(); + LLVMContextSetDiagnosticHandler(C, diagnosticHandler, &handlerCalled); + + if (LLVMContextGetDiagnosticHandler(C) != diagnosticHandler) { + fprintf(stderr, "LLVMContext{Set,Get}DiagnosticHandler failed\n"); + return 1; + } + + int *DC = (int *)LLVMContextGetDiagnosticContext(C); + if (DC != &handlerCalled || *DC) { + fprintf(stderr, "LLVMContextGetDiagnosticContext failed\n"); + return 1; + } + + LLVMMemoryBufferRef MB; + char *msg = NULL; + if (LLVMCreateMemoryBufferWithSTDIN(&MB, &msg)) { + fprintf(stderr, "Error reading file: %s\n", msg); + LLVMDisposeMessage(msg); + return 1; + } + + + LLVMModuleRef M; + int Ret = LLVMGetBitcodeModule2(MB, &M); + if (Ret) { + // We do not return if the bitcode was invalid, as we want to test whether + // the diagnostic handler was executed. + fprintf(stderr, "Error parsing bitcode: %s\n", msg); + } + + LLVMDisposeMemoryBuffer(MB); + + if (handlerCalled) { + fprintf(stderr, "Diagnostic handler was called while loading module\n"); + } else { + fprintf(stderr, "Diagnostic handler was not called while loading module\n"); + } + + return 0; +} |