glsl_parser_extras.cpp revision e24d35a5b59ca1e75b69a32db6294787378a963f
136421ee45722da418b8ab99d7e6358e4f86b9f1eCristy/*
236421ee45722da418b8ab99d7e6358e4f86b9f1eCristy * Copyright © 2008, 2009 Intel Corporation
336421ee45722da418b8ab99d7e6358e4f86b9f1eCristy *
436421ee45722da418b8ab99d7e6358e4f86b9f1eCristy * Permission is hereby granted, free of charge, to any person obtaining a
536421ee45722da418b8ab99d7e6358e4f86b9f1eCristy * copy of this software and associated documentation files (the "Software"),
636421ee45722da418b8ab99d7e6358e4f86b9f1eCristy * to deal in the Software without restriction, including without limitation
736421ee45722da418b8ab99d7e6358e4f86b9f1eCristy * the rights to use, copy, modify, merge, publish, distribute, sublicense,
836421ee45722da418b8ab99d7e6358e4f86b9f1eCristy * and/or sell copies of the Software, and to permit persons to whom the
936421ee45722da418b8ab99d7e6358e4f86b9f1eCristy * Software is furnished to do so, subject to the following conditions:
1036421ee45722da418b8ab99d7e6358e4f86b9f1eCristy *
1136421ee45722da418b8ab99d7e6358e4f86b9f1eCristy * The above copyright notice and this permission notice (including the next
1236421ee45722da418b8ab99d7e6358e4f86b9f1eCristy * paragraph) shall be included in all copies or substantial portions of the
1336421ee45722da418b8ab99d7e6358e4f86b9f1eCristy * Software.
1436421ee45722da418b8ab99d7e6358e4f86b9f1eCristy *
1536421ee45722da418b8ab99d7e6358e4f86b9f1eCristy * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
1636421ee45722da418b8ab99d7e6358e4f86b9f1eCristy * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
1736421ee45722da418b8ab99d7e6358e4f86b9f1eCristy * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL
1836421ee45722da418b8ab99d7e6358e4f86b9f1eCristy * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
1936421ee45722da418b8ab99d7e6358e4f86b9f1eCristy * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
2036421ee45722da418b8ab99d7e6358e4f86b9f1eCristy * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
2136421ee45722da418b8ab99d7e6358e4f86b9f1eCristy * DEALINGS IN THE SOFTWARE.
227ce65e7125a4e1df1a274ce373c537a9df9c16cdCristy */
2336421ee45722da418b8ab99d7e6358e4f86b9f1eCristy#include <stdio.h>
2436421ee45722da418b8ab99d7e6358e4f86b9f1eCristy#include <stdarg.h>
25882d9f4ab22246b0110b960e923614ae9c53702aCristy#include <string.h>
26882d9f4ab22246b0110b960e923614ae9c53702aCristy#include <assert.h>
27882d9f4ab22246b0110b960e923614ae9c53702aCristy
2836421ee45722da418b8ab99d7e6358e4f86b9f1eCristyextern "C" {
2936421ee45722da418b8ab99d7e6358e4f86b9f1eCristy#include <talloc.h>
3036421ee45722da418b8ab99d7e6358e4f86b9f1eCristy#include "main/core.h" /* for struct __GLcontextRec */
3136421ee45722da418b8ab99d7e6358e4f86b9f1eCristy}
3236421ee45722da418b8ab99d7e6358e4f86b9f1eCristy
33882d9f4ab22246b0110b960e923614ae9c53702aCristy#include "ast.h"
3436421ee45722da418b8ab99d7e6358e4f86b9f1eCristy#include "glsl_parser_extras.h"
3536421ee45722da418b8ab99d7e6358e4f86b9f1eCristy#include "glsl_parser.h"
3636421ee45722da418b8ab99d7e6358e4f86b9f1eCristy#include "ir_optimization.h"
3736421ee45722da418b8ab99d7e6358e4f86b9f1eCristy#include "loop_analysis.h"
3836421ee45722da418b8ab99d7e6358e4f86b9f1eCristy
39882d9f4ab22246b0110b960e923614ae9c53702aCristy_mesa_glsl_parse_state::_mesa_glsl_parse_state(struct __GLcontextRec *ctx,
4036421ee45722da418b8ab99d7e6358e4f86b9f1eCristy					       GLenum target, void *mem_ctx)
4136421ee45722da418b8ab99d7e6358e4f86b9f1eCristy{
4236421ee45722da418b8ab99d7e6358e4f86b9f1eCristy   switch (target) {
4336421ee45722da418b8ab99d7e6358e4f86b9f1eCristy   case GL_VERTEX_SHADER:   this->target = vertex_shader; break;
4436421ee45722da418b8ab99d7e6358e4f86b9f1eCristy   case GL_FRAGMENT_SHADER: this->target = fragment_shader; break;
4536421ee45722da418b8ab99d7e6358e4f86b9f1eCristy   case GL_GEOMETRY_SHADER: this->target = geometry_shader; break;
4636421ee45722da418b8ab99d7e6358e4f86b9f1eCristy   }
4736421ee45722da418b8ab99d7e6358e4f86b9f1eCristy
4836421ee45722da418b8ab99d7e6358e4f86b9f1eCristy   this->scanner = NULL;
4936421ee45722da418b8ab99d7e6358e4f86b9f1eCristy   this->translation_unit.make_empty();
5036421ee45722da418b8ab99d7e6358e4f86b9f1eCristy   this->symbols = new(mem_ctx) glsl_symbol_table;
5136421ee45722da418b8ab99d7e6358e4f86b9f1eCristy   this->info_log = talloc_strdup(mem_ctx, "");
5236421ee45722da418b8ab99d7e6358e4f86b9f1eCristy   this->error = false;
5336421ee45722da418b8ab99d7e6358e4f86b9f1eCristy   this->loop_or_switch_nesting = NULL;
5436421ee45722da418b8ab99d7e6358e4f86b9f1eCristy
5536421ee45722da418b8ab99d7e6358e4f86b9f1eCristy   /* Set default language version and extensions */
5636421ee45722da418b8ab99d7e6358e4f86b9f1eCristy   this->language_version = 110;
5736421ee45722da418b8ab99d7e6358e4f86b9f1eCristy   this->es_shader = false;
5836421ee45722da418b8ab99d7e6358e4f86b9f1eCristy   this->ARB_texture_rectangle_enable = true;
5936421ee45722da418b8ab99d7e6358e4f86b9f1eCristy
6036421ee45722da418b8ab99d7e6358e4f86b9f1eCristy   /* OpenGL ES 2.0 has different defaults from desktop GL. */
6136421ee45722da418b8ab99d7e6358e4f86b9f1eCristy   if (ctx->API == API_OPENGLES2) {
6236421ee45722da418b8ab99d7e6358e4f86b9f1eCristy      this->language_version = 100;
6336421ee45722da418b8ab99d7e6358e4f86b9f1eCristy      this->es_shader = true;
6436421ee45722da418b8ab99d7e6358e4f86b9f1eCristy      this->ARB_texture_rectangle_enable = false;
6536421ee45722da418b8ab99d7e6358e4f86b9f1eCristy   }
6636421ee45722da418b8ab99d7e6358e4f86b9f1eCristy
6736421ee45722da418b8ab99d7e6358e4f86b9f1eCristy   this->extensions = &ctx->Extensions;
6836421ee45722da418b8ab99d7e6358e4f86b9f1eCristy
6936421ee45722da418b8ab99d7e6358e4f86b9f1eCristy   this->Const.MaxLights = ctx->Const.MaxLights;
7036421ee45722da418b8ab99d7e6358e4f86b9f1eCristy   this->Const.MaxClipPlanes = ctx->Const.MaxClipPlanes;
7136421ee45722da418b8ab99d7e6358e4f86b9f1eCristy   this->Const.MaxTextureUnits = ctx->Const.MaxTextureUnits;
7236421ee45722da418b8ab99d7e6358e4f86b9f1eCristy   this->Const.MaxTextureCoords = ctx->Const.MaxTextureCoordUnits;
7336421ee45722da418b8ab99d7e6358e4f86b9f1eCristy   this->Const.MaxVertexAttribs = ctx->Const.VertexProgram.MaxAttribs;
7436421ee45722da418b8ab99d7e6358e4f86b9f1eCristy   this->Const.MaxVertexUniformComponents = ctx->Const.VertexProgram.MaxUniformComponents;
7536421ee45722da418b8ab99d7e6358e4f86b9f1eCristy   this->Const.MaxVaryingFloats = ctx->Const.MaxVarying * 4;
7636421ee45722da418b8ab99d7e6358e4f86b9f1eCristy   this->Const.MaxVertexTextureImageUnits = ctx->Const.MaxVertexTextureImageUnits;
7736421ee45722da418b8ab99d7e6358e4f86b9f1eCristy   this->Const.MaxCombinedTextureImageUnits = ctx->Const.MaxCombinedTextureImageUnits;
7836421ee45722da418b8ab99d7e6358e4f86b9f1eCristy   this->Const.MaxTextureImageUnits = ctx->Const.MaxTextureImageUnits;
7936421ee45722da418b8ab99d7e6358e4f86b9f1eCristy   this->Const.MaxFragmentUniformComponents = ctx->Const.FragmentProgram.MaxUniformComponents;
8036421ee45722da418b8ab99d7e6358e4f86b9f1eCristy
8136421ee45722da418b8ab99d7e6358e4f86b9f1eCristy   this->Const.MaxDrawBuffers = ctx->Const.MaxDrawBuffers;
8236421ee45722da418b8ab99d7e6358e4f86b9f1eCristy}
8336421ee45722da418b8ab99d7e6358e4f86b9f1eCristy
8436421ee45722da418b8ab99d7e6358e4f86b9f1eCristyconst char *
8536421ee45722da418b8ab99d7e6358e4f86b9f1eCristy_mesa_glsl_shader_target_name(enum _mesa_glsl_parser_targets target)
8636421ee45722da418b8ab99d7e6358e4f86b9f1eCristy{
8736421ee45722da418b8ab99d7e6358e4f86b9f1eCristy   switch (target) {
8836421ee45722da418b8ab99d7e6358e4f86b9f1eCristy   case vertex_shader:   return "vertex";
8936421ee45722da418b8ab99d7e6358e4f86b9f1eCristy   case fragment_shader: return "fragment";
9036421ee45722da418b8ab99d7e6358e4f86b9f1eCristy   case geometry_shader: return "geometry";
9136421ee45722da418b8ab99d7e6358e4f86b9f1eCristy   case ir_shader:       break;
9236421ee45722da418b8ab99d7e6358e4f86b9f1eCristy   }
9336421ee45722da418b8ab99d7e6358e4f86b9f1eCristy
9436421ee45722da418b8ab99d7e6358e4f86b9f1eCristy   assert(!"Should not get here.");
9536421ee45722da418b8ab99d7e6358e4f86b9f1eCristy   return "unknown";
9636421ee45722da418b8ab99d7e6358e4f86b9f1eCristy}
9736421ee45722da418b8ab99d7e6358e4f86b9f1eCristy
9836421ee45722da418b8ab99d7e6358e4f86b9f1eCristy
9936421ee45722da418b8ab99d7e6358e4f86b9f1eCristyvoid
10036421ee45722da418b8ab99d7e6358e4f86b9f1eCristy_mesa_glsl_error(YYLTYPE *locp, _mesa_glsl_parse_state *state,
10136421ee45722da418b8ab99d7e6358e4f86b9f1eCristy		 const char *fmt, ...)
10236421ee45722da418b8ab99d7e6358e4f86b9f1eCristy{
10336421ee45722da418b8ab99d7e6358e4f86b9f1eCristy   va_list ap;
10436421ee45722da418b8ab99d7e6358e4f86b9f1eCristy
10536421ee45722da418b8ab99d7e6358e4f86b9f1eCristy   state->error = true;
10636421ee45722da418b8ab99d7e6358e4f86b9f1eCristy
10736421ee45722da418b8ab99d7e6358e4f86b9f1eCristy   assert(state->info_log != NULL);
10836421ee45722da418b8ab99d7e6358e4f86b9f1eCristy   state->info_log = talloc_asprintf_append(state->info_log,
10936421ee45722da418b8ab99d7e6358e4f86b9f1eCristy					    "%u:%u(%u): error: ",
11036421ee45722da418b8ab99d7e6358e4f86b9f1eCristy					    locp->source,
11136421ee45722da418b8ab99d7e6358e4f86b9f1eCristy					    locp->first_line,
11236421ee45722da418b8ab99d7e6358e4f86b9f1eCristy					    locp->first_column);
11336421ee45722da418b8ab99d7e6358e4f86b9f1eCristy   va_start(ap, fmt);
11436421ee45722da418b8ab99d7e6358e4f86b9f1eCristy   state->info_log = talloc_vasprintf_append(state->info_log, fmt, ap);
11536421ee45722da418b8ab99d7e6358e4f86b9f1eCristy   va_end(ap);
11636421ee45722da418b8ab99d7e6358e4f86b9f1eCristy   state->info_log = talloc_strdup_append(state->info_log, "\n");
11736421ee45722da418b8ab99d7e6358e4f86b9f1eCristy}
11836421ee45722da418b8ab99d7e6358e4f86b9f1eCristy
11936421ee45722da418b8ab99d7e6358e4f86b9f1eCristy
12036421ee45722da418b8ab99d7e6358e4f86b9f1eCristyvoid
12136421ee45722da418b8ab99d7e6358e4f86b9f1eCristy_mesa_glsl_warning(const YYLTYPE *locp, _mesa_glsl_parse_state *state,
12236421ee45722da418b8ab99d7e6358e4f86b9f1eCristy		   const char *fmt, ...)
12336421ee45722da418b8ab99d7e6358e4f86b9f1eCristy{
12436421ee45722da418b8ab99d7e6358e4f86b9f1eCristy   va_list ap;
12536421ee45722da418b8ab99d7e6358e4f86b9f1eCristy
12636421ee45722da418b8ab99d7e6358e4f86b9f1eCristy   assert(state->info_log != NULL);
12736421ee45722da418b8ab99d7e6358e4f86b9f1eCristy   state->info_log = talloc_asprintf_append(state->info_log,
12836421ee45722da418b8ab99d7e6358e4f86b9f1eCristy					    "%u:%u(%u): warning: ",
12936421ee45722da418b8ab99d7e6358e4f86b9f1eCristy					    locp->source,
13036421ee45722da418b8ab99d7e6358e4f86b9f1eCristy					    locp->first_line,
13136421ee45722da418b8ab99d7e6358e4f86b9f1eCristy					    locp->first_column);
13236421ee45722da418b8ab99d7e6358e4f86b9f1eCristy   va_start(ap, fmt);
13336421ee45722da418b8ab99d7e6358e4f86b9f1eCristy   state->info_log = talloc_vasprintf_append(state->info_log, fmt, ap);
13436421ee45722da418b8ab99d7e6358e4f86b9f1eCristy   va_end(ap);
13536421ee45722da418b8ab99d7e6358e4f86b9f1eCristy   state->info_log = talloc_strdup_append(state->info_log, "\n");
13636421ee45722da418b8ab99d7e6358e4f86b9f1eCristy}
13736421ee45722da418b8ab99d7e6358e4f86b9f1eCristy
13836421ee45722da418b8ab99d7e6358e4f86b9f1eCristy
13936421ee45722da418b8ab99d7e6358e4f86b9f1eCristybool
14036421ee45722da418b8ab99d7e6358e4f86b9f1eCristy_mesa_glsl_process_extension(const char *name, YYLTYPE *name_locp,
14136421ee45722da418b8ab99d7e6358e4f86b9f1eCristy			     const char *behavior, YYLTYPE *behavior_locp,
14236421ee45722da418b8ab99d7e6358e4f86b9f1eCristy			     _mesa_glsl_parse_state *state)
14336421ee45722da418b8ab99d7e6358e4f86b9f1eCristy{
14436421ee45722da418b8ab99d7e6358e4f86b9f1eCristy   enum {
14536421ee45722da418b8ab99d7e6358e4f86b9f1eCristy      extension_disable,
14636421ee45722da418b8ab99d7e6358e4f86b9f1eCristy      extension_enable,
14736421ee45722da418b8ab99d7e6358e4f86b9f1eCristy      extension_require,
14836421ee45722da418b8ab99d7e6358e4f86b9f1eCristy      extension_warn
14936421ee45722da418b8ab99d7e6358e4f86b9f1eCristy   } ext_mode;
15036421ee45722da418b8ab99d7e6358e4f86b9f1eCristy
15136421ee45722da418b8ab99d7e6358e4f86b9f1eCristy   if (strcmp(behavior, "warn") == 0) {
15236421ee45722da418b8ab99d7e6358e4f86b9f1eCristy      ext_mode = extension_warn;
15336421ee45722da418b8ab99d7e6358e4f86b9f1eCristy   } else if (strcmp(behavior, "require") == 0) {
15436421ee45722da418b8ab99d7e6358e4f86b9f1eCristy      ext_mode = extension_require;
15536421ee45722da418b8ab99d7e6358e4f86b9f1eCristy   } else if (strcmp(behavior, "enable") == 0) {
15636421ee45722da418b8ab99d7e6358e4f86b9f1eCristy      ext_mode = extension_enable;
15736421ee45722da418b8ab99d7e6358e4f86b9f1eCristy   } else if (strcmp(behavior, "disable") == 0) {
15836421ee45722da418b8ab99d7e6358e4f86b9f1eCristy      ext_mode = extension_disable;
15936421ee45722da418b8ab99d7e6358e4f86b9f1eCristy   } else {
16036421ee45722da418b8ab99d7e6358e4f86b9f1eCristy      _mesa_glsl_error(behavior_locp, state,
16136421ee45722da418b8ab99d7e6358e4f86b9f1eCristy		       "Unknown extension behavior `%s'",
16236421ee45722da418b8ab99d7e6358e4f86b9f1eCristy		       behavior);
16336421ee45722da418b8ab99d7e6358e4f86b9f1eCristy      return false;
16436421ee45722da418b8ab99d7e6358e4f86b9f1eCristy   }
16536421ee45722da418b8ab99d7e6358e4f86b9f1eCristy
16636421ee45722da418b8ab99d7e6358e4f86b9f1eCristy   bool unsupported = false;
16736421ee45722da418b8ab99d7e6358e4f86b9f1eCristy
16836421ee45722da418b8ab99d7e6358e4f86b9f1eCristy   if (strcmp(name, "all") == 0) {
16936421ee45722da418b8ab99d7e6358e4f86b9f1eCristy      if ((ext_mode == extension_enable) || (ext_mode == extension_require)) {
17036421ee45722da418b8ab99d7e6358e4f86b9f1eCristy	 _mesa_glsl_error(name_locp, state, "Cannot %s all extensions",
17136421ee45722da418b8ab99d7e6358e4f86b9f1eCristy			  (ext_mode == extension_enable)
17236421ee45722da418b8ab99d7e6358e4f86b9f1eCristy			  ? "enable" : "require");
17336421ee45722da418b8ab99d7e6358e4f86b9f1eCristy	 return false;
17436421ee45722da418b8ab99d7e6358e4f86b9f1eCristy      }
17536421ee45722da418b8ab99d7e6358e4f86b9f1eCristy   } else if (strcmp(name, "GL_ARB_draw_buffers") == 0) {
17636421ee45722da418b8ab99d7e6358e4f86b9f1eCristy      /* This extension is only supported in fragment shaders.
17736421ee45722da418b8ab99d7e6358e4f86b9f1eCristy       */
17836421ee45722da418b8ab99d7e6358e4f86b9f1eCristy      if (state->target != fragment_shader) {
17936421ee45722da418b8ab99d7e6358e4f86b9f1eCristy	 unsupported = true;
18036421ee45722da418b8ab99d7e6358e4f86b9f1eCristy      } else {
18136421ee45722da418b8ab99d7e6358e4f86b9f1eCristy	 state->ARB_draw_buffers_enable = (ext_mode != extension_disable);
18236421ee45722da418b8ab99d7e6358e4f86b9f1eCristy	 state->ARB_draw_buffers_warn = (ext_mode == extension_warn);
18336421ee45722da418b8ab99d7e6358e4f86b9f1eCristy      }
18436421ee45722da418b8ab99d7e6358e4f86b9f1eCristy   } else if (strcmp(name, "GL_ARB_fragment_coord_conventions") == 0) {
18536421ee45722da418b8ab99d7e6358e4f86b9f1eCristy      state->ARB_fragment_coord_conventions_enable =
18636421ee45722da418b8ab99d7e6358e4f86b9f1eCristy	 (ext_mode != extension_disable);
18736421ee45722da418b8ab99d7e6358e4f86b9f1eCristy      state->ARB_fragment_coord_conventions_warn =
18836421ee45722da418b8ab99d7e6358e4f86b9f1eCristy	 (ext_mode == extension_warn);
18936421ee45722da418b8ab99d7e6358e4f86b9f1eCristy
19036421ee45722da418b8ab99d7e6358e4f86b9f1eCristy      unsupported = !state->extensions->ARB_fragment_coord_conventions;
19136421ee45722da418b8ab99d7e6358e4f86b9f1eCristy   } else if (strcmp(name, "GL_ARB_texture_rectangle") == 0) {
19236421ee45722da418b8ab99d7e6358e4f86b9f1eCristy      state->ARB_texture_rectangle_enable = (ext_mode != extension_disable);
19336421ee45722da418b8ab99d7e6358e4f86b9f1eCristy      state->ARB_texture_rectangle_warn = (ext_mode == extension_warn);
19436421ee45722da418b8ab99d7e6358e4f86b9f1eCristy   } else if (strcmp(name, "GL_EXT_texture_array") == 0) {
19536421ee45722da418b8ab99d7e6358e4f86b9f1eCristy      state->EXT_texture_array_enable = (ext_mode != extension_disable);
19636421ee45722da418b8ab99d7e6358e4f86b9f1eCristy      state->EXT_texture_array_warn = (ext_mode == extension_warn);
19736421ee45722da418b8ab99d7e6358e4f86b9f1eCristy
19836421ee45722da418b8ab99d7e6358e4f86b9f1eCristy      unsupported = !state->extensions->EXT_texture_array;
19936421ee45722da418b8ab99d7e6358e4f86b9f1eCristy   } else {
20036421ee45722da418b8ab99d7e6358e4f86b9f1eCristy      unsupported = true;
20136421ee45722da418b8ab99d7e6358e4f86b9f1eCristy   }
20236421ee45722da418b8ab99d7e6358e4f86b9f1eCristy
20336421ee45722da418b8ab99d7e6358e4f86b9f1eCristy   if (unsupported) {
20436421ee45722da418b8ab99d7e6358e4f86b9f1eCristy      static const char *const fmt = "extension `%s' unsupported in %s shader";
20536421ee45722da418b8ab99d7e6358e4f86b9f1eCristy
20636421ee45722da418b8ab99d7e6358e4f86b9f1eCristy      if (ext_mode == extension_require) {
20736421ee45722da418b8ab99d7e6358e4f86b9f1eCristy	 _mesa_glsl_error(name_locp, state, fmt,
20836421ee45722da418b8ab99d7e6358e4f86b9f1eCristy			  name, _mesa_glsl_shader_target_name(state->target));
20936421ee45722da418b8ab99d7e6358e4f86b9f1eCristy	 return false;
21036421ee45722da418b8ab99d7e6358e4f86b9f1eCristy      } else {
21136421ee45722da418b8ab99d7e6358e4f86b9f1eCristy	 _mesa_glsl_warning(name_locp, state, fmt,
21236421ee45722da418b8ab99d7e6358e4f86b9f1eCristy			    name, _mesa_glsl_shader_target_name(state->target));
21336421ee45722da418b8ab99d7e6358e4f86b9f1eCristy      }
21436421ee45722da418b8ab99d7e6358e4f86b9f1eCristy   }
21536421ee45722da418b8ab99d7e6358e4f86b9f1eCristy
21636421ee45722da418b8ab99d7e6358e4f86b9f1eCristy   return true;
21736421ee45722da418b8ab99d7e6358e4f86b9f1eCristy}
21836421ee45722da418b8ab99d7e6358e4f86b9f1eCristy
21936421ee45722da418b8ab99d7e6358e4f86b9f1eCristyvoid
22036421ee45722da418b8ab99d7e6358e4f86b9f1eCristy_mesa_ast_type_qualifier_print(const struct ast_type_qualifier *q)
22136421ee45722da418b8ab99d7e6358e4f86b9f1eCristy{
22236421ee45722da418b8ab99d7e6358e4f86b9f1eCristy   if (q->flags.q.constant)
22336421ee45722da418b8ab99d7e6358e4f86b9f1eCristy      printf("const ");
22436421ee45722da418b8ab99d7e6358e4f86b9f1eCristy
22536421ee45722da418b8ab99d7e6358e4f86b9f1eCristy   if (q->flags.q.invariant)
22636421ee45722da418b8ab99d7e6358e4f86b9f1eCristy      printf("invariant ");
22736421ee45722da418b8ab99d7e6358e4f86b9f1eCristy
22836421ee45722da418b8ab99d7e6358e4f86b9f1eCristy   if (q->flags.q.attribute)
22936421ee45722da418b8ab99d7e6358e4f86b9f1eCristy      printf("attribute ");
23036421ee45722da418b8ab99d7e6358e4f86b9f1eCristy
23136421ee45722da418b8ab99d7e6358e4f86b9f1eCristy   if (q->flags.q.varying)
23236421ee45722da418b8ab99d7e6358e4f86b9f1eCristy      printf("varying ");
23336421ee45722da418b8ab99d7e6358e4f86b9f1eCristy
23436421ee45722da418b8ab99d7e6358e4f86b9f1eCristy   if (q->flags.q.in && q->flags.q.out)
23536421ee45722da418b8ab99d7e6358e4f86b9f1eCristy      printf("inout ");
23636421ee45722da418b8ab99d7e6358e4f86b9f1eCristy   else {
23736421ee45722da418b8ab99d7e6358e4f86b9f1eCristy      if (q->flags.q.in)
23836421ee45722da418b8ab99d7e6358e4f86b9f1eCristy	 printf("in ");
23936421ee45722da418b8ab99d7e6358e4f86b9f1eCristy
24036421ee45722da418b8ab99d7e6358e4f86b9f1eCristy      if (q->flags.q.out)
24136421ee45722da418b8ab99d7e6358e4f86b9f1eCristy	 printf("out ");
24236421ee45722da418b8ab99d7e6358e4f86b9f1eCristy   }
24336421ee45722da418b8ab99d7e6358e4f86b9f1eCristy
24436421ee45722da418b8ab99d7e6358e4f86b9f1eCristy   if (q->flags.q.centroid)
24536421ee45722da418b8ab99d7e6358e4f86b9f1eCristy      printf("centroid ");
24636421ee45722da418b8ab99d7e6358e4f86b9f1eCristy   if (q->flags.q.uniform)
24736421ee45722da418b8ab99d7e6358e4f86b9f1eCristy      printf("uniform ");
24836421ee45722da418b8ab99d7e6358e4f86b9f1eCristy   if (q->flags.q.smooth)
24936421ee45722da418b8ab99d7e6358e4f86b9f1eCristy      printf("smooth ");
25036421ee45722da418b8ab99d7e6358e4f86b9f1eCristy   if (q->flags.q.flat)
25136421ee45722da418b8ab99d7e6358e4f86b9f1eCristy      printf("flat ");
25236421ee45722da418b8ab99d7e6358e4f86b9f1eCristy   if (q->flags.q.noperspective)
25336421ee45722da418b8ab99d7e6358e4f86b9f1eCristy      printf("noperspective ");
25436421ee45722da418b8ab99d7e6358e4f86b9f1eCristy}
25536421ee45722da418b8ab99d7e6358e4f86b9f1eCristy
25636421ee45722da418b8ab99d7e6358e4f86b9f1eCristy
25736421ee45722da418b8ab99d7e6358e4f86b9f1eCristyvoid
25836421ee45722da418b8ab99d7e6358e4f86b9f1eCristyast_node::print(void) const
25936421ee45722da418b8ab99d7e6358e4f86b9f1eCristy{
26036421ee45722da418b8ab99d7e6358e4f86b9f1eCristy   printf("unhandled node ");
26136421ee45722da418b8ab99d7e6358e4f86b9f1eCristy}
26236421ee45722da418b8ab99d7e6358e4f86b9f1eCristy
26336421ee45722da418b8ab99d7e6358e4f86b9f1eCristy
26436421ee45722da418b8ab99d7e6358e4f86b9f1eCristyast_node::ast_node(void)
26536421ee45722da418b8ab99d7e6358e4f86b9f1eCristy{
26636421ee45722da418b8ab99d7e6358e4f86b9f1eCristy   this->location.source = 0;
26736421ee45722da418b8ab99d7e6358e4f86b9f1eCristy   this->location.line = 0;
26836421ee45722da418b8ab99d7e6358e4f86b9f1eCristy   this->location.column = 0;
26936421ee45722da418b8ab99d7e6358e4f86b9f1eCristy}
27036421ee45722da418b8ab99d7e6358e4f86b9f1eCristy
27136421ee45722da418b8ab99d7e6358e4f86b9f1eCristy
27236421ee45722da418b8ab99d7e6358e4f86b9f1eCristystatic void
27336421ee45722da418b8ab99d7e6358e4f86b9f1eCristyast_opt_array_size_print(bool is_array, const ast_expression *array_size)
27436421ee45722da418b8ab99d7e6358e4f86b9f1eCristy{
27536421ee45722da418b8ab99d7e6358e4f86b9f1eCristy   if (is_array) {
27636421ee45722da418b8ab99d7e6358e4f86b9f1eCristy      printf("[ ");
27736421ee45722da418b8ab99d7e6358e4f86b9f1eCristy
27836421ee45722da418b8ab99d7e6358e4f86b9f1eCristy      if (array_size)
27936421ee45722da418b8ab99d7e6358e4f86b9f1eCristy	 array_size->print();
28036421ee45722da418b8ab99d7e6358e4f86b9f1eCristy
28136421ee45722da418b8ab99d7e6358e4f86b9f1eCristy      printf("] ");
28236421ee45722da418b8ab99d7e6358e4f86b9f1eCristy   }
28336421ee45722da418b8ab99d7e6358e4f86b9f1eCristy}
28436421ee45722da418b8ab99d7e6358e4f86b9f1eCristy
28536421ee45722da418b8ab99d7e6358e4f86b9f1eCristy
28636421ee45722da418b8ab99d7e6358e4f86b9f1eCristyvoid
28736421ee45722da418b8ab99d7e6358e4f86b9f1eCristyast_compound_statement::print(void) const
28836421ee45722da418b8ab99d7e6358e4f86b9f1eCristy{
28936421ee45722da418b8ab99d7e6358e4f86b9f1eCristy   printf("{\n");
29036421ee45722da418b8ab99d7e6358e4f86b9f1eCristy
29136421ee45722da418b8ab99d7e6358e4f86b9f1eCristy   foreach_list_const(n, &this->statements) {
29236421ee45722da418b8ab99d7e6358e4f86b9f1eCristy      ast_node *ast = exec_node_data(ast_node, n, link);
29336421ee45722da418b8ab99d7e6358e4f86b9f1eCristy      ast->print();
29436421ee45722da418b8ab99d7e6358e4f86b9f1eCristy   }
29536421ee45722da418b8ab99d7e6358e4f86b9f1eCristy
29636421ee45722da418b8ab99d7e6358e4f86b9f1eCristy   printf("}\n");
29736421ee45722da418b8ab99d7e6358e4f86b9f1eCristy}
29836421ee45722da418b8ab99d7e6358e4f86b9f1eCristy
29936421ee45722da418b8ab99d7e6358e4f86b9f1eCristy
30036421ee45722da418b8ab99d7e6358e4f86b9f1eCristyast_compound_statement::ast_compound_statement(int new_scope,
30136421ee45722da418b8ab99d7e6358e4f86b9f1eCristy					       ast_node *statements)
30236421ee45722da418b8ab99d7e6358e4f86b9f1eCristy{
30336421ee45722da418b8ab99d7e6358e4f86b9f1eCristy   this->new_scope = new_scope;
30436421ee45722da418b8ab99d7e6358e4f86b9f1eCristy
30536421ee45722da418b8ab99d7e6358e4f86b9f1eCristy   if (statements != NULL) {
30636421ee45722da418b8ab99d7e6358e4f86b9f1eCristy      this->statements.push_degenerate_list_at_head(&statements->link);
30736421ee45722da418b8ab99d7e6358e4f86b9f1eCristy   }
30836421ee45722da418b8ab99d7e6358e4f86b9f1eCristy}
30936421ee45722da418b8ab99d7e6358e4f86b9f1eCristy
31036421ee45722da418b8ab99d7e6358e4f86b9f1eCristy
31136421ee45722da418b8ab99d7e6358e4f86b9f1eCristyvoid
31236421ee45722da418b8ab99d7e6358e4f86b9f1eCristyast_expression::print(void) const
31336421ee45722da418b8ab99d7e6358e4f86b9f1eCristy{
31436421ee45722da418b8ab99d7e6358e4f86b9f1eCristy   switch (oper) {
31536421ee45722da418b8ab99d7e6358e4f86b9f1eCristy   case ast_assign:
31636421ee45722da418b8ab99d7e6358e4f86b9f1eCristy   case ast_mul_assign:
31736421ee45722da418b8ab99d7e6358e4f86b9f1eCristy   case ast_div_assign:
31836421ee45722da418b8ab99d7e6358e4f86b9f1eCristy   case ast_mod_assign:
31936421ee45722da418b8ab99d7e6358e4f86b9f1eCristy   case ast_add_assign:
32036421ee45722da418b8ab99d7e6358e4f86b9f1eCristy   case ast_sub_assign:
32136421ee45722da418b8ab99d7e6358e4f86b9f1eCristy   case ast_ls_assign:
32236421ee45722da418b8ab99d7e6358e4f86b9f1eCristy   case ast_rs_assign:
32336421ee45722da418b8ab99d7e6358e4f86b9f1eCristy   case ast_and_assign:
32436421ee45722da418b8ab99d7e6358e4f86b9f1eCristy   case ast_xor_assign:
32536421ee45722da418b8ab99d7e6358e4f86b9f1eCristy   case ast_or_assign:
32636421ee45722da418b8ab99d7e6358e4f86b9f1eCristy      subexpressions[0]->print();
32736421ee45722da418b8ab99d7e6358e4f86b9f1eCristy      printf("%s ", operator_string(oper));
32836421ee45722da418b8ab99d7e6358e4f86b9f1eCristy      subexpressions[1]->print();
32936421ee45722da418b8ab99d7e6358e4f86b9f1eCristy      break;
33036421ee45722da418b8ab99d7e6358e4f86b9f1eCristy
33136421ee45722da418b8ab99d7e6358e4f86b9f1eCristy   case ast_field_selection:
33236421ee45722da418b8ab99d7e6358e4f86b9f1eCristy      subexpressions[0]->print();
33336421ee45722da418b8ab99d7e6358e4f86b9f1eCristy      printf(". %s ", primary_expression.identifier);
33436421ee45722da418b8ab99d7e6358e4f86b9f1eCristy      break;
33536421ee45722da418b8ab99d7e6358e4f86b9f1eCristy
33636421ee45722da418b8ab99d7e6358e4f86b9f1eCristy   case ast_plus:
33736421ee45722da418b8ab99d7e6358e4f86b9f1eCristy   case ast_neg:
33836421ee45722da418b8ab99d7e6358e4f86b9f1eCristy   case ast_bit_not:
33936421ee45722da418b8ab99d7e6358e4f86b9f1eCristy   case ast_logic_not:
34036421ee45722da418b8ab99d7e6358e4f86b9f1eCristy   case ast_pre_inc:
34136421ee45722da418b8ab99d7e6358e4f86b9f1eCristy   case ast_pre_dec:
34236421ee45722da418b8ab99d7e6358e4f86b9f1eCristy      printf("%s ", operator_string(oper));
34336421ee45722da418b8ab99d7e6358e4f86b9f1eCristy      subexpressions[0]->print();
34436421ee45722da418b8ab99d7e6358e4f86b9f1eCristy      break;
34536421ee45722da418b8ab99d7e6358e4f86b9f1eCristy
34636421ee45722da418b8ab99d7e6358e4f86b9f1eCristy   case ast_post_inc:
34736421ee45722da418b8ab99d7e6358e4f86b9f1eCristy   case ast_post_dec:
34836421ee45722da418b8ab99d7e6358e4f86b9f1eCristy      subexpressions[0]->print();
34936421ee45722da418b8ab99d7e6358e4f86b9f1eCristy      printf("%s ", operator_string(oper));
35036421ee45722da418b8ab99d7e6358e4f86b9f1eCristy      break;
35136421ee45722da418b8ab99d7e6358e4f86b9f1eCristy
35236421ee45722da418b8ab99d7e6358e4f86b9f1eCristy   case ast_conditional:
35336421ee45722da418b8ab99d7e6358e4f86b9f1eCristy      subexpressions[0]->print();
35436421ee45722da418b8ab99d7e6358e4f86b9f1eCristy      printf("? ");
35536421ee45722da418b8ab99d7e6358e4f86b9f1eCristy      subexpressions[1]->print();
35636421ee45722da418b8ab99d7e6358e4f86b9f1eCristy      printf(": ");
35736421ee45722da418b8ab99d7e6358e4f86b9f1eCristy      subexpressions[1]->print();
35836421ee45722da418b8ab99d7e6358e4f86b9f1eCristy      break;
35936421ee45722da418b8ab99d7e6358e4f86b9f1eCristy
36036421ee45722da418b8ab99d7e6358e4f86b9f1eCristy   case ast_array_index:
36136421ee45722da418b8ab99d7e6358e4f86b9f1eCristy      subexpressions[0]->print();
36236421ee45722da418b8ab99d7e6358e4f86b9f1eCristy      printf("[ ");
36336421ee45722da418b8ab99d7e6358e4f86b9f1eCristy      subexpressions[1]->print();
36436421ee45722da418b8ab99d7e6358e4f86b9f1eCristy      printf("] ");
36536421ee45722da418b8ab99d7e6358e4f86b9f1eCristy      break;
36636421ee45722da418b8ab99d7e6358e4f86b9f1eCristy
36736421ee45722da418b8ab99d7e6358e4f86b9f1eCristy   case ast_function_call: {
36836421ee45722da418b8ab99d7e6358e4f86b9f1eCristy      subexpressions[0]->print();
36936421ee45722da418b8ab99d7e6358e4f86b9f1eCristy      printf("( ");
37036421ee45722da418b8ab99d7e6358e4f86b9f1eCristy
37136421ee45722da418b8ab99d7e6358e4f86b9f1eCristy      foreach_list_const (n, &this->expressions) {
372882d9f4ab22246b0110b960e923614ae9c53702aCristy	 if (n != this->expressions.get_head())
37336421ee45722da418b8ab99d7e6358e4f86b9f1eCristy	    printf(", ");
37436421ee45722da418b8ab99d7e6358e4f86b9f1eCristy
37536421ee45722da418b8ab99d7e6358e4f86b9f1eCristy	 ast_node *ast = exec_node_data(ast_node, n, link);
37636421ee45722da418b8ab99d7e6358e4f86b9f1eCristy	 ast->print();
37736421ee45722da418b8ab99d7e6358e4f86b9f1eCristy      }
37836421ee45722da418b8ab99d7e6358e4f86b9f1eCristy
37936421ee45722da418b8ab99d7e6358e4f86b9f1eCristy      printf(") ");
38036421ee45722da418b8ab99d7e6358e4f86b9f1eCristy      break;
38136421ee45722da418b8ab99d7e6358e4f86b9f1eCristy   }
38236421ee45722da418b8ab99d7e6358e4f86b9f1eCristy
38336421ee45722da418b8ab99d7e6358e4f86b9f1eCristy   case ast_identifier:
38436421ee45722da418b8ab99d7e6358e4f86b9f1eCristy      printf("%s ", primary_expression.identifier);
38536421ee45722da418b8ab99d7e6358e4f86b9f1eCristy      break;
38636421ee45722da418b8ab99d7e6358e4f86b9f1eCristy
38736421ee45722da418b8ab99d7e6358e4f86b9f1eCristy   case ast_int_constant:
38836421ee45722da418b8ab99d7e6358e4f86b9f1eCristy      printf("%d ", primary_expression.int_constant);
38936421ee45722da418b8ab99d7e6358e4f86b9f1eCristy      break;
39036421ee45722da418b8ab99d7e6358e4f86b9f1eCristy
39136421ee45722da418b8ab99d7e6358e4f86b9f1eCristy   case ast_uint_constant:
39236421ee45722da418b8ab99d7e6358e4f86b9f1eCristy      printf("%u ", primary_expression.uint_constant);
39336421ee45722da418b8ab99d7e6358e4f86b9f1eCristy      break;
39436421ee45722da418b8ab99d7e6358e4f86b9f1eCristy
39536421ee45722da418b8ab99d7e6358e4f86b9f1eCristy   case ast_float_constant:
39636421ee45722da418b8ab99d7e6358e4f86b9f1eCristy      printf("%f ", primary_expression.float_constant);
39736421ee45722da418b8ab99d7e6358e4f86b9f1eCristy      break;
39836421ee45722da418b8ab99d7e6358e4f86b9f1eCristy
39936421ee45722da418b8ab99d7e6358e4f86b9f1eCristy   case ast_bool_constant:
40036421ee45722da418b8ab99d7e6358e4f86b9f1eCristy      printf("%s ",
40136421ee45722da418b8ab99d7e6358e4f86b9f1eCristy	     primary_expression.bool_constant
40236421ee45722da418b8ab99d7e6358e4f86b9f1eCristy	     ? "true" : "false");
40336421ee45722da418b8ab99d7e6358e4f86b9f1eCristy      break;
40436421ee45722da418b8ab99d7e6358e4f86b9f1eCristy
40536421ee45722da418b8ab99d7e6358e4f86b9f1eCristy   case ast_sequence: {
40636421ee45722da418b8ab99d7e6358e4f86b9f1eCristy      printf("( ");
40736421ee45722da418b8ab99d7e6358e4f86b9f1eCristy      foreach_list_const(n, & this->expressions) {
40836421ee45722da418b8ab99d7e6358e4f86b9f1eCristy	 if (n != this->expressions.get_head())
40936421ee45722da418b8ab99d7e6358e4f86b9f1eCristy	    printf(", ");
41036421ee45722da418b8ab99d7e6358e4f86b9f1eCristy
41136421ee45722da418b8ab99d7e6358e4f86b9f1eCristy	 ast_node *ast = exec_node_data(ast_node, n, link);
41236421ee45722da418b8ab99d7e6358e4f86b9f1eCristy	 ast->print();
41336421ee45722da418b8ab99d7e6358e4f86b9f1eCristy      }
41436421ee45722da418b8ab99d7e6358e4f86b9f1eCristy      printf(") ");
41536421ee45722da418b8ab99d7e6358e4f86b9f1eCristy      break;
41636421ee45722da418b8ab99d7e6358e4f86b9f1eCristy   }
41736421ee45722da418b8ab99d7e6358e4f86b9f1eCristy
41836421ee45722da418b8ab99d7e6358e4f86b9f1eCristy   default:
41936421ee45722da418b8ab99d7e6358e4f86b9f1eCristy      assert(0);
42036421ee45722da418b8ab99d7e6358e4f86b9f1eCristy      break;
42136421ee45722da418b8ab99d7e6358e4f86b9f1eCristy   }
42236421ee45722da418b8ab99d7e6358e4f86b9f1eCristy}
42336421ee45722da418b8ab99d7e6358e4f86b9f1eCristy
42436421ee45722da418b8ab99d7e6358e4f86b9f1eCristyast_expression::ast_expression(int oper,
42536421ee45722da418b8ab99d7e6358e4f86b9f1eCristy			       ast_expression *ex0,
42636421ee45722da418b8ab99d7e6358e4f86b9f1eCristy			       ast_expression *ex1,
42736421ee45722da418b8ab99d7e6358e4f86b9f1eCristy			       ast_expression *ex2)
42836421ee45722da418b8ab99d7e6358e4f86b9f1eCristy{
42936421ee45722da418b8ab99d7e6358e4f86b9f1eCristy   this->oper = ast_operators(oper);
43036421ee45722da418b8ab99d7e6358e4f86b9f1eCristy   this->subexpressions[0] = ex0;
43136421ee45722da418b8ab99d7e6358e4f86b9f1eCristy   this->subexpressions[1] = ex1;
43236421ee45722da418b8ab99d7e6358e4f86b9f1eCristy   this->subexpressions[2] = ex2;
43336421ee45722da418b8ab99d7e6358e4f86b9f1eCristy}
43436421ee45722da418b8ab99d7e6358e4f86b9f1eCristy
43536421ee45722da418b8ab99d7e6358e4f86b9f1eCristy
43636421ee45722da418b8ab99d7e6358e4f86b9f1eCristyvoid
43736421ee45722da418b8ab99d7e6358e4f86b9f1eCristyast_expression_statement::print(void) const
43836421ee45722da418b8ab99d7e6358e4f86b9f1eCristy{
43936421ee45722da418b8ab99d7e6358e4f86b9f1eCristy   if (expression)
44036421ee45722da418b8ab99d7e6358e4f86b9f1eCristy      expression->print();
44136421ee45722da418b8ab99d7e6358e4f86b9f1eCristy
44236421ee45722da418b8ab99d7e6358e4f86b9f1eCristy   printf("; ");
44336421ee45722da418b8ab99d7e6358e4f86b9f1eCristy}
44436421ee45722da418b8ab99d7e6358e4f86b9f1eCristy
44536421ee45722da418b8ab99d7e6358e4f86b9f1eCristy
44636421ee45722da418b8ab99d7e6358e4f86b9f1eCristyast_expression_statement::ast_expression_statement(ast_expression *ex) :
44736421ee45722da418b8ab99d7e6358e4f86b9f1eCristy   expression(ex)
44836421ee45722da418b8ab99d7e6358e4f86b9f1eCristy{
44936421ee45722da418b8ab99d7e6358e4f86b9f1eCristy   /* empty */
45036421ee45722da418b8ab99d7e6358e4f86b9f1eCristy}
45136421ee45722da418b8ab99d7e6358e4f86b9f1eCristy
45236421ee45722da418b8ab99d7e6358e4f86b9f1eCristy
45336421ee45722da418b8ab99d7e6358e4f86b9f1eCristyvoid
45436421ee45722da418b8ab99d7e6358e4f86b9f1eCristyast_function::print(void) const
45536421ee45722da418b8ab99d7e6358e4f86b9f1eCristy{
45636421ee45722da418b8ab99d7e6358e4f86b9f1eCristy   return_type->print();
45736421ee45722da418b8ab99d7e6358e4f86b9f1eCristy   printf(" %s (", identifier);
45836421ee45722da418b8ab99d7e6358e4f86b9f1eCristy
45936421ee45722da418b8ab99d7e6358e4f86b9f1eCristy   foreach_list_const(n, & this->parameters) {
46036421ee45722da418b8ab99d7e6358e4f86b9f1eCristy      ast_node *ast = exec_node_data(ast_node, n, link);
46136421ee45722da418b8ab99d7e6358e4f86b9f1eCristy      ast->print();
46236421ee45722da418b8ab99d7e6358e4f86b9f1eCristy   }
46336421ee45722da418b8ab99d7e6358e4f86b9f1eCristy
46436421ee45722da418b8ab99d7e6358e4f86b9f1eCristy   printf(")");
46536421ee45722da418b8ab99d7e6358e4f86b9f1eCristy}
46636421ee45722da418b8ab99d7e6358e4f86b9f1eCristy
46736421ee45722da418b8ab99d7e6358e4f86b9f1eCristy
46836421ee45722da418b8ab99d7e6358e4f86b9f1eCristyast_function::ast_function(void)
46936421ee45722da418b8ab99d7e6358e4f86b9f1eCristy   : is_definition(false), signature(NULL)
47036421ee45722da418b8ab99d7e6358e4f86b9f1eCristy{
47136421ee45722da418b8ab99d7e6358e4f86b9f1eCristy   /* empty */
47236421ee45722da418b8ab99d7e6358e4f86b9f1eCristy}
47336421ee45722da418b8ab99d7e6358e4f86b9f1eCristy
47436421ee45722da418b8ab99d7e6358e4f86b9f1eCristy
47536421ee45722da418b8ab99d7e6358e4f86b9f1eCristyvoid
47636421ee45722da418b8ab99d7e6358e4f86b9f1eCristyast_fully_specified_type::print(void) const
47736421ee45722da418b8ab99d7e6358e4f86b9f1eCristy{
47836421ee45722da418b8ab99d7e6358e4f86b9f1eCristy   _mesa_ast_type_qualifier_print(& qualifier);
47936421ee45722da418b8ab99d7e6358e4f86b9f1eCristy   specifier->print();
48036421ee45722da418b8ab99d7e6358e4f86b9f1eCristy}
48136421ee45722da418b8ab99d7e6358e4f86b9f1eCristy
48236421ee45722da418b8ab99d7e6358e4f86b9f1eCristy
48336421ee45722da418b8ab99d7e6358e4f86b9f1eCristyvoid
48436421ee45722da418b8ab99d7e6358e4f86b9f1eCristyast_parameter_declarator::print(void) const
48536421ee45722da418b8ab99d7e6358e4f86b9f1eCristy{
48636421ee45722da418b8ab99d7e6358e4f86b9f1eCristy   type->print();
48736421ee45722da418b8ab99d7e6358e4f86b9f1eCristy   if (identifier)
48836421ee45722da418b8ab99d7e6358e4f86b9f1eCristy      printf("%s ", identifier);
48936421ee45722da418b8ab99d7e6358e4f86b9f1eCristy   ast_opt_array_size_print(is_array, array_size);
49036421ee45722da418b8ab99d7e6358e4f86b9f1eCristy}
49136421ee45722da418b8ab99d7e6358e4f86b9f1eCristy
49236421ee45722da418b8ab99d7e6358e4f86b9f1eCristy
49336421ee45722da418b8ab99d7e6358e4f86b9f1eCristyvoid
49436421ee45722da418b8ab99d7e6358e4f86b9f1eCristyast_function_definition::print(void) const
49536421ee45722da418b8ab99d7e6358e4f86b9f1eCristy{
49636421ee45722da418b8ab99d7e6358e4f86b9f1eCristy   prototype->print();
49736421ee45722da418b8ab99d7e6358e4f86b9f1eCristy   body->print();
49836421ee45722da418b8ab99d7e6358e4f86b9f1eCristy}
49936421ee45722da418b8ab99d7e6358e4f86b9f1eCristy
50036421ee45722da418b8ab99d7e6358e4f86b9f1eCristy
50136421ee45722da418b8ab99d7e6358e4f86b9f1eCristyvoid
50236421ee45722da418b8ab99d7e6358e4f86b9f1eCristyast_declaration::print(void) const
50336421ee45722da418b8ab99d7e6358e4f86b9f1eCristy{
50436421ee45722da418b8ab99d7e6358e4f86b9f1eCristy   printf("%s ", identifier);
50536421ee45722da418b8ab99d7e6358e4f86b9f1eCristy   ast_opt_array_size_print(is_array, array_size);
50636421ee45722da418b8ab99d7e6358e4f86b9f1eCristy
50736421ee45722da418b8ab99d7e6358e4f86b9f1eCristy   if (initializer) {
50836421ee45722da418b8ab99d7e6358e4f86b9f1eCristy      printf("= ");
50936421ee45722da418b8ab99d7e6358e4f86b9f1eCristy      initializer->print();
51036421ee45722da418b8ab99d7e6358e4f86b9f1eCristy   }
51136421ee45722da418b8ab99d7e6358e4f86b9f1eCristy}
51236421ee45722da418b8ab99d7e6358e4f86b9f1eCristy
51336421ee45722da418b8ab99d7e6358e4f86b9f1eCristy
51436421ee45722da418b8ab99d7e6358e4f86b9f1eCristyast_declaration::ast_declaration(char *identifier, int is_array,
51536421ee45722da418b8ab99d7e6358e4f86b9f1eCristy				 ast_expression *array_size,
51636421ee45722da418b8ab99d7e6358e4f86b9f1eCristy				 ast_expression *initializer)
51736421ee45722da418b8ab99d7e6358e4f86b9f1eCristy{
51836421ee45722da418b8ab99d7e6358e4f86b9f1eCristy   this->identifier = identifier;
51936421ee45722da418b8ab99d7e6358e4f86b9f1eCristy   this->is_array = is_array;
52036421ee45722da418b8ab99d7e6358e4f86b9f1eCristy   this->array_size = array_size;
52136421ee45722da418b8ab99d7e6358e4f86b9f1eCristy   this->initializer = initializer;
52236421ee45722da418b8ab99d7e6358e4f86b9f1eCristy}
52336421ee45722da418b8ab99d7e6358e4f86b9f1eCristy
52436421ee45722da418b8ab99d7e6358e4f86b9f1eCristy
52536421ee45722da418b8ab99d7e6358e4f86b9f1eCristyvoid
52636421ee45722da418b8ab99d7e6358e4f86b9f1eCristyast_declarator_list::print(void) const
52736421ee45722da418b8ab99d7e6358e4f86b9f1eCristy{
52836421ee45722da418b8ab99d7e6358e4f86b9f1eCristy   assert(type || invariant);
52936421ee45722da418b8ab99d7e6358e4f86b9f1eCristy
53036421ee45722da418b8ab99d7e6358e4f86b9f1eCristy   if (type)
53136421ee45722da418b8ab99d7e6358e4f86b9f1eCristy      type->print();
53236421ee45722da418b8ab99d7e6358e4f86b9f1eCristy   else
53336421ee45722da418b8ab99d7e6358e4f86b9f1eCristy      printf("invariant ");
53436421ee45722da418b8ab99d7e6358e4f86b9f1eCristy
53536421ee45722da418b8ab99d7e6358e4f86b9f1eCristy   foreach_list_const (ptr, & this->declarations) {
53636421ee45722da418b8ab99d7e6358e4f86b9f1eCristy      if (ptr != this->declarations.get_head())
53736421ee45722da418b8ab99d7e6358e4f86b9f1eCristy	 printf(", ");
53836421ee45722da418b8ab99d7e6358e4f86b9f1eCristy
53936421ee45722da418b8ab99d7e6358e4f86b9f1eCristy      ast_node *ast = exec_node_data(ast_node, ptr, link);
54036421ee45722da418b8ab99d7e6358e4f86b9f1eCristy      ast->print();
54136421ee45722da418b8ab99d7e6358e4f86b9f1eCristy   }
54236421ee45722da418b8ab99d7e6358e4f86b9f1eCristy
54336421ee45722da418b8ab99d7e6358e4f86b9f1eCristy   printf("; ");
54436421ee45722da418b8ab99d7e6358e4f86b9f1eCristy}
54536421ee45722da418b8ab99d7e6358e4f86b9f1eCristy
54636421ee45722da418b8ab99d7e6358e4f86b9f1eCristy
54736421ee45722da418b8ab99d7e6358e4f86b9f1eCristyast_declarator_list::ast_declarator_list(ast_fully_specified_type *type)
54836421ee45722da418b8ab99d7e6358e4f86b9f1eCristy{
54936421ee45722da418b8ab99d7e6358e4f86b9f1eCristy   this->type = type;
55036421ee45722da418b8ab99d7e6358e4f86b9f1eCristy   this->invariant = false;
55136421ee45722da418b8ab99d7e6358e4f86b9f1eCristy}
55236421ee45722da418b8ab99d7e6358e4f86b9f1eCristy
55336421ee45722da418b8ab99d7e6358e4f86b9f1eCristyvoid
55436421ee45722da418b8ab99d7e6358e4f86b9f1eCristyast_jump_statement::print(void) const
55536421ee45722da418b8ab99d7e6358e4f86b9f1eCristy{
55636421ee45722da418b8ab99d7e6358e4f86b9f1eCristy   switch (mode) {
55736421ee45722da418b8ab99d7e6358e4f86b9f1eCristy   case ast_continue:
55836421ee45722da418b8ab99d7e6358e4f86b9f1eCristy      printf("continue; ");
55936421ee45722da418b8ab99d7e6358e4f86b9f1eCristy      break;
56036421ee45722da418b8ab99d7e6358e4f86b9f1eCristy   case ast_break:
56136421ee45722da418b8ab99d7e6358e4f86b9f1eCristy      printf("break; ");
56236421ee45722da418b8ab99d7e6358e4f86b9f1eCristy      break;
56336421ee45722da418b8ab99d7e6358e4f86b9f1eCristy   case ast_return:
56436421ee45722da418b8ab99d7e6358e4f86b9f1eCristy      printf("return ");
56536421ee45722da418b8ab99d7e6358e4f86b9f1eCristy      if (opt_return_value)
56636421ee45722da418b8ab99d7e6358e4f86b9f1eCristy	 opt_return_value->print();
56736421ee45722da418b8ab99d7e6358e4f86b9f1eCristy
56836421ee45722da418b8ab99d7e6358e4f86b9f1eCristy      printf("; ");
56936421ee45722da418b8ab99d7e6358e4f86b9f1eCristy      break;
57036421ee45722da418b8ab99d7e6358e4f86b9f1eCristy   case ast_discard:
57136421ee45722da418b8ab99d7e6358e4f86b9f1eCristy      printf("discard; ");
57236421ee45722da418b8ab99d7e6358e4f86b9f1eCristy      break;
57336421ee45722da418b8ab99d7e6358e4f86b9f1eCristy   }
57436421ee45722da418b8ab99d7e6358e4f86b9f1eCristy}
57536421ee45722da418b8ab99d7e6358e4f86b9f1eCristy
57636421ee45722da418b8ab99d7e6358e4f86b9f1eCristy
57736421ee45722da418b8ab99d7e6358e4f86b9f1eCristyast_jump_statement::ast_jump_statement(int mode, ast_expression *return_value)
57836421ee45722da418b8ab99d7e6358e4f86b9f1eCristy{
57936421ee45722da418b8ab99d7e6358e4f86b9f1eCristy   this->mode = ast_jump_modes(mode);
58036421ee45722da418b8ab99d7e6358e4f86b9f1eCristy
58136421ee45722da418b8ab99d7e6358e4f86b9f1eCristy   if (mode == ast_return)
58236421ee45722da418b8ab99d7e6358e4f86b9f1eCristy      opt_return_value = return_value;
58336421ee45722da418b8ab99d7e6358e4f86b9f1eCristy}
58436421ee45722da418b8ab99d7e6358e4f86b9f1eCristy
58536421ee45722da418b8ab99d7e6358e4f86b9f1eCristy
58636421ee45722da418b8ab99d7e6358e4f86b9f1eCristyvoid
58736421ee45722da418b8ab99d7e6358e4f86b9f1eCristyast_selection_statement::print(void) const
58836421ee45722da418b8ab99d7e6358e4f86b9f1eCristy{
58936421ee45722da418b8ab99d7e6358e4f86b9f1eCristy   printf("if ( ");
59036421ee45722da418b8ab99d7e6358e4f86b9f1eCristy   condition->print();
59136421ee45722da418b8ab99d7e6358e4f86b9f1eCristy   printf(") ");
59236421ee45722da418b8ab99d7e6358e4f86b9f1eCristy
59336421ee45722da418b8ab99d7e6358e4f86b9f1eCristy   then_statement->print();
59436421ee45722da418b8ab99d7e6358e4f86b9f1eCristy
59536421ee45722da418b8ab99d7e6358e4f86b9f1eCristy   if (else_statement) {
59636421ee45722da418b8ab99d7e6358e4f86b9f1eCristy      printf("else ");
59736421ee45722da418b8ab99d7e6358e4f86b9f1eCristy      else_statement->print();
59836421ee45722da418b8ab99d7e6358e4f86b9f1eCristy   }
59936421ee45722da418b8ab99d7e6358e4f86b9f1eCristy
60036421ee45722da418b8ab99d7e6358e4f86b9f1eCristy}
60136421ee45722da418b8ab99d7e6358e4f86b9f1eCristy
60236421ee45722da418b8ab99d7e6358e4f86b9f1eCristy
60336421ee45722da418b8ab99d7e6358e4f86b9f1eCristyast_selection_statement::ast_selection_statement(ast_expression *condition,
60436421ee45722da418b8ab99d7e6358e4f86b9f1eCristy						 ast_node *then_statement,
60536421ee45722da418b8ab99d7e6358e4f86b9f1eCristy						 ast_node *else_statement)
60636421ee45722da418b8ab99d7e6358e4f86b9f1eCristy{
60736421ee45722da418b8ab99d7e6358e4f86b9f1eCristy   this->condition = condition;
60836421ee45722da418b8ab99d7e6358e4f86b9f1eCristy   this->then_statement = then_statement;
60936421ee45722da418b8ab99d7e6358e4f86b9f1eCristy   this->else_statement = else_statement;
61036421ee45722da418b8ab99d7e6358e4f86b9f1eCristy}
61136421ee45722da418b8ab99d7e6358e4f86b9f1eCristy
61236421ee45722da418b8ab99d7e6358e4f86b9f1eCristy
61336421ee45722da418b8ab99d7e6358e4f86b9f1eCristyvoid
61436421ee45722da418b8ab99d7e6358e4f86b9f1eCristyast_iteration_statement::print(void) const
61536421ee45722da418b8ab99d7e6358e4f86b9f1eCristy{
61636421ee45722da418b8ab99d7e6358e4f86b9f1eCristy   switch (mode) {
61736421ee45722da418b8ab99d7e6358e4f86b9f1eCristy   case ast_for:
61836421ee45722da418b8ab99d7e6358e4f86b9f1eCristy      printf("for( ");
61936421ee45722da418b8ab99d7e6358e4f86b9f1eCristy      if (init_statement)
62036421ee45722da418b8ab99d7e6358e4f86b9f1eCristy	 init_statement->print();
62136421ee45722da418b8ab99d7e6358e4f86b9f1eCristy      printf("; ");
62236421ee45722da418b8ab99d7e6358e4f86b9f1eCristy
62336421ee45722da418b8ab99d7e6358e4f86b9f1eCristy      if (condition)
62436421ee45722da418b8ab99d7e6358e4f86b9f1eCristy	 condition->print();
62536421ee45722da418b8ab99d7e6358e4f86b9f1eCristy      printf("; ");
62636421ee45722da418b8ab99d7e6358e4f86b9f1eCristy
62736421ee45722da418b8ab99d7e6358e4f86b9f1eCristy      if (rest_expression)
62836421ee45722da418b8ab99d7e6358e4f86b9f1eCristy	 rest_expression->print();
62936421ee45722da418b8ab99d7e6358e4f86b9f1eCristy      printf(") ");
63036421ee45722da418b8ab99d7e6358e4f86b9f1eCristy
63136421ee45722da418b8ab99d7e6358e4f86b9f1eCristy      body->print();
63236421ee45722da418b8ab99d7e6358e4f86b9f1eCristy      break;
63336421ee45722da418b8ab99d7e6358e4f86b9f1eCristy
63436421ee45722da418b8ab99d7e6358e4f86b9f1eCristy   case ast_while:
63536421ee45722da418b8ab99d7e6358e4f86b9f1eCristy      printf("while ( ");
63636421ee45722da418b8ab99d7e6358e4f86b9f1eCristy      if (condition)
63736421ee45722da418b8ab99d7e6358e4f86b9f1eCristy	 condition->print();
63836421ee45722da418b8ab99d7e6358e4f86b9f1eCristy      printf(") ");
63936421ee45722da418b8ab99d7e6358e4f86b9f1eCristy      body->print();
64036421ee45722da418b8ab99d7e6358e4f86b9f1eCristy      break;
64136421ee45722da418b8ab99d7e6358e4f86b9f1eCristy
64236421ee45722da418b8ab99d7e6358e4f86b9f1eCristy   case ast_do_while:
64336421ee45722da418b8ab99d7e6358e4f86b9f1eCristy      printf("do ");
64436421ee45722da418b8ab99d7e6358e4f86b9f1eCristy      body->print();
64536421ee45722da418b8ab99d7e6358e4f86b9f1eCristy      printf("while ( ");
64636421ee45722da418b8ab99d7e6358e4f86b9f1eCristy      if (condition)
64736421ee45722da418b8ab99d7e6358e4f86b9f1eCristy	 condition->print();
64836421ee45722da418b8ab99d7e6358e4f86b9f1eCristy      printf("); ");
64936421ee45722da418b8ab99d7e6358e4f86b9f1eCristy      break;
65036421ee45722da418b8ab99d7e6358e4f86b9f1eCristy   }
65136421ee45722da418b8ab99d7e6358e4f86b9f1eCristy}
65236421ee45722da418b8ab99d7e6358e4f86b9f1eCristy
65336421ee45722da418b8ab99d7e6358e4f86b9f1eCristy
65436421ee45722da418b8ab99d7e6358e4f86b9f1eCristyast_iteration_statement::ast_iteration_statement(int mode,
65536421ee45722da418b8ab99d7e6358e4f86b9f1eCristy						 ast_node *init,
65636421ee45722da418b8ab99d7e6358e4f86b9f1eCristy						 ast_node *condition,
65736421ee45722da418b8ab99d7e6358e4f86b9f1eCristy						 ast_expression *rest_expression,
65836421ee45722da418b8ab99d7e6358e4f86b9f1eCristy						 ast_node *body)
65936421ee45722da418b8ab99d7e6358e4f86b9f1eCristy{
66036421ee45722da418b8ab99d7e6358e4f86b9f1eCristy   this->mode = ast_iteration_modes(mode);
66136421ee45722da418b8ab99d7e6358e4f86b9f1eCristy   this->init_statement = init;
66236421ee45722da418b8ab99d7e6358e4f86b9f1eCristy   this->condition = condition;
66336421ee45722da418b8ab99d7e6358e4f86b9f1eCristy   this->rest_expression = rest_expression;
66436421ee45722da418b8ab99d7e6358e4f86b9f1eCristy   this->body = body;
66536421ee45722da418b8ab99d7e6358e4f86b9f1eCristy}
66636421ee45722da418b8ab99d7e6358e4f86b9f1eCristy
66736421ee45722da418b8ab99d7e6358e4f86b9f1eCristy
66836421ee45722da418b8ab99d7e6358e4f86b9f1eCristyvoid
66936421ee45722da418b8ab99d7e6358e4f86b9f1eCristyast_struct_specifier::print(void) const
67036421ee45722da418b8ab99d7e6358e4f86b9f1eCristy{
67136421ee45722da418b8ab99d7e6358e4f86b9f1eCristy   printf("struct %s { ", name);
67236421ee45722da418b8ab99d7e6358e4f86b9f1eCristy   foreach_list_const(n, &this->declarations) {
67336421ee45722da418b8ab99d7e6358e4f86b9f1eCristy      ast_node *ast = exec_node_data(ast_node, n, link);
67436421ee45722da418b8ab99d7e6358e4f86b9f1eCristy      ast->print();
67536421ee45722da418b8ab99d7e6358e4f86b9f1eCristy   }
67636421ee45722da418b8ab99d7e6358e4f86b9f1eCristy   printf("} ");
67736421ee45722da418b8ab99d7e6358e4f86b9f1eCristy}
67836421ee45722da418b8ab99d7e6358e4f86b9f1eCristy
67936421ee45722da418b8ab99d7e6358e4f86b9f1eCristy
68036421ee45722da418b8ab99d7e6358e4f86b9f1eCristyast_struct_specifier::ast_struct_specifier(char *identifier,
68136421ee45722da418b8ab99d7e6358e4f86b9f1eCristy					   ast_node *declarator_list)
68236421ee45722da418b8ab99d7e6358e4f86b9f1eCristy{
68336421ee45722da418b8ab99d7e6358e4f86b9f1eCristy   if (identifier == NULL) {
68436421ee45722da418b8ab99d7e6358e4f86b9f1eCristy      static unsigned anon_count = 1;
68536421ee45722da418b8ab99d7e6358e4f86b9f1eCristy      identifier = talloc_asprintf(this, "#anon_struct_%04x", anon_count);
68636421ee45722da418b8ab99d7e6358e4f86b9f1eCristy      anon_count++;
68736421ee45722da418b8ab99d7e6358e4f86b9f1eCristy   }
68836421ee45722da418b8ab99d7e6358e4f86b9f1eCristy   name = identifier;
68936421ee45722da418b8ab99d7e6358e4f86b9f1eCristy   this->declarations.push_degenerate_list_at_head(&declarator_list->link);
69036421ee45722da418b8ab99d7e6358e4f86b9f1eCristy}
69136421ee45722da418b8ab99d7e6358e4f86b9f1eCristy
69236421ee45722da418b8ab99d7e6358e4f86b9f1eCristybool
69336421ee45722da418b8ab99d7e6358e4f86b9f1eCristydo_common_optimization(exec_list *ir, bool linked, unsigned max_unroll_iterations)
69436421ee45722da418b8ab99d7e6358e4f86b9f1eCristy{
69536421ee45722da418b8ab99d7e6358e4f86b9f1eCristy   GLboolean progress = GL_FALSE;
69636421ee45722da418b8ab99d7e6358e4f86b9f1eCristy
69736421ee45722da418b8ab99d7e6358e4f86b9f1eCristy   progress = do_sub_to_add_neg(ir) || progress;
69836421ee45722da418b8ab99d7e6358e4f86b9f1eCristy
69936421ee45722da418b8ab99d7e6358e4f86b9f1eCristy   if (linked) {
70036421ee45722da418b8ab99d7e6358e4f86b9f1eCristy      progress = do_function_inlining(ir) || progress;
70136421ee45722da418b8ab99d7e6358e4f86b9f1eCristy      progress = do_dead_functions(ir) || progress;
70236421ee45722da418b8ab99d7e6358e4f86b9f1eCristy   }
70336421ee45722da418b8ab99d7e6358e4f86b9f1eCristy   progress = do_structure_splitting(ir) || progress;
70436421ee45722da418b8ab99d7e6358e4f86b9f1eCristy   progress = do_if_simplification(ir) || progress;
70536421ee45722da418b8ab99d7e6358e4f86b9f1eCristy   progress = do_copy_propagation(ir) || progress;
70636421ee45722da418b8ab99d7e6358e4f86b9f1eCristy   if (linked)
70736421ee45722da418b8ab99d7e6358e4f86b9f1eCristy      progress = do_dead_code(ir) || progress;
70836421ee45722da418b8ab99d7e6358e4f86b9f1eCristy   else
70936421ee45722da418b8ab99d7e6358e4f86b9f1eCristy      progress = do_dead_code_unlinked(ir) || progress;
71036421ee45722da418b8ab99d7e6358e4f86b9f1eCristy   progress = do_dead_code_local(ir) || progress;
71136421ee45722da418b8ab99d7e6358e4f86b9f1eCristy   progress = do_tree_grafting(ir) || progress;
71236421ee45722da418b8ab99d7e6358e4f86b9f1eCristy   progress = do_constant_propagation(ir) || progress;
71336421ee45722da418b8ab99d7e6358e4f86b9f1eCristy   if (linked)
71436421ee45722da418b8ab99d7e6358e4f86b9f1eCristy      progress = do_constant_variable(ir) || progress;
71536421ee45722da418b8ab99d7e6358e4f86b9f1eCristy   else
71636421ee45722da418b8ab99d7e6358e4f86b9f1eCristy      progress = do_constant_variable_unlinked(ir) || progress;
71736421ee45722da418b8ab99d7e6358e4f86b9f1eCristy   progress = do_constant_folding(ir) || progress;
71836421ee45722da418b8ab99d7e6358e4f86b9f1eCristy   progress = do_algebraic(ir) || progress;
71936421ee45722da418b8ab99d7e6358e4f86b9f1eCristy   progress = do_lower_jumps(ir) || progress;
72036421ee45722da418b8ab99d7e6358e4f86b9f1eCristy   progress = do_vec_index_to_swizzle(ir) || progress;
72136421ee45722da418b8ab99d7e6358e4f86b9f1eCristy   progress = do_swizzle_swizzle(ir) || progress;
72236421ee45722da418b8ab99d7e6358e4f86b9f1eCristy   progress = do_noop_swizzle(ir) || progress;
72336421ee45722da418b8ab99d7e6358e4f86b9f1eCristy
72436421ee45722da418b8ab99d7e6358e4f86b9f1eCristy   progress = optimize_redundant_jumps(ir) || progress;
72536421ee45722da418b8ab99d7e6358e4f86b9f1eCristy
72636421ee45722da418b8ab99d7e6358e4f86b9f1eCristy   loop_state *ls = analyze_loop_variables(ir);
72736421ee45722da418b8ab99d7e6358e4f86b9f1eCristy   progress = set_loop_controls(ir, ls) || progress;
72836421ee45722da418b8ab99d7e6358e4f86b9f1eCristy   progress = unroll_loops(ir, ls, max_unroll_iterations) || progress;
72936421ee45722da418b8ab99d7e6358e4f86b9f1eCristy   delete ls;
73036421ee45722da418b8ab99d7e6358e4f86b9f1eCristy
73136421ee45722da418b8ab99d7e6358e4f86b9f1eCristy   return progress;
73236421ee45722da418b8ab99d7e6358e4f86b9f1eCristy}
73336421ee45722da418b8ab99d7e6358e4f86b9f1eCristy
73436421ee45722da418b8ab99d7e6358e4f86b9f1eCristyextern "C" {
73536421ee45722da418b8ab99d7e6358e4f86b9f1eCristy
73636421ee45722da418b8ab99d7e6358e4f86b9f1eCristy/**
73736421ee45722da418b8ab99d7e6358e4f86b9f1eCristy * To be called at GL teardown time, this frees compiler datastructures.
73836421ee45722da418b8ab99d7e6358e4f86b9f1eCristy *
73936421ee45722da418b8ab99d7e6358e4f86b9f1eCristy * After calling this, any previously compiled shaders and shader
74036421ee45722da418b8ab99d7e6358e4f86b9f1eCristy * programs would be invalid.  So this should happen at approximately
74136421ee45722da418b8ab99d7e6358e4f86b9f1eCristy * program exit.
74236421ee45722da418b8ab99d7e6358e4f86b9f1eCristy */
74336421ee45722da418b8ab99d7e6358e4f86b9f1eCristyvoid
74436421ee45722da418b8ab99d7e6358e4f86b9f1eCristy_mesa_destroy_shader_compiler(void)
74536421ee45722da418b8ab99d7e6358e4f86b9f1eCristy{
74636421ee45722da418b8ab99d7e6358e4f86b9f1eCristy   _mesa_destroy_shader_compiler_caches();
74736421ee45722da418b8ab99d7e6358e4f86b9f1eCristy
74836421ee45722da418b8ab99d7e6358e4f86b9f1eCristy   _mesa_glsl_release_types();
74936421ee45722da418b8ab99d7e6358e4f86b9f1eCristy}
75036421ee45722da418b8ab99d7e6358e4f86b9f1eCristy
75136421ee45722da418b8ab99d7e6358e4f86b9f1eCristy/**
75236421ee45722da418b8ab99d7e6358e4f86b9f1eCristy * Releases compiler caches to trade off performance for memory.
75336421ee45722da418b8ab99d7e6358e4f86b9f1eCristy *
75436421ee45722da418b8ab99d7e6358e4f86b9f1eCristy * Intended to be used with glReleaseShaderCompiler().
75536421ee45722da418b8ab99d7e6358e4f86b9f1eCristy */
75636421ee45722da418b8ab99d7e6358e4f86b9f1eCristyvoid
75736421ee45722da418b8ab99d7e6358e4f86b9f1eCristy_mesa_destroy_shader_compiler_caches(void)
75836421ee45722da418b8ab99d7e6358e4f86b9f1eCristy{
75936421ee45722da418b8ab99d7e6358e4f86b9f1eCristy   _mesa_glsl_release_functions();
76036421ee45722da418b8ab99d7e6358e4f86b9f1eCristy}
76136421ee45722da418b8ab99d7e6358e4f86b9f1eCristy
76236421ee45722da418b8ab99d7e6358e4f86b9f1eCristy}
76336421ee45722da418b8ab99d7e6358e4f86b9f1eCristy