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