|  | //===-- 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; | 
|  | } |