i965: Give dump_instructions() a filename argument.
authorMatt Turner <mattst88@gmail.com>
Thu, 29 May 2014 20:08:59 +0000 (13:08 -0700)
committerMatt Turner <mattst88@gmail.com>
Sun, 1 Jun 2014 20:18:52 +0000 (13:18 -0700)
This will allow debugging code to dump the IR after an optimization pass
makes progress (the next patch). Only let it open and write to a file if
the effective user isn't root.

Reviewed-by: Kenneth Graunke <kenneth@whitecape.org>
src/mesa/drivers/dri/i965/brw_fs.cpp
src/mesa/drivers/dri/i965/brw_fs.h
src/mesa/drivers/dri/i965/brw_fs_reg_allocate.cpp
src/mesa/drivers/dri/i965/brw_shader.cpp
src/mesa/drivers/dri/i965/brw_shader.h

index 8bd3f6125322c16adb7d2d79c64535c18629a418..c9b31fef5b2af715129051d9af470646ffb63ee3 100644 (file)
@@ -2570,18 +2570,34 @@ fs_visitor::lower_uniform_pull_constant_loads()
 
 void
 fs_visitor::dump_instructions()
+{
+   dump_instructions(NULL);
+}
+
+void
+fs_visitor::dump_instructions(const char *name)
 {
    calculate_register_pressure();
+   FILE *file = stderr;
+   if (name && geteuid() != 0) {
+      file = fopen(name, "w");
+      if (!file)
+         file = stderr;
+   }
 
    int ip = 0, max_pressure = 0;
    foreach_list(node, &this->instructions) {
       backend_instruction *inst = (backend_instruction *)node;
       max_pressure = MAX2(max_pressure, regs_live_at_ip[ip]);
-      fprintf(stderr, "{%3d} %4d: ", regs_live_at_ip[ip], ip);
-      dump_instruction(inst);
+      fprintf(file, "{%3d} %4d: ", regs_live_at_ip[ip], ip);
+      dump_instruction(inst, file);
       ++ip;
    }
-   fprintf(stderr, "Maximum %3d registers live at once.\n", max_pressure);
+   fprintf(file, "Maximum %3d registers live at once.\n", max_pressure);
+
+   if (file != stderr) {
+      fclose(file);
+   }
 }
 
 void
index 90cf6fb301424ca079f7b943241625d27a765bfb..789f0b38c5355f473b43389ff297c80ed1af434d 100644 (file)
@@ -484,6 +484,7 @@ public:
    int implied_mrf_writes(fs_inst *inst);
 
    virtual void dump_instructions();
+   virtual void dump_instructions(const char *name);
    void dump_instruction(backend_instruction *inst);
    void dump_instruction(backend_instruction *inst, FILE *file);
 
index 717a94e90f3e74faa5c4236c7b8476a9371fab4c..bbaf8107ec7f1074c87a2225bfcff781159c1968 100644 (file)
@@ -498,7 +498,7 @@ fs_visitor::assign_regs(bool allow_spilling)
 
       if (reg == -1) {
          fail("no register to spill:\n");
-         dump_instructions();
+         dump_instructions(NULL);
       } else if (allow_spilling) {
          spill_reg(reg);
       }
index f4f1334d9ef56d6c7e03f4f03eae77c8e98241a6..69eab598ba2f65fb7fafdc0aa81379a1911eced2 100644 (file)
@@ -700,11 +700,29 @@ backend_instruction::has_side_effects() const
 void
 backend_visitor::dump_instructions()
 {
+   dump_instructions(NULL);
+}
+
+void
+backend_visitor::dump_instructions(const char *name)
+{
+   FILE *file = stderr;
+   if (name && geteuid() != 0) {
+      file = fopen(name, "w");
+      if (!file)
+         file = stderr;
+   }
+
    int ip = 0;
    foreach_list(node, &this->instructions) {
       backend_instruction *inst = (backend_instruction *)node;
-      fprintf(stderr, "%d: ", ip++);
-      dump_instruction(inst);
+      if (!name)
+         fprintf(stderr, "%d: ", ip++);
+      dump_instruction(inst, file);
+   }
+
+   if (file != stderr) {
+      fclose(file);
    }
 }
 
index 0dc87789b78e612c649723bee904e875e4f7e0b2..222b0a933cdf1c056a254bf7782fdb1f88808099 100644 (file)
@@ -111,6 +111,7 @@ public:
    virtual void dump_instruction(backend_instruction *inst) = 0;
    virtual void dump_instruction(backend_instruction *inst, FILE *file) = 0;
    virtual void dump_instructions();
+   virtual void dump_instructions(const char *name);
 
    void assign_common_binding_table_offsets(uint32_t next_binding_table_offset);