[Mesa-dev] [PATCH 5/6] gallium/radeon: send LLVM diagnostics as debug messages

Nicolai Hähnle nhaehnle at gmail.com
Wed Dec 30 18:30:47 PST 2015


From: Nicolai Hähnle <nicolai.haehnle at amd.com>

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.
---
 src/gallium/drivers/radeon/radeon_llvm_emit.c | 61 ++++++++++++++++++++-------
 1 file changed, 45 insertions(+), 16 deletions(-)

diff --git a/src/gallium/drivers/radeon/radeon_llvm_emit.c b/src/gallium/drivers/radeon/radeon_llvm_emit.c
index d0168f1..62e06ca 100644
--- a/src/gallium/drivers/radeon/radeon_llvm_emit.c
+++ b/src/gallium/drivers/radeon/radeon_llvm_emit.c
@@ -125,16 +125,44 @@ LLVMTargetRef radeon_llvm_get_r600_target(const char *triple)
 	return target;
 }
 
+struct radeon_llvm_diagnostics {
+	struct r600_common_context *rctx;
+	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->rctx->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,19 +175,21 @@ unsigned radeon_llvm_compile(struct r600_common_context *rctx,
 			     const char *gpu_family, bool dump_ir, bool dump_asm,
 			     LLVMTargetMachineRef tm)
 {
-
+	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.rctx = rctx;
+	diag.retval = 0;
+
 	if (!tm) {
 		strncpy(triple, "r600--", TRIPLE_STRING_LEN);
 		LLVMTargetRef target = radeon_llvm_get_r600_target(triple);
@@ -180,8 +210,7 @@ unsigned radeon_llvm_compile(struct r600_common_context *rctx,
 	/* 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,
@@ -190,15 +219,13 @@ unsigned radeon_llvm_compile(struct r600_common_context *rctx,
 	/* Process Errors/Warnings */
 	if (mem_err) {
 		fprintf(stderr, "%s: %s", __FUNCTION__, err);
+		pipe_debug_message(&rctx->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);
@@ -212,5 +239,7 @@ out:
 	if (dispose_tm) {
 		LLVMDisposeTargetMachine(tm);
 	}
-	return rval;
+	if (diag.retval != 0)
+		pipe_debug_message(&rctx->debug, SHADER_INFO, "LLVM compile failed");
+	return diag.retval;
 }
-- 
2.5.0



More information about the mesa-dev mailing list