11591693c7b415e9869157c711fe11263c95d74eDavid Li/*
21591693c7b415e9869157c711fe11263c95d74eDavid Li * Copyright © 2008, 2009 Intel Corporation
31591693c7b415e9869157c711fe11263c95d74eDavid Li *
41591693c7b415e9869157c711fe11263c95d74eDavid Li * Permission is hereby granted, free of charge, to any person obtaining a
51591693c7b415e9869157c711fe11263c95d74eDavid Li * copy of this software and associated documentation files (the "Software"),
61591693c7b415e9869157c711fe11263c95d74eDavid Li * to deal in the Software without restriction, including without limitation
71591693c7b415e9869157c711fe11263c95d74eDavid Li * the rights to use, copy, modify, merge, publish, distribute, sublicense,
81591693c7b415e9869157c711fe11263c95d74eDavid Li * and/or sell copies of the Software, and to permit persons to whom the
91591693c7b415e9869157c711fe11263c95d74eDavid Li * Software is furnished to do so, subject to the following conditions:
101591693c7b415e9869157c711fe11263c95d74eDavid Li *
111591693c7b415e9869157c711fe11263c95d74eDavid Li * The above copyright notice and this permission notice (including the next
121591693c7b415e9869157c711fe11263c95d74eDavid Li * paragraph) shall be included in all copies or substantial portions of the
131591693c7b415e9869157c711fe11263c95d74eDavid Li * Software.
141591693c7b415e9869157c711fe11263c95d74eDavid Li *
151591693c7b415e9869157c711fe11263c95d74eDavid Li * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
161591693c7b415e9869157c711fe11263c95d74eDavid Li * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
171591693c7b415e9869157c711fe11263c95d74eDavid Li * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL
181591693c7b415e9869157c711fe11263c95d74eDavid Li * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
191591693c7b415e9869157c711fe11263c95d74eDavid Li * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
201591693c7b415e9869157c711fe11263c95d74eDavid Li * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
211591693c7b415e9869157c711fe11263c95d74eDavid Li * DEALINGS IN THE SOFTWARE.
221591693c7b415e9869157c711fe11263c95d74eDavid Li */
231591693c7b415e9869157c711fe11263c95d74eDavid Li#include <stdio.h>
241591693c7b415e9869157c711fe11263c95d74eDavid Li#include <stdarg.h>
251591693c7b415e9869157c711fe11263c95d74eDavid Li#include <string.h>
261591693c7b415e9869157c711fe11263c95d74eDavid Li#include <assert.h>
271591693c7b415e9869157c711fe11263c95d74eDavid Li
281591693c7b415e9869157c711fe11263c95d74eDavid Liextern "C" {
29d50d9a90a0df4d706421850e17c0fbd85bf710eeDavid Li#include <hieralloc.h>
301591693c7b415e9869157c711fe11263c95d74eDavid Li#include "main/core.h" /* for struct gl_context */
311591693c7b415e9869157c711fe11263c95d74eDavid Li}
321591693c7b415e9869157c711fe11263c95d74eDavid Li
331591693c7b415e9869157c711fe11263c95d74eDavid Li#include "ast.h"
341591693c7b415e9869157c711fe11263c95d74eDavid Li#include "glsl_parser_extras.h"
351591693c7b415e9869157c711fe11263c95d74eDavid Li#include "glsl_parser.h"
361591693c7b415e9869157c711fe11263c95d74eDavid Li#include "ir_optimization.h"
371591693c7b415e9869157c711fe11263c95d74eDavid Li#include "loop_analysis.h"
381591693c7b415e9869157c711fe11263c95d74eDavid Li
390f34e4ed10959fe2a6fefcfbf8bd7b1b6716909dDavid Li_mesa_glsl_parse_state::_mesa_glsl_parse_state(const struct gl_context *ctx,
401591693c7b415e9869157c711fe11263c95d74eDavid Li					       GLenum target, void *mem_ctx)
411591693c7b415e9869157c711fe11263c95d74eDavid Li{
421591693c7b415e9869157c711fe11263c95d74eDavid Li   switch (target) {
431591693c7b415e9869157c711fe11263c95d74eDavid Li   case GL_VERTEX_SHADER:   this->target = vertex_shader; break;
441591693c7b415e9869157c711fe11263c95d74eDavid Li   case GL_FRAGMENT_SHADER: this->target = fragment_shader; break;
451591693c7b415e9869157c711fe11263c95d74eDavid Li   case GL_GEOMETRY_SHADER: this->target = geometry_shader; break;
461591693c7b415e9869157c711fe11263c95d74eDavid Li   }
471591693c7b415e9869157c711fe11263c95d74eDavid Li
481591693c7b415e9869157c711fe11263c95d74eDavid Li   this->scanner = NULL;
491591693c7b415e9869157c711fe11263c95d74eDavid Li   this->translation_unit.make_empty();
503b02c91d7b1fcc777dbdafeb044e0df61e1ff0d8David Li   this->symbols = new(mem_ctx) glsl_symbol_table(mem_ctx);
51d50d9a90a0df4d706421850e17c0fbd85bf710eeDavid Li   this->info_log = hieralloc_strdup(mem_ctx, "");
521591693c7b415e9869157c711fe11263c95d74eDavid Li   this->error = false;
531591693c7b415e9869157c711fe11263c95d74eDavid Li   this->loop_or_switch_nesting = NULL;
541591693c7b415e9869157c711fe11263c95d74eDavid Li
551591693c7b415e9869157c711fe11263c95d74eDavid Li   /* Set default language version and extensions */
561591693c7b415e9869157c711fe11263c95d74eDavid Li   this->language_version = 110;
571591693c7b415e9869157c711fe11263c95d74eDavid Li   this->es_shader = false;
581591693c7b415e9869157c711fe11263c95d74eDavid Li   this->ARB_texture_rectangle_enable = true;
591591693c7b415e9869157c711fe11263c95d74eDavid Li
601591693c7b415e9869157c711fe11263c95d74eDavid Li   /* OpenGL ES 2.0 has different defaults from desktop GL. */
611591693c7b415e9869157c711fe11263c95d74eDavid Li   if (ctx->API == API_OPENGLES2) {
62b341bc8271147be311b77937347f0f3f54aab749David Li      this->language_version = 120;
631591693c7b415e9869157c711fe11263c95d74eDavid Li      this->es_shader = true;
641591693c7b415e9869157c711fe11263c95d74eDavid Li      this->ARB_texture_rectangle_enable = false;
651591693c7b415e9869157c711fe11263c95d74eDavid Li   }
661591693c7b415e9869157c711fe11263c95d74eDavid Li
671591693c7b415e9869157c711fe11263c95d74eDavid Li   this->extensions = &ctx->Extensions;
681591693c7b415e9869157c711fe11263c95d74eDavid Li
691591693c7b415e9869157c711fe11263c95d74eDavid Li   this->Const.MaxLights = ctx->Const.MaxLights;
701591693c7b415e9869157c711fe11263c95d74eDavid Li   this->Const.MaxClipPlanes = ctx->Const.MaxClipPlanes;
711591693c7b415e9869157c711fe11263c95d74eDavid Li   this->Const.MaxTextureUnits = ctx->Const.MaxTextureUnits;
721591693c7b415e9869157c711fe11263c95d74eDavid Li   this->Const.MaxTextureCoords = ctx->Const.MaxTextureCoordUnits;
731591693c7b415e9869157c711fe11263c95d74eDavid Li   this->Const.MaxVertexAttribs = ctx->Const.VertexProgram.MaxAttribs;
741591693c7b415e9869157c711fe11263c95d74eDavid Li   this->Const.MaxVertexUniformComponents = ctx->Const.VertexProgram.MaxUniformComponents;
751591693c7b415e9869157c711fe11263c95d74eDavid Li   this->Const.MaxVaryingFloats = ctx->Const.MaxVarying * 4;
761591693c7b415e9869157c711fe11263c95d74eDavid Li   this->Const.MaxVertexTextureImageUnits = ctx->Const.MaxVertexTextureImageUnits;
771591693c7b415e9869157c711fe11263c95d74eDavid Li   this->Const.MaxCombinedTextureImageUnits = ctx->Const.MaxCombinedTextureImageUnits;
781591693c7b415e9869157c711fe11263c95d74eDavid Li   this->Const.MaxTextureImageUnits = ctx->Const.MaxTextureImageUnits;
791591693c7b415e9869157c711fe11263c95d74eDavid Li   this->Const.MaxFragmentUniformComponents = ctx->Const.FragmentProgram.MaxUniformComponents;
801591693c7b415e9869157c711fe11263c95d74eDavid Li
811591693c7b415e9869157c711fe11263c95d74eDavid Li   this->Const.MaxDrawBuffers = ctx->Const.MaxDrawBuffers;
821591693c7b415e9869157c711fe11263c95d74eDavid Li}
831591693c7b415e9869157c711fe11263c95d74eDavid Li
841591693c7b415e9869157c711fe11263c95d74eDavid Liconst char *
851591693c7b415e9869157c711fe11263c95d74eDavid Li_mesa_glsl_shader_target_name(enum _mesa_glsl_parser_targets target)
861591693c7b415e9869157c711fe11263c95d74eDavid Li{
871591693c7b415e9869157c711fe11263c95d74eDavid Li   switch (target) {
881591693c7b415e9869157c711fe11263c95d74eDavid Li   case vertex_shader:   return "vertex";
891591693c7b415e9869157c711fe11263c95d74eDavid Li   case fragment_shader: return "fragment";
901591693c7b415e9869157c711fe11263c95d74eDavid Li   case geometry_shader: return "geometry";
911591693c7b415e9869157c711fe11263c95d74eDavid Li   }
921591693c7b415e9869157c711fe11263c95d74eDavid Li
931591693c7b415e9869157c711fe11263c95d74eDavid Li   assert(!"Should not get here.");
941591693c7b415e9869157c711fe11263c95d74eDavid Li   return "unknown";
951591693c7b415e9869157c711fe11263c95d74eDavid Li}
961591693c7b415e9869157c711fe11263c95d74eDavid Li
971591693c7b415e9869157c711fe11263c95d74eDavid Li
981591693c7b415e9869157c711fe11263c95d74eDavid Livoid
991591693c7b415e9869157c711fe11263c95d74eDavid Li_mesa_glsl_error(YYLTYPE *locp, _mesa_glsl_parse_state *state,
1001591693c7b415e9869157c711fe11263c95d74eDavid Li		 const char *fmt, ...)
1011591693c7b415e9869157c711fe11263c95d74eDavid Li{
1021591693c7b415e9869157c711fe11263c95d74eDavid Li   va_list ap;
1031591693c7b415e9869157c711fe11263c95d74eDavid Li
1041591693c7b415e9869157c711fe11263c95d74eDavid Li   state->error = true;
1051591693c7b415e9869157c711fe11263c95d74eDavid Li
1061591693c7b415e9869157c711fe11263c95d74eDavid Li   assert(state->info_log != NULL);
107d50d9a90a0df4d706421850e17c0fbd85bf710eeDavid Li   state->info_log = hieralloc_asprintf_append(state->info_log,
1081591693c7b415e9869157c711fe11263c95d74eDavid Li					    "%u:%u(%u): error: ",
1091591693c7b415e9869157c711fe11263c95d74eDavid Li					    locp->source,
1101591693c7b415e9869157c711fe11263c95d74eDavid Li					    locp->first_line,
1111591693c7b415e9869157c711fe11263c95d74eDavid Li					    locp->first_column);
1121591693c7b415e9869157c711fe11263c95d74eDavid Li   va_start(ap, fmt);
113d50d9a90a0df4d706421850e17c0fbd85bf710eeDavid Li   state->info_log = hieralloc_vasprintf_append(state->info_log, fmt, ap);
1141591693c7b415e9869157c711fe11263c95d74eDavid Li   va_end(ap);
115d50d9a90a0df4d706421850e17c0fbd85bf710eeDavid Li   state->info_log = hieralloc_strdup_append(state->info_log, "\n");
1161591693c7b415e9869157c711fe11263c95d74eDavid Li}
1171591693c7b415e9869157c711fe11263c95d74eDavid Li
1181591693c7b415e9869157c711fe11263c95d74eDavid Li
1191591693c7b415e9869157c711fe11263c95d74eDavid Livoid
1201591693c7b415e9869157c711fe11263c95d74eDavid Li_mesa_glsl_warning(const YYLTYPE *locp, _mesa_glsl_parse_state *state,
1211591693c7b415e9869157c711fe11263c95d74eDavid Li		   const char *fmt, ...)
1221591693c7b415e9869157c711fe11263c95d74eDavid Li{
1231591693c7b415e9869157c711fe11263c95d74eDavid Li   va_list ap;
1241591693c7b415e9869157c711fe11263c95d74eDavid Li
1251591693c7b415e9869157c711fe11263c95d74eDavid Li   assert(state->info_log != NULL);
126d50d9a90a0df4d706421850e17c0fbd85bf710eeDavid Li   state->info_log = hieralloc_asprintf_append(state->info_log,
1271591693c7b415e9869157c711fe11263c95d74eDavid Li					    "%u:%u(%u): warning: ",
1281591693c7b415e9869157c711fe11263c95d74eDavid Li					    locp->source,
1291591693c7b415e9869157c711fe11263c95d74eDavid Li					    locp->first_line,
1301591693c7b415e9869157c711fe11263c95d74eDavid Li					    locp->first_column);
1311591693c7b415e9869157c711fe11263c95d74eDavid Li   va_start(ap, fmt);
132d50d9a90a0df4d706421850e17c0fbd85bf710eeDavid Li   state->info_log = hieralloc_vasprintf_append(state->info_log, fmt, ap);
1331591693c7b415e9869157c711fe11263c95d74eDavid Li   va_end(ap);
134d50d9a90a0df4d706421850e17c0fbd85bf710eeDavid Li   state->info_log = hieralloc_strdup_append(state->info_log, "\n");
1351591693c7b415e9869157c711fe11263c95d74eDavid Li}
1361591693c7b415e9869157c711fe11263c95d74eDavid Li
1371591693c7b415e9869157c711fe11263c95d74eDavid Li
1381591693c7b415e9869157c711fe11263c95d74eDavid Libool
1391591693c7b415e9869157c711fe11263c95d74eDavid Li_mesa_glsl_process_extension(const char *name, YYLTYPE *name_locp,
1401591693c7b415e9869157c711fe11263c95d74eDavid Li			     const char *behavior, YYLTYPE *behavior_locp,
1411591693c7b415e9869157c711fe11263c95d74eDavid Li			     _mesa_glsl_parse_state *state)
1421591693c7b415e9869157c711fe11263c95d74eDavid Li{
1431591693c7b415e9869157c711fe11263c95d74eDavid Li   enum {
1441591693c7b415e9869157c711fe11263c95d74eDavid Li      extension_disable,
1451591693c7b415e9869157c711fe11263c95d74eDavid Li      extension_enable,
1461591693c7b415e9869157c711fe11263c95d74eDavid Li      extension_require,
1471591693c7b415e9869157c711fe11263c95d74eDavid Li      extension_warn
1481591693c7b415e9869157c711fe11263c95d74eDavid Li   } ext_mode;
1491591693c7b415e9869157c711fe11263c95d74eDavid Li
1501591693c7b415e9869157c711fe11263c95d74eDavid Li   if (strcmp(behavior, "warn") == 0) {
1511591693c7b415e9869157c711fe11263c95d74eDavid Li      ext_mode = extension_warn;
1521591693c7b415e9869157c711fe11263c95d74eDavid Li   } else if (strcmp(behavior, "require") == 0) {
1531591693c7b415e9869157c711fe11263c95d74eDavid Li      ext_mode = extension_require;
1541591693c7b415e9869157c711fe11263c95d74eDavid Li   } else if (strcmp(behavior, "enable") == 0) {
1551591693c7b415e9869157c711fe11263c95d74eDavid Li      ext_mode = extension_enable;
1561591693c7b415e9869157c711fe11263c95d74eDavid Li   } else if (strcmp(behavior, "disable") == 0) {
1571591693c7b415e9869157c711fe11263c95d74eDavid Li      ext_mode = extension_disable;
1581591693c7b415e9869157c711fe11263c95d74eDavid Li   } else {
1591591693c7b415e9869157c711fe11263c95d74eDavid Li      _mesa_glsl_error(behavior_locp, state,
1601591693c7b415e9869157c711fe11263c95d74eDavid Li		       "Unknown extension behavior `%s'",
1611591693c7b415e9869157c711fe11263c95d74eDavid Li		       behavior);
1621591693c7b415e9869157c711fe11263c95d74eDavid Li      return false;
1631591693c7b415e9869157c711fe11263c95d74eDavid Li   }
1641591693c7b415e9869157c711fe11263c95d74eDavid Li
1651591693c7b415e9869157c711fe11263c95d74eDavid Li   bool unsupported = false;
1661591693c7b415e9869157c711fe11263c95d74eDavid Li
1671591693c7b415e9869157c711fe11263c95d74eDavid Li   if (strcmp(name, "all") == 0) {
1681591693c7b415e9869157c711fe11263c95d74eDavid Li      if ((ext_mode == extension_enable) || (ext_mode == extension_require)) {
1691591693c7b415e9869157c711fe11263c95d74eDavid Li	 _mesa_glsl_error(name_locp, state, "Cannot %s all extensions",
1701591693c7b415e9869157c711fe11263c95d74eDavid Li			  (ext_mode == extension_enable)
1711591693c7b415e9869157c711fe11263c95d74eDavid Li			  ? "enable" : "require");
1721591693c7b415e9869157c711fe11263c95d74eDavid Li	 return false;
1731591693c7b415e9869157c711fe11263c95d74eDavid Li      }
1741591693c7b415e9869157c711fe11263c95d74eDavid Li   } else if (strcmp(name, "GL_ARB_draw_buffers") == 0) {
1751591693c7b415e9869157c711fe11263c95d74eDavid Li      /* This extension is only supported in fragment shaders.
1761591693c7b415e9869157c711fe11263c95d74eDavid Li       */
1771591693c7b415e9869157c711fe11263c95d74eDavid Li      if (state->target != fragment_shader) {
1781591693c7b415e9869157c711fe11263c95d74eDavid Li	 unsupported = true;
1791591693c7b415e9869157c711fe11263c95d74eDavid Li      } else {
1801591693c7b415e9869157c711fe11263c95d74eDavid Li	 state->ARB_draw_buffers_enable = (ext_mode != extension_disable);
1811591693c7b415e9869157c711fe11263c95d74eDavid Li	 state->ARB_draw_buffers_warn = (ext_mode == extension_warn);
1821591693c7b415e9869157c711fe11263c95d74eDavid Li      }
1831591693c7b415e9869157c711fe11263c95d74eDavid Li   } else if (strcmp(name, "GL_ARB_explicit_attrib_location") == 0) {
1841591693c7b415e9869157c711fe11263c95d74eDavid Li      state->ARB_explicit_attrib_location_enable =
1851591693c7b415e9869157c711fe11263c95d74eDavid Li	 (ext_mode != extension_disable);
1861591693c7b415e9869157c711fe11263c95d74eDavid Li      state->ARB_explicit_attrib_location_warn =
1871591693c7b415e9869157c711fe11263c95d74eDavid Li	 (ext_mode == extension_warn);
1881591693c7b415e9869157c711fe11263c95d74eDavid Li
1891591693c7b415e9869157c711fe11263c95d74eDavid Li      unsupported = !state->extensions->ARB_explicit_attrib_location;
1901591693c7b415e9869157c711fe11263c95d74eDavid Li   } else if (strcmp(name, "GL_ARB_fragment_coord_conventions") == 0) {
1911591693c7b415e9869157c711fe11263c95d74eDavid Li      state->ARB_fragment_coord_conventions_enable =
1921591693c7b415e9869157c711fe11263c95d74eDavid Li	 (ext_mode != extension_disable);
1931591693c7b415e9869157c711fe11263c95d74eDavid Li      state->ARB_fragment_coord_conventions_warn =
1941591693c7b415e9869157c711fe11263c95d74eDavid Li	 (ext_mode == extension_warn);
1951591693c7b415e9869157c711fe11263c95d74eDavid Li
1961591693c7b415e9869157c711fe11263c95d74eDavid Li      unsupported = !state->extensions->ARB_fragment_coord_conventions;
1971591693c7b415e9869157c711fe11263c95d74eDavid Li   } else if (strcmp(name, "GL_ARB_texture_rectangle") == 0) {
1981591693c7b415e9869157c711fe11263c95d74eDavid Li      state->ARB_texture_rectangle_enable = (ext_mode != extension_disable);
1991591693c7b415e9869157c711fe11263c95d74eDavid Li      state->ARB_texture_rectangle_warn = (ext_mode == extension_warn);
2001591693c7b415e9869157c711fe11263c95d74eDavid Li   } else if (strcmp(name, "GL_EXT_texture_array") == 0) {
2011591693c7b415e9869157c711fe11263c95d74eDavid Li      state->EXT_texture_array_enable = (ext_mode != extension_disable);
2021591693c7b415e9869157c711fe11263c95d74eDavid Li      state->EXT_texture_array_warn = (ext_mode == extension_warn);
2031591693c7b415e9869157c711fe11263c95d74eDavid Li
2041591693c7b415e9869157c711fe11263c95d74eDavid Li      unsupported = !state->extensions->EXT_texture_array;
2051591693c7b415e9869157c711fe11263c95d74eDavid Li   } else if (strcmp(name, "GL_ARB_shader_stencil_export") == 0) {
2061591693c7b415e9869157c711fe11263c95d74eDavid Li      if (state->target != fragment_shader) {
2071591693c7b415e9869157c711fe11263c95d74eDavid Li	 unsupported = true;
2081591693c7b415e9869157c711fe11263c95d74eDavid Li      } else {
2091591693c7b415e9869157c711fe11263c95d74eDavid Li	 state->ARB_shader_stencil_export_enable = (ext_mode != extension_disable);
2101591693c7b415e9869157c711fe11263c95d74eDavid Li	 state->ARB_shader_stencil_export_warn = (ext_mode == extension_warn);
2111591693c7b415e9869157c711fe11263c95d74eDavid Li	 unsupported = !state->extensions->ARB_shader_stencil_export;
2121591693c7b415e9869157c711fe11263c95d74eDavid Li      }
2131591693c7b415e9869157c711fe11263c95d74eDavid Li   } else {
2141591693c7b415e9869157c711fe11263c95d74eDavid Li      unsupported = true;
2151591693c7b415e9869157c711fe11263c95d74eDavid Li   }
2161591693c7b415e9869157c711fe11263c95d74eDavid Li
2171591693c7b415e9869157c711fe11263c95d74eDavid Li   if (unsupported) {
2181591693c7b415e9869157c711fe11263c95d74eDavid Li      static const char *const fmt = "extension `%s' unsupported in %s shader";
2191591693c7b415e9869157c711fe11263c95d74eDavid Li
2201591693c7b415e9869157c711fe11263c95d74eDavid Li      if (ext_mode == extension_require) {
2211591693c7b415e9869157c711fe11263c95d74eDavid Li	 _mesa_glsl_error(name_locp, state, fmt,
2221591693c7b415e9869157c711fe11263c95d74eDavid Li			  name, _mesa_glsl_shader_target_name(state->target));
2231591693c7b415e9869157c711fe11263c95d74eDavid Li	 return false;
2241591693c7b415e9869157c711fe11263c95d74eDavid Li      } else {
2251591693c7b415e9869157c711fe11263c95d74eDavid Li	 _mesa_glsl_warning(name_locp, state, fmt,
2261591693c7b415e9869157c711fe11263c95d74eDavid Li			    name, _mesa_glsl_shader_target_name(state->target));
2271591693c7b415e9869157c711fe11263c95d74eDavid Li      }
2281591693c7b415e9869157c711fe11263c95d74eDavid Li   }
2291591693c7b415e9869157c711fe11263c95d74eDavid Li
2301591693c7b415e9869157c711fe11263c95d74eDavid Li   return true;
2311591693c7b415e9869157c711fe11263c95d74eDavid Li}
2321591693c7b415e9869157c711fe11263c95d74eDavid Li
2331591693c7b415e9869157c711fe11263c95d74eDavid Livoid
2341591693c7b415e9869157c711fe11263c95d74eDavid Li_mesa_ast_type_qualifier_print(const struct ast_type_qualifier *q)
2351591693c7b415e9869157c711fe11263c95d74eDavid Li{
2361591693c7b415e9869157c711fe11263c95d74eDavid Li   if (q->flags.q.constant)
2371591693c7b415e9869157c711fe11263c95d74eDavid Li      printf("const ");
2381591693c7b415e9869157c711fe11263c95d74eDavid Li
2391591693c7b415e9869157c711fe11263c95d74eDavid Li   if (q->flags.q.invariant)
2401591693c7b415e9869157c711fe11263c95d74eDavid Li      printf("invariant ");
2411591693c7b415e9869157c711fe11263c95d74eDavid Li
2421591693c7b415e9869157c711fe11263c95d74eDavid Li   if (q->flags.q.attribute)
2431591693c7b415e9869157c711fe11263c95d74eDavid Li      printf("attribute ");
2441591693c7b415e9869157c711fe11263c95d74eDavid Li
2451591693c7b415e9869157c711fe11263c95d74eDavid Li   if (q->flags.q.varying)
2461591693c7b415e9869157c711fe11263c95d74eDavid Li      printf("varying ");
2471591693c7b415e9869157c711fe11263c95d74eDavid Li
2481591693c7b415e9869157c711fe11263c95d74eDavid Li   if (q->flags.q.in && q->flags.q.out)
2491591693c7b415e9869157c711fe11263c95d74eDavid Li      printf("inout ");
2501591693c7b415e9869157c711fe11263c95d74eDavid Li   else {
2511591693c7b415e9869157c711fe11263c95d74eDavid Li      if (q->flags.q.in)
2521591693c7b415e9869157c711fe11263c95d74eDavid Li	 printf("in ");
2531591693c7b415e9869157c711fe11263c95d74eDavid Li
2541591693c7b415e9869157c711fe11263c95d74eDavid Li      if (q->flags.q.out)
2551591693c7b415e9869157c711fe11263c95d74eDavid Li	 printf("out ");
2561591693c7b415e9869157c711fe11263c95d74eDavid Li   }
2571591693c7b415e9869157c711fe11263c95d74eDavid Li
2581591693c7b415e9869157c711fe11263c95d74eDavid Li   if (q->flags.q.centroid)
2591591693c7b415e9869157c711fe11263c95d74eDavid Li      printf("centroid ");
2601591693c7b415e9869157c711fe11263c95d74eDavid Li   if (q->flags.q.uniform)
2611591693c7b415e9869157c711fe11263c95d74eDavid Li      printf("uniform ");
2621591693c7b415e9869157c711fe11263c95d74eDavid Li   if (q->flags.q.smooth)
2631591693c7b415e9869157c711fe11263c95d74eDavid Li      printf("smooth ");
2641591693c7b415e9869157c711fe11263c95d74eDavid Li   if (q->flags.q.flat)
2651591693c7b415e9869157c711fe11263c95d74eDavid Li      printf("flat ");
2661591693c7b415e9869157c711fe11263c95d74eDavid Li   if (q->flags.q.noperspective)
2671591693c7b415e9869157c711fe11263c95d74eDavid Li      printf("noperspective ");
2681591693c7b415e9869157c711fe11263c95d74eDavid Li}
2691591693c7b415e9869157c711fe11263c95d74eDavid Li
2701591693c7b415e9869157c711fe11263c95d74eDavid Li
2711591693c7b415e9869157c711fe11263c95d74eDavid Livoid
2721591693c7b415e9869157c711fe11263c95d74eDavid Liast_node::print(void) const
2731591693c7b415e9869157c711fe11263c95d74eDavid Li{
2741591693c7b415e9869157c711fe11263c95d74eDavid Li   printf("unhandled node ");
2751591693c7b415e9869157c711fe11263c95d74eDavid Li}
2761591693c7b415e9869157c711fe11263c95d74eDavid Li
2771591693c7b415e9869157c711fe11263c95d74eDavid Li
2781591693c7b415e9869157c711fe11263c95d74eDavid Liast_node::ast_node(void)
2791591693c7b415e9869157c711fe11263c95d74eDavid Li{
2801591693c7b415e9869157c711fe11263c95d74eDavid Li   this->location.source = 0;
2811591693c7b415e9869157c711fe11263c95d74eDavid Li   this->location.line = 0;
2821591693c7b415e9869157c711fe11263c95d74eDavid Li   this->location.column = 0;
2831591693c7b415e9869157c711fe11263c95d74eDavid Li}
2841591693c7b415e9869157c711fe11263c95d74eDavid Li
2851591693c7b415e9869157c711fe11263c95d74eDavid Li
2861591693c7b415e9869157c711fe11263c95d74eDavid Listatic void
2871591693c7b415e9869157c711fe11263c95d74eDavid Liast_opt_array_size_print(bool is_array, const ast_expression *array_size)
2881591693c7b415e9869157c711fe11263c95d74eDavid Li{
2891591693c7b415e9869157c711fe11263c95d74eDavid Li   if (is_array) {
2901591693c7b415e9869157c711fe11263c95d74eDavid Li      printf("[ ");
2911591693c7b415e9869157c711fe11263c95d74eDavid Li
2921591693c7b415e9869157c711fe11263c95d74eDavid Li      if (array_size)
2931591693c7b415e9869157c711fe11263c95d74eDavid Li	 array_size->print();
2941591693c7b415e9869157c711fe11263c95d74eDavid Li
2951591693c7b415e9869157c711fe11263c95d74eDavid Li      printf("] ");
2961591693c7b415e9869157c711fe11263c95d74eDavid Li   }
2971591693c7b415e9869157c711fe11263c95d74eDavid Li}
2981591693c7b415e9869157c711fe11263c95d74eDavid Li
2991591693c7b415e9869157c711fe11263c95d74eDavid Li
3001591693c7b415e9869157c711fe11263c95d74eDavid Livoid
3011591693c7b415e9869157c711fe11263c95d74eDavid Liast_compound_statement::print(void) const
3021591693c7b415e9869157c711fe11263c95d74eDavid Li{
3031591693c7b415e9869157c711fe11263c95d74eDavid Li   printf("{\n");
3041591693c7b415e9869157c711fe11263c95d74eDavid Li
3051591693c7b415e9869157c711fe11263c95d74eDavid Li   foreach_list_const(n, &this->statements) {
3061591693c7b415e9869157c711fe11263c95d74eDavid Li      ast_node *ast = exec_node_data(ast_node, n, link);
3071591693c7b415e9869157c711fe11263c95d74eDavid Li      ast->print();
3081591693c7b415e9869157c711fe11263c95d74eDavid Li   }
3091591693c7b415e9869157c711fe11263c95d74eDavid Li
3101591693c7b415e9869157c711fe11263c95d74eDavid Li   printf("}\n");
3111591693c7b415e9869157c711fe11263c95d74eDavid Li}
3121591693c7b415e9869157c711fe11263c95d74eDavid Li
3131591693c7b415e9869157c711fe11263c95d74eDavid Li
3141591693c7b415e9869157c711fe11263c95d74eDavid Liast_compound_statement::ast_compound_statement(int new_scope,
3151591693c7b415e9869157c711fe11263c95d74eDavid Li					       ast_node *statements)
3161591693c7b415e9869157c711fe11263c95d74eDavid Li{
3171591693c7b415e9869157c711fe11263c95d74eDavid Li   this->new_scope = new_scope;
3181591693c7b415e9869157c711fe11263c95d74eDavid Li
3191591693c7b415e9869157c711fe11263c95d74eDavid Li   if (statements != NULL) {
3201591693c7b415e9869157c711fe11263c95d74eDavid Li      this->statements.push_degenerate_list_at_head(&statements->link);
3211591693c7b415e9869157c711fe11263c95d74eDavid Li   }
3221591693c7b415e9869157c711fe11263c95d74eDavid Li}
3231591693c7b415e9869157c711fe11263c95d74eDavid Li
3241591693c7b415e9869157c711fe11263c95d74eDavid Li
3251591693c7b415e9869157c711fe11263c95d74eDavid Livoid
3261591693c7b415e9869157c711fe11263c95d74eDavid Liast_expression::print(void) const
3271591693c7b415e9869157c711fe11263c95d74eDavid Li{
3281591693c7b415e9869157c711fe11263c95d74eDavid Li   switch (oper) {
3291591693c7b415e9869157c711fe11263c95d74eDavid Li   case ast_assign:
3301591693c7b415e9869157c711fe11263c95d74eDavid Li   case ast_mul_assign:
3311591693c7b415e9869157c711fe11263c95d74eDavid Li   case ast_div_assign:
3321591693c7b415e9869157c711fe11263c95d74eDavid Li   case ast_mod_assign:
3331591693c7b415e9869157c711fe11263c95d74eDavid Li   case ast_add_assign:
3341591693c7b415e9869157c711fe11263c95d74eDavid Li   case ast_sub_assign:
3351591693c7b415e9869157c711fe11263c95d74eDavid Li   case ast_ls_assign:
3361591693c7b415e9869157c711fe11263c95d74eDavid Li   case ast_rs_assign:
3371591693c7b415e9869157c711fe11263c95d74eDavid Li   case ast_and_assign:
3381591693c7b415e9869157c711fe11263c95d74eDavid Li   case ast_xor_assign:
3391591693c7b415e9869157c711fe11263c95d74eDavid Li   case ast_or_assign:
3401591693c7b415e9869157c711fe11263c95d74eDavid Li      subexpressions[0]->print();
3411591693c7b415e9869157c711fe11263c95d74eDavid Li      printf("%s ", operator_string(oper));
3421591693c7b415e9869157c711fe11263c95d74eDavid Li      subexpressions[1]->print();
3431591693c7b415e9869157c711fe11263c95d74eDavid Li      break;
3441591693c7b415e9869157c711fe11263c95d74eDavid Li
3451591693c7b415e9869157c711fe11263c95d74eDavid Li   case ast_field_selection:
3461591693c7b415e9869157c711fe11263c95d74eDavid Li      subexpressions[0]->print();
3471591693c7b415e9869157c711fe11263c95d74eDavid Li      printf(". %s ", primary_expression.identifier);
3481591693c7b415e9869157c711fe11263c95d74eDavid Li      break;
3491591693c7b415e9869157c711fe11263c95d74eDavid Li
3501591693c7b415e9869157c711fe11263c95d74eDavid Li   case ast_plus:
3511591693c7b415e9869157c711fe11263c95d74eDavid Li   case ast_neg:
3521591693c7b415e9869157c711fe11263c95d74eDavid Li   case ast_bit_not:
3531591693c7b415e9869157c711fe11263c95d74eDavid Li   case ast_logic_not:
3541591693c7b415e9869157c711fe11263c95d74eDavid Li   case ast_pre_inc:
3551591693c7b415e9869157c711fe11263c95d74eDavid Li   case ast_pre_dec:
3561591693c7b415e9869157c711fe11263c95d74eDavid Li      printf("%s ", operator_string(oper));
3571591693c7b415e9869157c711fe11263c95d74eDavid Li      subexpressions[0]->print();
3581591693c7b415e9869157c711fe11263c95d74eDavid Li      break;
3591591693c7b415e9869157c711fe11263c95d74eDavid Li
3601591693c7b415e9869157c711fe11263c95d74eDavid Li   case ast_post_inc:
3611591693c7b415e9869157c711fe11263c95d74eDavid Li   case ast_post_dec:
3621591693c7b415e9869157c711fe11263c95d74eDavid Li      subexpressions[0]->print();
3631591693c7b415e9869157c711fe11263c95d74eDavid Li      printf("%s ", operator_string(oper));
3641591693c7b415e9869157c711fe11263c95d74eDavid Li      break;
3651591693c7b415e9869157c711fe11263c95d74eDavid Li
3661591693c7b415e9869157c711fe11263c95d74eDavid Li   case ast_conditional:
3671591693c7b415e9869157c711fe11263c95d74eDavid Li      subexpressions[0]->print();
3681591693c7b415e9869157c711fe11263c95d74eDavid Li      printf("? ");
3691591693c7b415e9869157c711fe11263c95d74eDavid Li      subexpressions[1]->print();
3701591693c7b415e9869157c711fe11263c95d74eDavid Li      printf(": ");
3711591693c7b415e9869157c711fe11263c95d74eDavid Li      subexpressions[1]->print();
3721591693c7b415e9869157c711fe11263c95d74eDavid Li      break;
3731591693c7b415e9869157c711fe11263c95d74eDavid Li
3741591693c7b415e9869157c711fe11263c95d74eDavid Li   case ast_array_index:
3751591693c7b415e9869157c711fe11263c95d74eDavid Li      subexpressions[0]->print();
3761591693c7b415e9869157c711fe11263c95d74eDavid Li      printf("[ ");
3771591693c7b415e9869157c711fe11263c95d74eDavid Li      subexpressions[1]->print();
3781591693c7b415e9869157c711fe11263c95d74eDavid Li      printf("] ");
3791591693c7b415e9869157c711fe11263c95d74eDavid Li      break;
3801591693c7b415e9869157c711fe11263c95d74eDavid Li
3811591693c7b415e9869157c711fe11263c95d74eDavid Li   case ast_function_call: {
3821591693c7b415e9869157c711fe11263c95d74eDavid Li      subexpressions[0]->print();
3831591693c7b415e9869157c711fe11263c95d74eDavid Li      printf("( ");
3841591693c7b415e9869157c711fe11263c95d74eDavid Li
3851591693c7b415e9869157c711fe11263c95d74eDavid Li      foreach_list_const (n, &this->expressions) {
3861591693c7b415e9869157c711fe11263c95d74eDavid Li	 if (n != this->expressions.get_head())
3871591693c7b415e9869157c711fe11263c95d74eDavid Li	    printf(", ");
3881591693c7b415e9869157c711fe11263c95d74eDavid Li
3891591693c7b415e9869157c711fe11263c95d74eDavid Li	 ast_node *ast = exec_node_data(ast_node, n, link);
3901591693c7b415e9869157c711fe11263c95d74eDavid Li	 ast->print();
3911591693c7b415e9869157c711fe11263c95d74eDavid Li      }
3921591693c7b415e9869157c711fe11263c95d74eDavid Li
3931591693c7b415e9869157c711fe11263c95d74eDavid Li      printf(") ");
3941591693c7b415e9869157c711fe11263c95d74eDavid Li      break;
3951591693c7b415e9869157c711fe11263c95d74eDavid Li   }
3961591693c7b415e9869157c711fe11263c95d74eDavid Li
3971591693c7b415e9869157c711fe11263c95d74eDavid Li   case ast_identifier:
3981591693c7b415e9869157c711fe11263c95d74eDavid Li      printf("%s ", primary_expression.identifier);
3991591693c7b415e9869157c711fe11263c95d74eDavid Li      break;
4001591693c7b415e9869157c711fe11263c95d74eDavid Li
4011591693c7b415e9869157c711fe11263c95d74eDavid Li   case ast_int_constant:
4021591693c7b415e9869157c711fe11263c95d74eDavid Li      printf("%d ", primary_expression.int_constant);
4031591693c7b415e9869157c711fe11263c95d74eDavid Li      break;
4041591693c7b415e9869157c711fe11263c95d74eDavid Li
4051591693c7b415e9869157c711fe11263c95d74eDavid Li   case ast_uint_constant:
4061591693c7b415e9869157c711fe11263c95d74eDavid Li      printf("%u ", primary_expression.uint_constant);
4071591693c7b415e9869157c711fe11263c95d74eDavid Li      break;
4081591693c7b415e9869157c711fe11263c95d74eDavid Li
4091591693c7b415e9869157c711fe11263c95d74eDavid Li   case ast_float_constant:
4101591693c7b415e9869157c711fe11263c95d74eDavid Li      printf("%f ", primary_expression.float_constant);
4111591693c7b415e9869157c711fe11263c95d74eDavid Li      break;
4121591693c7b415e9869157c711fe11263c95d74eDavid Li
4131591693c7b415e9869157c711fe11263c95d74eDavid Li   case ast_bool_constant:
4141591693c7b415e9869157c711fe11263c95d74eDavid Li      printf("%s ",
4151591693c7b415e9869157c711fe11263c95d74eDavid Li	     primary_expression.bool_constant
4161591693c7b415e9869157c711fe11263c95d74eDavid Li	     ? "true" : "false");
4171591693c7b415e9869157c711fe11263c95d74eDavid Li      break;
4181591693c7b415e9869157c711fe11263c95d74eDavid Li
4191591693c7b415e9869157c711fe11263c95d74eDavid Li   case ast_sequence: {
4201591693c7b415e9869157c711fe11263c95d74eDavid Li      printf("( ");
4211591693c7b415e9869157c711fe11263c95d74eDavid Li      foreach_list_const(n, & this->expressions) {
4221591693c7b415e9869157c711fe11263c95d74eDavid Li	 if (n != this->expressions.get_head())
4231591693c7b415e9869157c711fe11263c95d74eDavid Li	    printf(", ");
4241591693c7b415e9869157c711fe11263c95d74eDavid Li
4251591693c7b415e9869157c711fe11263c95d74eDavid Li	 ast_node *ast = exec_node_data(ast_node, n, link);
4261591693c7b415e9869157c711fe11263c95d74eDavid Li	 ast->print();
4271591693c7b415e9869157c711fe11263c95d74eDavid Li      }
4281591693c7b415e9869157c711fe11263c95d74eDavid Li      printf(") ");
4291591693c7b415e9869157c711fe11263c95d74eDavid Li      break;
4301591693c7b415e9869157c711fe11263c95d74eDavid Li   }
4311591693c7b415e9869157c711fe11263c95d74eDavid Li
4321591693c7b415e9869157c711fe11263c95d74eDavid Li   default:
4331591693c7b415e9869157c711fe11263c95d74eDavid Li      assert(0);
4341591693c7b415e9869157c711fe11263c95d74eDavid Li      break;
4351591693c7b415e9869157c711fe11263c95d74eDavid Li   }
4361591693c7b415e9869157c711fe11263c95d74eDavid Li}
4371591693c7b415e9869157c711fe11263c95d74eDavid Li
4381591693c7b415e9869157c711fe11263c95d74eDavid Liast_expression::ast_expression(int oper,
4391591693c7b415e9869157c711fe11263c95d74eDavid Li			       ast_expression *ex0,
4401591693c7b415e9869157c711fe11263c95d74eDavid Li			       ast_expression *ex1,
4411591693c7b415e9869157c711fe11263c95d74eDavid Li			       ast_expression *ex2)
4421591693c7b415e9869157c711fe11263c95d74eDavid Li{
4431591693c7b415e9869157c711fe11263c95d74eDavid Li   this->oper = ast_operators(oper);
4441591693c7b415e9869157c711fe11263c95d74eDavid Li   this->subexpressions[0] = ex0;
4451591693c7b415e9869157c711fe11263c95d74eDavid Li   this->subexpressions[1] = ex1;
4461591693c7b415e9869157c711fe11263c95d74eDavid Li   this->subexpressions[2] = ex2;
4471591693c7b415e9869157c711fe11263c95d74eDavid Li}
4481591693c7b415e9869157c711fe11263c95d74eDavid Li
4491591693c7b415e9869157c711fe11263c95d74eDavid Li
4501591693c7b415e9869157c711fe11263c95d74eDavid Livoid
4511591693c7b415e9869157c711fe11263c95d74eDavid Liast_expression_statement::print(void) const
4521591693c7b415e9869157c711fe11263c95d74eDavid Li{
4531591693c7b415e9869157c711fe11263c95d74eDavid Li   if (expression)
4541591693c7b415e9869157c711fe11263c95d74eDavid Li      expression->print();
4551591693c7b415e9869157c711fe11263c95d74eDavid Li
4561591693c7b415e9869157c711fe11263c95d74eDavid Li   printf("; ");
4571591693c7b415e9869157c711fe11263c95d74eDavid Li}
4581591693c7b415e9869157c711fe11263c95d74eDavid Li
4591591693c7b415e9869157c711fe11263c95d74eDavid Li
4601591693c7b415e9869157c711fe11263c95d74eDavid Liast_expression_statement::ast_expression_statement(ast_expression *ex) :
4611591693c7b415e9869157c711fe11263c95d74eDavid Li   expression(ex)
4621591693c7b415e9869157c711fe11263c95d74eDavid Li{
4631591693c7b415e9869157c711fe11263c95d74eDavid Li   /* empty */
4641591693c7b415e9869157c711fe11263c95d74eDavid Li}
4651591693c7b415e9869157c711fe11263c95d74eDavid Li
4661591693c7b415e9869157c711fe11263c95d74eDavid Li
4671591693c7b415e9869157c711fe11263c95d74eDavid Livoid
4681591693c7b415e9869157c711fe11263c95d74eDavid Liast_function::print(void) const
4691591693c7b415e9869157c711fe11263c95d74eDavid Li{
4701591693c7b415e9869157c711fe11263c95d74eDavid Li   return_type->print();
4711591693c7b415e9869157c711fe11263c95d74eDavid Li   printf(" %s (", identifier);
4721591693c7b415e9869157c711fe11263c95d74eDavid Li
4731591693c7b415e9869157c711fe11263c95d74eDavid Li   foreach_list_const(n, & this->parameters) {
4741591693c7b415e9869157c711fe11263c95d74eDavid Li      ast_node *ast = exec_node_data(ast_node, n, link);
4751591693c7b415e9869157c711fe11263c95d74eDavid Li      ast->print();
4761591693c7b415e9869157c711fe11263c95d74eDavid Li   }
4771591693c7b415e9869157c711fe11263c95d74eDavid Li
4781591693c7b415e9869157c711fe11263c95d74eDavid Li   printf(")");
4791591693c7b415e9869157c711fe11263c95d74eDavid Li}
4801591693c7b415e9869157c711fe11263c95d74eDavid Li
4811591693c7b415e9869157c711fe11263c95d74eDavid Li
4821591693c7b415e9869157c711fe11263c95d74eDavid Liast_function::ast_function(void)
4831591693c7b415e9869157c711fe11263c95d74eDavid Li   : is_definition(false), signature(NULL)
4841591693c7b415e9869157c711fe11263c95d74eDavid Li{
4851591693c7b415e9869157c711fe11263c95d74eDavid Li   /* empty */
4861591693c7b415e9869157c711fe11263c95d74eDavid Li}
4871591693c7b415e9869157c711fe11263c95d74eDavid Li
4881591693c7b415e9869157c711fe11263c95d74eDavid Li
4891591693c7b415e9869157c711fe11263c95d74eDavid Livoid
4901591693c7b415e9869157c711fe11263c95d74eDavid Liast_fully_specified_type::print(void) const
4911591693c7b415e9869157c711fe11263c95d74eDavid Li{
4921591693c7b415e9869157c711fe11263c95d74eDavid Li   _mesa_ast_type_qualifier_print(& qualifier);
4931591693c7b415e9869157c711fe11263c95d74eDavid Li   specifier->print();
4941591693c7b415e9869157c711fe11263c95d74eDavid Li}
4951591693c7b415e9869157c711fe11263c95d74eDavid Li
4961591693c7b415e9869157c711fe11263c95d74eDavid Li
4971591693c7b415e9869157c711fe11263c95d74eDavid Livoid
4981591693c7b415e9869157c711fe11263c95d74eDavid Liast_parameter_declarator::print(void) const
4991591693c7b415e9869157c711fe11263c95d74eDavid Li{
5001591693c7b415e9869157c711fe11263c95d74eDavid Li   type->print();
5011591693c7b415e9869157c711fe11263c95d74eDavid Li   if (identifier)
5021591693c7b415e9869157c711fe11263c95d74eDavid Li      printf("%s ", identifier);
5031591693c7b415e9869157c711fe11263c95d74eDavid Li   ast_opt_array_size_print(is_array, array_size);
5041591693c7b415e9869157c711fe11263c95d74eDavid Li}
5051591693c7b415e9869157c711fe11263c95d74eDavid Li
5061591693c7b415e9869157c711fe11263c95d74eDavid Li
5071591693c7b415e9869157c711fe11263c95d74eDavid Livoid
5081591693c7b415e9869157c711fe11263c95d74eDavid Liast_function_definition::print(void) const
5091591693c7b415e9869157c711fe11263c95d74eDavid Li{
5101591693c7b415e9869157c711fe11263c95d74eDavid Li   prototype->print();
5111591693c7b415e9869157c711fe11263c95d74eDavid Li   body->print();
5121591693c7b415e9869157c711fe11263c95d74eDavid Li}
5131591693c7b415e9869157c711fe11263c95d74eDavid Li
5141591693c7b415e9869157c711fe11263c95d74eDavid Li
5151591693c7b415e9869157c711fe11263c95d74eDavid Livoid
5161591693c7b415e9869157c711fe11263c95d74eDavid Liast_declaration::print(void) const
5171591693c7b415e9869157c711fe11263c95d74eDavid Li{
5181591693c7b415e9869157c711fe11263c95d74eDavid Li   printf("%s ", identifier);
5191591693c7b415e9869157c711fe11263c95d74eDavid Li   ast_opt_array_size_print(is_array, array_size);
5201591693c7b415e9869157c711fe11263c95d74eDavid Li
5211591693c7b415e9869157c711fe11263c95d74eDavid Li   if (initializer) {
5221591693c7b415e9869157c711fe11263c95d74eDavid Li      printf("= ");
5231591693c7b415e9869157c711fe11263c95d74eDavid Li      initializer->print();
5241591693c7b415e9869157c711fe11263c95d74eDavid Li   }
5251591693c7b415e9869157c711fe11263c95d74eDavid Li}
5261591693c7b415e9869157c711fe11263c95d74eDavid Li
5271591693c7b415e9869157c711fe11263c95d74eDavid Li
5281591693c7b415e9869157c711fe11263c95d74eDavid Liast_declaration::ast_declaration(char *identifier, int is_array,
5291591693c7b415e9869157c711fe11263c95d74eDavid Li				 ast_expression *array_size,
5301591693c7b415e9869157c711fe11263c95d74eDavid Li				 ast_expression *initializer)
5311591693c7b415e9869157c711fe11263c95d74eDavid Li{
5321591693c7b415e9869157c711fe11263c95d74eDavid Li   this->identifier = identifier;
5331591693c7b415e9869157c711fe11263c95d74eDavid Li   this->is_array = is_array;
5341591693c7b415e9869157c711fe11263c95d74eDavid Li   this->array_size = array_size;
5351591693c7b415e9869157c711fe11263c95d74eDavid Li   this->initializer = initializer;
5361591693c7b415e9869157c711fe11263c95d74eDavid Li}
5371591693c7b415e9869157c711fe11263c95d74eDavid Li
5381591693c7b415e9869157c711fe11263c95d74eDavid Li
5391591693c7b415e9869157c711fe11263c95d74eDavid Livoid
5401591693c7b415e9869157c711fe11263c95d74eDavid Liast_declarator_list::print(void) const
5411591693c7b415e9869157c711fe11263c95d74eDavid Li{
5421591693c7b415e9869157c711fe11263c95d74eDavid Li   assert(type || invariant);
5431591693c7b415e9869157c711fe11263c95d74eDavid Li
5441591693c7b415e9869157c711fe11263c95d74eDavid Li   if (type)
5451591693c7b415e9869157c711fe11263c95d74eDavid Li      type->print();
5461591693c7b415e9869157c711fe11263c95d74eDavid Li   else
5471591693c7b415e9869157c711fe11263c95d74eDavid Li      printf("invariant ");
5481591693c7b415e9869157c711fe11263c95d74eDavid Li
5491591693c7b415e9869157c711fe11263c95d74eDavid Li   foreach_list_const (ptr, & this->declarations) {
5501591693c7b415e9869157c711fe11263c95d74eDavid Li      if (ptr != this->declarations.get_head())
5511591693c7b415e9869157c711fe11263c95d74eDavid Li	 printf(", ");
5521591693c7b415e9869157c711fe11263c95d74eDavid Li
5531591693c7b415e9869157c711fe11263c95d74eDavid Li      ast_node *ast = exec_node_data(ast_node, ptr, link);
5541591693c7b415e9869157c711fe11263c95d74eDavid Li      ast->print();
5551591693c7b415e9869157c711fe11263c95d74eDavid Li   }
5561591693c7b415e9869157c711fe11263c95d74eDavid Li
5571591693c7b415e9869157c711fe11263c95d74eDavid Li   printf("; ");
5581591693c7b415e9869157c711fe11263c95d74eDavid Li}
5591591693c7b415e9869157c711fe11263c95d74eDavid Li
5601591693c7b415e9869157c711fe11263c95d74eDavid Li
5611591693c7b415e9869157c711fe11263c95d74eDavid Liast_declarator_list::ast_declarator_list(ast_fully_specified_type *type)
5621591693c7b415e9869157c711fe11263c95d74eDavid Li{
5631591693c7b415e9869157c711fe11263c95d74eDavid Li   this->type = type;
5641591693c7b415e9869157c711fe11263c95d74eDavid Li   this->invariant = false;
5651591693c7b415e9869157c711fe11263c95d74eDavid Li}
5661591693c7b415e9869157c711fe11263c95d74eDavid Li
5671591693c7b415e9869157c711fe11263c95d74eDavid Livoid
5681591693c7b415e9869157c711fe11263c95d74eDavid Liast_jump_statement::print(void) const
5691591693c7b415e9869157c711fe11263c95d74eDavid Li{
5701591693c7b415e9869157c711fe11263c95d74eDavid Li   switch (mode) {
5711591693c7b415e9869157c711fe11263c95d74eDavid Li   case ast_continue:
5721591693c7b415e9869157c711fe11263c95d74eDavid Li      printf("continue; ");
5731591693c7b415e9869157c711fe11263c95d74eDavid Li      break;
5741591693c7b415e9869157c711fe11263c95d74eDavid Li   case ast_break:
5751591693c7b415e9869157c711fe11263c95d74eDavid Li      printf("break; ");
5761591693c7b415e9869157c711fe11263c95d74eDavid Li      break;
5771591693c7b415e9869157c711fe11263c95d74eDavid Li   case ast_return:
5781591693c7b415e9869157c711fe11263c95d74eDavid Li      printf("return ");
5791591693c7b415e9869157c711fe11263c95d74eDavid Li      if (opt_return_value)
5801591693c7b415e9869157c711fe11263c95d74eDavid Li	 opt_return_value->print();
5811591693c7b415e9869157c711fe11263c95d74eDavid Li
5821591693c7b415e9869157c711fe11263c95d74eDavid Li      printf("; ");
5831591693c7b415e9869157c711fe11263c95d74eDavid Li      break;
5841591693c7b415e9869157c711fe11263c95d74eDavid Li   case ast_discard:
5851591693c7b415e9869157c711fe11263c95d74eDavid Li      printf("discard; ");
5861591693c7b415e9869157c711fe11263c95d74eDavid Li      break;
5871591693c7b415e9869157c711fe11263c95d74eDavid Li   }
5881591693c7b415e9869157c711fe11263c95d74eDavid Li}
5891591693c7b415e9869157c711fe11263c95d74eDavid Li
5901591693c7b415e9869157c711fe11263c95d74eDavid Li
5911591693c7b415e9869157c711fe11263c95d74eDavid Liast_jump_statement::ast_jump_statement(int mode, ast_expression *return_value)
5921591693c7b415e9869157c711fe11263c95d74eDavid Li{
5931591693c7b415e9869157c711fe11263c95d74eDavid Li   this->mode = ast_jump_modes(mode);
5941591693c7b415e9869157c711fe11263c95d74eDavid Li
5951591693c7b415e9869157c711fe11263c95d74eDavid Li   if (mode == ast_return)
5961591693c7b415e9869157c711fe11263c95d74eDavid Li      opt_return_value = return_value;
5971591693c7b415e9869157c711fe11263c95d74eDavid Li}
5981591693c7b415e9869157c711fe11263c95d74eDavid Li
5991591693c7b415e9869157c711fe11263c95d74eDavid Li
6001591693c7b415e9869157c711fe11263c95d74eDavid Livoid
6011591693c7b415e9869157c711fe11263c95d74eDavid Liast_selection_statement::print(void) const
6021591693c7b415e9869157c711fe11263c95d74eDavid Li{
6031591693c7b415e9869157c711fe11263c95d74eDavid Li   printf("if ( ");
6041591693c7b415e9869157c711fe11263c95d74eDavid Li   condition->print();
6051591693c7b415e9869157c711fe11263c95d74eDavid Li   printf(") ");
6061591693c7b415e9869157c711fe11263c95d74eDavid Li
6071591693c7b415e9869157c711fe11263c95d74eDavid Li   then_statement->print();
6081591693c7b415e9869157c711fe11263c95d74eDavid Li
6091591693c7b415e9869157c711fe11263c95d74eDavid Li   if (else_statement) {
6101591693c7b415e9869157c711fe11263c95d74eDavid Li      printf("else ");
6111591693c7b415e9869157c711fe11263c95d74eDavid Li      else_statement->print();
6121591693c7b415e9869157c711fe11263c95d74eDavid Li   }
6131591693c7b415e9869157c711fe11263c95d74eDavid Li
6141591693c7b415e9869157c711fe11263c95d74eDavid Li}
6151591693c7b415e9869157c711fe11263c95d74eDavid Li
6161591693c7b415e9869157c711fe11263c95d74eDavid Li
6171591693c7b415e9869157c711fe11263c95d74eDavid Liast_selection_statement::ast_selection_statement(ast_expression *condition,
6181591693c7b415e9869157c711fe11263c95d74eDavid Li						 ast_node *then_statement,
6191591693c7b415e9869157c711fe11263c95d74eDavid Li						 ast_node *else_statement)
6201591693c7b415e9869157c711fe11263c95d74eDavid Li{
6211591693c7b415e9869157c711fe11263c95d74eDavid Li   this->condition = condition;
6221591693c7b415e9869157c711fe11263c95d74eDavid Li   this->then_statement = then_statement;
6231591693c7b415e9869157c711fe11263c95d74eDavid Li   this->else_statement = else_statement;
6241591693c7b415e9869157c711fe11263c95d74eDavid Li}
6251591693c7b415e9869157c711fe11263c95d74eDavid Li
6261591693c7b415e9869157c711fe11263c95d74eDavid Li
6271591693c7b415e9869157c711fe11263c95d74eDavid Livoid
6281591693c7b415e9869157c711fe11263c95d74eDavid Liast_iteration_statement::print(void) const
6291591693c7b415e9869157c711fe11263c95d74eDavid Li{
6301591693c7b415e9869157c711fe11263c95d74eDavid Li   switch (mode) {
6311591693c7b415e9869157c711fe11263c95d74eDavid Li   case ast_for:
6321591693c7b415e9869157c711fe11263c95d74eDavid Li      printf("for( ");
6331591693c7b415e9869157c711fe11263c95d74eDavid Li      if (init_statement)
6341591693c7b415e9869157c711fe11263c95d74eDavid Li	 init_statement->print();
6351591693c7b415e9869157c711fe11263c95d74eDavid Li      printf("; ");
6361591693c7b415e9869157c711fe11263c95d74eDavid Li
6371591693c7b415e9869157c711fe11263c95d74eDavid Li      if (condition)
6381591693c7b415e9869157c711fe11263c95d74eDavid Li	 condition->print();
6391591693c7b415e9869157c711fe11263c95d74eDavid Li      printf("; ");
6401591693c7b415e9869157c711fe11263c95d74eDavid Li
6411591693c7b415e9869157c711fe11263c95d74eDavid Li      if (rest_expression)
6421591693c7b415e9869157c711fe11263c95d74eDavid Li	 rest_expression->print();
6431591693c7b415e9869157c711fe11263c95d74eDavid Li      printf(") ");
6441591693c7b415e9869157c711fe11263c95d74eDavid Li
6451591693c7b415e9869157c711fe11263c95d74eDavid Li      body->print();
6461591693c7b415e9869157c711fe11263c95d74eDavid Li      break;
6471591693c7b415e9869157c711fe11263c95d74eDavid Li
6481591693c7b415e9869157c711fe11263c95d74eDavid Li   case ast_while:
6491591693c7b415e9869157c711fe11263c95d74eDavid Li      printf("while ( ");
6501591693c7b415e9869157c711fe11263c95d74eDavid Li      if (condition)
6511591693c7b415e9869157c711fe11263c95d74eDavid Li	 condition->print();
6521591693c7b415e9869157c711fe11263c95d74eDavid Li      printf(") ");
6531591693c7b415e9869157c711fe11263c95d74eDavid Li      body->print();
6541591693c7b415e9869157c711fe11263c95d74eDavid Li      break;
6551591693c7b415e9869157c711fe11263c95d74eDavid Li
6561591693c7b415e9869157c711fe11263c95d74eDavid Li   case ast_do_while:
6571591693c7b415e9869157c711fe11263c95d74eDavid Li      printf("do ");
6581591693c7b415e9869157c711fe11263c95d74eDavid Li      body->print();
6591591693c7b415e9869157c711fe11263c95d74eDavid Li      printf("while ( ");
6601591693c7b415e9869157c711fe11263c95d74eDavid Li      if (condition)
6611591693c7b415e9869157c711fe11263c95d74eDavid Li	 condition->print();
6621591693c7b415e9869157c711fe11263c95d74eDavid Li      printf("); ");
6631591693c7b415e9869157c711fe11263c95d74eDavid Li      break;
6641591693c7b415e9869157c711fe11263c95d74eDavid Li   }
6651591693c7b415e9869157c711fe11263c95d74eDavid Li}
6661591693c7b415e9869157c711fe11263c95d74eDavid Li
6671591693c7b415e9869157c711fe11263c95d74eDavid Li
6681591693c7b415e9869157c711fe11263c95d74eDavid Liast_iteration_statement::ast_iteration_statement(int mode,
6691591693c7b415e9869157c711fe11263c95d74eDavid Li						 ast_node *init,
6701591693c7b415e9869157c711fe11263c95d74eDavid Li						 ast_node *condition,
6711591693c7b415e9869157c711fe11263c95d74eDavid Li						 ast_expression *rest_expression,
6721591693c7b415e9869157c711fe11263c95d74eDavid Li						 ast_node *body)
6731591693c7b415e9869157c711fe11263c95d74eDavid Li{
6741591693c7b415e9869157c711fe11263c95d74eDavid Li   this->mode = ast_iteration_modes(mode);
6751591693c7b415e9869157c711fe11263c95d74eDavid Li   this->init_statement = init;
6761591693c7b415e9869157c711fe11263c95d74eDavid Li   this->condition = condition;
6771591693c7b415e9869157c711fe11263c95d74eDavid Li   this->rest_expression = rest_expression;
6781591693c7b415e9869157c711fe11263c95d74eDavid Li   this->body = body;
6791591693c7b415e9869157c711fe11263c95d74eDavid Li}
6801591693c7b415e9869157c711fe11263c95d74eDavid Li
6811591693c7b415e9869157c711fe11263c95d74eDavid Li
6821591693c7b415e9869157c711fe11263c95d74eDavid Livoid
6831591693c7b415e9869157c711fe11263c95d74eDavid Liast_struct_specifier::print(void) const
6841591693c7b415e9869157c711fe11263c95d74eDavid Li{
6851591693c7b415e9869157c711fe11263c95d74eDavid Li   printf("struct %s { ", name);
6861591693c7b415e9869157c711fe11263c95d74eDavid Li   foreach_list_const(n, &this->declarations) {
6871591693c7b415e9869157c711fe11263c95d74eDavid Li      ast_node *ast = exec_node_data(ast_node, n, link);
6881591693c7b415e9869157c711fe11263c95d74eDavid Li      ast->print();
6891591693c7b415e9869157c711fe11263c95d74eDavid Li   }
6901591693c7b415e9869157c711fe11263c95d74eDavid Li   printf("} ");
6911591693c7b415e9869157c711fe11263c95d74eDavid Li}
6921591693c7b415e9869157c711fe11263c95d74eDavid Li
6931591693c7b415e9869157c711fe11263c95d74eDavid Li
6941591693c7b415e9869157c711fe11263c95d74eDavid Liast_struct_specifier::ast_struct_specifier(char *identifier,
6951591693c7b415e9869157c711fe11263c95d74eDavid Li					   ast_node *declarator_list)
6961591693c7b415e9869157c711fe11263c95d74eDavid Li{
6971591693c7b415e9869157c711fe11263c95d74eDavid Li   if (identifier == NULL) {
6981591693c7b415e9869157c711fe11263c95d74eDavid Li      static unsigned anon_count = 1;
699d50d9a90a0df4d706421850e17c0fbd85bf710eeDavid Li      identifier = hieralloc_asprintf(this, "#anon_struct_%04x", anon_count);
7001591693c7b415e9869157c711fe11263c95d74eDavid Li      anon_count++;
7011591693c7b415e9869157c711fe11263c95d74eDavid Li   }
7021591693c7b415e9869157c711fe11263c95d74eDavid Li   name = identifier;
7031591693c7b415e9869157c711fe11263c95d74eDavid Li   this->declarations.push_degenerate_list_at_head(&declarator_list->link);
7041591693c7b415e9869157c711fe11263c95d74eDavid Li}
7051591693c7b415e9869157c711fe11263c95d74eDavid Li
7061591693c7b415e9869157c711fe11263c95d74eDavid Libool
7071591693c7b415e9869157c711fe11263c95d74eDavid Lido_common_optimization(exec_list *ir, bool linked, unsigned max_unroll_iterations)
7081591693c7b415e9869157c711fe11263c95d74eDavid Li{
7091591693c7b415e9869157c711fe11263c95d74eDavid Li   GLboolean progress = GL_FALSE;
7101591693c7b415e9869157c711fe11263c95d74eDavid Li
7111591693c7b415e9869157c711fe11263c95d74eDavid Li   progress = lower_instructions(ir, SUB_TO_ADD_NEG) || progress;
7121591693c7b415e9869157c711fe11263c95d74eDavid Li
7131591693c7b415e9869157c711fe11263c95d74eDavid Li   if (linked) {
7141591693c7b415e9869157c711fe11263c95d74eDavid Li      progress = do_function_inlining(ir) || progress;
7151591693c7b415e9869157c711fe11263c95d74eDavid Li      progress = do_dead_functions(ir) || progress;
7161591693c7b415e9869157c711fe11263c95d74eDavid Li   }
7171591693c7b415e9869157c711fe11263c95d74eDavid Li   progress = do_structure_splitting(ir) || progress;
7181591693c7b415e9869157c711fe11263c95d74eDavid Li   progress = do_if_simplification(ir) || progress;
7191591693c7b415e9869157c711fe11263c95d74eDavid Li   progress = do_discard_simplification(ir) || progress;
7201591693c7b415e9869157c711fe11263c95d74eDavid Li   progress = do_copy_propagation(ir) || progress;
7211591693c7b415e9869157c711fe11263c95d74eDavid Li   if (linked)
7221591693c7b415e9869157c711fe11263c95d74eDavid Li      progress = do_dead_code(ir) || progress;
7231591693c7b415e9869157c711fe11263c95d74eDavid Li   else
7241591693c7b415e9869157c711fe11263c95d74eDavid Li      progress = do_dead_code_unlinked(ir) || progress;
7251591693c7b415e9869157c711fe11263c95d74eDavid Li   progress = do_dead_code_local(ir) || progress;
7261591693c7b415e9869157c711fe11263c95d74eDavid Li   progress = do_tree_grafting(ir) || progress;
7271591693c7b415e9869157c711fe11263c95d74eDavid Li   progress = do_constant_propagation(ir) || progress;
7281591693c7b415e9869157c711fe11263c95d74eDavid Li   if (linked)
7291591693c7b415e9869157c711fe11263c95d74eDavid Li      progress = do_constant_variable(ir) || progress;
7301591693c7b415e9869157c711fe11263c95d74eDavid Li   else
7311591693c7b415e9869157c711fe11263c95d74eDavid Li      progress = do_constant_variable_unlinked(ir) || progress;
7321591693c7b415e9869157c711fe11263c95d74eDavid Li   progress = do_constant_folding(ir) || progress;
7331591693c7b415e9869157c711fe11263c95d74eDavid Li   progress = do_algebraic(ir) || progress;
7341591693c7b415e9869157c711fe11263c95d74eDavid Li   progress = do_lower_jumps(ir) || progress;
7351591693c7b415e9869157c711fe11263c95d74eDavid Li   progress = do_vec_index_to_swizzle(ir) || progress;
7361591693c7b415e9869157c711fe11263c95d74eDavid Li   progress = do_swizzle_swizzle(ir) || progress;
7371591693c7b415e9869157c711fe11263c95d74eDavid Li   progress = do_noop_swizzle(ir) || progress;
7381591693c7b415e9869157c711fe11263c95d74eDavid Li
7391591693c7b415e9869157c711fe11263c95d74eDavid Li   progress = optimize_redundant_jumps(ir) || progress;
7401591693c7b415e9869157c711fe11263c95d74eDavid Li
7411591693c7b415e9869157c711fe11263c95d74eDavid Li   loop_state *ls = analyze_loop_variables(ir);
7421591693c7b415e9869157c711fe11263c95d74eDavid Li   progress = set_loop_controls(ir, ls) || progress;
7431591693c7b415e9869157c711fe11263c95d74eDavid Li   progress = unroll_loops(ir, ls, max_unroll_iterations) || progress;
7441591693c7b415e9869157c711fe11263c95d74eDavid Li   delete ls;
7451591693c7b415e9869157c711fe11263c95d74eDavid Li
7461591693c7b415e9869157c711fe11263c95d74eDavid Li   return progress;
7471591693c7b415e9869157c711fe11263c95d74eDavid Li}
7481591693c7b415e9869157c711fe11263c95d74eDavid Li
7491591693c7b415e9869157c711fe11263c95d74eDavid Liextern "C" {
7501591693c7b415e9869157c711fe11263c95d74eDavid Li
7511591693c7b415e9869157c711fe11263c95d74eDavid Li/**
7521591693c7b415e9869157c711fe11263c95d74eDavid Li * To be called at GL teardown time, this frees compiler datastructures.
7531591693c7b415e9869157c711fe11263c95d74eDavid Li *
7541591693c7b415e9869157c711fe11263c95d74eDavid Li * After calling this, any previously compiled shaders and shader
7551591693c7b415e9869157c711fe11263c95d74eDavid Li * programs would be invalid.  So this should happen at approximately
7561591693c7b415e9869157c711fe11263c95d74eDavid Li * program exit.
7571591693c7b415e9869157c711fe11263c95d74eDavid Li */
7581591693c7b415e9869157c711fe11263c95d74eDavid Livoid
7591591693c7b415e9869157c711fe11263c95d74eDavid Li_mesa_destroy_shader_compiler(void)
7601591693c7b415e9869157c711fe11263c95d74eDavid Li{
7611591693c7b415e9869157c711fe11263c95d74eDavid Li   _mesa_destroy_shader_compiler_caches();
7621591693c7b415e9869157c711fe11263c95d74eDavid Li
7631591693c7b415e9869157c711fe11263c95d74eDavid Li   _mesa_glsl_release_types();
7641591693c7b415e9869157c711fe11263c95d74eDavid Li}
7651591693c7b415e9869157c711fe11263c95d74eDavid Li
7661591693c7b415e9869157c711fe11263c95d74eDavid Li/**
7671591693c7b415e9869157c711fe11263c95d74eDavid Li * Releases compiler caches to trade off performance for memory.
7681591693c7b415e9869157c711fe11263c95d74eDavid Li *
7691591693c7b415e9869157c711fe11263c95d74eDavid Li * Intended to be used with glReleaseShaderCompiler().
7701591693c7b415e9869157c711fe11263c95d74eDavid Li */
7711591693c7b415e9869157c711fe11263c95d74eDavid Livoid
7721591693c7b415e9869157c711fe11263c95d74eDavid Li_mesa_destroy_shader_compiler_caches(void)
7731591693c7b415e9869157c711fe11263c95d74eDavid Li{
7741591693c7b415e9869157c711fe11263c95d74eDavid Li   _mesa_glsl_release_functions();
7751591693c7b415e9869157c711fe11263c95d74eDavid Li}
7761591693c7b415e9869157c711fe11263c95d74eDavid Li
7771591693c7b415e9869157c711fe11263c95d74eDavid Li}
778