Add stub ir_reader and new 'i' mode for reading IR rather than GLSL.
diff --git a/glsl_parser_extras.cpp b/glsl_parser_extras.cpp
index 121104f..88889d5 100644
--- a/glsl_parser_extras.cpp
+++ b/glsl_parser_extras.cpp
@@ -39,6 +39,7 @@
 #include "ir_function_inlining.h"
 #include "ir_if_simplification.h"
 #include "ir_print_visitor.h"
+#include "ir_reader.h"
 
 const char *
 _mesa_glsl_shader_target_name(enum _mesa_glsl_parser_targets target)
@@ -715,7 +716,7 @@
    exec_list instructions;
 
    if (argc < 3) {
-      printf("Usage: %s [v|g|f] <shader_file>\n", argv[0]);
+      printf("Usage: %s [v|g|f|i] <shader_file>\n", argv[0]);
       return EXIT_FAILURE;
    }
 
@@ -731,8 +732,11 @@
    case 'f':
       state.target = fragment_shader;
       break;
+   case 'i':
+      state.target = ir_shader;
+      break;
    default:
-      printf("Usage: %s [v|g|f] <shader_file>\n", argv[0]);
+      printf("Usage: %s [v|g|f|i] <shader_file>\n", argv[0]);
       return EXIT_FAILURE;
    }
 
@@ -746,16 +750,20 @@
    state.loop_or_switch_nesting = NULL;
    state.ARB_texture_rectangle_enable = true;
 
-   _mesa_glsl_lexer_ctor(& state, shader, shader_len);
-   _mesa_glsl_parse(& state);
-   _mesa_glsl_lexer_dtor(& state);
+   if (state.target != ir_shader) {
+      _mesa_glsl_lexer_ctor(& state, shader, shader_len);
+      _mesa_glsl_parse(& state);
+      _mesa_glsl_lexer_dtor(& state);
 
-   foreach (ptr, & state.translation_unit) {
-      ((ast_node *)ptr)->print();
+      foreach (ptr, & state.translation_unit) {
+	 ((ast_node *)ptr)->print();
+      }
+
+      _mesa_ast_to_hir(&instructions, &state);
+   } else {
+      _mesa_glsl_read_ir(&state, &instructions, shader);
    }
 
-   _mesa_ast_to_hir(&instructions, &state);
-
    /* Optimization passes */
    if (!state.error) {
       bool progress;