gallium/radeon: send LLVM diagnostics as debug messages
authorNicolai Hähnle <nicolai.haehnle@amd.com>
Sat, 2 Jan 2016 21:40:47 +0000 (16:40 -0500)
committerNicolai Hähnle <nicolai.haehnle@amd.com>
Sat, 2 Jan 2016 21:47:24 +0000 (16:47 -0500)
Diagnostics sent during code generation and the every error message reported
by LLVMTargetMachineEmitToMemoryBuffer are disjoint reporting mechanisms. We
take care of both and also send an explicit message indicating failure at the
end, so that log parsers can more easily tell the boundary between shader
compiles.

Removed an fprintf that could never be triggered.

Reviewed-by: Edward O'Callaghan <eocallaghan@alterapraxis.com>
Reviewed-by: Marek Olšák <marek.olsak@amd.com>
src/gallium/drivers/radeon/radeon_llvm_emit.c

index 9754fd9..b765d36 100644 (file)
@@ -31,6 +31,7 @@
 #include "util/u_debug.h"
 #include "util/u_memory.h"
 #include "pipe/p_shader_tokens.h"
+#include "pipe/p_state.h"
 
 #include <llvm-c/Target.h>
 #include <llvm-c/TargetMachine.h>
@@ -125,16 +126,44 @@ LLVMTargetRef radeon_llvm_get_r600_target(const char *triple)
        return target;
 }
 
+struct radeon_llvm_diagnostics {
+       struct pipe_debug_callback *debug;
+       unsigned retval;
+};
+
 static void radeonDiagnosticHandler(LLVMDiagnosticInfoRef di, void *context)
 {
-       if (LLVMGetDiagInfoSeverity(di) == LLVMDSError) {
-               unsigned int *diagnosticflag = (unsigned int *)context;
-               char *diaginfo_message = LLVMGetDiagInfoDescription(di);
+       struct radeon_llvm_diagnostics *diag = (struct radeon_llvm_diagnostics *)context;
+       LLVMDiagnosticSeverity severity = LLVMGetDiagInfoSeverity(di);
+       char *description = LLVMGetDiagInfoDescription(di);
+       const char *severity_str = NULL;
+
+       switch (severity) {
+       case LLVMDSError:
+               severity_str = "error";
+               break;
+       case LLVMDSWarning:
+               severity_str = "warning";
+               break;
+       case LLVMDSRemark:
+               severity_str = "remark";
+               break;
+       case LLVMDSNote:
+               severity_str = "note";
+               break;
+       default:
+               severity_str = "unknown";
+       }
+
+       pipe_debug_message(diag->debug, SHADER_INFO,
+                          "LLVM diagnostic (%s): %s", severity_str, description);
 
-               *diagnosticflag = 1;
-               fprintf(stderr,"LLVM triggered Diagnostic Handler: %s\n", diaginfo_message);
-               LLVMDisposeMessage(diaginfo_message);
+       if (severity == LLVMDSError) {
+               diag->retval = 1;
+               fprintf(stderr,"LLVM triggered Diagnostic Handler: %s\n", description);
        }
+
+       LLVMDisposeMessage(description);
 }
 
 /**
@@ -147,18 +176,21 @@ unsigned radeon_llvm_compile(LLVMModuleRef M, struct radeon_shader_binary *binar
                             LLVMTargetMachineRef tm,
                             struct pipe_debug_callback *debug)
 {
+       struct radeon_llvm_diagnostics diag;
        char cpu[CPU_STRING_LEN];
        char fs[FS_STRING_LEN];
        char *err;
        bool dispose_tm = false;
        LLVMContextRef llvm_ctx;
-       unsigned rval = 0;
        LLVMMemoryBufferRef out_buffer;
        unsigned buffer_size;
        const char *buffer_data;
        char triple[TRIPLE_STRING_LEN];
        LLVMBool mem_err;
 
+       diag.debug = debug;
+       diag.retval = 0;
+
        if (!tm) {
                strncpy(triple, "r600--", TRIPLE_STRING_LEN);
                LLVMTargetRef target = radeon_llvm_get_r600_target(triple);
@@ -179,8 +211,7 @@ unsigned radeon_llvm_compile(LLVMModuleRef M, struct radeon_shader_binary *binar
        /* Setup Diagnostic Handler*/
        llvm_ctx = LLVMGetModuleContext(M);
 
-       LLVMContextSetDiagnosticHandler(llvm_ctx, radeonDiagnosticHandler, &rval);
-       rval = 0;
+       LLVMContextSetDiagnosticHandler(llvm_ctx, radeonDiagnosticHandler, &diag);
 
        /* Compile IR*/
        mem_err = LLVMTargetMachineEmitToMemoryBuffer(tm, M, LLVMObjectFile, &err,
@@ -189,15 +220,13 @@ unsigned radeon_llvm_compile(LLVMModuleRef M, struct radeon_shader_binary *binar
        /* Process Errors/Warnings */
        if (mem_err) {
                fprintf(stderr, "%s: %s", __FUNCTION__, err);
+               pipe_debug_message(debug, SHADER_INFO,
+                                  "LLVM emit error: %s", err);
                FREE(err);
-               rval = 1;
+               diag.retval = 1;
                goto out;
        }
 
-       if (0 != rval) {
-               fprintf(stderr, "%s: Processing Diag Flag\n", __FUNCTION__);
-       }
-
        /* Extract Shader Code*/
        buffer_size = LLVMGetBufferSize(out_buffer);
        buffer_data = LLVMGetBufferStart(out_buffer);
@@ -211,5 +240,7 @@ out:
        if (dispose_tm) {
                LLVMDisposeTargetMachine(tm);
        }
-       return rval;
+       if (diag.retval != 0)
+               pipe_debug_message(debug, SHADER_INFO, "LLVM compile failed");
+       return diag.retval;
 }