nir/spirv: Handle OpLine and OpNoLine in foreach_instruction
authorJason Ekstrand <jason.ekstrand@intel.com>
Wed, 20 Jan 2016 02:44:44 +0000 (18:44 -0800)
committerJason Ekstrand <jason.ekstrand@intel.com>
Wed, 20 Jan 2016 03:00:00 +0000 (19:00 -0800)
This way we don't have to explicitly handle them everywhere.

src/glsl/nir/spirv/spirv_to_nir.c
src/glsl/nir/spirv/vtn_private.h

index 1fcdb1aa14aabedd6fe459b6bfaeef62b4d00d5b..a117175341e6b5d330c5877e9f58785c92aa1f35 100644 (file)
@@ -192,19 +192,37 @@ const uint32_t *
 vtn_foreach_instruction(struct vtn_builder *b, const uint32_t *start,
                         const uint32_t *end, vtn_instruction_handler handler)
 {
+   b->file = NULL;
+   b->line = -1;
+   b->col = -1;
+
    const uint32_t *w = start;
    while (w < end) {
       SpvOp opcode = w[0] & SpvOpCodeMask;
       unsigned count = w[0] >> SpvWordCountShift;
       assert(count >= 1 && w + count <= end);
 
-      if (opcode == SpvOpNop) {
-         w++;
-         continue;
-      }
+      switch (opcode) {
+      case SpvOpNop:
+         break; /* Do nothing */
 
-      if (!handler(b, opcode, w, count))
-         return w;
+      case SpvOpLine:
+         b->file = vtn_value(b, w[1], vtn_value_type_string)->str;
+         b->line = w[2];
+         b->col = w[3];
+         break;
+
+      case SpvOpNoLine:
+         b->file = NULL;
+         b->line = -1;
+         b->col = -1;
+         break;
+
+      default:
+         if (!handler(b, opcode, w, count))
+            return w;
+         break;
+      }
 
       w += count;
    }
@@ -3498,10 +3516,6 @@ vtn_handle_variable_or_type_instruction(struct vtn_builder *b, SpvOp opcode,
       assert(!"Invalid opcode types and variables section");
       break;
 
-   case SpvOpLine:
-   case SpvOpNoLine:
-      break; /* Ignored for now */
-
    case SpvOpTypeVoid:
    case SpvOpTypeBool:
    case SpvOpTypeInt:
@@ -3555,10 +3569,6 @@ vtn_handle_body_instruction(struct vtn_builder *b, SpvOp opcode,
                             const uint32_t *w, unsigned count)
 {
    switch (opcode) {
-   case SpvOpLine:
-   case SpvOpNoLine:
-      break; /* Ignored for now */
-
    case SpvOpLabel:
       break;
 
index cf75bc92a7ac24ec74192f17e30c5be23c10c150..a0cf1b9fd420d7c726866ec7400e6da673784733 100644 (file)
@@ -299,6 +299,12 @@ struct vtn_builder {
    nir_function_impl *impl;
    struct vtn_block *block;
 
+   /* Current file, line, and column.  Useful for debugging.  Set
+    * automatically by vtn_foreach_instruction.
+    */
+   char *file;
+   int line, col;
+
    /*
     * In SPIR-V, constants are global, whereas in NIR, the load_const
     * instruction we use is per-function. So while we parse each function, we