int disasm_a3xx(uint32_t *dwords, int sizedwords, int level, FILE *out, unsigned gpu_id);
int disasm_a3xx_stat(uint32_t *dwords, int sizedwords, int level, FILE *out,
unsigned gpu_id, struct shader_stats *stats);
+int try_disasm_a3xx(uint32_t *dwords, int sizedwords, int level, FILE *out, unsigned gpu_id);
void disasm_a2xx_set_debug(enum debug_t debug);
void disasm_a3xx_set_debug(enum debug_t debug);
const char *ext;
dump_hex(buf, min(64, sizedwords), level+1);
- disasm_a3xx(buf, sizedwords, level+2, stdout, options->gpu_id);
+ try_disasm_a3xx(buf, sizedwords, level+2, stdout, options->gpu_id);
/* this is a bit ugly way, but oh well.. */
if (strstr(name, "SP_VS_OBJ")) {
}
if (contents)
- disasm_a3xx(contents, num_unit * 2, level+2, stdout, options->gpu_id);
+ try_disasm_a3xx(contents, num_unit * 2, level+2, stdout, options->gpu_id);
/* dump raw shader: */
if (ext)
#include <assert.h>
#include <getopt.h>
#include <inttypes.h>
-#include <setjmp.h>
#include <stdarg.h>
#include <stdbool.h>
#include <stdint.h>
break; \
} else
-/*
- * Provide our own disasm assert() handler, so that we can recover
- * after attempting to disassemble things that might not be valid
- * instructions:
- */
-
-static bool jmp_env_valid;
-static jmp_buf jmp_env;
-
-void
-ir3_assert_handler(const char *expr, const char *file, int line,
- const char *func)
-{
- printf("\n%s:%u: %s: Assertion `%s' failed.\n", file, line, func, expr);
- if (jmp_env_valid)
- longjmp(jmp_env, 1);
- abort();
-}
-
-#define TRY(x) do { \
- assert(!jmp_env_valid); \
- if (setjmp(jmp_env) == 0) { \
- jmp_env_valid = true; \
- x; \
- } \
- jmp_env_valid = false; \
- } while (0)
-
/*
* Decode ringbuffer section:
*/
* (or parts of shaders?), so perhaps we should search
* for ends of shaders and decode each?
*/
- TRY(disasm_a3xx(buf, sizedwords, 1, stdout, options.gpu_id));
+ try_disasm_a3xx(buf, sizedwords, 1, stdout, options.gpu_id);
}
if (dump)
((opc == OPC_END) || (opc == OPC_CHSH));
}
-int disasm_a3xx(uint32_t *dwords, int sizedwords, int level, FILE *out, unsigned gpu_id)
-{
- struct shader_stats stats;
- return disasm_a3xx_stat(dwords, sizedwords, level, out, gpu_id, &stats);
-}
-
int disasm_a3xx_stat(uint32_t *dwords, int sizedwords, int level, FILE *out,
unsigned gpu_id, struct shader_stats *stats)
{
{
debug = d;
}
+
+#include <setjmp.h>
+
+static bool jmp_env_valid;
+static jmp_buf jmp_env;
+
+void
+ir3_assert_handler(const char *expr, const char *file, int line,
+ const char *func)
+{
+ fprintf(stdout, "\n%s:%u: %s: Assertion `%s' failed.\n", file, line, func, expr);
+ if (jmp_env_valid)
+ longjmp(jmp_env, 1);
+ abort();
+}
+
+#define TRY(x) do { \
+ assert(!jmp_env_valid); \
+ if (setjmp(jmp_env) == 0) { \
+ jmp_env_valid = true; \
+ x; \
+ } \
+ jmp_env_valid = false; \
+ } while (0)
+
+
+int disasm_a3xx(uint32_t *dwords, int sizedwords, int level, FILE *out, unsigned gpu_id)
+{
+ struct shader_stats stats;
+ return disasm_a3xx_stat(dwords, sizedwords, level, out, gpu_id, &stats);
+}
+
+int try_disasm_a3xx(uint32_t *dwords, int sizedwords, int level, FILE *out, unsigned gpu_id)
+{
+ struct shader_stats stats;
+ int ret;
+ TRY(ret = disasm_a3xx_stat(dwords, sizedwords, level, out, gpu_id, &stats));
+ return ret;
+}