ac/debug: invoke valgrind checks while parsing IBs
authorNicolai Hähnle <nicolai.haehnle@amd.com>
Fri, 18 Aug 2017 18:17:29 +0000 (20:17 +0200)
committerNicolai Hähnle <nicolai.haehnle@amd.com>
Wed, 23 Aug 2017 11:54:07 +0000 (13:54 +0200)
Help catch garbage data written into IBs.

Reviewed-by: Marek Olšák <marek.olsak@amd.com>
src/amd/common/ac_debug.c

index e92dfbd0e4a31794a822ddc0e5e7b419fb339ec4..2af83a146c8d4128e25c37bad3dae480ad7f584d 100644 (file)
 
 #include "ac_debug.h"
 
+#ifdef HAVE_VALGRIND
+#include <valgrind.h>
+#include <memcheck.h>
+#define VG(x) x
+#else
+#define VG(x)
+#endif
+
 #include "sid.h"
 #include "gfx9d.h"
 #include "sid_tables.h"
@@ -149,6 +157,18 @@ static uint32_t ac_ib_get(struct ac_ib_parser *ib)
 
        if (ib->cur_dw < ib->num_dw) {
                v = ib->ib[ib->cur_dw];
+#ifdef HAVE_VALGRIND
+               /* Help figure out where garbage data is written to IBs.
+                *
+                * Arguably we should do this already when the IBs are written,
+                * see RADEON_VALGRIND. The problem is that client-requests to
+                * Valgrind have an overhead even when Valgrind isn't running,
+                * and radeon_emit is performance sensitive...
+                */
+               if (VALGRIND_CHECK_VALUE_IS_DEFINED(v))
+                       fprintf(ib->f, COLOR_RED "Valgrind: The next DWORD is garbage"
+                               COLOR_RESET "\n");
+#endif
                fprintf(ib->f, "\n\035#%08x ", v);
        } else {
                fprintf(ib->f, "\n\035#???????? ");