ast_to_hir.cpp revision b66be7518ad57368b31b5d70a2bb4c0fe66aa988
1a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick/*
2a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick * Copyright © 2010 Intel Corporation
3a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick *
4a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick * Permission is hereby granted, free of charge, to any person obtaining a
5a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick * copy of this software and associated documentation files (the "Software"),
6a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick * to deal in the Software without restriction, including without limitation
7a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick * the rights to use, copy, modify, merge, publish, distribute, sublicense,
8a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick * and/or sell copies of the Software, and to permit persons to whom the
9a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick * Software is furnished to do so, subject to the following conditions:
10a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick *
11a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick * The above copyright notice and this permission notice (including the next
12a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick * paragraph) shall be included in all copies or substantial portions of the
13a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick * Software.
14a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick *
15a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL
18a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
20a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
21a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick * DEALINGS IN THE SOFTWARE.
22a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick */
23a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick
24a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick/**
25a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick * \file ast_to_hir.c
26a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick * Convert abstract syntax to to high-level intermediate reprensentation (HIR).
27a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick *
28a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick * During the conversion to HIR, the majority of the symantic checking is
29a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick * preformed on the program.  This includes:
30a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick *
31a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick *    * Symbol table management
32a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick *    * Type checking
33a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick *    * Function binding
34a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick *
35a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick * The majority of this work could be done during parsing, and the parser could
36a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick * probably generate HIR directly.  However, this results in frequent changes
37a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick * to the parser code.  Since we do not assume that every system this complier
38a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick * is built on will have Flex and Bison installed, we have to store the code
39a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick * generated by these tools in our version control system.  In other parts of
40a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick * the system we've seen problems where a parser was changed but the generated
41a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick * code was not committed, merge conflicts where created because two developers
42a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick * had slightly different versions of Bison installed, etc.
43a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick *
44a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick * I have also noticed that running Bison generated parsers in GDB is very
45a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick * irritating.  When you get a segfault on '$$ = $1->foo', you can't very
46a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick * well 'print $1' in GDB.
47a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick *
48a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick * As a result, my preference is to put as little C code as possible in the
49a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick * parser (and lexer) sources.
50a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick */
51ac95f2f8c88d39aaa878f61172d9748af13e2c80Eric Anholt
52bfd7c9ac228c7ed8aec04c3b3aa33f40ee00b035Chia-I Wu#include "main/core.h" /* for struct gl_extensions */
538bde4cec6b189564b1f2d58514bd7e7a4b40f714Ian Romanick#include "glsl_symbol_table.h"
54a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick#include "glsl_parser_extras.h"
55a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick#include "ast.h"
56a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick#include "glsl_types.h"
57a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick#include "ir.h"
58a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick
59d949a9afb0a01e9678a4343f66b056b41a2e48a9Ian Romanickvoid
60d949a9afb0a01e9678a4343f66b056b41a2e48a9Ian Romanick_mesa_ast_to_hir(exec_list *instructions, struct _mesa_glsl_parse_state *state)
61d949a9afb0a01e9678a4343f66b056b41a2e48a9Ian Romanick{
62adfb0cd7401251bef0c854ac945fce78f0ed11dbIan Romanick   _mesa_glsl_initialize_variables(instructions, state);
6381168351a7f493fcde55e621af046c9301aa93e9Kenneth Graunke   _mesa_glsl_initialize_functions(state);
64adfb0cd7401251bef0c854ac945fce78f0ed11dbIan Romanick
65814c89abdbcd5b841b98746af921796df0362238Kenneth Graunke   state->symbols->language_version = state->language_version;
66814c89abdbcd5b841b98746af921796df0362238Kenneth Graunke
6741ec6a47ab81620bab9182f987e4bc4780e3a6abIan Romanick   state->current_function = NULL;
6841ec6a47ab81620bab9182f987e4bc4780e3a6abIan Romanick
69a044285e25615f2d97636fe3ba47d580c3537bc4Kenneth Graunke   /* Section 4.2 of the GLSL 1.20 specification states:
70a044285e25615f2d97636fe3ba47d580c3537bc4Kenneth Graunke    * "The built-in functions are scoped in a scope outside the global scope
71a044285e25615f2d97636fe3ba47d580c3537bc4Kenneth Graunke    *  users declare global variables in.  That is, a shader's global scope,
72a044285e25615f2d97636fe3ba47d580c3537bc4Kenneth Graunke    *  available for user-defined functions and global variables, is nested
73a044285e25615f2d97636fe3ba47d580c3537bc4Kenneth Graunke    *  inside the scope containing the built-in functions."
74a044285e25615f2d97636fe3ba47d580c3537bc4Kenneth Graunke    *
75a044285e25615f2d97636fe3ba47d580c3537bc4Kenneth Graunke    * Since built-in functions like ftransform() access built-in variables,
76a044285e25615f2d97636fe3ba47d580c3537bc4Kenneth Graunke    * it follows that those must be in the outer scope as well.
77a044285e25615f2d97636fe3ba47d580c3537bc4Kenneth Graunke    *
78a044285e25615f2d97636fe3ba47d580c3537bc4Kenneth Graunke    * We push scope here to create this nesting effect...but don't pop.
79a044285e25615f2d97636fe3ba47d580c3537bc4Kenneth Graunke    * This way, a shader's globals are still in the symbol table for use
80a044285e25615f2d97636fe3ba47d580c3537bc4Kenneth Graunke    * by the linker.
81a044285e25615f2d97636fe3ba47d580c3537bc4Kenneth Graunke    */
82a044285e25615f2d97636fe3ba47d580c3537bc4Kenneth Graunke   state->symbols->push_scope();
83a044285e25615f2d97636fe3ba47d580c3537bc4Kenneth Graunke
842b97dc657a0e762bc67216405419cd348eb948c0Ian Romanick   foreach_list_typed (ast_node, ast, link, & state->translation_unit)
85304ea90233baeac6801a98e981658cb7a2d2501cIan Romanick      ast->hir(instructions, state);
86d949a9afb0a01e9678a4343f66b056b41a2e48a9Ian Romanick}
87d949a9afb0a01e9678a4343f66b056b41a2e48a9Ian Romanick
88d949a9afb0a01e9678a4343f66b056b41a2e48a9Ian Romanick
890104536568ed031654c1c3c957b0216bbca4a1d6Ian Romanick/**
900104536568ed031654c1c3c957b0216bbca4a1d6Ian Romanick * If a conversion is available, convert one operand to a different type
910104536568ed031654c1c3c957b0216bbca4a1d6Ian Romanick *
920104536568ed031654c1c3c957b0216bbca4a1d6Ian Romanick * The \c from \c ir_rvalue is converted "in place".
930104536568ed031654c1c3c957b0216bbca4a1d6Ian Romanick *
940104536568ed031654c1c3c957b0216bbca4a1d6Ian Romanick * \param to     Type that the operand it to be converted to
950104536568ed031654c1c3c957b0216bbca4a1d6Ian Romanick * \param from   Operand that is being converted
960104536568ed031654c1c3c957b0216bbca4a1d6Ian Romanick * \param state  GLSL compiler state
970104536568ed031654c1c3c957b0216bbca4a1d6Ian Romanick *
980104536568ed031654c1c3c957b0216bbca4a1d6Ian Romanick * \return
990104536568ed031654c1c3c957b0216bbca4a1d6Ian Romanick * If a conversion is possible (or unnecessary), \c true is returned.
1000104536568ed031654c1c3c957b0216bbca4a1d6Ian Romanick * Otherwise \c false is returned.
1010104536568ed031654c1c3c957b0216bbca4a1d6Ian Romanick */
102f32d3df8ab2b7c6c746f46870edc4b284cea50caKenneth Graunkebool
103bfb09c2a94414c1b40108c9c41eb0844d932e459Ian Romanickapply_implicit_conversion(const glsl_type *to, ir_rvalue * &from,
1040104536568ed031654c1c3c957b0216bbca4a1d6Ian Romanick			  struct _mesa_glsl_parse_state *state)
1050104536568ed031654c1c3c957b0216bbca4a1d6Ian Romanick{
106953ff1283d3d52e6a6b4850c2b0b574111625010Kenneth Graunke   void *ctx = state;
107bfb09c2a94414c1b40108c9c41eb0844d932e459Ian Romanick   if (to->base_type == from->type->base_type)
1080104536568ed031654c1c3c957b0216bbca4a1d6Ian Romanick      return true;
1090104536568ed031654c1c3c957b0216bbca4a1d6Ian Romanick
1100104536568ed031654c1c3c957b0216bbca4a1d6Ian Romanick   /* This conversion was added in GLSL 1.20.  If the compilation mode is
1110104536568ed031654c1c3c957b0216bbca4a1d6Ian Romanick    * GLSL 1.10, the conversion is skipped.
1120104536568ed031654c1c3c957b0216bbca4a1d6Ian Romanick    */
1130104536568ed031654c1c3c957b0216bbca4a1d6Ian Romanick   if (state->language_version < 120)
1140104536568ed031654c1c3c957b0216bbca4a1d6Ian Romanick      return false;
1150104536568ed031654c1c3c957b0216bbca4a1d6Ian Romanick
1160104536568ed031654c1c3c957b0216bbca4a1d6Ian Romanick   /* From page 27 (page 33 of the PDF) of the GLSL 1.50 spec:
1170104536568ed031654c1c3c957b0216bbca4a1d6Ian Romanick    *
1180104536568ed031654c1c3c957b0216bbca4a1d6Ian Romanick    *    "There are no implicit array or structure conversions. For
1190104536568ed031654c1c3c957b0216bbca4a1d6Ian Romanick    *    example, an array of int cannot be implicitly converted to an
1200104536568ed031654c1c3c957b0216bbca4a1d6Ian Romanick    *    array of float. There are no implicit conversions between
1210104536568ed031654c1c3c957b0216bbca4a1d6Ian Romanick    *    signed and unsigned integers."
1220104536568ed031654c1c3c957b0216bbca4a1d6Ian Romanick    */
1230104536568ed031654c1c3c957b0216bbca4a1d6Ian Romanick   /* FINISHME: The above comment is partially a lie.  There is int/uint
1240104536568ed031654c1c3c957b0216bbca4a1d6Ian Romanick    * FINISHME: conversion for immediate constants.
1250104536568ed031654c1c3c957b0216bbca4a1d6Ian Romanick    */
126bfb09c2a94414c1b40108c9c41eb0844d932e459Ian Romanick   if (!to->is_float() || !from->type->is_numeric())
1270104536568ed031654c1c3c957b0216bbca4a1d6Ian Romanick      return false;
1280104536568ed031654c1c3c957b0216bbca4a1d6Ian Romanick
129506199b852390e14a1d78392285bee8f06b6ede7Kenneth Graunke   /* Convert to a floating point type with the same number of components
130506199b852390e14a1d78392285bee8f06b6ede7Kenneth Graunke    * as the original type - i.e. int to float, not int to vec4.
131506199b852390e14a1d78392285bee8f06b6ede7Kenneth Graunke    */
132506199b852390e14a1d78392285bee8f06b6ede7Kenneth Graunke   to = glsl_type::get_instance(GLSL_TYPE_FLOAT, from->type->vector_elements,
133506199b852390e14a1d78392285bee8f06b6ede7Kenneth Graunke			        from->type->matrix_columns);
134506199b852390e14a1d78392285bee8f06b6ede7Kenneth Graunke
135bfb09c2a94414c1b40108c9c41eb0844d932e459Ian Romanick   switch (from->type->base_type) {
1360104536568ed031654c1c3c957b0216bbca4a1d6Ian Romanick   case GLSL_TYPE_INT:
1371660a2954797e056caba319c5d6c70b0d4be22feCarl Worth      from = new(ctx) ir_expression(ir_unop_i2f, to, from, NULL);
1380104536568ed031654c1c3c957b0216bbca4a1d6Ian Romanick      break;
1390104536568ed031654c1c3c957b0216bbca4a1d6Ian Romanick   case GLSL_TYPE_UINT:
1401660a2954797e056caba319c5d6c70b0d4be22feCarl Worth      from = new(ctx) ir_expression(ir_unop_u2f, to, from, NULL);
1410104536568ed031654c1c3c957b0216bbca4a1d6Ian Romanick      break;
1420104536568ed031654c1c3c957b0216bbca4a1d6Ian Romanick   case GLSL_TYPE_BOOL:
1431660a2954797e056caba319c5d6c70b0d4be22feCarl Worth      from = new(ctx) ir_expression(ir_unop_b2f, to, from, NULL);
144dc58b3f8ccd817fdee390a3df5b8e0fb29d5397cEric Anholt      break;
1450104536568ed031654c1c3c957b0216bbca4a1d6Ian Romanick   default:
1460104536568ed031654c1c3c957b0216bbca4a1d6Ian Romanick      assert(0);
1470104536568ed031654c1c3c957b0216bbca4a1d6Ian Romanick   }
1480104536568ed031654c1c3c957b0216bbca4a1d6Ian Romanick
1490104536568ed031654c1c3c957b0216bbca4a1d6Ian Romanick   return true;
1500104536568ed031654c1c3c957b0216bbca4a1d6Ian Romanick}
1510104536568ed031654c1c3c957b0216bbca4a1d6Ian Romanick
1520104536568ed031654c1c3c957b0216bbca4a1d6Ian Romanick
153a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanickstatic const struct glsl_type *
154bfb09c2a94414c1b40108c9c41eb0844d932e459Ian Romanickarithmetic_result_type(ir_rvalue * &value_a, ir_rvalue * &value_b,
155a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick		       bool multiply,
156a13bb1490c57ea958f2d1853d71c55d03263e9e4Eric Anholt		       struct _mesa_glsl_parse_state *state, YYLTYPE *loc)
157a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick{
158336b4ad8c76a525a0df2f4b0fc1d67e86bc5db3fEric Anholt   const glsl_type *type_a = value_a->type;
159336b4ad8c76a525a0df2f4b0fc1d67e86bc5db3fEric Anholt   const glsl_type *type_b = value_b->type;
1600104536568ed031654c1c3c957b0216bbca4a1d6Ian Romanick
161a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   /* From GLSL 1.50 spec, page 56:
162a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick    *
163a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick    *    "The arithmetic binary operators add (+), subtract (-),
164a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick    *    multiply (*), and divide (/) operate on integer and
165a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick    *    floating-point scalars, vectors, and matrices."
166a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick    */
16760b54d977a7b3df9612eb9232f6b5d6c3f393e2fIan Romanick   if (!type_a->is_numeric() || !type_b->is_numeric()) {
168a13bb1490c57ea958f2d1853d71c55d03263e9e4Eric Anholt      _mesa_glsl_error(loc, state,
169a13bb1490c57ea958f2d1853d71c55d03263e9e4Eric Anholt		       "Operands to arithmetic operators must be numeric");
1700471e8b0896e05b3bc81ccad6184e6e35fb61425Ian Romanick      return glsl_type::error_type;
171a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   }
172a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick
173a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick
174a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   /*    "If one operand is floating-point based and the other is
175a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick    *    not, then the conversions from Section 4.1.10 "Implicit
176a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick    *    Conversions" are applied to the non-floating-point-based operand."
177a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick    */
1780104536568ed031654c1c3c957b0216bbca4a1d6Ian Romanick   if (!apply_implicit_conversion(type_a, value_b, state)
1790104536568ed031654c1c3c957b0216bbca4a1d6Ian Romanick       && !apply_implicit_conversion(type_b, value_a, state)) {
180a13bb1490c57ea958f2d1853d71c55d03263e9e4Eric Anholt      _mesa_glsl_error(loc, state,
181a13bb1490c57ea958f2d1853d71c55d03263e9e4Eric Anholt		       "Could not implicitly convert operands to "
182a13bb1490c57ea958f2d1853d71c55d03263e9e4Eric Anholt		       "arithmetic operator");
1830104536568ed031654c1c3c957b0216bbca4a1d6Ian Romanick      return glsl_type::error_type;
184a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   }
185336b4ad8c76a525a0df2f4b0fc1d67e86bc5db3fEric Anholt   type_a = value_a->type;
186336b4ad8c76a525a0df2f4b0fc1d67e86bc5db3fEric Anholt   type_b = value_b->type;
187336b4ad8c76a525a0df2f4b0fc1d67e86bc5db3fEric Anholt
188a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   /*    "If the operands are integer types, they must both be signed or
189a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick    *    both be unsigned."
190a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick    *
191a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick    * From this rule and the preceeding conversion it can be inferred that
192a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick    * both types must be GLSL_TYPE_FLOAT, or GLSL_TYPE_UINT, or GLSL_TYPE_INT.
19360b54d977a7b3df9612eb9232f6b5d6c3f393e2fIan Romanick    * The is_numeric check above already filtered out the case where either
19460b54d977a7b3df9612eb9232f6b5d6c3f393e2fIan Romanick    * type is not one of these, so now the base types need only be tested for
19560b54d977a7b3df9612eb9232f6b5d6c3f393e2fIan Romanick    * equality.
196a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick    */
197a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   if (type_a->base_type != type_b->base_type) {
198a13bb1490c57ea958f2d1853d71c55d03263e9e4Eric Anholt      _mesa_glsl_error(loc, state,
199a13bb1490c57ea958f2d1853d71c55d03263e9e4Eric Anholt		       "base type mismatch for arithmetic operator");
2000471e8b0896e05b3bc81ccad6184e6e35fb61425Ian Romanick      return glsl_type::error_type;
201a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   }
202a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick
203a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   /*    "All arithmetic binary operators result in the same fundamental type
204a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick    *    (signed integer, unsigned integer, or floating-point) as the
205a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick    *    operands they operate on, after operand type conversion. After
206a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick    *    conversion, the following cases are valid
207a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick    *
208a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick    *    * The two operands are scalars. In this case the operation is
209a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick    *      applied, resulting in a scalar."
210a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick    */
211cb36f8aaeeb09660843316270a781948f773d90bIan Romanick   if (type_a->is_scalar() && type_b->is_scalar())
212a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick      return type_a;
213a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick
214a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   /*   "* One operand is a scalar, and the other is a vector or matrix.
215a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick    *      In this case, the scalar operation is applied independently to each
216a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick    *      component of the vector or matrix, resulting in the same size
217a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick    *      vector or matrix."
218a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick    */
219cb36f8aaeeb09660843316270a781948f773d90bIan Romanick   if (type_a->is_scalar()) {
220cb36f8aaeeb09660843316270a781948f773d90bIan Romanick      if (!type_b->is_scalar())
221a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick	 return type_b;
222cb36f8aaeeb09660843316270a781948f773d90bIan Romanick   } else if (type_b->is_scalar()) {
223a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick      return type_a;
224a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   }
225a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick
226a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   /* All of the combinations of <scalar, scalar>, <vector, scalar>,
227a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick    * <scalar, vector>, <scalar, matrix>, and <matrix, scalar> have been
228a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick    * handled.
229a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick    */
23060b54d977a7b3df9612eb9232f6b5d6c3f393e2fIan Romanick   assert(!type_a->is_scalar());
23160b54d977a7b3df9612eb9232f6b5d6c3f393e2fIan Romanick   assert(!type_b->is_scalar());
232a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick
233a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   /*   "* The two operands are vectors of the same size. In this case, the
234a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick    *      operation is done component-wise resulting in the same size
235a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick    *      vector."
236a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick    */
237a2dd22fb194bdffa14a2466ae5667f3be63430d3Ian Romanick   if (type_a->is_vector() && type_b->is_vector()) {
238a13bb1490c57ea958f2d1853d71c55d03263e9e4Eric Anholt      if (type_a == type_b) {
239a13bb1490c57ea958f2d1853d71c55d03263e9e4Eric Anholt	 return type_a;
240a13bb1490c57ea958f2d1853d71c55d03263e9e4Eric Anholt      } else {
241a13bb1490c57ea958f2d1853d71c55d03263e9e4Eric Anholt	 _mesa_glsl_error(loc, state,
242a13bb1490c57ea958f2d1853d71c55d03263e9e4Eric Anholt			  "vector size mismatch for arithmetic operator");
243a13bb1490c57ea958f2d1853d71c55d03263e9e4Eric Anholt	 return glsl_type::error_type;
244a13bb1490c57ea958f2d1853d71c55d03263e9e4Eric Anholt      }
245a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   }
246a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick
247a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   /* All of the combinations of <scalar, scalar>, <vector, scalar>,
248a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick    * <scalar, vector>, <scalar, matrix>, <matrix, scalar>, and
249a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick    * <vector, vector> have been handled.  At least one of the operands must
250a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick    * be matrix.  Further, since there are no integer matrix types, the base
251a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick    * type of both operands must be float.
252a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick    */
25360b54d977a7b3df9612eb9232f6b5d6c3f393e2fIan Romanick   assert(type_a->is_matrix() || type_b->is_matrix());
254a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   assert(type_a->base_type == GLSL_TYPE_FLOAT);
255a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   assert(type_b->base_type == GLSL_TYPE_FLOAT);
256a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick
257a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   /*   "* The operator is add (+), subtract (-), or divide (/), and the
258a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick    *      operands are matrices with the same number of rows and the same
259a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick    *      number of columns. In this case, the operation is done component-
260a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick    *      wise resulting in the same size matrix."
261a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick    *    * The operator is multiply (*), where both operands are matrices or
262a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick    *      one operand is a vector and the other a matrix. A right vector
263a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick    *      operand is treated as a column vector and a left vector operand as a
264a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick    *      row vector. In all these cases, it is required that the number of
265a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick    *      columns of the left operand is equal to the number of rows of the
266a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick    *      right operand. Then, the multiply (*) operation does a linear
267a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick    *      algebraic multiply, yielding an object that has the same number of
268a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick    *      rows as the left operand and the same number of columns as the right
269a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick    *      operand. Section 5.10 "Vector and Matrix Operations" explains in
270a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick    *      more detail how vectors and matrices are operated on."
271a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick    */
272a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   if (! multiply) {
273a13bb1490c57ea958f2d1853d71c55d03263e9e4Eric Anholt      if (type_a == type_b)
274a13bb1490c57ea958f2d1853d71c55d03263e9e4Eric Anholt	 return type_a;
275a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   } else {
276fce1150156edc8b51f5cf077679c0fdb5d582abaIan Romanick      if (type_a->is_matrix() && type_b->is_matrix()) {
277c1bd3a1a61364d8450629a935b4611184eb99654Ian Romanick	 /* Matrix multiply.  The columns of A must match the rows of B.  Given
278c1bd3a1a61364d8450629a935b4611184eb99654Ian Romanick	  * the other previously tested constraints, this means the vector type
279c1bd3a1a61364d8450629a935b4611184eb99654Ian Romanick	  * of a row from A must be the same as the vector type of a column from
280c1bd3a1a61364d8450629a935b4611184eb99654Ian Romanick	  * B.
281c1bd3a1a61364d8450629a935b4611184eb99654Ian Romanick	  */
282c1bd3a1a61364d8450629a935b4611184eb99654Ian Romanick	 if (type_a->row_type() == type_b->column_type()) {
283c1bd3a1a61364d8450629a935b4611184eb99654Ian Romanick	    /* The resulting matrix has the number of columns of matrix B and
284c1bd3a1a61364d8450629a935b4611184eb99654Ian Romanick	     * the number of rows of matrix A.  We get the row count of A by
285c1bd3a1a61364d8450629a935b4611184eb99654Ian Romanick	     * looking at the size of a vector that makes up a column.  The
286c1bd3a1a61364d8450629a935b4611184eb99654Ian Romanick	     * transpose (size of a row) is done for B.
287c1bd3a1a61364d8450629a935b4611184eb99654Ian Romanick	     */
288a13bb1490c57ea958f2d1853d71c55d03263e9e4Eric Anholt	    const glsl_type *const type =
289c1bd3a1a61364d8450629a935b4611184eb99654Ian Romanick	       glsl_type::get_instance(type_a->base_type,
290c1bd3a1a61364d8450629a935b4611184eb99654Ian Romanick				       type_a->column_type()->vector_elements,
291c1bd3a1a61364d8450629a935b4611184eb99654Ian Romanick				       type_b->row_type()->vector_elements);
292a13bb1490c57ea958f2d1853d71c55d03263e9e4Eric Anholt	    assert(type != glsl_type::error_type);
293a13bb1490c57ea958f2d1853d71c55d03263e9e4Eric Anholt
294a13bb1490c57ea958f2d1853d71c55d03263e9e4Eric Anholt	    return type;
295a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick	 }
296fce1150156edc8b51f5cf077679c0fdb5d582abaIan Romanick      } else if (type_a->is_matrix()) {
297a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick	 /* A is a matrix and B is a column vector.  Columns of A must match
298c1bd3a1a61364d8450629a935b4611184eb99654Ian Romanick	  * rows of B.  Given the other previously tested constraints, this
299c1bd3a1a61364d8450629a935b4611184eb99654Ian Romanick	  * means the vector type of a row from A must be the same as the
300c1bd3a1a61364d8450629a935b4611184eb99654Ian Romanick	  * vector the type of B.
301a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick	  */
30247c90b144729e3edf3b5cbf5b260c1c46e429879Carl Worth	 if (type_a->row_type() == type_b) {
30347c90b144729e3edf3b5cbf5b260c1c46e429879Carl Worth	    /* The resulting vector has a number of elements equal to
30447c90b144729e3edf3b5cbf5b260c1c46e429879Carl Worth	     * the number of rows of matrix A. */
30547c90b144729e3edf3b5cbf5b260c1c46e429879Carl Worth	    const glsl_type *const type =
30647c90b144729e3edf3b5cbf5b260c1c46e429879Carl Worth	       glsl_type::get_instance(type_a->base_type,
30747c90b144729e3edf3b5cbf5b260c1c46e429879Carl Worth				       type_a->column_type()->vector_elements,
30847c90b144729e3edf3b5cbf5b260c1c46e429879Carl Worth				       1);
30947c90b144729e3edf3b5cbf5b260c1c46e429879Carl Worth	    assert(type != glsl_type::error_type);
31047c90b144729e3edf3b5cbf5b260c1c46e429879Carl Worth
31147c90b144729e3edf3b5cbf5b260c1c46e429879Carl Worth	    return type;
31247c90b144729e3edf3b5cbf5b260c1c46e429879Carl Worth	 }
313a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick      } else {
314fce1150156edc8b51f5cf077679c0fdb5d582abaIan Romanick	 assert(type_b->is_matrix());
315a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick
316c1bd3a1a61364d8450629a935b4611184eb99654Ian Romanick	 /* A is a row vector and B is a matrix.  Columns of A must match rows
317c1bd3a1a61364d8450629a935b4611184eb99654Ian Romanick	  * of B.  Given the other previously tested constraints, this means
318c1bd3a1a61364d8450629a935b4611184eb99654Ian Romanick	  * the type of A must be the same as the vector type of a column from
319c1bd3a1a61364d8450629a935b4611184eb99654Ian Romanick	  * B.
320a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick	  */
32147c90b144729e3edf3b5cbf5b260c1c46e429879Carl Worth	 if (type_a == type_b->column_type()) {
32247c90b144729e3edf3b5cbf5b260c1c46e429879Carl Worth	    /* The resulting vector has a number of elements equal to
32347c90b144729e3edf3b5cbf5b260c1c46e429879Carl Worth	     * the number of columns of matrix B. */
32447c90b144729e3edf3b5cbf5b260c1c46e429879Carl Worth	    const glsl_type *const type =
32547c90b144729e3edf3b5cbf5b260c1c46e429879Carl Worth	       glsl_type::get_instance(type_a->base_type,
32647c90b144729e3edf3b5cbf5b260c1c46e429879Carl Worth				       type_b->row_type()->vector_elements,
32747c90b144729e3edf3b5cbf5b260c1c46e429879Carl Worth				       1);
32847c90b144729e3edf3b5cbf5b260c1c46e429879Carl Worth	    assert(type != glsl_type::error_type);
32947c90b144729e3edf3b5cbf5b260c1c46e429879Carl Worth
33047c90b144729e3edf3b5cbf5b260c1c46e429879Carl Worth	    return type;
33147c90b144729e3edf3b5cbf5b260c1c46e429879Carl Worth	 }
332a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick      }
333a13bb1490c57ea958f2d1853d71c55d03263e9e4Eric Anholt
334a13bb1490c57ea958f2d1853d71c55d03263e9e4Eric Anholt      _mesa_glsl_error(loc, state, "size mismatch for matrix multiplication");
335a13bb1490c57ea958f2d1853d71c55d03263e9e4Eric Anholt      return glsl_type::error_type;
336a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   }
337a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick
338a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick
339a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   /*    "All other cases are illegal."
340a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick    */
341a13bb1490c57ea958f2d1853d71c55d03263e9e4Eric Anholt   _mesa_glsl_error(loc, state, "type mismatch");
3420471e8b0896e05b3bc81ccad6184e6e35fb61425Ian Romanick   return glsl_type::error_type;
343a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick}
344a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick
345a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick
346a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanickstatic const struct glsl_type *
34765e1a7ac6a6735e135851ddb87e48361d4677000Eric Anholtunary_arithmetic_result_type(const struct glsl_type *type,
34865e1a7ac6a6735e135851ddb87e48361d4677000Eric Anholt			     struct _mesa_glsl_parse_state *state, YYLTYPE *loc)
349a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick{
350a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   /* From GLSL 1.50 spec, page 57:
351a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick    *
352a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick    *    "The arithmetic unary operators negate (-), post- and pre-increment
353a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick    *     and decrement (-- and ++) operate on integer or floating-point
354a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick    *     values (including vectors and matrices). All unary operators work
355a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick    *     component-wise on their operands. These result with the same type
356a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick    *     they operated on."
357a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick    */
35865e1a7ac6a6735e135851ddb87e48361d4677000Eric Anholt   if (!type->is_numeric()) {
35965e1a7ac6a6735e135851ddb87e48361d4677000Eric Anholt      _mesa_glsl_error(loc, state,
36065e1a7ac6a6735e135851ddb87e48361d4677000Eric Anholt		       "Operands to arithmetic operators must be numeric");
3610471e8b0896e05b3bc81ccad6184e6e35fb61425Ian Romanick      return glsl_type::error_type;
36265e1a7ac6a6735e135851ddb87e48361d4677000Eric Anholt   }
363a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick
364a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   return type;
365a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick}
366a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick
367cfdbf8bc8497b29fbdd9fa7bd00da554aecb5962Chad Versace/**
368cfdbf8bc8497b29fbdd9fa7bd00da554aecb5962Chad Versace * \brief Return the result type of a bit-logic operation.
369cfdbf8bc8497b29fbdd9fa7bd00da554aecb5962Chad Versace *
370cfdbf8bc8497b29fbdd9fa7bd00da554aecb5962Chad Versace * If the given types to the bit-logic operator are invalid, return
371cfdbf8bc8497b29fbdd9fa7bd00da554aecb5962Chad Versace * glsl_type::error_type.
372cfdbf8bc8497b29fbdd9fa7bd00da554aecb5962Chad Versace *
373cfdbf8bc8497b29fbdd9fa7bd00da554aecb5962Chad Versace * \param type_a Type of LHS of bit-logic op
374cfdbf8bc8497b29fbdd9fa7bd00da554aecb5962Chad Versace * \param type_b Type of RHS of bit-logic op
375cfdbf8bc8497b29fbdd9fa7bd00da554aecb5962Chad Versace */
376cfdbf8bc8497b29fbdd9fa7bd00da554aecb5962Chad Versacestatic const struct glsl_type *
377cfdbf8bc8497b29fbdd9fa7bd00da554aecb5962Chad Versacebit_logic_result_type(const struct glsl_type *type_a,
378cfdbf8bc8497b29fbdd9fa7bd00da554aecb5962Chad Versace                      const struct glsl_type *type_b,
379cfdbf8bc8497b29fbdd9fa7bd00da554aecb5962Chad Versace                      ast_operators op,
380cfdbf8bc8497b29fbdd9fa7bd00da554aecb5962Chad Versace                      struct _mesa_glsl_parse_state *state, YYLTYPE *loc)
381cfdbf8bc8497b29fbdd9fa7bd00da554aecb5962Chad Versace{
382cfdbf8bc8497b29fbdd9fa7bd00da554aecb5962Chad Versace    if (state->language_version < 130) {
383cfdbf8bc8497b29fbdd9fa7bd00da554aecb5962Chad Versace       _mesa_glsl_error(loc, state, "bit operations require GLSL 1.30");
384cfdbf8bc8497b29fbdd9fa7bd00da554aecb5962Chad Versace       return glsl_type::error_type;
385cfdbf8bc8497b29fbdd9fa7bd00da554aecb5962Chad Versace    }
386cfdbf8bc8497b29fbdd9fa7bd00da554aecb5962Chad Versace
387cfdbf8bc8497b29fbdd9fa7bd00da554aecb5962Chad Versace    /* From page 50 (page 56 of PDF) of GLSL 1.30 spec:
388cfdbf8bc8497b29fbdd9fa7bd00da554aecb5962Chad Versace     *
389cfdbf8bc8497b29fbdd9fa7bd00da554aecb5962Chad Versace     *     "The bitwise operators and (&), exclusive-or (^), and inclusive-or
390cfdbf8bc8497b29fbdd9fa7bd00da554aecb5962Chad Versace     *     (|). The operands must be of type signed or unsigned integers or
391cfdbf8bc8497b29fbdd9fa7bd00da554aecb5962Chad Versace     *     integer vectors."
392cfdbf8bc8497b29fbdd9fa7bd00da554aecb5962Chad Versace     */
393cfdbf8bc8497b29fbdd9fa7bd00da554aecb5962Chad Versace    if (!type_a->is_integer()) {
394cfdbf8bc8497b29fbdd9fa7bd00da554aecb5962Chad Versace       _mesa_glsl_error(loc, state, "LHS of `%s' must be an integer",
395cfdbf8bc8497b29fbdd9fa7bd00da554aecb5962Chad Versace                         ast_expression::operator_string(op));
396cfdbf8bc8497b29fbdd9fa7bd00da554aecb5962Chad Versace       return glsl_type::error_type;
397cfdbf8bc8497b29fbdd9fa7bd00da554aecb5962Chad Versace    }
398cfdbf8bc8497b29fbdd9fa7bd00da554aecb5962Chad Versace    if (!type_b->is_integer()) {
399cfdbf8bc8497b29fbdd9fa7bd00da554aecb5962Chad Versace       _mesa_glsl_error(loc, state, "RHS of `%s' must be an integer",
400cfdbf8bc8497b29fbdd9fa7bd00da554aecb5962Chad Versace                        ast_expression::operator_string(op));
401cfdbf8bc8497b29fbdd9fa7bd00da554aecb5962Chad Versace       return glsl_type::error_type;
402cfdbf8bc8497b29fbdd9fa7bd00da554aecb5962Chad Versace    }
403cfdbf8bc8497b29fbdd9fa7bd00da554aecb5962Chad Versace
404cfdbf8bc8497b29fbdd9fa7bd00da554aecb5962Chad Versace    /*     "The fundamental types of the operands (signed or unsigned) must
405cfdbf8bc8497b29fbdd9fa7bd00da554aecb5962Chad Versace     *     match,"
406cfdbf8bc8497b29fbdd9fa7bd00da554aecb5962Chad Versace     */
407cfdbf8bc8497b29fbdd9fa7bd00da554aecb5962Chad Versace    if (type_a->base_type != type_b->base_type) {
408cfdbf8bc8497b29fbdd9fa7bd00da554aecb5962Chad Versace       _mesa_glsl_error(loc, state, "operands of `%s' must have the same "
409cfdbf8bc8497b29fbdd9fa7bd00da554aecb5962Chad Versace                        "base type", ast_expression::operator_string(op));
410cfdbf8bc8497b29fbdd9fa7bd00da554aecb5962Chad Versace       return glsl_type::error_type;
411cfdbf8bc8497b29fbdd9fa7bd00da554aecb5962Chad Versace    }
412cfdbf8bc8497b29fbdd9fa7bd00da554aecb5962Chad Versace
413cfdbf8bc8497b29fbdd9fa7bd00da554aecb5962Chad Versace    /*     "The operands cannot be vectors of differing size." */
414cfdbf8bc8497b29fbdd9fa7bd00da554aecb5962Chad Versace    if (type_a->is_vector() &&
415cfdbf8bc8497b29fbdd9fa7bd00da554aecb5962Chad Versace        type_b->is_vector() &&
416cfdbf8bc8497b29fbdd9fa7bd00da554aecb5962Chad Versace        type_a->vector_elements != type_b->vector_elements) {
417cfdbf8bc8497b29fbdd9fa7bd00da554aecb5962Chad Versace       _mesa_glsl_error(loc, state, "operands of `%s' cannot be vectors of "
418cfdbf8bc8497b29fbdd9fa7bd00da554aecb5962Chad Versace                        "different sizes", ast_expression::operator_string(op));
419cfdbf8bc8497b29fbdd9fa7bd00da554aecb5962Chad Versace       return glsl_type::error_type;
420cfdbf8bc8497b29fbdd9fa7bd00da554aecb5962Chad Versace    }
421cfdbf8bc8497b29fbdd9fa7bd00da554aecb5962Chad Versace
422cfdbf8bc8497b29fbdd9fa7bd00da554aecb5962Chad Versace    /*     "If one operand is a scalar and the other a vector, the scalar is
423cfdbf8bc8497b29fbdd9fa7bd00da554aecb5962Chad Versace     *     applied component-wise to the vector, resulting in the same type as
424cfdbf8bc8497b29fbdd9fa7bd00da554aecb5962Chad Versace     *     the vector. The fundamental types of the operands [...] will be the
425cfdbf8bc8497b29fbdd9fa7bd00da554aecb5962Chad Versace     *     resulting fundamental type."
426cfdbf8bc8497b29fbdd9fa7bd00da554aecb5962Chad Versace     */
427cfdbf8bc8497b29fbdd9fa7bd00da554aecb5962Chad Versace    if (type_a->is_scalar())
428cfdbf8bc8497b29fbdd9fa7bd00da554aecb5962Chad Versace        return type_b;
429cfdbf8bc8497b29fbdd9fa7bd00da554aecb5962Chad Versace    else
430cfdbf8bc8497b29fbdd9fa7bd00da554aecb5962Chad Versace        return type_a;
431cfdbf8bc8497b29fbdd9fa7bd00da554aecb5962Chad Versace}
432a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick
433a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanickstatic const struct glsl_type *
434a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanickmodulus_result_type(const struct glsl_type *type_a,
43565e1a7ac6a6735e135851ddb87e48361d4677000Eric Anholt		    const struct glsl_type *type_b,
43665e1a7ac6a6735e135851ddb87e48361d4677000Eric Anholt		    struct _mesa_glsl_parse_state *state, YYLTYPE *loc)
437a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick{
438a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   /* From GLSL 1.50 spec, page 56:
439a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick    *    "The operator modulus (%) operates on signed or unsigned integers or
440a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick    *    integer vectors. The operand types must both be signed or both be
441a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick    *    unsigned."
442a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick    */
44340176e249f72b6090204611873b19aed3da67c71Ian Romanick   if (!type_a->is_integer() || !type_b->is_integer()
444a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick       || (type_a->base_type != type_b->base_type)) {
44565e1a7ac6a6735e135851ddb87e48361d4677000Eric Anholt      _mesa_glsl_error(loc, state, "type mismatch");
4460471e8b0896e05b3bc81ccad6184e6e35fb61425Ian Romanick      return glsl_type::error_type;
447a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   }
448a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick
449a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   /*    "The operands cannot be vectors of differing size. If one operand is
450a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick    *    a scalar and the other vector, then the scalar is applied component-
451a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick    *    wise to the vector, resulting in the same type as the vector. If both
452a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick    *    are vectors of the same size, the result is computed component-wise."
453a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick    */
454a2dd22fb194bdffa14a2466ae5667f3be63430d3Ian Romanick   if (type_a->is_vector()) {
455a2dd22fb194bdffa14a2466ae5667f3be63430d3Ian Romanick      if (!type_b->is_vector()
456a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick	  || (type_a->vector_elements == type_b->vector_elements))
457a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick	 return type_a;
458a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   } else
459a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick      return type_b;
460a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick
461a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   /*    "The operator modulus (%) is not defined for any other data types
462a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick    *    (non-integer types)."
463a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick    */
46465e1a7ac6a6735e135851ddb87e48361d4677000Eric Anholt   _mesa_glsl_error(loc, state, "type mismatch");
4650471e8b0896e05b3bc81ccad6184e6e35fb61425Ian Romanick   return glsl_type::error_type;
466a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick}
467a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick
468a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick
469a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanickstatic const struct glsl_type *
470bfb09c2a94414c1b40108c9c41eb0844d932e459Ian Romanickrelational_result_type(ir_rvalue * &value_a, ir_rvalue * &value_b,
47165e1a7ac6a6735e135851ddb87e48361d4677000Eric Anholt		       struct _mesa_glsl_parse_state *state, YYLTYPE *loc)
472a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick{
473336b4ad8c76a525a0df2f4b0fc1d67e86bc5db3fEric Anholt   const glsl_type *type_a = value_a->type;
474336b4ad8c76a525a0df2f4b0fc1d67e86bc5db3fEric Anholt   const glsl_type *type_b = value_b->type;
4750150f5f20edaef96520af5d1bbed0e62e24918e5Ian Romanick
476a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   /* From GLSL 1.50 spec, page 56:
477a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick    *    "The relational operators greater than (>), less than (<), greater
478a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick    *    than or equal (>=), and less than or equal (<=) operate only on
479a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick    *    scalar integer and scalar floating-point expressions."
480a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick    */
481a6d653dcbbee3158f9ea7b284bdeb1a8432f0fcbIan Romanick   if (!type_a->is_numeric()
482a6d653dcbbee3158f9ea7b284bdeb1a8432f0fcbIan Romanick       || !type_b->is_numeric()
483cb36f8aaeeb09660843316270a781948f773d90bIan Romanick       || !type_a->is_scalar()
48465e1a7ac6a6735e135851ddb87e48361d4677000Eric Anholt       || !type_b->is_scalar()) {
48565e1a7ac6a6735e135851ddb87e48361d4677000Eric Anholt      _mesa_glsl_error(loc, state,
48665e1a7ac6a6735e135851ddb87e48361d4677000Eric Anholt		       "Operands to relational operators must be scalar and "
48765e1a7ac6a6735e135851ddb87e48361d4677000Eric Anholt		       "numeric");
4880471e8b0896e05b3bc81ccad6184e6e35fb61425Ian Romanick      return glsl_type::error_type;
48965e1a7ac6a6735e135851ddb87e48361d4677000Eric Anholt   }
490a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick
491a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   /*    "Either the operands' types must match, or the conversions from
492a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick    *    Section 4.1.10 "Implicit Conversions" will be applied to the integer
493a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick    *    operand, after which the types must match."
494a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick    */
4950150f5f20edaef96520af5d1bbed0e62e24918e5Ian Romanick   if (!apply_implicit_conversion(type_a, value_b, state)
4960150f5f20edaef96520af5d1bbed0e62e24918e5Ian Romanick       && !apply_implicit_conversion(type_b, value_a, state)) {
49765e1a7ac6a6735e135851ddb87e48361d4677000Eric Anholt      _mesa_glsl_error(loc, state,
49865e1a7ac6a6735e135851ddb87e48361d4677000Eric Anholt		       "Could not implicitly convert operands to "
49965e1a7ac6a6735e135851ddb87e48361d4677000Eric Anholt		       "relational operator");
5000150f5f20edaef96520af5d1bbed0e62e24918e5Ian Romanick      return glsl_type::error_type;
501a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   }
502336b4ad8c76a525a0df2f4b0fc1d67e86bc5db3fEric Anholt   type_a = value_a->type;
503336b4ad8c76a525a0df2f4b0fc1d67e86bc5db3fEric Anholt   type_b = value_b->type;
504a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick
50565e1a7ac6a6735e135851ddb87e48361d4677000Eric Anholt   if (type_a->base_type != type_b->base_type) {
50665e1a7ac6a6735e135851ddb87e48361d4677000Eric Anholt      _mesa_glsl_error(loc, state, "base type mismatch");
5070471e8b0896e05b3bc81ccad6184e6e35fb61425Ian Romanick      return glsl_type::error_type;
50865e1a7ac6a6735e135851ddb87e48361d4677000Eric Anholt   }
509a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick
510a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   /*    "The result is scalar Boolean."
511a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick    */
5120471e8b0896e05b3bc81ccad6184e6e35fb61425Ian Romanick   return glsl_type::bool_type;
513a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick}
514a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick
515c0197ab0af94ed0f3b2d453fb1ee6589f15d8e9cChad Versace/**
516c0197ab0af94ed0f3b2d453fb1ee6589f15d8e9cChad Versace * \brief Return the result type of a bit-shift operation.
517c0197ab0af94ed0f3b2d453fb1ee6589f15d8e9cChad Versace *
518c0197ab0af94ed0f3b2d453fb1ee6589f15d8e9cChad Versace * If the given types to the bit-shift operator are invalid, return
519c0197ab0af94ed0f3b2d453fb1ee6589f15d8e9cChad Versace * glsl_type::error_type.
520c0197ab0af94ed0f3b2d453fb1ee6589f15d8e9cChad Versace *
521c0197ab0af94ed0f3b2d453fb1ee6589f15d8e9cChad Versace * \param type_a Type of LHS of bit-shift op
522c0197ab0af94ed0f3b2d453fb1ee6589f15d8e9cChad Versace * \param type_b Type of RHS of bit-shift op
523c0197ab0af94ed0f3b2d453fb1ee6589f15d8e9cChad Versace */
524c0197ab0af94ed0f3b2d453fb1ee6589f15d8e9cChad Versacestatic const struct glsl_type *
525c0197ab0af94ed0f3b2d453fb1ee6589f15d8e9cChad Versaceshift_result_type(const struct glsl_type *type_a,
526c0197ab0af94ed0f3b2d453fb1ee6589f15d8e9cChad Versace                  const struct glsl_type *type_b,
527c0197ab0af94ed0f3b2d453fb1ee6589f15d8e9cChad Versace                  ast_operators op,
528c0197ab0af94ed0f3b2d453fb1ee6589f15d8e9cChad Versace                  struct _mesa_glsl_parse_state *state, YYLTYPE *loc)
529c0197ab0af94ed0f3b2d453fb1ee6589f15d8e9cChad Versace{
530c0197ab0af94ed0f3b2d453fb1ee6589f15d8e9cChad Versace   if (state->language_version < 130) {
531c0197ab0af94ed0f3b2d453fb1ee6589f15d8e9cChad Versace      _mesa_glsl_error(loc, state, "bit operations require GLSL 1.30");
532c0197ab0af94ed0f3b2d453fb1ee6589f15d8e9cChad Versace      return glsl_type::error_type;
533c0197ab0af94ed0f3b2d453fb1ee6589f15d8e9cChad Versace   }
534c0197ab0af94ed0f3b2d453fb1ee6589f15d8e9cChad Versace
535c0197ab0af94ed0f3b2d453fb1ee6589f15d8e9cChad Versace   /* From page 50 (page 56 of the PDF) of the GLSL 1.30 spec:
536c0197ab0af94ed0f3b2d453fb1ee6589f15d8e9cChad Versace    *
537c0197ab0af94ed0f3b2d453fb1ee6589f15d8e9cChad Versace    *     "The shift operators (<<) and (>>). For both operators, the operands
538c0197ab0af94ed0f3b2d453fb1ee6589f15d8e9cChad Versace    *     must be signed or unsigned integers or integer vectors. One operand
539c0197ab0af94ed0f3b2d453fb1ee6589f15d8e9cChad Versace    *     can be signed while the other is unsigned."
540c0197ab0af94ed0f3b2d453fb1ee6589f15d8e9cChad Versace    */
541c0197ab0af94ed0f3b2d453fb1ee6589f15d8e9cChad Versace   if (!type_a->is_integer()) {
542c0197ab0af94ed0f3b2d453fb1ee6589f15d8e9cChad Versace      _mesa_glsl_error(loc, state, "LHS of operator %s must be an integer or "
543c0197ab0af94ed0f3b2d453fb1ee6589f15d8e9cChad Versace              "integer vector", ast_expression::operator_string(op));
544c0197ab0af94ed0f3b2d453fb1ee6589f15d8e9cChad Versace     return glsl_type::error_type;
545c0197ab0af94ed0f3b2d453fb1ee6589f15d8e9cChad Versace
546c0197ab0af94ed0f3b2d453fb1ee6589f15d8e9cChad Versace   }
547c0197ab0af94ed0f3b2d453fb1ee6589f15d8e9cChad Versace   if (!type_b->is_integer()) {
548c0197ab0af94ed0f3b2d453fb1ee6589f15d8e9cChad Versace      _mesa_glsl_error(loc, state, "RHS of operator %s must be an integer or "
549c0197ab0af94ed0f3b2d453fb1ee6589f15d8e9cChad Versace              "integer vector", ast_expression::operator_string(op));
550c0197ab0af94ed0f3b2d453fb1ee6589f15d8e9cChad Versace     return glsl_type::error_type;
551c0197ab0af94ed0f3b2d453fb1ee6589f15d8e9cChad Versace   }
552c0197ab0af94ed0f3b2d453fb1ee6589f15d8e9cChad Versace
553c0197ab0af94ed0f3b2d453fb1ee6589f15d8e9cChad Versace   /*     "If the first operand is a scalar, the second operand has to be
554c0197ab0af94ed0f3b2d453fb1ee6589f15d8e9cChad Versace    *     a scalar as well."
555c0197ab0af94ed0f3b2d453fb1ee6589f15d8e9cChad Versace    */
556c0197ab0af94ed0f3b2d453fb1ee6589f15d8e9cChad Versace   if (type_a->is_scalar() && !type_b->is_scalar()) {
557c0197ab0af94ed0f3b2d453fb1ee6589f15d8e9cChad Versace      _mesa_glsl_error(loc, state, "If the first operand of %s is scalar, the "
558c0197ab0af94ed0f3b2d453fb1ee6589f15d8e9cChad Versace              "second must be scalar as well",
559c0197ab0af94ed0f3b2d453fb1ee6589f15d8e9cChad Versace              ast_expression::operator_string(op));
560c0197ab0af94ed0f3b2d453fb1ee6589f15d8e9cChad Versace     return glsl_type::error_type;
561c0197ab0af94ed0f3b2d453fb1ee6589f15d8e9cChad Versace   }
562c0197ab0af94ed0f3b2d453fb1ee6589f15d8e9cChad Versace
563c0197ab0af94ed0f3b2d453fb1ee6589f15d8e9cChad Versace   /* If both operands are vectors, check that they have same number of
564c0197ab0af94ed0f3b2d453fb1ee6589f15d8e9cChad Versace    * elements.
565c0197ab0af94ed0f3b2d453fb1ee6589f15d8e9cChad Versace    */
566c0197ab0af94ed0f3b2d453fb1ee6589f15d8e9cChad Versace   if (type_a->is_vector() &&
567c0197ab0af94ed0f3b2d453fb1ee6589f15d8e9cChad Versace      type_b->is_vector() &&
568c0197ab0af94ed0f3b2d453fb1ee6589f15d8e9cChad Versace      type_a->vector_elements != type_b->vector_elements) {
569c0197ab0af94ed0f3b2d453fb1ee6589f15d8e9cChad Versace      _mesa_glsl_error(loc, state, "Vector operands to operator %s must "
570c0197ab0af94ed0f3b2d453fb1ee6589f15d8e9cChad Versace              "have same number of elements",
571c0197ab0af94ed0f3b2d453fb1ee6589f15d8e9cChad Versace              ast_expression::operator_string(op));
572c0197ab0af94ed0f3b2d453fb1ee6589f15d8e9cChad Versace     return glsl_type::error_type;
573c0197ab0af94ed0f3b2d453fb1ee6589f15d8e9cChad Versace   }
574c0197ab0af94ed0f3b2d453fb1ee6589f15d8e9cChad Versace
575c0197ab0af94ed0f3b2d453fb1ee6589f15d8e9cChad Versace   /*     "In all cases, the resulting type will be the same type as the left
576c0197ab0af94ed0f3b2d453fb1ee6589f15d8e9cChad Versace    *     operand."
577c0197ab0af94ed0f3b2d453fb1ee6589f15d8e9cChad Versace    */
578c0197ab0af94ed0f3b2d453fb1ee6589f15d8e9cChad Versace   return type_a;
579c0197ab0af94ed0f3b2d453fb1ee6589f15d8e9cChad Versace}
580a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick
5810bb1c3c1539fcadaa90d592a296c2ff1de3787a4Ian Romanick/**
5820bb1c3c1539fcadaa90d592a296c2ff1de3787a4Ian Romanick * Validates that a value can be assigned to a location with a specified type
5830bb1c3c1539fcadaa90d592a296c2ff1de3787a4Ian Romanick *
5840bb1c3c1539fcadaa90d592a296c2ff1de3787a4Ian Romanick * Validates that \c rhs can be assigned to some location.  If the types are
5850bb1c3c1539fcadaa90d592a296c2ff1de3787a4Ian Romanick * not an exact match but an automatic conversion is possible, \c rhs will be
5860bb1c3c1539fcadaa90d592a296c2ff1de3787a4Ian Romanick * converted.
5870bb1c3c1539fcadaa90d592a296c2ff1de3787a4Ian Romanick *
5880bb1c3c1539fcadaa90d592a296c2ff1de3787a4Ian Romanick * \return
5890bb1c3c1539fcadaa90d592a296c2ff1de3787a4Ian Romanick * \c NULL if \c rhs cannot be assigned to a location with type \c lhs_type.
5900bb1c3c1539fcadaa90d592a296c2ff1de3787a4Ian Romanick * Otherwise the actual RHS to be assigned will be returned.  This may be
5910bb1c3c1539fcadaa90d592a296c2ff1de3787a4Ian Romanick * \c rhs, or it may be \c rhs after some type conversion.
5920bb1c3c1539fcadaa90d592a296c2ff1de3787a4Ian Romanick *
5930bb1c3c1539fcadaa90d592a296c2ff1de3787a4Ian Romanick * \note
5940bb1c3c1539fcadaa90d592a296c2ff1de3787a4Ian Romanick * In addition to being used for assignments, this function is used to
5950bb1c3c1539fcadaa90d592a296c2ff1de3787a4Ian Romanick * type-check return values.
5960bb1c3c1539fcadaa90d592a296c2ff1de3787a4Ian Romanick */
597fb9fb5f51deca28ed1ec7b71759fb71fc26a0ab6Kenneth Graunkeir_rvalue *
598336b4ad8c76a525a0df2f4b0fc1d67e86bc5db3fEric Anholtvalidate_assignment(struct _mesa_glsl_parse_state *state,
599336b4ad8c76a525a0df2f4b0fc1d67e86bc5db3fEric Anholt		    const glsl_type *lhs_type, ir_rvalue *rhs)
6000bb1c3c1539fcadaa90d592a296c2ff1de3787a4Ian Romanick{
6010bb1c3c1539fcadaa90d592a296c2ff1de3787a4Ian Romanick   /* If there is already some error in the RHS, just return it.  Anything
6020bb1c3c1539fcadaa90d592a296c2ff1de3787a4Ian Romanick    * else will lead to an avalanche of error message back to the user.
6030bb1c3c1539fcadaa90d592a296c2ff1de3787a4Ian Romanick    */
604ec53010c4d02e11171d3c782a41b70cad76788e8Ian Romanick   if (rhs->type->is_error())
6050bb1c3c1539fcadaa90d592a296c2ff1de3787a4Ian Romanick      return rhs;
6060bb1c3c1539fcadaa90d592a296c2ff1de3787a4Ian Romanick
6070bb1c3c1539fcadaa90d592a296c2ff1de3787a4Ian Romanick   /* If the types are identical, the assignment can trivially proceed.
6080bb1c3c1539fcadaa90d592a296c2ff1de3787a4Ian Romanick    */
609ec53010c4d02e11171d3c782a41b70cad76788e8Ian Romanick   if (rhs->type == lhs_type)
6100bb1c3c1539fcadaa90d592a296c2ff1de3787a4Ian Romanick      return rhs;
6110bb1c3c1539fcadaa90d592a296c2ff1de3787a4Ian Romanick
6120157f41e5e644632393edf903f3c1adb1cf782cdIan Romanick   /* If the array element types are the same and the size of the LHS is zero,
6130157f41e5e644632393edf903f3c1adb1cf782cdIan Romanick    * the assignment is okay.
6140157f41e5e644632393edf903f3c1adb1cf782cdIan Romanick    *
6150157f41e5e644632393edf903f3c1adb1cf782cdIan Romanick    * Note: Whole-array assignments are not permitted in GLSL 1.10, but this
6160157f41e5e644632393edf903f3c1adb1cf782cdIan Romanick    * is handled by ir_dereference::is_lvalue.
6170157f41e5e644632393edf903f3c1adb1cf782cdIan Romanick    */
6180157f41e5e644632393edf903f3c1adb1cf782cdIan Romanick   if (lhs_type->is_array() && rhs->type->is_array()
6190157f41e5e644632393edf903f3c1adb1cf782cdIan Romanick       && (lhs_type->element_type() == rhs->type->element_type())
6200157f41e5e644632393edf903f3c1adb1cf782cdIan Romanick       && (lhs_type->array_size() == 0)) {
6210157f41e5e644632393edf903f3c1adb1cf782cdIan Romanick      return rhs;
6220157f41e5e644632393edf903f3c1adb1cf782cdIan Romanick   }
6230157f41e5e644632393edf903f3c1adb1cf782cdIan Romanick
624336b4ad8c76a525a0df2f4b0fc1d67e86bc5db3fEric Anholt   /* Check for implicit conversion in GLSL 1.20 */
625336b4ad8c76a525a0df2f4b0fc1d67e86bc5db3fEric Anholt   if (apply_implicit_conversion(lhs_type, rhs, state)) {
626ec53010c4d02e11171d3c782a41b70cad76788e8Ian Romanick      if (rhs->type == lhs_type)
627336b4ad8c76a525a0df2f4b0fc1d67e86bc5db3fEric Anholt	 return rhs;
628336b4ad8c76a525a0df2f4b0fc1d67e86bc5db3fEric Anholt   }
629336b4ad8c76a525a0df2f4b0fc1d67e86bc5db3fEric Anholt
6300bb1c3c1539fcadaa90d592a296c2ff1de3787a4Ian Romanick   return NULL;
6310bb1c3c1539fcadaa90d592a296c2ff1de3787a4Ian Romanick}
6320bb1c3c1539fcadaa90d592a296c2ff1de3787a4Ian Romanick
63310a685218610e737e23d2d8a243ed6ff6613becdEric Anholtir_rvalue *
63410a685218610e737e23d2d8a243ed6ff6613becdEric Anholtdo_assignment(exec_list *instructions, struct _mesa_glsl_parse_state *state,
63510a685218610e737e23d2d8a243ed6ff6613becdEric Anholt	      ir_rvalue *lhs, ir_rvalue *rhs,
63610a685218610e737e23d2d8a243ed6ff6613becdEric Anholt	      YYLTYPE lhs_loc)
63710a685218610e737e23d2d8a243ed6ff6613becdEric Anholt{
638953ff1283d3d52e6a6b4850c2b0b574111625010Kenneth Graunke   void *ctx = state;
63910a685218610e737e23d2d8a243ed6ff6613becdEric Anholt   bool error_emitted = (lhs->type->is_error() || rhs->type->is_error());
64010a685218610e737e23d2d8a243ed6ff6613becdEric Anholt
64110a685218610e737e23d2d8a243ed6ff6613becdEric Anholt   if (!error_emitted) {
642b66be7518ad57368b31b5d70a2bb4c0fe66aa988Chad Versace      if (lhs->variable_referenced() != NULL
643b66be7518ad57368b31b5d70a2bb4c0fe66aa988Chad Versace          && lhs->variable_referenced()->read_only) {
644b66be7518ad57368b31b5d70a2bb4c0fe66aa988Chad Versace         _mesa_glsl_error(&lhs_loc, state,
645b66be7518ad57368b31b5d70a2bb4c0fe66aa988Chad Versace                          "assignment to read-only variable '%s'",
646b66be7518ad57368b31b5d70a2bb4c0fe66aa988Chad Versace                          lhs->variable_referenced()->name);
647b66be7518ad57368b31b5d70a2bb4c0fe66aa988Chad Versace         error_emitted = true;
648b66be7518ad57368b31b5d70a2bb4c0fe66aa988Chad Versace
649b66be7518ad57368b31b5d70a2bb4c0fe66aa988Chad Versace      } else if (!lhs->is_lvalue()) {
65010a685218610e737e23d2d8a243ed6ff6613becdEric Anholt	 _mesa_glsl_error(& lhs_loc, state, "non-lvalue in assignment");
65110a685218610e737e23d2d8a243ed6ff6613becdEric Anholt	 error_emitted = true;
65210a685218610e737e23d2d8a243ed6ff6613becdEric Anholt      }
65310eaa8bcbce1cd6d2e120e913f7abafde9675215Kenneth Graunke
65410eaa8bcbce1cd6d2e120e913f7abafde9675215Kenneth Graunke      if (state->es_shader && lhs->type->is_array()) {
65510eaa8bcbce1cd6d2e120e913f7abafde9675215Kenneth Graunke	 _mesa_glsl_error(&lhs_loc, state, "whole array assignment is not "
65610eaa8bcbce1cd6d2e120e913f7abafde9675215Kenneth Graunke			  "allowed in GLSL ES 1.00.");
65710eaa8bcbce1cd6d2e120e913f7abafde9675215Kenneth Graunke	 error_emitted = true;
65810eaa8bcbce1cd6d2e120e913f7abafde9675215Kenneth Graunke      }
65910a685218610e737e23d2d8a243ed6ff6613becdEric Anholt   }
66010a685218610e737e23d2d8a243ed6ff6613becdEric Anholt
661336b4ad8c76a525a0df2f4b0fc1d67e86bc5db3fEric Anholt   ir_rvalue *new_rhs = validate_assignment(state, lhs->type, rhs);
66210a685218610e737e23d2d8a243ed6ff6613becdEric Anholt   if (new_rhs == NULL) {
66310a685218610e737e23d2d8a243ed6ff6613becdEric Anholt      _mesa_glsl_error(& lhs_loc, state, "type mismatch");
66410a685218610e737e23d2d8a243ed6ff6613becdEric Anholt   } else {
66510a685218610e737e23d2d8a243ed6ff6613becdEric Anholt      rhs = new_rhs;
6660157f41e5e644632393edf903f3c1adb1cf782cdIan Romanick
6670157f41e5e644632393edf903f3c1adb1cf782cdIan Romanick      /* If the LHS array was not declared with a size, it takes it size from
6680157f41e5e644632393edf903f3c1adb1cf782cdIan Romanick       * the RHS.  If the LHS is an l-value and a whole array, it must be a
6690157f41e5e644632393edf903f3c1adb1cf782cdIan Romanick       * dereference of a variable.  Any other case would require that the LHS
6700157f41e5e644632393edf903f3c1adb1cf782cdIan Romanick       * is either not an l-value or not a whole array.
6710157f41e5e644632393edf903f3c1adb1cf782cdIan Romanick       */
6720157f41e5e644632393edf903f3c1adb1cf782cdIan Romanick      if (lhs->type->array_size() == 0) {
6730157f41e5e644632393edf903f3c1adb1cf782cdIan Romanick	 ir_dereference *const d = lhs->as_dereference();
6740157f41e5e644632393edf903f3c1adb1cf782cdIan Romanick
6750157f41e5e644632393edf903f3c1adb1cf782cdIan Romanick	 assert(d != NULL);
6760157f41e5e644632393edf903f3c1adb1cf782cdIan Romanick
67736ea28646c666ac2af9b43c47e65f9f53ffcc390Ian Romanick	 ir_variable *const var = d->variable_referenced();
6780157f41e5e644632393edf903f3c1adb1cf782cdIan Romanick
6790157f41e5e644632393edf903f3c1adb1cf782cdIan Romanick	 assert(var != NULL);
6800157f41e5e644632393edf903f3c1adb1cf782cdIan Romanick
68163f394203a8be9b87f8617cd7a56a0806c0870b3Ian Romanick	 if (var->max_array_access >= unsigned(rhs->type->array_size())) {
68263f394203a8be9b87f8617cd7a56a0806c0870b3Ian Romanick	    /* FINISHME: This should actually log the location of the RHS. */
68363f394203a8be9b87f8617cd7a56a0806c0870b3Ian Romanick	    _mesa_glsl_error(& lhs_loc, state, "array size must be > %u due to "
68463f394203a8be9b87f8617cd7a56a0806c0870b3Ian Romanick			     "previous access",
68563f394203a8be9b87f8617cd7a56a0806c0870b3Ian Romanick			     var->max_array_access);
68663f394203a8be9b87f8617cd7a56a0806c0870b3Ian Romanick	 }
68763f394203a8be9b87f8617cd7a56a0806c0870b3Ian Romanick
688f38d15b80d4e4c8ecb7a76087cdc49835f0aa271Ian Romanick	 var->type = glsl_type::get_array_instance(lhs->type->element_type(),
6890157f41e5e644632393edf903f3c1adb1cf782cdIan Romanick						   rhs->type->array_size());
6909703ed05e684f4269cd8af27c94e9b6bf8781d85Eric Anholt	 d->type = var->type;
6910157f41e5e644632393edf903f3c1adb1cf782cdIan Romanick      }
69210a685218610e737e23d2d8a243ed6ff6613becdEric Anholt   }
69310a685218610e737e23d2d8a243ed6ff6613becdEric Anholt
6942731a739d047e4aadc1cab4bcf8c01c1cf8e86dbEric Anholt   /* Most callers of do_assignment (assign, add_assign, pre_inc/dec,
6952731a739d047e4aadc1cab4bcf8c01c1cf8e86dbEric Anholt    * but not post_inc) need the converted assigned value as an rvalue
6962731a739d047e4aadc1cab4bcf8c01c1cf8e86dbEric Anholt    * to handle things like:
6972731a739d047e4aadc1cab4bcf8c01c1cf8e86dbEric Anholt    *
6982731a739d047e4aadc1cab4bcf8c01c1cf8e86dbEric Anholt    * i = j += 1;
6992731a739d047e4aadc1cab4bcf8c01c1cf8e86dbEric Anholt    *
7002731a739d047e4aadc1cab4bcf8c01c1cf8e86dbEric Anholt    * So we always just store the computed value being assigned to a
7012731a739d047e4aadc1cab4bcf8c01c1cf8e86dbEric Anholt    * temporary and return a deref of that temporary.  If the rvalue
7022731a739d047e4aadc1cab4bcf8c01c1cf8e86dbEric Anholt    * ends up not being used, the temp will get copy-propagated out.
7032731a739d047e4aadc1cab4bcf8c01c1cf8e86dbEric Anholt    */
7047e2aa91507a5883e33473e0a94215ee3985baad1Ian Romanick   ir_variable *var = new(ctx) ir_variable(rhs->type, "assignment_tmp",
7057e2aa91507a5883e33473e0a94215ee3985baad1Ian Romanick					   ir_var_temporary);
706e33c10328caec29616a5433b1d1df9088f3a84dfEric Anholt   ir_dereference_variable *deref_var = new(ctx) ir_dereference_variable(var);
707ae805922b7e3cdaf3aee26c3b799fe3608669bbaEric Anholt   instructions->push_tail(var);
708e33c10328caec29616a5433b1d1df9088f3a84dfEric Anholt   instructions->push_tail(new(ctx) ir_assignment(deref_var,
7091660a2954797e056caba319c5d6c70b0d4be22feCarl Worth						  rhs,
7101660a2954797e056caba319c5d6c70b0d4be22feCarl Worth						  NULL));
711e33c10328caec29616a5433b1d1df9088f3a84dfEric Anholt   deref_var = new(ctx) ir_dereference_variable(var);
7122731a739d047e4aadc1cab4bcf8c01c1cf8e86dbEric Anholt
7138e9ce2eb56a087c2544112700ae1abe3f96648ddIan Romanick   if (!error_emitted)
7148e9ce2eb56a087c2544112700ae1abe3f96648ddIan Romanick      instructions->push_tail(new(ctx) ir_assignment(lhs, deref_var, NULL));
71510a685218610e737e23d2d8a243ed6ff6613becdEric Anholt
7161660a2954797e056caba319c5d6c70b0d4be22feCarl Worth   return new(ctx) ir_dereference_variable(var);
71710a685218610e737e23d2d8a243ed6ff6613becdEric Anholt}
7180bb1c3c1539fcadaa90d592a296c2ff1de3787a4Ian Romanick
719de38f0ed53c80f87478c3899d4ff1bc3a601ea6bEric Anholtstatic ir_rvalue *
720959a9ecdd8fbc3375e4149f2b44d253622ff12eeEric Anholtget_lvalue_copy(exec_list *instructions, ir_rvalue *lvalue)
721de38f0ed53c80f87478c3899d4ff1bc3a601ea6bEric Anholt{
7221660a2954797e056caba319c5d6c70b0d4be22feCarl Worth   void *ctx = talloc_parent(lvalue);
723de38f0ed53c80f87478c3899d4ff1bc3a601ea6bEric Anholt   ir_variable *var;
724de38f0ed53c80f87478c3899d4ff1bc3a601ea6bEric Anholt
7257e2aa91507a5883e33473e0a94215ee3985baad1Ian Romanick   var = new(ctx) ir_variable(lvalue->type, "_post_incdec_tmp",
7267e2aa91507a5883e33473e0a94215ee3985baad1Ian Romanick			      ir_var_temporary);
72743b5b03d67ce890e867c81d4a5cfc4871d711d43Eric Anholt   instructions->push_tail(var);
728de38f0ed53c80f87478c3899d4ff1bc3a601ea6bEric Anholt   var->mode = ir_var_auto;
729de38f0ed53c80f87478c3899d4ff1bc3a601ea6bEric Anholt
7301660a2954797e056caba319c5d6c70b0d4be22feCarl Worth   instructions->push_tail(new(ctx) ir_assignment(new(ctx) ir_dereference_variable(var),
7311660a2954797e056caba319c5d6c70b0d4be22feCarl Worth						  lvalue, NULL));
732de38f0ed53c80f87478c3899d4ff1bc3a601ea6bEric Anholt
733de38f0ed53c80f87478c3899d4ff1bc3a601ea6bEric Anholt   /* Once we've created this temporary, mark it read only so it's no
734de38f0ed53c80f87478c3899d4ff1bc3a601ea6bEric Anholt    * longer considered an lvalue.
735de38f0ed53c80f87478c3899d4ff1bc3a601ea6bEric Anholt    */
736de38f0ed53c80f87478c3899d4ff1bc3a601ea6bEric Anholt   var->read_only = true;
737de38f0ed53c80f87478c3899d4ff1bc3a601ea6bEric Anholt
7381660a2954797e056caba319c5d6c70b0d4be22feCarl Worth   return new(ctx) ir_dereference_variable(var);
739de38f0ed53c80f87478c3899d4ff1bc3a601ea6bEric Anholt}
740de38f0ed53c80f87478c3899d4ff1bc3a601ea6bEric Anholt
741de38f0ed53c80f87478c3899d4ff1bc3a601ea6bEric Anholt
742fb9fb5f51deca28ed1ec7b71759fb71fc26a0ab6Kenneth Graunkeir_rvalue *
7430044e7edcea22d2456c051a1c4b744a26960ad27Ian Romanickast_node::hir(exec_list *instructions,
74418238de6c34a1a32c452f1006ed13d8adc1bc9d7Ian Romanick	      struct _mesa_glsl_parse_state *state)
74518238de6c34a1a32c452f1006ed13d8adc1bc9d7Ian Romanick{
74618238de6c34a1a32c452f1006ed13d8adc1bc9d7Ian Romanick   (void) instructions;
74718238de6c34a1a32c452f1006ed13d8adc1bc9d7Ian Romanick   (void) state;
74818238de6c34a1a32c452f1006ed13d8adc1bc9d7Ian Romanick
74918238de6c34a1a32c452f1006ed13d8adc1bc9d7Ian Romanick   return NULL;
75018238de6c34a1a32c452f1006ed13d8adc1bc9d7Ian Romanick}
75118238de6c34a1a32c452f1006ed13d8adc1bc9d7Ian Romanick
752b4f585665c31b1f80d909e38b3b2a9fab0c03076Eric Anholtstatic void
753b4f585665c31b1f80d909e38b3b2a9fab0c03076Eric Anholtmark_whole_array_access(ir_rvalue *access)
754b4f585665c31b1f80d909e38b3b2a9fab0c03076Eric Anholt{
755b4f585665c31b1f80d909e38b3b2a9fab0c03076Eric Anholt   ir_dereference_variable *deref = access->as_dereference_variable();
756b4f585665c31b1f80d909e38b3b2a9fab0c03076Eric Anholt
757b4f585665c31b1f80d909e38b3b2a9fab0c03076Eric Anholt   if (deref) {
758b4f585665c31b1f80d909e38b3b2a9fab0c03076Eric Anholt      deref->var->max_array_access = deref->type->length - 1;
759b4f585665c31b1f80d909e38b3b2a9fab0c03076Eric Anholt   }
760b4f585665c31b1f80d909e38b3b2a9fab0c03076Eric Anholt}
761b4f585665c31b1f80d909e38b3b2a9fab0c03076Eric Anholt
762ff79633d9f930e396933a0ad9564824ec73ea4dcEric Anholtstatic ir_rvalue *
763ff79633d9f930e396933a0ad9564824ec73ea4dcEric Anholtdo_comparison(void *mem_ctx, int operation, ir_rvalue *op0, ir_rvalue *op1)
764ff79633d9f930e396933a0ad9564824ec73ea4dcEric Anholt{
765ff79633d9f930e396933a0ad9564824ec73ea4dcEric Anholt   int join_op;
7666d36be508ff0765beb6cf6bb95a323ff01e458ddIan Romanick   ir_rvalue *cmp = NULL;
767ff79633d9f930e396933a0ad9564824ec73ea4dcEric Anholt
768ff79633d9f930e396933a0ad9564824ec73ea4dcEric Anholt   if (operation == ir_binop_all_equal)
769ff79633d9f930e396933a0ad9564824ec73ea4dcEric Anholt      join_op = ir_binop_logic_and;
770ff79633d9f930e396933a0ad9564824ec73ea4dcEric Anholt   else
771ff79633d9f930e396933a0ad9564824ec73ea4dcEric Anholt      join_op = ir_binop_logic_or;
772ff79633d9f930e396933a0ad9564824ec73ea4dcEric Anholt
773ff79633d9f930e396933a0ad9564824ec73ea4dcEric Anholt   switch (op0->type->base_type) {
774ff79633d9f930e396933a0ad9564824ec73ea4dcEric Anholt   case GLSL_TYPE_FLOAT:
775ff79633d9f930e396933a0ad9564824ec73ea4dcEric Anholt   case GLSL_TYPE_UINT:
776ff79633d9f930e396933a0ad9564824ec73ea4dcEric Anholt   case GLSL_TYPE_INT:
777ff79633d9f930e396933a0ad9564824ec73ea4dcEric Anholt   case GLSL_TYPE_BOOL:
778ff79633d9f930e396933a0ad9564824ec73ea4dcEric Anholt      return new(mem_ctx) ir_expression(operation, op0, op1);
779ff79633d9f930e396933a0ad9564824ec73ea4dcEric Anholt
780ff79633d9f930e396933a0ad9564824ec73ea4dcEric Anholt   case GLSL_TYPE_ARRAY: {
781ff79633d9f930e396933a0ad9564824ec73ea4dcEric Anholt      for (unsigned int i = 0; i < op0->type->length; i++) {
782ff79633d9f930e396933a0ad9564824ec73ea4dcEric Anholt	 ir_rvalue *e0, *e1, *result;
783ff79633d9f930e396933a0ad9564824ec73ea4dcEric Anholt
784ff79633d9f930e396933a0ad9564824ec73ea4dcEric Anholt	 e0 = new(mem_ctx) ir_dereference_array(op0->clone(mem_ctx, NULL),
785ff79633d9f930e396933a0ad9564824ec73ea4dcEric Anholt						new(mem_ctx) ir_constant(i));
786ff79633d9f930e396933a0ad9564824ec73ea4dcEric Anholt	 e1 = new(mem_ctx) ir_dereference_array(op1->clone(mem_ctx, NULL),
787ff79633d9f930e396933a0ad9564824ec73ea4dcEric Anholt						new(mem_ctx) ir_constant(i));
788ff79633d9f930e396933a0ad9564824ec73ea4dcEric Anholt	 result = do_comparison(mem_ctx, operation, e0, e1);
789ff79633d9f930e396933a0ad9564824ec73ea4dcEric Anholt
7906d36be508ff0765beb6cf6bb95a323ff01e458ddIan Romanick	 if (cmp) {
7916d36be508ff0765beb6cf6bb95a323ff01e458ddIan Romanick	    cmp = new(mem_ctx) ir_expression(join_op, cmp, result);
792ff79633d9f930e396933a0ad9564824ec73ea4dcEric Anholt	 } else {
7936d36be508ff0765beb6cf6bb95a323ff01e458ddIan Romanick	    cmp = result;
794ff79633d9f930e396933a0ad9564824ec73ea4dcEric Anholt	 }
795ff79633d9f930e396933a0ad9564824ec73ea4dcEric Anholt      }
796b4f585665c31b1f80d909e38b3b2a9fab0c03076Eric Anholt
797b4f585665c31b1f80d909e38b3b2a9fab0c03076Eric Anholt      mark_whole_array_access(op0);
798b4f585665c31b1f80d909e38b3b2a9fab0c03076Eric Anholt      mark_whole_array_access(op1);
7996d36be508ff0765beb6cf6bb95a323ff01e458ddIan Romanick      break;
800ff79633d9f930e396933a0ad9564824ec73ea4dcEric Anholt   }
801ff79633d9f930e396933a0ad9564824ec73ea4dcEric Anholt
802ff79633d9f930e396933a0ad9564824ec73ea4dcEric Anholt   case GLSL_TYPE_STRUCT: {
803ff79633d9f930e396933a0ad9564824ec73ea4dcEric Anholt      for (unsigned int i = 0; i < op0->type->length; i++) {
804ff79633d9f930e396933a0ad9564824ec73ea4dcEric Anholt	 ir_rvalue *e0, *e1, *result;
805ff79633d9f930e396933a0ad9564824ec73ea4dcEric Anholt	 const char *field_name = op0->type->fields.structure[i].name;
806ff79633d9f930e396933a0ad9564824ec73ea4dcEric Anholt
807ff79633d9f930e396933a0ad9564824ec73ea4dcEric Anholt	 e0 = new(mem_ctx) ir_dereference_record(op0->clone(mem_ctx, NULL),
808ff79633d9f930e396933a0ad9564824ec73ea4dcEric Anholt						 field_name);
809ff79633d9f930e396933a0ad9564824ec73ea4dcEric Anholt	 e1 = new(mem_ctx) ir_dereference_record(op1->clone(mem_ctx, NULL),
810ff79633d9f930e396933a0ad9564824ec73ea4dcEric Anholt						 field_name);
811ff79633d9f930e396933a0ad9564824ec73ea4dcEric Anholt	 result = do_comparison(mem_ctx, operation, e0, e1);
812ff79633d9f930e396933a0ad9564824ec73ea4dcEric Anholt
8136d36be508ff0765beb6cf6bb95a323ff01e458ddIan Romanick	 if (cmp) {
8146d36be508ff0765beb6cf6bb95a323ff01e458ddIan Romanick	    cmp = new(mem_ctx) ir_expression(join_op, cmp, result);
815ff79633d9f930e396933a0ad9564824ec73ea4dcEric Anholt	 } else {
8166d36be508ff0765beb6cf6bb95a323ff01e458ddIan Romanick	    cmp = result;
817ff79633d9f930e396933a0ad9564824ec73ea4dcEric Anholt	 }
818ff79633d9f930e396933a0ad9564824ec73ea4dcEric Anholt      }
8196d36be508ff0765beb6cf6bb95a323ff01e458ddIan Romanick      break;
820ff79633d9f930e396933a0ad9564824ec73ea4dcEric Anholt   }
821ff79633d9f930e396933a0ad9564824ec73ea4dcEric Anholt
822ff79633d9f930e396933a0ad9564824ec73ea4dcEric Anholt   case GLSL_TYPE_ERROR:
823ff79633d9f930e396933a0ad9564824ec73ea4dcEric Anholt   case GLSL_TYPE_VOID:
824ff79633d9f930e396933a0ad9564824ec73ea4dcEric Anholt   case GLSL_TYPE_SAMPLER:
825ff79633d9f930e396933a0ad9564824ec73ea4dcEric Anholt      /* I assume a comparison of a struct containing a sampler just
826ff79633d9f930e396933a0ad9564824ec73ea4dcEric Anholt       * ignores the sampler present in the type.
827ff79633d9f930e396933a0ad9564824ec73ea4dcEric Anholt       */
8286d36be508ff0765beb6cf6bb95a323ff01e458ddIan Romanick      break;
8296d36be508ff0765beb6cf6bb95a323ff01e458ddIan Romanick
8306d36be508ff0765beb6cf6bb95a323ff01e458ddIan Romanick   default:
8316d36be508ff0765beb6cf6bb95a323ff01e458ddIan Romanick      assert(!"Should not get here.");
8326d36be508ff0765beb6cf6bb95a323ff01e458ddIan Romanick      break;
833ff79633d9f930e396933a0ad9564824ec73ea4dcEric Anholt   }
834d56c97413ee65e40e3544b89ffca450df9ba1c06Eric Anholt
8356d36be508ff0765beb6cf6bb95a323ff01e458ddIan Romanick   if (cmp == NULL)
8366d36be508ff0765beb6cf6bb95a323ff01e458ddIan Romanick      cmp = new(mem_ctx) ir_constant(true);
8376d36be508ff0765beb6cf6bb95a323ff01e458ddIan Romanick
8386d36be508ff0765beb6cf6bb95a323ff01e458ddIan Romanick   return cmp;
839ff79633d9f930e396933a0ad9564824ec73ea4dcEric Anholt}
84018238de6c34a1a32c452f1006ed13d8adc1bc9d7Ian Romanick
841fb9fb5f51deca28ed1ec7b71759fb71fc26a0ab6Kenneth Graunkeir_rvalue *
8420044e7edcea22d2456c051a1c4b744a26960ad27Ian Romanickast_expression::hir(exec_list *instructions,
84318238de6c34a1a32c452f1006ed13d8adc1bc9d7Ian Romanick		    struct _mesa_glsl_parse_state *state)
844a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick{
845953ff1283d3d52e6a6b4850c2b0b574111625010Kenneth Graunke   void *ctx = state;
846a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   static const int operations[AST_NUM_OPERATORS] = {
847a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick      -1,               /* ast_assign doesn't convert to ir_expression. */
848a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick      -1,               /* ast_plus doesn't convert to ir_expression. */
849a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick      ir_unop_neg,
850a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick      ir_binop_add,
851a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick      ir_binop_sub,
852a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick      ir_binop_mul,
853a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick      ir_binop_div,
854a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick      ir_binop_mod,
855a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick      ir_binop_lshift,
856a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick      ir_binop_rshift,
857a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick      ir_binop_less,
858a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick      ir_binop_greater,
859a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick      ir_binop_lequal,
860a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick      ir_binop_gequal,
8614dfb89904c0a3d2166e9a3fc0253a254680e91bcLuca Barbieri      ir_binop_all_equal,
8624dfb89904c0a3d2166e9a3fc0253a254680e91bcLuca Barbieri      ir_binop_any_nequal,
863a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick      ir_binop_bit_and,
864a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick      ir_binop_bit_xor,
865a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick      ir_binop_bit_or,
866a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick      ir_unop_bit_not,
867a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick      ir_binop_logic_and,
868a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick      ir_binop_logic_xor,
869a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick      ir_binop_logic_or,
870a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick      ir_unop_logic_not,
871a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick
872a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick      /* Note: The following block of expression types actually convert
873a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick       * to multiple IR instructions.
874a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick       */
875a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick      ir_binop_mul,     /* ast_mul_assign */
876a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick      ir_binop_div,     /* ast_div_assign */
877a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick      ir_binop_mod,     /* ast_mod_assign */
878a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick      ir_binop_add,     /* ast_add_assign */
879a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick      ir_binop_sub,     /* ast_sub_assign */
880a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick      ir_binop_lshift,  /* ast_ls_assign */
881a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick      ir_binop_rshift,  /* ast_rs_assign */
882a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick      ir_binop_bit_and, /* ast_and_assign */
883a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick      ir_binop_bit_xor, /* ast_xor_assign */
884a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick      ir_binop_bit_or,  /* ast_or_assign */
885a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick
886a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick      -1,               /* ast_conditional doesn't convert to ir_expression. */
887de38f0ed53c80f87478c3899d4ff1bc3a601ea6bEric Anholt      ir_binop_add,     /* ast_pre_inc. */
888de38f0ed53c80f87478c3899d4ff1bc3a601ea6bEric Anholt      ir_binop_sub,     /* ast_pre_dec. */
889de38f0ed53c80f87478c3899d4ff1bc3a601ea6bEric Anholt      ir_binop_add,     /* ast_post_inc. */
890de38f0ed53c80f87478c3899d4ff1bc3a601ea6bEric Anholt      ir_binop_sub,     /* ast_post_dec. */
891a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick      -1,               /* ast_field_selection doesn't conv to ir_expression. */
892a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick      -1,               /* ast_array_index doesn't convert to ir_expression. */
893a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick      -1,               /* ast_function_call doesn't conv to ir_expression. */
894a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick      -1,               /* ast_identifier doesn't convert to ir_expression. */
895a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick      -1,               /* ast_int_constant doesn't convert to ir_expression. */
896a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick      -1,               /* ast_uint_constant doesn't conv to ir_expression. */
897a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick      -1,               /* ast_float_constant doesn't conv to ir_expression. */
898a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick      -1,               /* ast_bool_constant doesn't conv to ir_expression. */
899a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick      -1,               /* ast_sequence doesn't convert to ir_expression. */
900a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   };
901fb9fb5f51deca28ed1ec7b71759fb71fc26a0ab6Kenneth Graunke   ir_rvalue *result = NULL;
9021c325af4d6b907e0a47ab7f868a2a78f054f153fAras Pranckevicius   ir_rvalue *op[3];
9030471e8b0896e05b3bc81ccad6184e6e35fb61425Ian Romanick   const struct glsl_type *type = glsl_type::error_type;
904a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   bool error_emitted = false;
905a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   YYLTYPE loc;
906a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick
90718238de6c34a1a32c452f1006ed13d8adc1bc9d7Ian Romanick   loc = this->get_location();
908a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick
90918238de6c34a1a32c452f1006ed13d8adc1bc9d7Ian Romanick   switch (this->oper) {
9106652af36fe8994b1621d882fcc230d320908a2a3Ian Romanick   case ast_assign: {
91118238de6c34a1a32c452f1006ed13d8adc1bc9d7Ian Romanick      op[0] = this->subexpressions[0]->hir(instructions, state);
91218238de6c34a1a32c452f1006ed13d8adc1bc9d7Ian Romanick      op[1] = this->subexpressions[1]->hir(instructions, state);
913a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick
91410a685218610e737e23d2d8a243ed6ff6613becdEric Anholt      result = do_assignment(instructions, state, op[0], op[1],
91510a685218610e737e23d2d8a243ed6ff6613becdEric Anholt			     this->subexpressions[0]->get_location());
91610a685218610e737e23d2d8a243ed6ff6613becdEric Anholt      error_emitted = result->type->is_error();
91710a685218610e737e23d2d8a243ed6ff6613becdEric Anholt      type = result->type;
918a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick      break;
9196652af36fe8994b1621d882fcc230d320908a2a3Ian Romanick   }
920a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick
921a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   case ast_plus:
92218238de6c34a1a32c452f1006ed13d8adc1bc9d7Ian Romanick      op[0] = this->subexpressions[0]->hir(instructions, state);
923a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick
924c24bcad9f88379ffba9e2f0ff92f22cdf60c2927Carl Worth      type = unary_arithmetic_result_type(op[0]->type, state, & loc);
925c24bcad9f88379ffba9e2f0ff92f22cdf60c2927Carl Worth
926c24bcad9f88379ffba9e2f0ff92f22cdf60c2927Carl Worth      error_emitted = type->is_error();
927a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick
928a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick      result = op[0];
929a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick      break;
930a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick
931a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   case ast_neg:
93218238de6c34a1a32c452f1006ed13d8adc1bc9d7Ian Romanick      op[0] = this->subexpressions[0]->hir(instructions, state);
933a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick
93465e1a7ac6a6735e135851ddb87e48361d4677000Eric Anholt      type = unary_arithmetic_result_type(op[0]->type, state, & loc);
935a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick
93665e1a7ac6a6735e135851ddb87e48361d4677000Eric Anholt      error_emitted = type->is_error();
937a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick
9381660a2954797e056caba319c5d6c70b0d4be22feCarl Worth      result = new(ctx) ir_expression(operations[this->oper], type,
9391660a2954797e056caba319c5d6c70b0d4be22feCarl Worth				      op[0], NULL);
940a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick      break;
941a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick
942a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   case ast_add:
943a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   case ast_sub:
944a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   case ast_mul:
945a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   case ast_div:
94618238de6c34a1a32c452f1006ed13d8adc1bc9d7Ian Romanick      op[0] = this->subexpressions[0]->hir(instructions, state);
94718238de6c34a1a32c452f1006ed13d8adc1bc9d7Ian Romanick      op[1] = this->subexpressions[1]->hir(instructions, state);
948a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick
949bfb09c2a94414c1b40108c9c41eb0844d932e459Ian Romanick      type = arithmetic_result_type(op[0], op[1],
95018238de6c34a1a32c452f1006ed13d8adc1bc9d7Ian Romanick				    (this->oper == ast_mul),
951a13bb1490c57ea958f2d1853d71c55d03263e9e4Eric Anholt				    state, & loc);
952a13bb1490c57ea958f2d1853d71c55d03263e9e4Eric Anholt      error_emitted = type->is_error();
953a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick
9541660a2954797e056caba319c5d6c70b0d4be22feCarl Worth      result = new(ctx) ir_expression(operations[this->oper], type,
9551660a2954797e056caba319c5d6c70b0d4be22feCarl Worth				      op[0], op[1]);
956a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick      break;
957a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick
958a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   case ast_mod:
95918238de6c34a1a32c452f1006ed13d8adc1bc9d7Ian Romanick      op[0] = this->subexpressions[0]->hir(instructions, state);
96018238de6c34a1a32c452f1006ed13d8adc1bc9d7Ian Romanick      op[1] = this->subexpressions[1]->hir(instructions, state);
961a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick
96265e1a7ac6a6735e135851ddb87e48361d4677000Eric Anholt      type = modulus_result_type(op[0]->type, op[1]->type, state, & loc);
963a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick
96418238de6c34a1a32c452f1006ed13d8adc1bc9d7Ian Romanick      assert(operations[this->oper] == ir_binop_mod);
965a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick
9661660a2954797e056caba319c5d6c70b0d4be22feCarl Worth      result = new(ctx) ir_expression(operations[this->oper], type,
9671660a2954797e056caba319c5d6c70b0d4be22feCarl Worth				      op[0], op[1]);
96865e1a7ac6a6735e135851ddb87e48361d4677000Eric Anholt      error_emitted = type->is_error();
969a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick      break;
970a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick
971a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   case ast_lshift:
972a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   case ast_rshift:
9735c4c36f7f3842e287b303b1eca8d260c37e3580bChad Versace       if (state->language_version < 130) {
9745c4c36f7f3842e287b303b1eca8d260c37e3580bChad Versace          _mesa_glsl_error(&loc, state, "operator %s requires GLSL 1.30",
9755c4c36f7f3842e287b303b1eca8d260c37e3580bChad Versace              operator_string(this->oper));
9765c4c36f7f3842e287b303b1eca8d260c37e3580bChad Versace          error_emitted = true;
9775c4c36f7f3842e287b303b1eca8d260c37e3580bChad Versace       }
9785c4c36f7f3842e287b303b1eca8d260c37e3580bChad Versace
9795c4c36f7f3842e287b303b1eca8d260c37e3580bChad Versace       op[0] = this->subexpressions[0]->hir(instructions, state);
9805c4c36f7f3842e287b303b1eca8d260c37e3580bChad Versace       op[1] = this->subexpressions[1]->hir(instructions, state);
981c0197ab0af94ed0f3b2d453fb1ee6589f15d8e9cChad Versace       type = shift_result_type(op[0]->type, op[1]->type, this->oper, state,
982c0197ab0af94ed0f3b2d453fb1ee6589f15d8e9cChad Versace                                &loc);
9835c4c36f7f3842e287b303b1eca8d260c37e3580bChad Versace       result = new(ctx) ir_expression(operations[this->oper], type,
9845c4c36f7f3842e287b303b1eca8d260c37e3580bChad Versace                                       op[0], op[1]);
9855c4c36f7f3842e287b303b1eca8d260c37e3580bChad Versace       error_emitted = op[0]->type->is_error() || op[1]->type->is_error();
9865c4c36f7f3842e287b303b1eca8d260c37e3580bChad Versace       break;
987a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick
988a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   case ast_less:
989a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   case ast_greater:
990a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   case ast_lequal:
991a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   case ast_gequal:
99218238de6c34a1a32c452f1006ed13d8adc1bc9d7Ian Romanick      op[0] = this->subexpressions[0]->hir(instructions, state);
99318238de6c34a1a32c452f1006ed13d8adc1bc9d7Ian Romanick      op[1] = this->subexpressions[1]->hir(instructions, state);
994a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick
99565e1a7ac6a6735e135851ddb87e48361d4677000Eric Anholt      type = relational_result_type(op[0], op[1], state, & loc);
996a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick
997a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick      /* The relational operators must either generate an error or result
998a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick       * in a scalar boolean.  See page 57 of the GLSL 1.50 spec.
999a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick       */
1000a43817a483a8c4a480ef4e6dfda2cef899300eb0Ian Romanick      assert(type->is_error()
1001a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick	     || ((type->base_type == GLSL_TYPE_BOOL)
1002cb36f8aaeeb09660843316270a781948f773d90bIan Romanick		 && type->is_scalar()));
1003a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick
10041660a2954797e056caba319c5d6c70b0d4be22feCarl Worth      result = new(ctx) ir_expression(operations[this->oper], type,
10051660a2954797e056caba319c5d6c70b0d4be22feCarl Worth				      op[0], op[1]);
100665e1a7ac6a6735e135851ddb87e48361d4677000Eric Anholt      error_emitted = type->is_error();
1007a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick      break;
1008a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick
1009a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   case ast_nequal:
1010a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   case ast_equal:
10116e659caaa946339a2de3890a8bed091ccb65102aIan Romanick      op[0] = this->subexpressions[0]->hir(instructions, state);
10126e659caaa946339a2de3890a8bed091ccb65102aIan Romanick      op[1] = this->subexpressions[1]->hir(instructions, state);
10136e659caaa946339a2de3890a8bed091ccb65102aIan Romanick
10146e659caaa946339a2de3890a8bed091ccb65102aIan Romanick      /* From page 58 (page 64 of the PDF) of the GLSL 1.50 spec:
10156e659caaa946339a2de3890a8bed091ccb65102aIan Romanick       *
10166e659caaa946339a2de3890a8bed091ccb65102aIan Romanick       *    "The equality operators equal (==), and not equal (!=)
10176e659caaa946339a2de3890a8bed091ccb65102aIan Romanick       *    operate on all types. They result in a scalar Boolean. If
10186e659caaa946339a2de3890a8bed091ccb65102aIan Romanick       *    the operand types do not match, then there must be a
10196e659caaa946339a2de3890a8bed091ccb65102aIan Romanick       *    conversion from Section 4.1.10 "Implicit Conversions"
10206e659caaa946339a2de3890a8bed091ccb65102aIan Romanick       *    applied to one operand that can make them match, in which
10216e659caaa946339a2de3890a8bed091ccb65102aIan Romanick       *    case this conversion is done."
10226e659caaa946339a2de3890a8bed091ccb65102aIan Romanick       */
1023bfb09c2a94414c1b40108c9c41eb0844d932e459Ian Romanick      if ((!apply_implicit_conversion(op[0]->type, op[1], state)
1024bfb09c2a94414c1b40108c9c41eb0844d932e459Ian Romanick	   && !apply_implicit_conversion(op[1]->type, op[0], state))
1025212b0327b47033442842a7be3d7fb10e08e2bf66Ian Romanick	  || (op[0]->type != op[1]->type)) {
10266e659caaa946339a2de3890a8bed091ccb65102aIan Romanick	 _mesa_glsl_error(& loc, state, "operands of `%s' must have the same "
10276e659caaa946339a2de3890a8bed091ccb65102aIan Romanick			  "type", (this->oper == ast_equal) ? "==" : "!=");
10286e659caaa946339a2de3890a8bed091ccb65102aIan Romanick	 error_emitted = true;
1029a80cbd6d82f6ec4c1d16129581d5fa893a6ba94fIan Romanick      } else if ((state->language_version <= 110)
1030a80cbd6d82f6ec4c1d16129581d5fa893a6ba94fIan Romanick		 && (op[0]->type->is_array() || op[1]->type->is_array())) {
1031a80cbd6d82f6ec4c1d16129581d5fa893a6ba94fIan Romanick	 _mesa_glsl_error(& loc, state, "array comparisons forbidden in "
1032a80cbd6d82f6ec4c1d16129581d5fa893a6ba94fIan Romanick			  "GLSL 1.10");
1033a80cbd6d82f6ec4c1d16129581d5fa893a6ba94fIan Romanick	 error_emitted = true;
10346e659caaa946339a2de3890a8bed091ccb65102aIan Romanick      }
10356e659caaa946339a2de3890a8bed091ccb65102aIan Romanick
1036ff79633d9f930e396933a0ad9564824ec73ea4dcEric Anholt      result = do_comparison(ctx, operations[this->oper], op[0], op[1]);
10376e659caaa946339a2de3890a8bed091ccb65102aIan Romanick      type = glsl_type::bool_type;
10386e659caaa946339a2de3890a8bed091ccb65102aIan Romanick
10396d36be508ff0765beb6cf6bb95a323ff01e458ddIan Romanick      assert(error_emitted || (result->type == glsl_type::bool_type));
1040a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick      break;
1041a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick
1042a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   case ast_bit_and:
1043a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   case ast_bit_xor:
1044a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   case ast_bit_or:
10451eea96326fa652029e3898e104c715e5464f11e4Kenneth Graunke      op[0] = this->subexpressions[0]->hir(instructions, state);
10461eea96326fa652029e3898e104c715e5464f11e4Kenneth Graunke      op[1] = this->subexpressions[1]->hir(instructions, state);
1047cfdbf8bc8497b29fbdd9fa7bd00da554aecb5962Chad Versace      type = bit_logic_result_type(op[0]->type, op[1]->type, this->oper,
1048cfdbf8bc8497b29fbdd9fa7bd00da554aecb5962Chad Versace                                   state, &loc);
10491eea96326fa652029e3898e104c715e5464f11e4Kenneth Graunke      result = new(ctx) ir_expression(operations[this->oper], type,
10501eea96326fa652029e3898e104c715e5464f11e4Kenneth Graunke				      op[0], op[1]);
10511eea96326fa652029e3898e104c715e5464f11e4Kenneth Graunke      error_emitted = op[0]->type->is_error() || op[1]->type->is_error();
10521eea96326fa652029e3898e104c715e5464f11e4Kenneth Graunke      break;
10531eea96326fa652029e3898e104c715e5464f11e4Kenneth Graunke
1054a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   case ast_bit_not:
10551eea96326fa652029e3898e104c715e5464f11e4Kenneth Graunke      op[0] = this->subexpressions[0]->hir(instructions, state);
10561eea96326fa652029e3898e104c715e5464f11e4Kenneth Graunke
10571eea96326fa652029e3898e104c715e5464f11e4Kenneth Graunke      if (state->language_version < 130) {
10581eea96326fa652029e3898e104c715e5464f11e4Kenneth Graunke	 _mesa_glsl_error(&loc, state, "bit-wise operations require GLSL 1.30");
10591eea96326fa652029e3898e104c715e5464f11e4Kenneth Graunke	 error_emitted = true;
10601eea96326fa652029e3898e104c715e5464f11e4Kenneth Graunke      }
10611eea96326fa652029e3898e104c715e5464f11e4Kenneth Graunke
10621eea96326fa652029e3898e104c715e5464f11e4Kenneth Graunke      if (!op[0]->type->is_integer()) {
10631eea96326fa652029e3898e104c715e5464f11e4Kenneth Graunke	 _mesa_glsl_error(&loc, state, "operand of `~' must be an integer");
10641eea96326fa652029e3898e104c715e5464f11e4Kenneth Graunke	 error_emitted = true;
10651eea96326fa652029e3898e104c715e5464f11e4Kenneth Graunke      }
10661eea96326fa652029e3898e104c715e5464f11e4Kenneth Graunke
10671eea96326fa652029e3898e104c715e5464f11e4Kenneth Graunke      type = op[0]->type;
10681eea96326fa652029e3898e104c715e5464f11e4Kenneth Graunke      result = new(ctx) ir_expression(ir_unop_bit_not, type, op[0], NULL);
1069a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick      break;
1070a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick
10714950a68bf22ede6f4f368c9783e5401816159574Eric Anholt   case ast_logic_and: {
1072b82c0c31aea2d02721f162b94b9f591242d9364eEric Anholt      op[0] = this->subexpressions[0]->hir(instructions, state);
1073b82c0c31aea2d02721f162b94b9f591242d9364eEric Anholt
1074b82c0c31aea2d02721f162b94b9f591242d9364eEric Anholt      if (!op[0]->type->is_boolean() || !op[0]->type->is_scalar()) {
1075b82c0c31aea2d02721f162b94b9f591242d9364eEric Anholt	 YYLTYPE loc = this->subexpressions[0]->get_location();
1076b82c0c31aea2d02721f162b94b9f591242d9364eEric Anholt
1077b82c0c31aea2d02721f162b94b9f591242d9364eEric Anholt	 _mesa_glsl_error(& loc, state, "LHS of `%s' must be scalar boolean",
1078b82c0c31aea2d02721f162b94b9f591242d9364eEric Anholt			  operator_string(this->oper));
1079ebbf14b9801d577adf40dcb0b63df2d3b8da934eEric Anholt	 error_emitted = true;
1080b82c0c31aea2d02721f162b94b9f591242d9364eEric Anholt      }
1081b82c0c31aea2d02721f162b94b9f591242d9364eEric Anholt
108244b694e1f621730bca1cd03eabdfe5474d818f18Eric Anholt      ir_constant *op0_const = op[0]->constant_expression_value();
108344b694e1f621730bca1cd03eabdfe5474d818f18Eric Anholt      if (op0_const) {
108444b694e1f621730bca1cd03eabdfe5474d818f18Eric Anholt	 if (op0_const->value.b[0]) {
108544b694e1f621730bca1cd03eabdfe5474d818f18Eric Anholt	    op[1] = this->subexpressions[1]->hir(instructions, state);
108644b694e1f621730bca1cd03eabdfe5474d818f18Eric Anholt
108744b694e1f621730bca1cd03eabdfe5474d818f18Eric Anholt	    if (!op[1]->type->is_boolean() || !op[1]->type->is_scalar()) {
108844b694e1f621730bca1cd03eabdfe5474d818f18Eric Anholt	       YYLTYPE loc = this->subexpressions[1]->get_location();
108944b694e1f621730bca1cd03eabdfe5474d818f18Eric Anholt
109044b694e1f621730bca1cd03eabdfe5474d818f18Eric Anholt	       _mesa_glsl_error(& loc, state,
109144b694e1f621730bca1cd03eabdfe5474d818f18Eric Anholt				"RHS of `%s' must be scalar boolean",
109244b694e1f621730bca1cd03eabdfe5474d818f18Eric Anholt				operator_string(this->oper));
109344b694e1f621730bca1cd03eabdfe5474d818f18Eric Anholt	       error_emitted = true;
109444b694e1f621730bca1cd03eabdfe5474d818f18Eric Anholt	    }
109544b694e1f621730bca1cd03eabdfe5474d818f18Eric Anholt	    result = op[1];
109644b694e1f621730bca1cd03eabdfe5474d818f18Eric Anholt	 } else {
109744b694e1f621730bca1cd03eabdfe5474d818f18Eric Anholt	    result = op0_const;
109844b694e1f621730bca1cd03eabdfe5474d818f18Eric Anholt	 }
109944b694e1f621730bca1cd03eabdfe5474d818f18Eric Anholt	 type = glsl_type::bool_type;
110044b694e1f621730bca1cd03eabdfe5474d818f18Eric Anholt      } else {
110181d664f099a5fd5fac777480532fb4307d591451Ian Romanick	 ir_variable *const tmp = new(ctx) ir_variable(glsl_type::bool_type,
11027e2aa91507a5883e33473e0a94215ee3985baad1Ian Romanick						       "and_tmp",
11037e2aa91507a5883e33473e0a94215ee3985baad1Ian Romanick						       ir_var_temporary);
110481d664f099a5fd5fac777480532fb4307d591451Ian Romanick	 instructions->push_tail(tmp);
110581d664f099a5fd5fac777480532fb4307d591451Ian Romanick
11061660a2954797e056caba319c5d6c70b0d4be22feCarl Worth	 ir_if *const stmt = new(ctx) ir_if(op[0]);
110744b694e1f621730bca1cd03eabdfe5474d818f18Eric Anholt	 instructions->push_tail(stmt);
11084950a68bf22ede6f4f368c9783e5401816159574Eric Anholt
110944b694e1f621730bca1cd03eabdfe5474d818f18Eric Anholt	 op[1] = this->subexpressions[1]->hir(&stmt->then_instructions, state);
11104950a68bf22ede6f4f368c9783e5401816159574Eric Anholt
111144b694e1f621730bca1cd03eabdfe5474d818f18Eric Anholt	 if (!op[1]->type->is_boolean() || !op[1]->type->is_scalar()) {
111244b694e1f621730bca1cd03eabdfe5474d818f18Eric Anholt	    YYLTYPE loc = this->subexpressions[1]->get_location();
11134950a68bf22ede6f4f368c9783e5401816159574Eric Anholt
111444b694e1f621730bca1cd03eabdfe5474d818f18Eric Anholt	    _mesa_glsl_error(& loc, state,
111544b694e1f621730bca1cd03eabdfe5474d818f18Eric Anholt			     "RHS of `%s' must be scalar boolean",
111644b694e1f621730bca1cd03eabdfe5474d818f18Eric Anholt			     operator_string(this->oper));
111744b694e1f621730bca1cd03eabdfe5474d818f18Eric Anholt	    error_emitted = true;
111844b694e1f621730bca1cd03eabdfe5474d818f18Eric Anholt	 }
1119b82c0c31aea2d02721f162b94b9f591242d9364eEric Anholt
11201660a2954797e056caba319c5d6c70b0d4be22feCarl Worth	 ir_dereference *const then_deref = new(ctx) ir_dereference_variable(tmp);
112144b694e1f621730bca1cd03eabdfe5474d818f18Eric Anholt	 ir_assignment *const then_assign =
11221660a2954797e056caba319c5d6c70b0d4be22feCarl Worth	    new(ctx) ir_assignment(then_deref, op[1], NULL);
112344b694e1f621730bca1cd03eabdfe5474d818f18Eric Anholt	 stmt->then_instructions.push_tail(then_assign);
11244950a68bf22ede6f4f368c9783e5401816159574Eric Anholt
11251660a2954797e056caba319c5d6c70b0d4be22feCarl Worth	 ir_dereference *const else_deref = new(ctx) ir_dereference_variable(tmp);
112644b694e1f621730bca1cd03eabdfe5474d818f18Eric Anholt	 ir_assignment *const else_assign =
11271660a2954797e056caba319c5d6c70b0d4be22feCarl Worth	    new(ctx) ir_assignment(else_deref, new(ctx) ir_constant(false), NULL);
112844b694e1f621730bca1cd03eabdfe5474d818f18Eric Anholt	 stmt->else_instructions.push_tail(else_assign);
11294950a68bf22ede6f4f368c9783e5401816159574Eric Anholt
11301660a2954797e056caba319c5d6c70b0d4be22feCarl Worth	 result = new(ctx) ir_dereference_variable(tmp);
113144b694e1f621730bca1cd03eabdfe5474d818f18Eric Anholt	 type = tmp->type;
113244b694e1f621730bca1cd03eabdfe5474d818f18Eric Anholt      }
11334950a68bf22ede6f4f368c9783e5401816159574Eric Anholt      break;
11344950a68bf22ede6f4f368c9783e5401816159574Eric Anholt   }
11354950a68bf22ede6f4f368c9783e5401816159574Eric Anholt
11364950a68bf22ede6f4f368c9783e5401816159574Eric Anholt   case ast_logic_or: {
11374950a68bf22ede6f4f368c9783e5401816159574Eric Anholt      op[0] = this->subexpressions[0]->hir(instructions, state);
11384950a68bf22ede6f4f368c9783e5401816159574Eric Anholt
11394950a68bf22ede6f4f368c9783e5401816159574Eric Anholt      if (!op[0]->type->is_boolean() || !op[0]->type->is_scalar()) {
11404950a68bf22ede6f4f368c9783e5401816159574Eric Anholt	 YYLTYPE loc = this->subexpressions[0]->get_location();
11414950a68bf22ede6f4f368c9783e5401816159574Eric Anholt
11424950a68bf22ede6f4f368c9783e5401816159574Eric Anholt	 _mesa_glsl_error(& loc, state, "LHS of `%s' must be scalar boolean",
11434950a68bf22ede6f4f368c9783e5401816159574Eric Anholt			  operator_string(this->oper));
11444950a68bf22ede6f4f368c9783e5401816159574Eric Anholt	 error_emitted = true;
11454950a68bf22ede6f4f368c9783e5401816159574Eric Anholt      }
11464950a68bf22ede6f4f368c9783e5401816159574Eric Anholt
114744b694e1f621730bca1cd03eabdfe5474d818f18Eric Anholt      ir_constant *op0_const = op[0]->constant_expression_value();
114844b694e1f621730bca1cd03eabdfe5474d818f18Eric Anholt      if (op0_const) {
114944b694e1f621730bca1cd03eabdfe5474d818f18Eric Anholt	 if (op0_const->value.b[0]) {
115044b694e1f621730bca1cd03eabdfe5474d818f18Eric Anholt	    result = op0_const;
115144b694e1f621730bca1cd03eabdfe5474d818f18Eric Anholt	 } else {
115244b694e1f621730bca1cd03eabdfe5474d818f18Eric Anholt	    op[1] = this->subexpressions[1]->hir(instructions, state);
115344b694e1f621730bca1cd03eabdfe5474d818f18Eric Anholt
115444b694e1f621730bca1cd03eabdfe5474d818f18Eric Anholt	    if (!op[1]->type->is_boolean() || !op[1]->type->is_scalar()) {
115544b694e1f621730bca1cd03eabdfe5474d818f18Eric Anholt	       YYLTYPE loc = this->subexpressions[1]->get_location();
115644b694e1f621730bca1cd03eabdfe5474d818f18Eric Anholt
115744b694e1f621730bca1cd03eabdfe5474d818f18Eric Anholt	       _mesa_glsl_error(& loc, state,
115844b694e1f621730bca1cd03eabdfe5474d818f18Eric Anholt				"RHS of `%s' must be scalar boolean",
115944b694e1f621730bca1cd03eabdfe5474d818f18Eric Anholt				operator_string(this->oper));
116044b694e1f621730bca1cd03eabdfe5474d818f18Eric Anholt	       error_emitted = true;
116144b694e1f621730bca1cd03eabdfe5474d818f18Eric Anholt	    }
116244b694e1f621730bca1cd03eabdfe5474d818f18Eric Anholt	    result = op[1];
116344b694e1f621730bca1cd03eabdfe5474d818f18Eric Anholt	 }
116444b694e1f621730bca1cd03eabdfe5474d818f18Eric Anholt	 type = glsl_type::bool_type;
116544b694e1f621730bca1cd03eabdfe5474d818f18Eric Anholt      } else {
1166dfd30ca6a95a7d95835dad78ffe1fba4d1f4ef69Kenneth Graunke	 ir_variable *const tmp = new(ctx) ir_variable(glsl_type::bool_type,
11677e2aa91507a5883e33473e0a94215ee3985baad1Ian Romanick						       "or_tmp",
11687e2aa91507a5883e33473e0a94215ee3985baad1Ian Romanick						       ir_var_temporary);
11690b9ae3befb0bf80e000b159fd44c961a144f9c36Ian Romanick	 instructions->push_tail(tmp);
11704950a68bf22ede6f4f368c9783e5401816159574Eric Anholt
117181d664f099a5fd5fac777480532fb4307d591451Ian Romanick	 ir_if *const stmt = new(ctx) ir_if(op[0]);
117281d664f099a5fd5fac777480532fb4307d591451Ian Romanick	 instructions->push_tail(stmt);
117381d664f099a5fd5fac777480532fb4307d591451Ian Romanick
1174a0879b9dd438d78635f047cdd5ed4c72bc831b60Eric Anholt	 op[1] = this->subexpressions[1]->hir(&stmt->else_instructions, state);
11754950a68bf22ede6f4f368c9783e5401816159574Eric Anholt
117644b694e1f621730bca1cd03eabdfe5474d818f18Eric Anholt	 if (!op[1]->type->is_boolean() || !op[1]->type->is_scalar()) {
117744b694e1f621730bca1cd03eabdfe5474d818f18Eric Anholt	    YYLTYPE loc = this->subexpressions[1]->get_location();
11784950a68bf22ede6f4f368c9783e5401816159574Eric Anholt
117944b694e1f621730bca1cd03eabdfe5474d818f18Eric Anholt	    _mesa_glsl_error(& loc, state, "RHS of `%s' must be scalar boolean",
118044b694e1f621730bca1cd03eabdfe5474d818f18Eric Anholt			     operator_string(this->oper));
118144b694e1f621730bca1cd03eabdfe5474d818f18Eric Anholt	    error_emitted = true;
118244b694e1f621730bca1cd03eabdfe5474d818f18Eric Anholt	 }
11834950a68bf22ede6f4f368c9783e5401816159574Eric Anholt
11841660a2954797e056caba319c5d6c70b0d4be22feCarl Worth	 ir_dereference *const then_deref = new(ctx) ir_dereference_variable(tmp);
118544b694e1f621730bca1cd03eabdfe5474d818f18Eric Anholt	 ir_assignment *const then_assign =
11861660a2954797e056caba319c5d6c70b0d4be22feCarl Worth	    new(ctx) ir_assignment(then_deref, new(ctx) ir_constant(true), NULL);
118744b694e1f621730bca1cd03eabdfe5474d818f18Eric Anholt	 stmt->then_instructions.push_tail(then_assign);
11884950a68bf22ede6f4f368c9783e5401816159574Eric Anholt
11891660a2954797e056caba319c5d6c70b0d4be22feCarl Worth	 ir_dereference *const else_deref = new(ctx) ir_dereference_variable(tmp);
119044b694e1f621730bca1cd03eabdfe5474d818f18Eric Anholt	 ir_assignment *const else_assign =
11911660a2954797e056caba319c5d6c70b0d4be22feCarl Worth	    new(ctx) ir_assignment(else_deref, op[1], NULL);
119244b694e1f621730bca1cd03eabdfe5474d818f18Eric Anholt	 stmt->else_instructions.push_tail(else_assign);
11934950a68bf22ede6f4f368c9783e5401816159574Eric Anholt
11941660a2954797e056caba319c5d6c70b0d4be22feCarl Worth	 result = new(ctx) ir_dereference_variable(tmp);
119544b694e1f621730bca1cd03eabdfe5474d818f18Eric Anholt	 type = tmp->type;
119644b694e1f621730bca1cd03eabdfe5474d818f18Eric Anholt      }
11974950a68bf22ede6f4f368c9783e5401816159574Eric Anholt      break;
11984950a68bf22ede6f4f368c9783e5401816159574Eric Anholt   }
11994950a68bf22ede6f4f368c9783e5401816159574Eric Anholt
12004950a68bf22ede6f4f368c9783e5401816159574Eric Anholt   case ast_logic_xor:
12014950a68bf22ede6f4f368c9783e5401816159574Eric Anholt      op[0] = this->subexpressions[0]->hir(instructions, state);
12024950a68bf22ede6f4f368c9783e5401816159574Eric Anholt      op[1] = this->subexpressions[1]->hir(instructions, state);
12034950a68bf22ede6f4f368c9783e5401816159574Eric Anholt
12044950a68bf22ede6f4f368c9783e5401816159574Eric Anholt
12051660a2954797e056caba319c5d6c70b0d4be22feCarl Worth      result = new(ctx) ir_expression(operations[this->oper], glsl_type::bool_type,
12061660a2954797e056caba319c5d6c70b0d4be22feCarl Worth				      op[0], op[1]);
1207ebbf14b9801d577adf40dcb0b63df2d3b8da934eEric Anholt      type = glsl_type::bool_type;
1208a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick      break;
1209a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick
1210a5827fe8d06a1161ef3b4e2b3296431a55d4ba2eEric Anholt   case ast_logic_not:
1211a5827fe8d06a1161ef3b4e2b3296431a55d4ba2eEric Anholt      op[0] = this->subexpressions[0]->hir(instructions, state);
1212a5827fe8d06a1161ef3b4e2b3296431a55d4ba2eEric Anholt
1213a5827fe8d06a1161ef3b4e2b3296431a55d4ba2eEric Anholt      if (!op[0]->type->is_boolean() || !op[0]->type->is_scalar()) {
1214a5827fe8d06a1161ef3b4e2b3296431a55d4ba2eEric Anholt	 YYLTYPE loc = this->subexpressions[0]->get_location();
1215a5827fe8d06a1161ef3b4e2b3296431a55d4ba2eEric Anholt
1216a5827fe8d06a1161ef3b4e2b3296431a55d4ba2eEric Anholt	 _mesa_glsl_error(& loc, state,
1217a5827fe8d06a1161ef3b4e2b3296431a55d4ba2eEric Anholt			  "operand of `!' must be scalar boolean");
1218ebbf14b9801d577adf40dcb0b63df2d3b8da934eEric Anholt	 error_emitted = true;
1219a5827fe8d06a1161ef3b4e2b3296431a55d4ba2eEric Anholt      }
1220a5827fe8d06a1161ef3b4e2b3296431a55d4ba2eEric Anholt
12211660a2954797e056caba319c5d6c70b0d4be22feCarl Worth      result = new(ctx) ir_expression(operations[this->oper], glsl_type::bool_type,
12221660a2954797e056caba319c5d6c70b0d4be22feCarl Worth				      op[0], NULL);
1223ebbf14b9801d577adf40dcb0b63df2d3b8da934eEric Anholt      type = glsl_type::bool_type;
1224a5827fe8d06a1161ef3b4e2b3296431a55d4ba2eEric Anholt      break;
1225a5827fe8d06a1161ef3b4e2b3296431a55d4ba2eEric Anholt
1226a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   case ast_mul_assign:
1227a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   case ast_div_assign:
1228a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   case ast_add_assign:
1229a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   case ast_sub_assign: {
123018238de6c34a1a32c452f1006ed13d8adc1bc9d7Ian Romanick      op[0] = this->subexpressions[0]->hir(instructions, state);
123118238de6c34a1a32c452f1006ed13d8adc1bc9d7Ian Romanick      op[1] = this->subexpressions[1]->hir(instructions, state);
1232a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick
1233bfb09c2a94414c1b40108c9c41eb0844d932e459Ian Romanick      type = arithmetic_result_type(op[0], op[1],
123418238de6c34a1a32c452f1006ed13d8adc1bc9d7Ian Romanick				    (this->oper == ast_mul_assign),
1235a13bb1490c57ea958f2d1853d71c55d03263e9e4Eric Anholt				    state, & loc);
1236a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick
12371660a2954797e056caba319c5d6c70b0d4be22feCarl Worth      ir_rvalue *temp_rhs = new(ctx) ir_expression(operations[this->oper], type,
12381660a2954797e056caba319c5d6c70b0d4be22feCarl Worth						   op[0], op[1]);
1239a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick
12403e24ef68a9b22918c8b21b743d81bbf86f43c119Eric Anholt      result = do_assignment(instructions, state,
12418273bd46877e2ea2b8a02b87a11c68102d07e1f2Eric Anholt			     op[0]->clone(ctx, NULL), temp_rhs,
124210a685218610e737e23d2d8a243ed6ff6613becdEric Anholt			     this->subexpressions[0]->get_location());
124310a685218610e737e23d2d8a243ed6ff6613becdEric Anholt      type = result->type;
124410a685218610e737e23d2d8a243ed6ff6613becdEric Anholt      error_emitted = (op[0]->type->is_error());
1245a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick
1246a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick      /* GLSL 1.10 does not allow array assignment.  However, we don't have to
1247a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick       * explicitly test for this because none of the binary expression
1248a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick       * operators allow array operands either.
1249a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick       */
1250a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick
1251a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick      break;
1252a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   }
1253a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick
125448a0e64b7d6a4308f9c691e5844165ec97f8282eEric Anholt   case ast_mod_assign: {
125548a0e64b7d6a4308f9c691e5844165ec97f8282eEric Anholt      op[0] = this->subexpressions[0]->hir(instructions, state);
125648a0e64b7d6a4308f9c691e5844165ec97f8282eEric Anholt      op[1] = this->subexpressions[1]->hir(instructions, state);
125748a0e64b7d6a4308f9c691e5844165ec97f8282eEric Anholt
125865e1a7ac6a6735e135851ddb87e48361d4677000Eric Anholt      type = modulus_result_type(op[0]->type, op[1]->type, state, & loc);
125948a0e64b7d6a4308f9c691e5844165ec97f8282eEric Anholt
126048a0e64b7d6a4308f9c691e5844165ec97f8282eEric Anholt      assert(operations[this->oper] == ir_binop_mod);
126148a0e64b7d6a4308f9c691e5844165ec97f8282eEric Anholt
1262768b55a5268572ff9fd03e57e92775882eb0a821Ian Romanick      ir_rvalue *temp_rhs;
12631660a2954797e056caba319c5d6c70b0d4be22feCarl Worth      temp_rhs = new(ctx) ir_expression(operations[this->oper], type,
12641660a2954797e056caba319c5d6c70b0d4be22feCarl Worth					op[0], op[1]);
126548a0e64b7d6a4308f9c691e5844165ec97f8282eEric Anholt
12663e24ef68a9b22918c8b21b743d81bbf86f43c119Eric Anholt      result = do_assignment(instructions, state,
12678273bd46877e2ea2b8a02b87a11c68102d07e1f2Eric Anholt			     op[0]->clone(ctx, NULL), temp_rhs,
126848a0e64b7d6a4308f9c691e5844165ec97f8282eEric Anholt			     this->subexpressions[0]->get_location());
126948a0e64b7d6a4308f9c691e5844165ec97f8282eEric Anholt      type = result->type;
127065e1a7ac6a6735e135851ddb87e48361d4677000Eric Anholt      error_emitted = type->is_error();
127148a0e64b7d6a4308f9c691e5844165ec97f8282eEric Anholt      break;
127248a0e64b7d6a4308f9c691e5844165ec97f8282eEric Anholt   }
1273a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick
1274a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   case ast_ls_assign:
1275338ed6ec297d76746b6466c26c307722af965e60Chad Versace   case ast_rs_assign: {
1276338ed6ec297d76746b6466c26c307722af965e60Chad Versace      op[0] = this->subexpressions[0]->hir(instructions, state);
1277338ed6ec297d76746b6466c26c307722af965e60Chad Versace      op[1] = this->subexpressions[1]->hir(instructions, state);
1278338ed6ec297d76746b6466c26c307722af965e60Chad Versace      type = shift_result_type(op[0]->type, op[1]->type, this->oper, state,
1279338ed6ec297d76746b6466c26c307722af965e60Chad Versace                               &loc);
1280338ed6ec297d76746b6466c26c307722af965e60Chad Versace      ir_rvalue *temp_rhs = new(ctx) ir_expression(operations[this->oper],
1281338ed6ec297d76746b6466c26c307722af965e60Chad Versace                                                   type, op[0], op[1]);
1282338ed6ec297d76746b6466c26c307722af965e60Chad Versace      result = do_assignment(instructions, state, op[0]->clone(ctx, NULL),
1283338ed6ec297d76746b6466c26c307722af965e60Chad Versace                             temp_rhs,
1284338ed6ec297d76746b6466c26c307722af965e60Chad Versace                             this->subexpressions[0]->get_location());
1285338ed6ec297d76746b6466c26c307722af965e60Chad Versace      error_emitted = op[0]->type->is_error() || op[1]->type->is_error();
1286251eb753187fee83e6413f44f8b3cf0be1b4f4cbIan Romanick      break;
1287338ed6ec297d76746b6466c26c307722af965e60Chad Versace   }
1288a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick
1289a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   case ast_and_assign:
1290a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   case ast_xor_assign:
1291d03ac0f8d81fd3032d271586d936f14b7d9201d5Chad Versace   case ast_or_assign: {
1292d03ac0f8d81fd3032d271586d936f14b7d9201d5Chad Versace      op[0] = this->subexpressions[0]->hir(instructions, state);
1293d03ac0f8d81fd3032d271586d936f14b7d9201d5Chad Versace      op[1] = this->subexpressions[1]->hir(instructions, state);
1294d03ac0f8d81fd3032d271586d936f14b7d9201d5Chad Versace      type = bit_logic_result_type(op[0]->type, op[1]->type, this->oper,
1295d03ac0f8d81fd3032d271586d936f14b7d9201d5Chad Versace                                   state, &loc);
1296d03ac0f8d81fd3032d271586d936f14b7d9201d5Chad Versace      ir_rvalue *temp_rhs = new(ctx) ir_expression(operations[this->oper],
1297d03ac0f8d81fd3032d271586d936f14b7d9201d5Chad Versace                                                   type, op[0], op[1]);
1298d03ac0f8d81fd3032d271586d936f14b7d9201d5Chad Versace      result = do_assignment(instructions, state, op[0]->clone(ctx, NULL),
1299d03ac0f8d81fd3032d271586d936f14b7d9201d5Chad Versace                             temp_rhs,
1300d03ac0f8d81fd3032d271586d936f14b7d9201d5Chad Versace                             this->subexpressions[0]->get_location());
1301d03ac0f8d81fd3032d271586d936f14b7d9201d5Chad Versace      error_emitted = op[0]->type->is_error() || op[1]->type->is_error();
1302251eb753187fee83e6413f44f8b3cf0be1b4f4cbIan Romanick      break;
1303d03ac0f8d81fd3032d271586d936f14b7d9201d5Chad Versace   }
1304a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick
130596f9cea11606bb1bd8e07edc17032447424b8bffIan Romanick   case ast_conditional: {
130696f9cea11606bb1bd8e07edc17032447424b8bffIan Romanick      op[0] = this->subexpressions[0]->hir(instructions, state);
130796f9cea11606bb1bd8e07edc17032447424b8bffIan Romanick
130896f9cea11606bb1bd8e07edc17032447424b8bffIan Romanick      /* From page 59 (page 65 of the PDF) of the GLSL 1.50 spec:
130996f9cea11606bb1bd8e07edc17032447424b8bffIan Romanick       *
131096f9cea11606bb1bd8e07edc17032447424b8bffIan Romanick       *    "The ternary selection operator (?:). It operates on three
131196f9cea11606bb1bd8e07edc17032447424b8bffIan Romanick       *    expressions (exp1 ? exp2 : exp3). This operator evaluates the
131296f9cea11606bb1bd8e07edc17032447424b8bffIan Romanick       *    first expression, which must result in a scalar Boolean."
131396f9cea11606bb1bd8e07edc17032447424b8bffIan Romanick       */
131496f9cea11606bb1bd8e07edc17032447424b8bffIan Romanick      if (!op[0]->type->is_boolean() || !op[0]->type->is_scalar()) {
131596f9cea11606bb1bd8e07edc17032447424b8bffIan Romanick	 YYLTYPE loc = this->subexpressions[0]->get_location();
131696f9cea11606bb1bd8e07edc17032447424b8bffIan Romanick
131796f9cea11606bb1bd8e07edc17032447424b8bffIan Romanick	 _mesa_glsl_error(& loc, state, "?: condition must be scalar boolean");
131896f9cea11606bb1bd8e07edc17032447424b8bffIan Romanick	 error_emitted = true;
131996f9cea11606bb1bd8e07edc17032447424b8bffIan Romanick      }
132096f9cea11606bb1bd8e07edc17032447424b8bffIan Romanick
132196f9cea11606bb1bd8e07edc17032447424b8bffIan Romanick      /* The :? operator is implemented by generating an anonymous temporary
132296f9cea11606bb1bd8e07edc17032447424b8bffIan Romanick       * followed by an if-statement.  The last instruction in each branch of
132396f9cea11606bb1bd8e07edc17032447424b8bffIan Romanick       * the if-statement assigns a value to the anonymous temporary.  This
132496f9cea11606bb1bd8e07edc17032447424b8bffIan Romanick       * temporary is the r-value of the expression.
132596f9cea11606bb1bd8e07edc17032447424b8bffIan Romanick       */
13260ad76c67675c35a65a79752058f53eee74947ba5Ian Romanick      exec_list then_instructions;
13270ad76c67675c35a65a79752058f53eee74947ba5Ian Romanick      exec_list else_instructions;
132896f9cea11606bb1bd8e07edc17032447424b8bffIan Romanick
13290ad76c67675c35a65a79752058f53eee74947ba5Ian Romanick      op[1] = this->subexpressions[1]->hir(&then_instructions, state);
13300ad76c67675c35a65a79752058f53eee74947ba5Ian Romanick      op[2] = this->subexpressions[2]->hir(&else_instructions, state);
133196f9cea11606bb1bd8e07edc17032447424b8bffIan Romanick
133296f9cea11606bb1bd8e07edc17032447424b8bffIan Romanick      /* From page 59 (page 65 of the PDF) of the GLSL 1.50 spec:
133396f9cea11606bb1bd8e07edc17032447424b8bffIan Romanick       *
133496f9cea11606bb1bd8e07edc17032447424b8bffIan Romanick       *     "The second and third expressions can be any type, as
133596f9cea11606bb1bd8e07edc17032447424b8bffIan Romanick       *     long their types match, or there is a conversion in
133696f9cea11606bb1bd8e07edc17032447424b8bffIan Romanick       *     Section 4.1.10 "Implicit Conversions" that can be applied
133796f9cea11606bb1bd8e07edc17032447424b8bffIan Romanick       *     to one of the expressions to make their types match. This
133896f9cea11606bb1bd8e07edc17032447424b8bffIan Romanick       *     resulting matching type is the type of the entire
133996f9cea11606bb1bd8e07edc17032447424b8bffIan Romanick       *     expression."
134096f9cea11606bb1bd8e07edc17032447424b8bffIan Romanick       */
1341bfb09c2a94414c1b40108c9c41eb0844d932e459Ian Romanick      if ((!apply_implicit_conversion(op[1]->type, op[2], state)
1342bfb09c2a94414c1b40108c9c41eb0844d932e459Ian Romanick	   && !apply_implicit_conversion(op[2]->type, op[1], state))
1343db9be2e7aa3a56e43b725ad7725fe6b424e4933eIan Romanick	  || (op[1]->type != op[2]->type)) {
134496f9cea11606bb1bd8e07edc17032447424b8bffIan Romanick	 YYLTYPE loc = this->subexpressions[1]->get_location();
134596f9cea11606bb1bd8e07edc17032447424b8bffIan Romanick
134696f9cea11606bb1bd8e07edc17032447424b8bffIan Romanick	 _mesa_glsl_error(& loc, state, "Second and third operands of ?: "
134796f9cea11606bb1bd8e07edc17032447424b8bffIan Romanick			  "operator must have matching types.");
134896f9cea11606bb1bd8e07edc17032447424b8bffIan Romanick	 error_emitted = true;
13490ad76c67675c35a65a79752058f53eee74947ba5Ian Romanick	 type = glsl_type::error_type;
1350db9be2e7aa3a56e43b725ad7725fe6b424e4933eIan Romanick      } else {
13510ad76c67675c35a65a79752058f53eee74947ba5Ian Romanick	 type = op[1]->type;
135296f9cea11606bb1bd8e07edc17032447424b8bffIan Romanick      }
135396f9cea11606bb1bd8e07edc17032447424b8bffIan Romanick
1354f09fabc448c0781f0cf9160565e1b0bab59a16e5Ian Romanick      /* From page 33 (page 39 of the PDF) of the GLSL 1.10 spec:
1355f09fabc448c0781f0cf9160565e1b0bab59a16e5Ian Romanick       *
1356f09fabc448c0781f0cf9160565e1b0bab59a16e5Ian Romanick       *    "The second and third expressions must be the same type, but can
1357f09fabc448c0781f0cf9160565e1b0bab59a16e5Ian Romanick       *    be of any type other than an array."
1358f09fabc448c0781f0cf9160565e1b0bab59a16e5Ian Romanick       */
1359f09fabc448c0781f0cf9160565e1b0bab59a16e5Ian Romanick      if ((state->language_version <= 110) && type->is_array()) {
1360f09fabc448c0781f0cf9160565e1b0bab59a16e5Ian Romanick	 _mesa_glsl_error(& loc, state, "Second and third operands of ?: "
1361f09fabc448c0781f0cf9160565e1b0bab59a16e5Ian Romanick			  "operator must not be arrays.");
1362f09fabc448c0781f0cf9160565e1b0bab59a16e5Ian Romanick	 error_emitted = true;
1363f09fabc448c0781f0cf9160565e1b0bab59a16e5Ian Romanick      }
1364f09fabc448c0781f0cf9160565e1b0bab59a16e5Ian Romanick
13657825d3d15710fdfcfc503754862963aac8065480Ian Romanick      ir_constant *cond_val = op[0]->constant_expression_value();
13667825d3d15710fdfcfc503754862963aac8065480Ian Romanick      ir_constant *then_val = op[1]->constant_expression_value();
13677825d3d15710fdfcfc503754862963aac8065480Ian Romanick      ir_constant *else_val = op[2]->constant_expression_value();
13687825d3d15710fdfcfc503754862963aac8065480Ian Romanick
13697825d3d15710fdfcfc503754862963aac8065480Ian Romanick      if (then_instructions.is_empty()
13707825d3d15710fdfcfc503754862963aac8065480Ian Romanick	  && else_instructions.is_empty()
13717825d3d15710fdfcfc503754862963aac8065480Ian Romanick	  && (cond_val != NULL) && (then_val != NULL) && (else_val != NULL)) {
13727825d3d15710fdfcfc503754862963aac8065480Ian Romanick	 result = (cond_val->value.b[0]) ? then_val : else_val;
13737825d3d15710fdfcfc503754862963aac8065480Ian Romanick      } else {
13747e2aa91507a5883e33473e0a94215ee3985baad1Ian Romanick	 ir_variable *const tmp =
13757e2aa91507a5883e33473e0a94215ee3985baad1Ian Romanick	    new(ctx) ir_variable(type, "conditional_tmp", ir_var_temporary);
13760b9ae3befb0bf80e000b159fd44c961a144f9c36Ian Romanick	 instructions->push_tail(tmp);
13770ad76c67675c35a65a79752058f53eee74947ba5Ian Romanick
13781660a2954797e056caba319c5d6c70b0d4be22feCarl Worth	 ir_if *const stmt = new(ctx) ir_if(op[0]);
13797825d3d15710fdfcfc503754862963aac8065480Ian Romanick	 instructions->push_tail(stmt);
13800ad76c67675c35a65a79752058f53eee74947ba5Ian Romanick
13817825d3d15710fdfcfc503754862963aac8065480Ian Romanick	 then_instructions.move_nodes_to(& stmt->then_instructions);
13821660a2954797e056caba319c5d6c70b0d4be22feCarl Worth	 ir_dereference *const then_deref =
13831660a2954797e056caba319c5d6c70b0d4be22feCarl Worth	    new(ctx) ir_dereference_variable(tmp);
13847825d3d15710fdfcfc503754862963aac8065480Ian Romanick	 ir_assignment *const then_assign =
13851660a2954797e056caba319c5d6c70b0d4be22feCarl Worth	    new(ctx) ir_assignment(then_deref, op[1], NULL);
13867825d3d15710fdfcfc503754862963aac8065480Ian Romanick	 stmt->then_instructions.push_tail(then_assign);
13870ad76c67675c35a65a79752058f53eee74947ba5Ian Romanick
13887825d3d15710fdfcfc503754862963aac8065480Ian Romanick	 else_instructions.move_nodes_to(& stmt->else_instructions);
13891660a2954797e056caba319c5d6c70b0d4be22feCarl Worth	 ir_dereference *const else_deref =
13901660a2954797e056caba319c5d6c70b0d4be22feCarl Worth	    new(ctx) ir_dereference_variable(tmp);
13917825d3d15710fdfcfc503754862963aac8065480Ian Romanick	 ir_assignment *const else_assign =
13921660a2954797e056caba319c5d6c70b0d4be22feCarl Worth	    new(ctx) ir_assignment(else_deref, op[2], NULL);
13937825d3d15710fdfcfc503754862963aac8065480Ian Romanick	 stmt->else_instructions.push_tail(else_assign);
13940ad76c67675c35a65a79752058f53eee74947ba5Ian Romanick
13951660a2954797e056caba319c5d6c70b0d4be22feCarl Worth	 result = new(ctx) ir_dereference_variable(tmp);
13967825d3d15710fdfcfc503754862963aac8065480Ian Romanick      }
1397251eb753187fee83e6413f44f8b3cf0be1b4f4cbIan Romanick      break;
139896f9cea11606bb1bd8e07edc17032447424b8bffIan Romanick   }
1399a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick
1400a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   case ast_pre_inc:
140176ea56c007263ec3b79234e7b775e3a7b519a54aEric Anholt   case ast_pre_dec: {
140276ea56c007263ec3b79234e7b775e3a7b519a54aEric Anholt      op[0] = this->subexpressions[0]->hir(instructions, state);
140376ea56c007263ec3b79234e7b775e3a7b519a54aEric Anholt      if (op[0]->type->base_type == GLSL_TYPE_FLOAT)
14041660a2954797e056caba319c5d6c70b0d4be22feCarl Worth	 op[1] = new(ctx) ir_constant(1.0f);
140576ea56c007263ec3b79234e7b775e3a7b519a54aEric Anholt      else
14061660a2954797e056caba319c5d6c70b0d4be22feCarl Worth	 op[1] = new(ctx) ir_constant(1);
140776ea56c007263ec3b79234e7b775e3a7b519a54aEric Anholt
1408a13bb1490c57ea958f2d1853d71c55d03263e9e4Eric Anholt      type = arithmetic_result_type(op[0], op[1], false, state, & loc);
140976ea56c007263ec3b79234e7b775e3a7b519a54aEric Anholt
1410768b55a5268572ff9fd03e57e92775882eb0a821Ian Romanick      ir_rvalue *temp_rhs;
14111660a2954797e056caba319c5d6c70b0d4be22feCarl Worth      temp_rhs = new(ctx) ir_expression(operations[this->oper], type,
14121660a2954797e056caba319c5d6c70b0d4be22feCarl Worth					op[0], op[1]);
141376ea56c007263ec3b79234e7b775e3a7b519a54aEric Anholt
14143e24ef68a9b22918c8b21b743d81bbf86f43c119Eric Anholt      result = do_assignment(instructions, state,
14158273bd46877e2ea2b8a02b87a11c68102d07e1f2Eric Anholt			     op[0]->clone(ctx, NULL), temp_rhs,
141676ea56c007263ec3b79234e7b775e3a7b519a54aEric Anholt			     this->subexpressions[0]->get_location());
141776ea56c007263ec3b79234e7b775e3a7b519a54aEric Anholt      type = result->type;
141876ea56c007263ec3b79234e7b775e3a7b519a54aEric Anholt      error_emitted = op[0]->type->is_error();
141976ea56c007263ec3b79234e7b775e3a7b519a54aEric Anholt      break;
142076ea56c007263ec3b79234e7b775e3a7b519a54aEric Anholt   }
1421a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick
1422a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   case ast_post_inc:
1423de38f0ed53c80f87478c3899d4ff1bc3a601ea6bEric Anholt   case ast_post_dec: {
1424de38f0ed53c80f87478c3899d4ff1bc3a601ea6bEric Anholt      op[0] = this->subexpressions[0]->hir(instructions, state);
1425de38f0ed53c80f87478c3899d4ff1bc3a601ea6bEric Anholt      if (op[0]->type->base_type == GLSL_TYPE_FLOAT)
14261660a2954797e056caba319c5d6c70b0d4be22feCarl Worth	 op[1] = new(ctx) ir_constant(1.0f);
1427de38f0ed53c80f87478c3899d4ff1bc3a601ea6bEric Anholt      else
14281660a2954797e056caba319c5d6c70b0d4be22feCarl Worth	 op[1] = new(ctx) ir_constant(1);
1429de38f0ed53c80f87478c3899d4ff1bc3a601ea6bEric Anholt
1430de38f0ed53c80f87478c3899d4ff1bc3a601ea6bEric Anholt      error_emitted = op[0]->type->is_error() || op[1]->type->is_error();
1431de38f0ed53c80f87478c3899d4ff1bc3a601ea6bEric Anholt
1432a13bb1490c57ea958f2d1853d71c55d03263e9e4Eric Anholt      type = arithmetic_result_type(op[0], op[1], false, state, & loc);
1433de38f0ed53c80f87478c3899d4ff1bc3a601ea6bEric Anholt
1434768b55a5268572ff9fd03e57e92775882eb0a821Ian Romanick      ir_rvalue *temp_rhs;
14351660a2954797e056caba319c5d6c70b0d4be22feCarl Worth      temp_rhs = new(ctx) ir_expression(operations[this->oper], type,
14361660a2954797e056caba319c5d6c70b0d4be22feCarl Worth					op[0], op[1]);
1437de38f0ed53c80f87478c3899d4ff1bc3a601ea6bEric Anholt
1438de38f0ed53c80f87478c3899d4ff1bc3a601ea6bEric Anholt      /* Get a temporary of a copy of the lvalue before it's modified.
1439de38f0ed53c80f87478c3899d4ff1bc3a601ea6bEric Anholt       * This may get thrown away later.
1440de38f0ed53c80f87478c3899d4ff1bc3a601ea6bEric Anholt       */
14418273bd46877e2ea2b8a02b87a11c68102d07e1f2Eric Anholt      result = get_lvalue_copy(instructions, op[0]->clone(ctx, NULL));
1442de38f0ed53c80f87478c3899d4ff1bc3a601ea6bEric Anholt
14433e24ef68a9b22918c8b21b743d81bbf86f43c119Eric Anholt      (void)do_assignment(instructions, state,
14448273bd46877e2ea2b8a02b87a11c68102d07e1f2Eric Anholt			  op[0]->clone(ctx, NULL), temp_rhs,
1445de38f0ed53c80f87478c3899d4ff1bc3a601ea6bEric Anholt			  this->subexpressions[0]->get_location());
1446de38f0ed53c80f87478c3899d4ff1bc3a601ea6bEric Anholt
1447de38f0ed53c80f87478c3899d4ff1bc3a601ea6bEric Anholt      type = result->type;
1448de38f0ed53c80f87478c3899d4ff1bc3a601ea6bEric Anholt      error_emitted = op[0]->type->is_error();
1449a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick      break;
1450de38f0ed53c80f87478c3899d4ff1bc3a601ea6bEric Anholt   }
1451a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick
1452a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   case ast_field_selection:
145318238de6c34a1a32c452f1006ed13d8adc1bc9d7Ian Romanick      result = _mesa_ast_field_selection_to_hir(this, instructions, state);
1454a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick      type = result->type;
1455a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick      break;
1456a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick
145727e3cf8c0d8812f9be55ca6ceb52cf8232742d99Ian Romanick   case ast_array_index: {
145827e3cf8c0d8812f9be55ca6ceb52cf8232742d99Ian Romanick      YYLTYPE index_loc = subexpressions[1]->get_location();
145927e3cf8c0d8812f9be55ca6ceb52cf8232742d99Ian Romanick
146027e3cf8c0d8812f9be55ca6ceb52cf8232742d99Ian Romanick      op[0] = subexpressions[0]->hir(instructions, state);
146127e3cf8c0d8812f9be55ca6ceb52cf8232742d99Ian Romanick      op[1] = subexpressions[1]->hir(instructions, state);
146227e3cf8c0d8812f9be55ca6ceb52cf8232742d99Ian Romanick
146327e3cf8c0d8812f9be55ca6ceb52cf8232742d99Ian Romanick      error_emitted = op[0]->type->is_error() || op[1]->type->is_error();
146427e3cf8c0d8812f9be55ca6ceb52cf8232742d99Ian Romanick
1465a9159f9e87b518ba0a4ad43db8fdd58a678b3a92Ian Romanick      ir_rvalue *const array = op[0];
1466b8a21cc6df7e9da15a24ed3dbf60cd4aeb8effaaIan Romanick
14671660a2954797e056caba319c5d6c70b0d4be22feCarl Worth      result = new(ctx) ir_dereference_array(op[0], op[1]);
1468b8a21cc6df7e9da15a24ed3dbf60cd4aeb8effaaIan Romanick
1469b8a21cc6df7e9da15a24ed3dbf60cd4aeb8effaaIan Romanick      /* Do not use op[0] after this point.  Use array.
1470b8a21cc6df7e9da15a24ed3dbf60cd4aeb8effaaIan Romanick       */
1471b8a21cc6df7e9da15a24ed3dbf60cd4aeb8effaaIan Romanick      op[0] = NULL;
1472b8a21cc6df7e9da15a24ed3dbf60cd4aeb8effaaIan Romanick
147327e3cf8c0d8812f9be55ca6ceb52cf8232742d99Ian Romanick
147427e3cf8c0d8812f9be55ca6ceb52cf8232742d99Ian Romanick      if (error_emitted)
147527e3cf8c0d8812f9be55ca6ceb52cf8232742d99Ian Romanick	 break;
147627e3cf8c0d8812f9be55ca6ceb52cf8232742d99Ian Romanick
147763038e18ad44e4e021da9a6dbe7a075e57ff6415Ian Romanick      if (!array->type->is_array()
147863038e18ad44e4e021da9a6dbe7a075e57ff6415Ian Romanick	  && !array->type->is_matrix()
147963038e18ad44e4e021da9a6dbe7a075e57ff6415Ian Romanick	  && !array->type->is_vector()) {
148027e3cf8c0d8812f9be55ca6ceb52cf8232742d99Ian Romanick	 _mesa_glsl_error(& index_loc, state,
148163038e18ad44e4e021da9a6dbe7a075e57ff6415Ian Romanick			  "cannot dereference non-array / non-matrix / "
148263038e18ad44e4e021da9a6dbe7a075e57ff6415Ian Romanick			  "non-vector");
148327e3cf8c0d8812f9be55ca6ceb52cf8232742d99Ian Romanick	 error_emitted = true;
148427e3cf8c0d8812f9be55ca6ceb52cf8232742d99Ian Romanick      }
148527e3cf8c0d8812f9be55ca6ceb52cf8232742d99Ian Romanick
148627e3cf8c0d8812f9be55ca6ceb52cf8232742d99Ian Romanick      if (!op[1]->type->is_integer()) {
148727e3cf8c0d8812f9be55ca6ceb52cf8232742d99Ian Romanick	 _mesa_glsl_error(& index_loc, state,
148827e3cf8c0d8812f9be55ca6ceb52cf8232742d99Ian Romanick			  "array index must be integer type");
148927e3cf8c0d8812f9be55ca6ceb52cf8232742d99Ian Romanick	 error_emitted = true;
149027e3cf8c0d8812f9be55ca6ceb52cf8232742d99Ian Romanick      } else if (!op[1]->type->is_scalar()) {
149127e3cf8c0d8812f9be55ca6ceb52cf8232742d99Ian Romanick	 _mesa_glsl_error(& index_loc, state,
149227e3cf8c0d8812f9be55ca6ceb52cf8232742d99Ian Romanick			  "array index must be scalar");
149327e3cf8c0d8812f9be55ca6ceb52cf8232742d99Ian Romanick	 error_emitted = true;
149427e3cf8c0d8812f9be55ca6ceb52cf8232742d99Ian Romanick      }
149527e3cf8c0d8812f9be55ca6ceb52cf8232742d99Ian Romanick
149627e3cf8c0d8812f9be55ca6ceb52cf8232742d99Ian Romanick      /* If the array index is a constant expression and the array has a
149727e3cf8c0d8812f9be55ca6ceb52cf8232742d99Ian Romanick       * declared size, ensure that the access is in-bounds.  If the array
149827e3cf8c0d8812f9be55ca6ceb52cf8232742d99Ian Romanick       * index is not a constant expression, ensure that the array has a
149927e3cf8c0d8812f9be55ca6ceb52cf8232742d99Ian Romanick       * declared size.
150027e3cf8c0d8812f9be55ca6ceb52cf8232742d99Ian Romanick       */
150127e3cf8c0d8812f9be55ca6ceb52cf8232742d99Ian Romanick      ir_constant *const const_index = op[1]->constant_expression_value();
150227e3cf8c0d8812f9be55ca6ceb52cf8232742d99Ian Romanick      if (const_index != NULL) {
150327e3cf8c0d8812f9be55ca6ceb52cf8232742d99Ian Romanick	 const int idx = const_index->value.i[0];
150463038e18ad44e4e021da9a6dbe7a075e57ff6415Ian Romanick	 const char *type_name;
150563038e18ad44e4e021da9a6dbe7a075e57ff6415Ian Romanick	 unsigned bound = 0;
150663038e18ad44e4e021da9a6dbe7a075e57ff6415Ian Romanick
150763038e18ad44e4e021da9a6dbe7a075e57ff6415Ian Romanick	 if (array->type->is_matrix()) {
150863038e18ad44e4e021da9a6dbe7a075e57ff6415Ian Romanick	    type_name = "matrix";
150963038e18ad44e4e021da9a6dbe7a075e57ff6415Ian Romanick	 } else if (array->type->is_vector()) {
151063038e18ad44e4e021da9a6dbe7a075e57ff6415Ian Romanick	    type_name = "vector";
151163038e18ad44e4e021da9a6dbe7a075e57ff6415Ian Romanick	 } else {
151263038e18ad44e4e021da9a6dbe7a075e57ff6415Ian Romanick	    type_name = "array";
151363038e18ad44e4e021da9a6dbe7a075e57ff6415Ian Romanick	 }
151427e3cf8c0d8812f9be55ca6ceb52cf8232742d99Ian Romanick
151527e3cf8c0d8812f9be55ca6ceb52cf8232742d99Ian Romanick	 /* From page 24 (page 30 of the PDF) of the GLSL 1.50 spec:
151627e3cf8c0d8812f9be55ca6ceb52cf8232742d99Ian Romanick	  *
151727e3cf8c0d8812f9be55ca6ceb52cf8232742d99Ian Romanick	  *    "It is illegal to declare an array with a size, and then
151827e3cf8c0d8812f9be55ca6ceb52cf8232742d99Ian Romanick	  *    later (in the same shader) index the same array with an
151927e3cf8c0d8812f9be55ca6ceb52cf8232742d99Ian Romanick	  *    integral constant expression greater than or equal to the
152027e3cf8c0d8812f9be55ca6ceb52cf8232742d99Ian Romanick	  *    declared size. It is also illegal to index an array with a
152127e3cf8c0d8812f9be55ca6ceb52cf8232742d99Ian Romanick	  *    negative constant expression."
152227e3cf8c0d8812f9be55ca6ceb52cf8232742d99Ian Romanick	  */
152363038e18ad44e4e021da9a6dbe7a075e57ff6415Ian Romanick	 if (array->type->is_matrix()) {
152463038e18ad44e4e021da9a6dbe7a075e57ff6415Ian Romanick	    if (array->type->row_type()->vector_elements <= idx) {
152563038e18ad44e4e021da9a6dbe7a075e57ff6415Ian Romanick	       bound = array->type->row_type()->vector_elements;
152663038e18ad44e4e021da9a6dbe7a075e57ff6415Ian Romanick	    }
152763038e18ad44e4e021da9a6dbe7a075e57ff6415Ian Romanick	 } else if (array->type->is_vector()) {
152863038e18ad44e4e021da9a6dbe7a075e57ff6415Ian Romanick	    if (array->type->vector_elements <= idx) {
152963038e18ad44e4e021da9a6dbe7a075e57ff6415Ian Romanick	       bound = array->type->vector_elements;
153063038e18ad44e4e021da9a6dbe7a075e57ff6415Ian Romanick	    }
153163038e18ad44e4e021da9a6dbe7a075e57ff6415Ian Romanick	 } else {
153263038e18ad44e4e021da9a6dbe7a075e57ff6415Ian Romanick	    if ((array->type->array_size() > 0)
153363038e18ad44e4e021da9a6dbe7a075e57ff6415Ian Romanick		&& (array->type->array_size() <= idx)) {
153463038e18ad44e4e021da9a6dbe7a075e57ff6415Ian Romanick	       bound = array->type->array_size();
153563038e18ad44e4e021da9a6dbe7a075e57ff6415Ian Romanick	    }
153627e3cf8c0d8812f9be55ca6ceb52cf8232742d99Ian Romanick	 }
153727e3cf8c0d8812f9be55ca6ceb52cf8232742d99Ian Romanick
153863038e18ad44e4e021da9a6dbe7a075e57ff6415Ian Romanick	 if (bound > 0) {
153963038e18ad44e4e021da9a6dbe7a075e57ff6415Ian Romanick	    _mesa_glsl_error(& loc, state, "%s index must be < %u",
154063038e18ad44e4e021da9a6dbe7a075e57ff6415Ian Romanick			     type_name, bound);
154163038e18ad44e4e021da9a6dbe7a075e57ff6415Ian Romanick	    error_emitted = true;
154263038e18ad44e4e021da9a6dbe7a075e57ff6415Ian Romanick	 } else if (idx < 0) {
154363038e18ad44e4e021da9a6dbe7a075e57ff6415Ian Romanick	    _mesa_glsl_error(& loc, state, "%s index must be >= 0",
154463038e18ad44e4e021da9a6dbe7a075e57ff6415Ian Romanick			     type_name);
154527e3cf8c0d8812f9be55ca6ceb52cf8232742d99Ian Romanick	    error_emitted = true;
154627e3cf8c0d8812f9be55ca6ceb52cf8232742d99Ian Romanick	 }
1547b8a21cc6df7e9da15a24ed3dbf60cd4aeb8effaaIan Romanick
154863038e18ad44e4e021da9a6dbe7a075e57ff6415Ian Romanick	 if (array->type->is_array()) {
1549a9159f9e87b518ba0a4ad43db8fdd58a678b3a92Ian Romanick	    /* If the array is a variable dereference, it dereferences the
1550a9159f9e87b518ba0a4ad43db8fdd58a678b3a92Ian Romanick	     * whole array, by definition.  Use this to get the variable.
1551a9159f9e87b518ba0a4ad43db8fdd58a678b3a92Ian Romanick	     *
1552a9159f9e87b518ba0a4ad43db8fdd58a678b3a92Ian Romanick	     * FINISHME: Should some methods for getting / setting / testing
1553a9159f9e87b518ba0a4ad43db8fdd58a678b3a92Ian Romanick	     * FINISHME: array access limits be added to ir_dereference?
1554a9159f9e87b518ba0a4ad43db8fdd58a678b3a92Ian Romanick	     */
1555a9159f9e87b518ba0a4ad43db8fdd58a678b3a92Ian Romanick	    ir_variable *const v = array->whole_variable_referenced();
155663038e18ad44e4e021da9a6dbe7a075e57ff6415Ian Romanick	    if ((v != NULL) && (unsigned(idx) > v->max_array_access))
155763038e18ad44e4e021da9a6dbe7a075e57ff6415Ian Romanick	       v->max_array_access = idx;
155863038e18ad44e4e021da9a6dbe7a075e57ff6415Ian Romanick	 }
15592b7c42b40ae459f7b290eb134d6dabd075aab9f0Kenneth Graunke      } else if (array->type->array_size() == 0) {
15602b7c42b40ae459f7b290eb134d6dabd075aab9f0Kenneth Graunke	 _mesa_glsl_error(&loc, state, "unsized array index must be constant");
1561a721abfbd1724e83381b46fc670bb38fbde76f69Eric Anholt      } else {
1562a721abfbd1724e83381b46fc670bb38fbde76f69Eric Anholt	 if (array->type->is_array()) {
15635226f8c7b0025031e8540adc93ecfe0b36b8f90fAras Pranckevicius	    /* whole_variable_referenced can return NULL if the array is a
15645226f8c7b0025031e8540adc93ecfe0b36b8f90fAras Pranckevicius	     * member of a structure.  In this case it is safe to not update
15655226f8c7b0025031e8540adc93ecfe0b36b8f90fAras Pranckevicius	     * the max_array_access field because it is never used for fields
15665226f8c7b0025031e8540adc93ecfe0b36b8f90fAras Pranckevicius	     * of structures.
15675226f8c7b0025031e8540adc93ecfe0b36b8f90fAras Pranckevicius	     */
1568a721abfbd1724e83381b46fc670bb38fbde76f69Eric Anholt	    ir_variable *v = array->whole_variable_referenced();
15695226f8c7b0025031e8540adc93ecfe0b36b8f90fAras Pranckevicius	    if (v != NULL)
15705226f8c7b0025031e8540adc93ecfe0b36b8f90fAras Pranckevicius	       v->max_array_access = array->type->array_size();
1571a721abfbd1724e83381b46fc670bb38fbde76f69Eric Anholt	 }
157227e3cf8c0d8812f9be55ca6ceb52cf8232742d99Ian Romanick      }
157327e3cf8c0d8812f9be55ca6ceb52cf8232742d99Ian Romanick
1574e942f328365309a1d8240cfe8eb5d88391015f37Ian Romanick      /* From page 23 (29 of the PDF) of the GLSL 1.30 spec:
1575e942f328365309a1d8240cfe8eb5d88391015f37Ian Romanick       *
1576f0f2ec4d8a50c79c2943ac95eb790fb734d88980Chad Versace       *    "Samplers aggregated into arrays within a shader (using square
1577f0f2ec4d8a50c79c2943ac95eb790fb734d88980Chad Versace       *    brackets [ ]) can only be indexed with integral constant
1578f0f2ec4d8a50c79c2943ac95eb790fb734d88980Chad Versace       *    expressions [...]."
1579e942f328365309a1d8240cfe8eb5d88391015f37Ian Romanick       *
1580e942f328365309a1d8240cfe8eb5d88391015f37Ian Romanick       * This restriction was added in GLSL 1.30.  Shaders using earlier version
1581e942f328365309a1d8240cfe8eb5d88391015f37Ian Romanick       * of the language should not be rejected by the compiler front-end for
1582e942f328365309a1d8240cfe8eb5d88391015f37Ian Romanick       * using this construct.  This allows useful things such as using a loop
1583e942f328365309a1d8240cfe8eb5d88391015f37Ian Romanick       * counter as the index to an array of samplers.  If the loop in unrolled,
1584e942f328365309a1d8240cfe8eb5d88391015f37Ian Romanick       * the code should compile correctly.  Instead, emit a warning.
1585f0f2ec4d8a50c79c2943ac95eb790fb734d88980Chad Versace       */
1586f0f2ec4d8a50c79c2943ac95eb790fb734d88980Chad Versace      if (array->type->is_array() &&
1587f0f2ec4d8a50c79c2943ac95eb790fb734d88980Chad Versace          array->type->element_type()->is_sampler() &&
1588f0f2ec4d8a50c79c2943ac95eb790fb734d88980Chad Versace          const_index == NULL) {
1589f0f2ec4d8a50c79c2943ac95eb790fb734d88980Chad Versace
1590e942f328365309a1d8240cfe8eb5d88391015f37Ian Romanick	 if (state->language_version == 100) {
1591e942f328365309a1d8240cfe8eb5d88391015f37Ian Romanick	    _mesa_glsl_warning(&loc, state,
1592e942f328365309a1d8240cfe8eb5d88391015f37Ian Romanick			       "sampler arrays indexed with non-constant "
1593e942f328365309a1d8240cfe8eb5d88391015f37Ian Romanick			       "expressions is optional in GLSL ES 1.00");
1594e942f328365309a1d8240cfe8eb5d88391015f37Ian Romanick	 } else if (state->language_version < 130) {
1595e942f328365309a1d8240cfe8eb5d88391015f37Ian Romanick	    _mesa_glsl_warning(&loc, state,
1596e942f328365309a1d8240cfe8eb5d88391015f37Ian Romanick			       "sampler arrays indexed with non-constant "
1597e942f328365309a1d8240cfe8eb5d88391015f37Ian Romanick			       "expressions is forbidden in GLSL 1.30 and "
1598e942f328365309a1d8240cfe8eb5d88391015f37Ian Romanick			       "later");
1599e942f328365309a1d8240cfe8eb5d88391015f37Ian Romanick	 } else {
1600e942f328365309a1d8240cfe8eb5d88391015f37Ian Romanick	    _mesa_glsl_error(&loc, state,
1601e942f328365309a1d8240cfe8eb5d88391015f37Ian Romanick			     "sampler arrays indexed with non-constant "
1602e942f328365309a1d8240cfe8eb5d88391015f37Ian Romanick			     "expressions is forbidden in GLSL 1.30 and "
1603e942f328365309a1d8240cfe8eb5d88391015f37Ian Romanick			     "later");
1604e942f328365309a1d8240cfe8eb5d88391015f37Ian Romanick	    error_emitted = true;
1605e942f328365309a1d8240cfe8eb5d88391015f37Ian Romanick	 }
1606f0f2ec4d8a50c79c2943ac95eb790fb734d88980Chad Versace      }
1607f0f2ec4d8a50c79c2943ac95eb790fb734d88980Chad Versace
160827e3cf8c0d8812f9be55ca6ceb52cf8232742d99Ian Romanick      if (error_emitted)
160927e3cf8c0d8812f9be55ca6ceb52cf8232742d99Ian Romanick	 result->type = glsl_type::error_type;
161027e3cf8c0d8812f9be55ca6ceb52cf8232742d99Ian Romanick
161127e3cf8c0d8812f9be55ca6ceb52cf8232742d99Ian Romanick      type = result->type;
1612a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick      break;
161327e3cf8c0d8812f9be55ca6ceb52cf8232742d99Ian Romanick   }
1614a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick
1615a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   case ast_function_call:
16167cfddf19413ef61fcf1450bd61e9ece4cf1735a4Ian Romanick      /* Should *NEVER* get here.  ast_function_call should always be handled
16177cfddf19413ef61fcf1450bd61e9ece4cf1735a4Ian Romanick       * by ast_function_expression::hir.
1618a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick       */
16197cfddf19413ef61fcf1450bd61e9ece4cf1735a4Ian Romanick      assert(0);
1620a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick      break;
1621a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick
1622a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   case ast_identifier: {
1623a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick      /* ast_identifier can appear several places in a full abstract syntax
1624a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick       * tree.  This particular use must be at location specified in the grammar
1625a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick       * as 'variable_identifier'.
1626a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick       */
16278bde4cec6b189564b1f2d58514bd7e7a4b40f714Ian Romanick      ir_variable *var =
16288bde4cec6b189564b1f2d58514bd7e7a4b40f714Ian Romanick	 state->symbols->get_variable(this->primary_expression.identifier);
1629a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick
16301660a2954797e056caba319c5d6c70b0d4be22feCarl Worth      result = new(ctx) ir_dereference_variable(var);
1631a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick
1632a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick      if (var != NULL) {
1633bd33055ef4b6dd18d6247ff7d9e47496ff4acc51Ian Romanick	 var->used = true;
1634a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick	 type = result->type;
1635a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick      } else {
163671d0bbfcb2853f37b580ec7b705e55bb0eb426faIan Romanick	 _mesa_glsl_error(& loc, state, "`%s' undeclared",
163718238de6c34a1a32c452f1006ed13d8adc1bc9d7Ian Romanick			  this->primary_expression.identifier);
1638a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick
1639a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick	 error_emitted = true;
1640a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick      }
1641a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick      break;
1642a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   }
1643a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick
1644a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   case ast_int_constant:
16450471e8b0896e05b3bc81ccad6184e6e35fb61425Ian Romanick      type = glsl_type::int_type;
16461660a2954797e056caba319c5d6c70b0d4be22feCarl Worth      result = new(ctx) ir_constant(this->primary_expression.int_constant);
1647a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick      break;
1648a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick
1649a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   case ast_uint_constant:
16500471e8b0896e05b3bc81ccad6184e6e35fb61425Ian Romanick      type = glsl_type::uint_type;
16511660a2954797e056caba319c5d6c70b0d4be22feCarl Worth      result = new(ctx) ir_constant(this->primary_expression.uint_constant);
1652a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick      break;
1653a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick
1654a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   case ast_float_constant:
16550471e8b0896e05b3bc81ccad6184e6e35fb61425Ian Romanick      type = glsl_type::float_type;
16561660a2954797e056caba319c5d6c70b0d4be22feCarl Worth      result = new(ctx) ir_constant(this->primary_expression.float_constant);
1657a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick      break;
1658a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick
1659a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   case ast_bool_constant:
16600471e8b0896e05b3bc81ccad6184e6e35fb61425Ian Romanick      type = glsl_type::bool_type;
16611660a2954797e056caba319c5d6c70b0d4be22feCarl Worth      result = new(ctx) ir_constant(bool(this->primary_expression.bool_constant));
1662a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick      break;
1663a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick
1664a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   case ast_sequence: {
1665a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick      /* It should not be possible to generate a sequence in the AST without
1666a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick       * any expressions in it.
1667a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick       */
1668304ea90233baeac6801a98e981658cb7a2d2501cIan Romanick      assert(!this->expressions.is_empty());
1669a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick
1670a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick      /* The r-value of a sequence is the last expression in the sequence.  If
1671a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick       * the other expressions in the sequence do not have side-effects (and
1672a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick       * therefore add instructions to the instruction list), they get dropped
1673a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick       * on the floor.
1674a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick       */
16752b97dc657a0e762bc67216405419cd348eb948c0Ian Romanick      foreach_list_typed (ast_node, ast, link, &this->expressions)
1676304ea90233baeac6801a98e981658cb7a2d2501cIan Romanick	 result = ast->hir(instructions, state);
1677a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick
1678a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick      type = result->type;
1679a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick
1680a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick      /* Any errors should have already been emitted in the loop above.
1681a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick       */
1682a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick      error_emitted = true;
1683a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick      break;
1684a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   }
1685a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   }
1686a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick
1687cef3baecf636a30b62cd7a1e8de57c7650f7003eIan Romanick   if (type->is_error() && !error_emitted)
168871d0bbfcb2853f37b580ec7b705e55bb0eb426faIan Romanick      _mesa_glsl_error(& loc, state, "type mismatch");
1689a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick
1690a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   return result;
1691a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick}
1692a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick
1693a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick
1694fb9fb5f51deca28ed1ec7b71759fb71fc26a0ab6Kenneth Graunkeir_rvalue *
16950044e7edcea22d2456c051a1c4b744a26960ad27Ian Romanickast_expression_statement::hir(exec_list *instructions,
169618238de6c34a1a32c452f1006ed13d8adc1bc9d7Ian Romanick			      struct _mesa_glsl_parse_state *state)
1697a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick{
1698a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   /* It is possible to have expression statements that don't have an
1699a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick    * expression.  This is the solitary semicolon:
1700a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick    *
1701a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick    * for (i = 0; i < 5; i++)
1702a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick    *     ;
1703a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick    *
1704a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick    * In this case the expression will be NULL.  Test for NULL and don't do
1705a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick    * anything in that case.
1706a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick    */
170718238de6c34a1a32c452f1006ed13d8adc1bc9d7Ian Romanick   if (expression != NULL)
170818238de6c34a1a32c452f1006ed13d8adc1bc9d7Ian Romanick      expression->hir(instructions, state);
1709a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick
1710a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   /* Statements do not have r-values.
1711a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick    */
1712a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   return NULL;
1713a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick}
1714a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick
1715a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick
1716fb9fb5f51deca28ed1ec7b71759fb71fc26a0ab6Kenneth Graunkeir_rvalue *
17170044e7edcea22d2456c051a1c4b744a26960ad27Ian Romanickast_compound_statement::hir(exec_list *instructions,
171818238de6c34a1a32c452f1006ed13d8adc1bc9d7Ian Romanick			    struct _mesa_glsl_parse_state *state)
1719a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick{
172018238de6c34a1a32c452f1006ed13d8adc1bc9d7Ian Romanick   if (new_scope)
17218bde4cec6b189564b1f2d58514bd7e7a4b40f714Ian Romanick      state->symbols->push_scope();
1722a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick
17232b97dc657a0e762bc67216405419cd348eb948c0Ian Romanick   foreach_list_typed (ast_node, ast, link, &this->statements)
1724304ea90233baeac6801a98e981658cb7a2d2501cIan Romanick      ast->hir(instructions, state);
1725a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick
172618238de6c34a1a32c452f1006ed13d8adc1bc9d7Ian Romanick   if (new_scope)
17278bde4cec6b189564b1f2d58514bd7e7a4b40f714Ian Romanick      state->symbols->pop_scope();
1728a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick
1729a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   /* Compound statements do not have r-values.
1730a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick    */
1731a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   return NULL;
1732a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick}
1733a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick
1734a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick
173528009cd75cd3328774bd80a5b87a255ac881a710Ian Romanickstatic const glsl_type *
1736d8e34e29eb58c38ef60226156aab8f4a93b397b7Kenneth Graunkeprocess_array_type(YYLTYPE *loc, const glsl_type *base, ast_node *array_size,
173728009cd75cd3328774bd80a5b87a255ac881a710Ian Romanick		   struct _mesa_glsl_parse_state *state)
173828009cd75cd3328774bd80a5b87a255ac881a710Ian Romanick{
173928009cd75cd3328774bd80a5b87a255ac881a710Ian Romanick   unsigned length = 0;
174028009cd75cd3328774bd80a5b87a255ac881a710Ian Romanick
174128009cd75cd3328774bd80a5b87a255ac881a710Ian Romanick   /* FINISHME: Reject delcarations of multidimensional arrays. */
174228009cd75cd3328774bd80a5b87a255ac881a710Ian Romanick
174328009cd75cd3328774bd80a5b87a255ac881a710Ian Romanick   if (array_size != NULL) {
174428009cd75cd3328774bd80a5b87a255ac881a710Ian Romanick      exec_list dummy_instructions;
174528009cd75cd3328774bd80a5b87a255ac881a710Ian Romanick      ir_rvalue *const ir = array_size->hir(& dummy_instructions, state);
174628009cd75cd3328774bd80a5b87a255ac881a710Ian Romanick      YYLTYPE loc = array_size->get_location();
174728009cd75cd3328774bd80a5b87a255ac881a710Ian Romanick
174828009cd75cd3328774bd80a5b87a255ac881a710Ian Romanick      /* FINISHME: Verify that the grammar forbids side-effects in array
174928009cd75cd3328774bd80a5b87a255ac881a710Ian Romanick       * FINISHME: sizes.   i.e., 'vec4 [x = 12] data'
175028009cd75cd3328774bd80a5b87a255ac881a710Ian Romanick       */
175128009cd75cd3328774bd80a5b87a255ac881a710Ian Romanick      assert(dummy_instructions.is_empty());
175228009cd75cd3328774bd80a5b87a255ac881a710Ian Romanick
175328009cd75cd3328774bd80a5b87a255ac881a710Ian Romanick      if (ir != NULL) {
175428009cd75cd3328774bd80a5b87a255ac881a710Ian Romanick	 if (!ir->type->is_integer()) {
175528009cd75cd3328774bd80a5b87a255ac881a710Ian Romanick	    _mesa_glsl_error(& loc, state, "array size must be integer type");
175628009cd75cd3328774bd80a5b87a255ac881a710Ian Romanick	 } else if (!ir->type->is_scalar()) {
175728009cd75cd3328774bd80a5b87a255ac881a710Ian Romanick	    _mesa_glsl_error(& loc, state, "array size must be scalar type");
175828009cd75cd3328774bd80a5b87a255ac881a710Ian Romanick	 } else {
175928009cd75cd3328774bd80a5b87a255ac881a710Ian Romanick	    ir_constant *const size = ir->constant_expression_value();
176028009cd75cd3328774bd80a5b87a255ac881a710Ian Romanick
176128009cd75cd3328774bd80a5b87a255ac881a710Ian Romanick	    if (size == NULL) {
176228009cd75cd3328774bd80a5b87a255ac881a710Ian Romanick	       _mesa_glsl_error(& loc, state, "array size must be a "
176328009cd75cd3328774bd80a5b87a255ac881a710Ian Romanick				"constant valued expression");
176428009cd75cd3328774bd80a5b87a255ac881a710Ian Romanick	    } else if (size->value.i[0] <= 0) {
176528009cd75cd3328774bd80a5b87a255ac881a710Ian Romanick	       _mesa_glsl_error(& loc, state, "array size must be > 0");
176628009cd75cd3328774bd80a5b87a255ac881a710Ian Romanick	    } else {
176728009cd75cd3328774bd80a5b87a255ac881a710Ian Romanick	       assert(size->type == ir->type);
176828009cd75cd3328774bd80a5b87a255ac881a710Ian Romanick	       length = size->value.u[0];
176928009cd75cd3328774bd80a5b87a255ac881a710Ian Romanick	    }
177028009cd75cd3328774bd80a5b87a255ac881a710Ian Romanick	 }
177128009cd75cd3328774bd80a5b87a255ac881a710Ian Romanick      }
1772d8e34e29eb58c38ef60226156aab8f4a93b397b7Kenneth Graunke   } else if (state->es_shader) {
1773d8e34e29eb58c38ef60226156aab8f4a93b397b7Kenneth Graunke      /* Section 10.17 of the GLSL ES 1.00 specification states that unsized
1774d8e34e29eb58c38ef60226156aab8f4a93b397b7Kenneth Graunke       * array declarations have been removed from the language.
1775d8e34e29eb58c38ef60226156aab8f4a93b397b7Kenneth Graunke       */
1776d8e34e29eb58c38ef60226156aab8f4a93b397b7Kenneth Graunke      _mesa_glsl_error(loc, state, "unsized array declarations are not "
1777d8e34e29eb58c38ef60226156aab8f4a93b397b7Kenneth Graunke		       "allowed in GLSL ES 1.00.");
177828009cd75cd3328774bd80a5b87a255ac881a710Ian Romanick   }
177928009cd75cd3328774bd80a5b87a255ac881a710Ian Romanick
1780f38d15b80d4e4c8ecb7a76087cdc49835f0aa271Ian Romanick   return glsl_type::get_array_instance(base, length);
178128009cd75cd3328774bd80a5b87a255ac881a710Ian Romanick}
178228009cd75cd3328774bd80a5b87a255ac881a710Ian Romanick
178328009cd75cd3328774bd80a5b87a255ac881a710Ian Romanick
1784d612a127ccf12c11204f7f72a332de12f58f85a2Ian Romanickconst glsl_type *
1785d612a127ccf12c11204f7f72a332de12f58f85a2Ian Romanickast_type_specifier::glsl_type(const char **name,
1786d612a127ccf12c11204f7f72a332de12f58f85a2Ian Romanick			      struct _mesa_glsl_parse_state *state) const
1787a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick{
1788d612a127ccf12c11204f7f72a332de12f58f85a2Ian Romanick   const struct glsl_type *type;
1789a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick
1790ca92ae2699c4aad21c0811b9a5562b9223816cafKenneth Graunke   type = state->symbols->get_type(this->type_name);
1791ca92ae2699c4aad21c0811b9a5562b9223816cafKenneth Graunke   *name = this->type_name;
1792a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick
1793ca92ae2699c4aad21c0811b9a5562b9223816cafKenneth Graunke   if (this->is_array) {
1794ca92ae2699c4aad21c0811b9a5562b9223816cafKenneth Graunke      YYLTYPE loc = this->get_location();
1795ca92ae2699c4aad21c0811b9a5562b9223816cafKenneth Graunke      type = process_array_type(&loc, type, this->array_size, state);
1796a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   }
1797a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick
1798a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   return type;
1799a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick}
1800a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick
1801a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick
1802a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanickstatic void
1803a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanickapply_type_qualifier_to_variable(const struct ast_type_qualifier *qual,
1804768b55a5268572ff9fd03e57e92775882eb0a821Ian Romanick				 ir_variable *var,
18052e063f1adf9e529697483eaabc7e015b4b740267Eric Anholt				 struct _mesa_glsl_parse_state *state,
18062e063f1adf9e529697483eaabc7e015b4b740267Eric Anholt				 YYLTYPE *loc)
1807a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick{
1808bd33055ef4b6dd18d6247ff7d9e47496ff4acc51Ian Romanick   if (qual->flags.q.invariant) {
1809bd33055ef4b6dd18d6247ff7d9e47496ff4acc51Ian Romanick      if (var->used) {
1810bd33055ef4b6dd18d6247ff7d9e47496ff4acc51Ian Romanick	 _mesa_glsl_error(loc, state,
1811bd33055ef4b6dd18d6247ff7d9e47496ff4acc51Ian Romanick			  "variable `%s' may not be redeclared "
1812bd33055ef4b6dd18d6247ff7d9e47496ff4acc51Ian Romanick			  "`invariant' after being used",
1813bd33055ef4b6dd18d6247ff7d9e47496ff4acc51Ian Romanick			  var->name);
1814bd33055ef4b6dd18d6247ff7d9e47496ff4acc51Ian Romanick      } else {
1815bd33055ef4b6dd18d6247ff7d9e47496ff4acc51Ian Romanick	 var->invariant = 1;
1816bd33055ef4b6dd18d6247ff7d9e47496ff4acc51Ian Romanick      }
1817bd33055ef4b6dd18d6247ff7d9e47496ff4acc51Ian Romanick   }
1818a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick
1819e24d35a5b59ca1e75b69a32db6294787378a963fIan Romanick   if (qual->flags.q.constant || qual->flags.q.attribute
1820e24d35a5b59ca1e75b69a32db6294787378a963fIan Romanick       || qual->flags.q.uniform
1821e24d35a5b59ca1e75b69a32db6294787378a963fIan Romanick       || (qual->flags.q.varying && (state->target == fragment_shader)))
1822a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick      var->read_only = 1;
1823a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick
1824e24d35a5b59ca1e75b69a32db6294787378a963fIan Romanick   if (qual->flags.q.centroid)
1825a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick      var->centroid = 1;
1826a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick
1827e24d35a5b59ca1e75b69a32db6294787378a963fIan Romanick   if (qual->flags.q.attribute && state->target != vertex_shader) {
18282e063f1adf9e529697483eaabc7e015b4b740267Eric Anholt      var->type = glsl_type::error_type;
18292e063f1adf9e529697483eaabc7e015b4b740267Eric Anholt      _mesa_glsl_error(loc, state,
18302e063f1adf9e529697483eaabc7e015b4b740267Eric Anholt		       "`attribute' variables may not be declared in the "
1831ae4c4c07959f059e557ea44e98552ced1fec9f47Ian Romanick		       "%s shader",
1832ae4c4c07959f059e557ea44e98552ced1fec9f47Ian Romanick		       _mesa_glsl_shader_target_name(state->target));
18332e063f1adf9e529697483eaabc7e015b4b740267Eric Anholt   }
18342e063f1adf9e529697483eaabc7e015b4b740267Eric Anholt
183590b7825b0e92375dbe721d2dca1a4a3f1093f4abEric Anholt   /* From page 25 (page 31 of the PDF) of the GLSL 1.10 spec:
183690b7825b0e92375dbe721d2dca1a4a3f1093f4abEric Anholt    *
183790b7825b0e92375dbe721d2dca1a4a3f1093f4abEric Anholt    *     "The varying qualifier can be used only with the data types
183890b7825b0e92375dbe721d2dca1a4a3f1093f4abEric Anholt    *     float, vec2, vec3, vec4, mat2, mat3, and mat4, or arrays of
183990b7825b0e92375dbe721d2dca1a4a3f1093f4abEric Anholt    *     these."
184090b7825b0e92375dbe721d2dca1a4a3f1093f4abEric Anholt    */
1841e24d35a5b59ca1e75b69a32db6294787378a963fIan Romanick   if (qual->flags.q.varying) {
18420ca171908d04732176cbcaf2625fed8208a93dc9Eric Anholt      const glsl_type *non_array_type;
18430ca171908d04732176cbcaf2625fed8208a93dc9Eric Anholt
18440ca171908d04732176cbcaf2625fed8208a93dc9Eric Anholt      if (var->type && var->type->is_array())
18450ca171908d04732176cbcaf2625fed8208a93dc9Eric Anholt	 non_array_type = var->type->fields.array;
18460ca171908d04732176cbcaf2625fed8208a93dc9Eric Anholt      else
18470ca171908d04732176cbcaf2625fed8208a93dc9Eric Anholt	 non_array_type = var->type;
18480ca171908d04732176cbcaf2625fed8208a93dc9Eric Anholt
18490ca171908d04732176cbcaf2625fed8208a93dc9Eric Anholt      if (non_array_type && non_array_type->base_type != GLSL_TYPE_FLOAT) {
18500ca171908d04732176cbcaf2625fed8208a93dc9Eric Anholt	 var->type = glsl_type::error_type;
18510ca171908d04732176cbcaf2625fed8208a93dc9Eric Anholt	 _mesa_glsl_error(loc, state,
18520ca171908d04732176cbcaf2625fed8208a93dc9Eric Anholt			  "varying variables must be of base type float");
18530ca171908d04732176cbcaf2625fed8208a93dc9Eric Anholt      }
185490b7825b0e92375dbe721d2dca1a4a3f1093f4abEric Anholt   }
185590b7825b0e92375dbe721d2dca1a4a3f1093f4abEric Anholt
18567e2aa91507a5883e33473e0a94215ee3985baad1Ian Romanick   /* If there is no qualifier that changes the mode of the variable, leave
18577e2aa91507a5883e33473e0a94215ee3985baad1Ian Romanick    * the setting alone.
18587e2aa91507a5883e33473e0a94215ee3985baad1Ian Romanick    */
1859e24d35a5b59ca1e75b69a32db6294787378a963fIan Romanick   if (qual->flags.q.in && qual->flags.q.out)
1860a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick      var->mode = ir_var_inout;
1861e24d35a5b59ca1e75b69a32db6294787378a963fIan Romanick   else if (qual->flags.q.attribute || qual->flags.q.in
1862e24d35a5b59ca1e75b69a32db6294787378a963fIan Romanick	    || (qual->flags.q.varying && (state->target == fragment_shader)))
1863a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick      var->mode = ir_var_in;
1864e24d35a5b59ca1e75b69a32db6294787378a963fIan Romanick   else if (qual->flags.q.out
1865e24d35a5b59ca1e75b69a32db6294787378a963fIan Romanick	    || (qual->flags.q.varying && (state->target == vertex_shader)))
1866a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick      var->mode = ir_var_out;
1867e24d35a5b59ca1e75b69a32db6294787378a963fIan Romanick   else if (qual->flags.q.uniform)
1868a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick      var->mode = ir_var_uniform;
1869a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick
187086b4398cd158024f6be9fa830554a11c2a7ebe0cIan Romanick   if (state->all_invariant && (state->current_function == NULL)) {
187186b4398cd158024f6be9fa830554a11c2a7ebe0cIan Romanick      switch (state->target) {
187286b4398cd158024f6be9fa830554a11c2a7ebe0cIan Romanick      case vertex_shader:
187386b4398cd158024f6be9fa830554a11c2a7ebe0cIan Romanick	 if (var->mode == ir_var_out)
187486b4398cd158024f6be9fa830554a11c2a7ebe0cIan Romanick	    var->invariant = true;
187586b4398cd158024f6be9fa830554a11c2a7ebe0cIan Romanick	 break;
187686b4398cd158024f6be9fa830554a11c2a7ebe0cIan Romanick      case geometry_shader:
187786b4398cd158024f6be9fa830554a11c2a7ebe0cIan Romanick	 if ((var->mode == ir_var_in) || (var->mode == ir_var_out))
187886b4398cd158024f6be9fa830554a11c2a7ebe0cIan Romanick	    var->invariant = true;
187986b4398cd158024f6be9fa830554a11c2a7ebe0cIan Romanick	 break;
188086b4398cd158024f6be9fa830554a11c2a7ebe0cIan Romanick      case fragment_shader:
188186b4398cd158024f6be9fa830554a11c2a7ebe0cIan Romanick	 if (var->mode == ir_var_in)
188286b4398cd158024f6be9fa830554a11c2a7ebe0cIan Romanick	    var->invariant = true;
188386b4398cd158024f6be9fa830554a11c2a7ebe0cIan Romanick	 break;
188486b4398cd158024f6be9fa830554a11c2a7ebe0cIan Romanick      }
188586b4398cd158024f6be9fa830554a11c2a7ebe0cIan Romanick   }
188686b4398cd158024f6be9fa830554a11c2a7ebe0cIan Romanick
1887e24d35a5b59ca1e75b69a32db6294787378a963fIan Romanick   if (qual->flags.q.flat)
1888a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick      var->interpolation = ir_var_flat;
1889e24d35a5b59ca1e75b69a32db6294787378a963fIan Romanick   else if (qual->flags.q.noperspective)
1890a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick      var->interpolation = ir_var_noperspective;
1891a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   else
1892a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick      var->interpolation = ir_var_smooth;
18939d975377ca6dae7805804c0fbe625bb7c5f9e095Ian Romanick
1894e24d35a5b59ca1e75b69a32db6294787378a963fIan Romanick   var->pixel_center_integer = qual->flags.q.pixel_center_integer;
1895e24d35a5b59ca1e75b69a32db6294787378a963fIan Romanick   var->origin_upper_left = qual->flags.q.origin_upper_left;
1896e24d35a5b59ca1e75b69a32db6294787378a963fIan Romanick   if ((qual->flags.q.origin_upper_left || qual->flags.q.pixel_center_integer)
18978d8469eb2ade4fd48188403351a38f740987fb80Ian Romanick       && (strcmp(var->name, "gl_FragCoord") != 0)) {
1898e24d35a5b59ca1e75b69a32db6294787378a963fIan Romanick      const char *const qual_string = (qual->flags.q.origin_upper_left)
18998d8469eb2ade4fd48188403351a38f740987fb80Ian Romanick	 ? "origin_upper_left" : "pixel_center_integer";
19008d8469eb2ade4fd48188403351a38f740987fb80Ian Romanick
19018d8469eb2ade4fd48188403351a38f740987fb80Ian Romanick      _mesa_glsl_error(loc, state,
19028d8469eb2ade4fd48188403351a38f740987fb80Ian Romanick		       "layout qualifier `%s' can only be applied to "
19038d8469eb2ade4fd48188403351a38f740987fb80Ian Romanick		       "fragment shader input `gl_FragCoord'",
19048d8469eb2ade4fd48188403351a38f740987fb80Ian Romanick		       qual_string);
19058d8469eb2ade4fd48188403351a38f740987fb80Ian Romanick   }
19068d8469eb2ade4fd48188403351a38f740987fb80Ian Romanick
1907eee68d3631813580a14fa51fda6f0c959279256cIan Romanick   if (qual->flags.q.explicit_location) {
1908eee68d3631813580a14fa51fda6f0c959279256cIan Romanick      const bool global_scope = (state->current_function == NULL);
1909eee68d3631813580a14fa51fda6f0c959279256cIan Romanick      bool fail = false;
1910eee68d3631813580a14fa51fda6f0c959279256cIan Romanick      const char *string = "";
1911eee68d3631813580a14fa51fda6f0c959279256cIan Romanick
1912eee68d3631813580a14fa51fda6f0c959279256cIan Romanick      /* In the vertex shader only shader inputs can be given explicit
1913eee68d3631813580a14fa51fda6f0c959279256cIan Romanick       * locations.
1914eee68d3631813580a14fa51fda6f0c959279256cIan Romanick       *
1915eee68d3631813580a14fa51fda6f0c959279256cIan Romanick       * In the fragment shader only shader outputs can be given explicit
1916eee68d3631813580a14fa51fda6f0c959279256cIan Romanick       * locations.
1917eee68d3631813580a14fa51fda6f0c959279256cIan Romanick       */
1918eee68d3631813580a14fa51fda6f0c959279256cIan Romanick      switch (state->target) {
1919eee68d3631813580a14fa51fda6f0c959279256cIan Romanick      case vertex_shader:
1920eee68d3631813580a14fa51fda6f0c959279256cIan Romanick	 if (!global_scope || (var->mode != ir_var_in)) {
1921eee68d3631813580a14fa51fda6f0c959279256cIan Romanick	    fail = true;
1922eee68d3631813580a14fa51fda6f0c959279256cIan Romanick	    string = "input";
1923eee68d3631813580a14fa51fda6f0c959279256cIan Romanick	 }
1924eee68d3631813580a14fa51fda6f0c959279256cIan Romanick	 break;
1925eee68d3631813580a14fa51fda6f0c959279256cIan Romanick
1926eee68d3631813580a14fa51fda6f0c959279256cIan Romanick      case geometry_shader:
1927eee68d3631813580a14fa51fda6f0c959279256cIan Romanick	 _mesa_glsl_error(loc, state,
1928eee68d3631813580a14fa51fda6f0c959279256cIan Romanick			  "geometry shader variables cannot be given "
1929eee68d3631813580a14fa51fda6f0c959279256cIan Romanick			  "explicit locations\n");
1930eee68d3631813580a14fa51fda6f0c959279256cIan Romanick	 break;
1931eee68d3631813580a14fa51fda6f0c959279256cIan Romanick
1932eee68d3631813580a14fa51fda6f0c959279256cIan Romanick      case fragment_shader:
1933eee68d3631813580a14fa51fda6f0c959279256cIan Romanick	 if (!global_scope || (var->mode != ir_var_in)) {
1934eee68d3631813580a14fa51fda6f0c959279256cIan Romanick	    fail = true;
1935eee68d3631813580a14fa51fda6f0c959279256cIan Romanick	    string = "output";
1936eee68d3631813580a14fa51fda6f0c959279256cIan Romanick	 }
1937eee68d3631813580a14fa51fda6f0c959279256cIan Romanick	 break;
1938a75da2c0e85eb6b8279ec895c3f74cc4aefc0257Kenneth Graunke      };
1939eee68d3631813580a14fa51fda6f0c959279256cIan Romanick
1940eee68d3631813580a14fa51fda6f0c959279256cIan Romanick      if (fail) {
1941eee68d3631813580a14fa51fda6f0c959279256cIan Romanick	 _mesa_glsl_error(loc, state,
1942eee68d3631813580a14fa51fda6f0c959279256cIan Romanick			  "only %s shader %s variables can be given an "
1943eee68d3631813580a14fa51fda6f0c959279256cIan Romanick			  "explicit location\n",
1944eee68d3631813580a14fa51fda6f0c959279256cIan Romanick			  _mesa_glsl_shader_target_name(state->target),
1945eee68d3631813580a14fa51fda6f0c959279256cIan Romanick			  string);
1946eee68d3631813580a14fa51fda6f0c959279256cIan Romanick      } else {
1947eee68d3631813580a14fa51fda6f0c959279256cIan Romanick	 var->explicit_location = true;
194868a4fc9d5a9dd3b61472451d659275531253b67dIan Romanick
194968a4fc9d5a9dd3b61472451d659275531253b67dIan Romanick	 /* This bit of silliness is needed because invalid explicit locations
195068a4fc9d5a9dd3b61472451d659275531253b67dIan Romanick	  * are supposed to be flagged during linking.  Small negative values
195168a4fc9d5a9dd3b61472451d659275531253b67dIan Romanick	  * biased by VERT_ATTRIB_GENERIC0 or FRAG_RESULT_DATA0 could alias
195268a4fc9d5a9dd3b61472451d659275531253b67dIan Romanick	  * built-in values (e.g., -16+VERT_ATTRIB_GENERIC0 = VERT_ATTRIB_POS).
195368a4fc9d5a9dd3b61472451d659275531253b67dIan Romanick	  * The linker needs to be able to differentiate these cases.  This
195468a4fc9d5a9dd3b61472451d659275531253b67dIan Romanick	  * ensures that negative values stay negative.
195568a4fc9d5a9dd3b61472451d659275531253b67dIan Romanick	  */
195668a4fc9d5a9dd3b61472451d659275531253b67dIan Romanick	 if (qual->location >= 0) {
195768a4fc9d5a9dd3b61472451d659275531253b67dIan Romanick	    var->location = (state->target == vertex_shader)
195868a4fc9d5a9dd3b61472451d659275531253b67dIan Romanick	       ? (qual->location + VERT_ATTRIB_GENERIC0)
195968a4fc9d5a9dd3b61472451d659275531253b67dIan Romanick	       : (qual->location + FRAG_RESULT_DATA0);
196068a4fc9d5a9dd3b61472451d659275531253b67dIan Romanick	 } else {
196168a4fc9d5a9dd3b61472451d659275531253b67dIan Romanick	    var->location = qual->location;
196268a4fc9d5a9dd3b61472451d659275531253b67dIan Romanick	 }
1963eee68d3631813580a14fa51fda6f0c959279256cIan Romanick      }
1964eee68d3631813580a14fa51fda6f0c959279256cIan Romanick   }
1965eee68d3631813580a14fa51fda6f0c959279256cIan Romanick
19664bcff0c19091c7df2b2e0bafe58addb5bae28f1aIan Romanick   /* Does the declaration use the 'layout' keyword?
19674bcff0c19091c7df2b2e0bafe58addb5bae28f1aIan Romanick    */
19684bcff0c19091c7df2b2e0bafe58addb5bae28f1aIan Romanick   const bool uses_layout = qual->flags.q.pixel_center_integer
19694bcff0c19091c7df2b2e0bafe58addb5bae28f1aIan Romanick      || qual->flags.q.origin_upper_left
19704bcff0c19091c7df2b2e0bafe58addb5bae28f1aIan Romanick      || qual->flags.q.explicit_location;
19714bcff0c19091c7df2b2e0bafe58addb5bae28f1aIan Romanick
19724bcff0c19091c7df2b2e0bafe58addb5bae28f1aIan Romanick   /* Does the declaration use the deprecated 'attribute' or 'varying'
19734bcff0c19091c7df2b2e0bafe58addb5bae28f1aIan Romanick    * keywords?
19744bcff0c19091c7df2b2e0bafe58addb5bae28f1aIan Romanick    */
19754bcff0c19091c7df2b2e0bafe58addb5bae28f1aIan Romanick   const bool uses_deprecated_qualifier = qual->flags.q.attribute
19764bcff0c19091c7df2b2e0bafe58addb5bae28f1aIan Romanick      || qual->flags.q.varying;
19774bcff0c19091c7df2b2e0bafe58addb5bae28f1aIan Romanick
19784bcff0c19091c7df2b2e0bafe58addb5bae28f1aIan Romanick   /* Is the 'layout' keyword used with parameters that allow relaxed checking.
19794bcff0c19091c7df2b2e0bafe58addb5bae28f1aIan Romanick    * Many implementations of GL_ARB_fragment_coord_conventions_enable and some
19804bcff0c19091c7df2b2e0bafe58addb5bae28f1aIan Romanick    * implementations (only Mesa?) GL_ARB_explicit_attrib_location_enable
19814bcff0c19091c7df2b2e0bafe58addb5bae28f1aIan Romanick    * allowed the layout qualifier to be used with 'varying' and 'attribute'.
19824bcff0c19091c7df2b2e0bafe58addb5bae28f1aIan Romanick    * These extensions and all following extensions that add the 'layout'
19834bcff0c19091c7df2b2e0bafe58addb5bae28f1aIan Romanick    * keyword have been modified to require the use of 'in' or 'out'.
19844bcff0c19091c7df2b2e0bafe58addb5bae28f1aIan Romanick    *
19854bcff0c19091c7df2b2e0bafe58addb5bae28f1aIan Romanick    * The following extension do not allow the deprecated keywords:
19864bcff0c19091c7df2b2e0bafe58addb5bae28f1aIan Romanick    *
19874bcff0c19091c7df2b2e0bafe58addb5bae28f1aIan Romanick    *    GL_AMD_conservative_depth
19884bcff0c19091c7df2b2e0bafe58addb5bae28f1aIan Romanick    *    GL_ARB_gpu_shader5
19894bcff0c19091c7df2b2e0bafe58addb5bae28f1aIan Romanick    *    GL_ARB_separate_shader_objects
19904bcff0c19091c7df2b2e0bafe58addb5bae28f1aIan Romanick    *    GL_ARB_tesselation_shader
19914bcff0c19091c7df2b2e0bafe58addb5bae28f1aIan Romanick    *    GL_ARB_transform_feedback3
19924bcff0c19091c7df2b2e0bafe58addb5bae28f1aIan Romanick    *    GL_ARB_uniform_buffer_object
19934bcff0c19091c7df2b2e0bafe58addb5bae28f1aIan Romanick    *
19944bcff0c19091c7df2b2e0bafe58addb5bae28f1aIan Romanick    * It is unknown whether GL_EXT_shader_image_load_store or GL_NV_gpu_shader5
19954bcff0c19091c7df2b2e0bafe58addb5bae28f1aIan Romanick    * allow layout with the deprecated keywords.
19964bcff0c19091c7df2b2e0bafe58addb5bae28f1aIan Romanick    */
19974bcff0c19091c7df2b2e0bafe58addb5bae28f1aIan Romanick   const bool relaxed_layout_qualifier_checking =
19984bcff0c19091c7df2b2e0bafe58addb5bae28f1aIan Romanick      state->ARB_fragment_coord_conventions_enable;
19994bcff0c19091c7df2b2e0bafe58addb5bae28f1aIan Romanick
20004bcff0c19091c7df2b2e0bafe58addb5bae28f1aIan Romanick   if (uses_layout && uses_deprecated_qualifier) {
20014bcff0c19091c7df2b2e0bafe58addb5bae28f1aIan Romanick      if (relaxed_layout_qualifier_checking) {
20024bcff0c19091c7df2b2e0bafe58addb5bae28f1aIan Romanick	 _mesa_glsl_warning(loc, state,
20034bcff0c19091c7df2b2e0bafe58addb5bae28f1aIan Romanick			    "`layout' qualifier may not be used with "
20044bcff0c19091c7df2b2e0bafe58addb5bae28f1aIan Romanick			    "`attribute' or `varying'");
20054bcff0c19091c7df2b2e0bafe58addb5bae28f1aIan Romanick      } else {
20064bcff0c19091c7df2b2e0bafe58addb5bae28f1aIan Romanick	 _mesa_glsl_error(loc, state,
20074bcff0c19091c7df2b2e0bafe58addb5bae28f1aIan Romanick			  "`layout' qualifier may not be used with "
20084bcff0c19091c7df2b2e0bafe58addb5bae28f1aIan Romanick			  "`attribute' or `varying'");
20094bcff0c19091c7df2b2e0bafe58addb5bae28f1aIan Romanick      }
20104bcff0c19091c7df2b2e0bafe58addb5bae28f1aIan Romanick   }
20114bcff0c19091c7df2b2e0bafe58addb5bae28f1aIan Romanick
201210eaa8bcbce1cd6d2e120e913f7abafde9675215Kenneth Graunke   if (var->type->is_array() && state->language_version != 110) {
20139d975377ca6dae7805804c0fbe625bb7c5f9e095Ian Romanick      var->array_lvalue = true;
20149d975377ca6dae7805804c0fbe625bb7c5f9e095Ian Romanick   }
2015a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick}
2016a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick
2017a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick
2018fb9fb5f51deca28ed1ec7b71759fb71fc26a0ab6Kenneth Graunkeir_rvalue *
20190044e7edcea22d2456c051a1c4b744a26960ad27Ian Romanickast_declarator_list::hir(exec_list *instructions,
202018238de6c34a1a32c452f1006ed13d8adc1bc9d7Ian Romanick			 struct _mesa_glsl_parse_state *state)
2021a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick{
2022953ff1283d3d52e6a6b4850c2b0b574111625010Kenneth Graunke   void *ctx = state;
2023a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   const struct glsl_type *decl_type;
2024a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   const char *type_name = NULL;
20258558459512594216c5aed0bb8d2b0efcbc8b921cEric Anholt   ir_rvalue *result = NULL;
2026c824e35dd092a9cc0dbfd36d90fcdf1488c8942dIan Romanick   YYLTYPE loc = this->get_location();
2027a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick
20286f0823da09384cc1b557385b9e19a9cc7e901ad7Ian Romanick   /* From page 46 (page 52 of the PDF) of the GLSL 1.50 spec:
20296f0823da09384cc1b557385b9e19a9cc7e901ad7Ian Romanick    *
20306f0823da09384cc1b557385b9e19a9cc7e901ad7Ian Romanick    *     "To ensure that a particular output variable is invariant, it is
20316f0823da09384cc1b557385b9e19a9cc7e901ad7Ian Romanick    *     necessary to use the invariant qualifier. It can either be used to
20326f0823da09384cc1b557385b9e19a9cc7e901ad7Ian Romanick    *     qualify a previously declared variable as being invariant
20336f0823da09384cc1b557385b9e19a9cc7e901ad7Ian Romanick    *
20346f0823da09384cc1b557385b9e19a9cc7e901ad7Ian Romanick    *         invariant gl_Position; // make existing gl_Position be invariant"
20356f0823da09384cc1b557385b9e19a9cc7e901ad7Ian Romanick    *
20366f0823da09384cc1b557385b9e19a9cc7e901ad7Ian Romanick    * In these cases the parser will set the 'invariant' flag in the declarator
20376f0823da09384cc1b557385b9e19a9cc7e901ad7Ian Romanick    * list, and the type will be NULL.
20386f0823da09384cc1b557385b9e19a9cc7e901ad7Ian Romanick    */
20396f0823da09384cc1b557385b9e19a9cc7e901ad7Ian Romanick   if (this->invariant) {
20406f0823da09384cc1b557385b9e19a9cc7e901ad7Ian Romanick      assert(this->type == NULL);
20416f0823da09384cc1b557385b9e19a9cc7e901ad7Ian Romanick
20426f0823da09384cc1b557385b9e19a9cc7e901ad7Ian Romanick      if (state->current_function != NULL) {
20436f0823da09384cc1b557385b9e19a9cc7e901ad7Ian Romanick	 _mesa_glsl_error(& loc, state,
20446f0823da09384cc1b557385b9e19a9cc7e901ad7Ian Romanick			  "All uses of `invariant' keyword must be at global "
20456f0823da09384cc1b557385b9e19a9cc7e901ad7Ian Romanick			  "scope\n");
20466f0823da09384cc1b557385b9e19a9cc7e901ad7Ian Romanick      }
20476f0823da09384cc1b557385b9e19a9cc7e901ad7Ian Romanick
20486f0823da09384cc1b557385b9e19a9cc7e901ad7Ian Romanick      foreach_list_typed (ast_declaration, decl, link, &this->declarations) {
20496f0823da09384cc1b557385b9e19a9cc7e901ad7Ian Romanick	 assert(!decl->is_array);
20506f0823da09384cc1b557385b9e19a9cc7e901ad7Ian Romanick	 assert(decl->array_size == NULL);
20516f0823da09384cc1b557385b9e19a9cc7e901ad7Ian Romanick	 assert(decl->initializer == NULL);
20526f0823da09384cc1b557385b9e19a9cc7e901ad7Ian Romanick
20536f0823da09384cc1b557385b9e19a9cc7e901ad7Ian Romanick	 ir_variable *const earlier =
20546f0823da09384cc1b557385b9e19a9cc7e901ad7Ian Romanick	    state->symbols->get_variable(decl->identifier);
20556f0823da09384cc1b557385b9e19a9cc7e901ad7Ian Romanick	 if (earlier == NULL) {
20566f0823da09384cc1b557385b9e19a9cc7e901ad7Ian Romanick	    _mesa_glsl_error(& loc, state,
20576f0823da09384cc1b557385b9e19a9cc7e901ad7Ian Romanick			     "Undeclared variable `%s' cannot be marked "
20586f0823da09384cc1b557385b9e19a9cc7e901ad7Ian Romanick			     "invariant\n", decl->identifier);
20596f0823da09384cc1b557385b9e19a9cc7e901ad7Ian Romanick	 } else if ((state->target == vertex_shader)
20606f0823da09384cc1b557385b9e19a9cc7e901ad7Ian Romanick	       && (earlier->mode != ir_var_out)) {
20616f0823da09384cc1b557385b9e19a9cc7e901ad7Ian Romanick	    _mesa_glsl_error(& loc, state,
20626f0823da09384cc1b557385b9e19a9cc7e901ad7Ian Romanick			     "`%s' cannot be marked invariant, vertex shader "
20636f0823da09384cc1b557385b9e19a9cc7e901ad7Ian Romanick			     "outputs only\n", decl->identifier);
20646f0823da09384cc1b557385b9e19a9cc7e901ad7Ian Romanick	 } else if ((state->target == fragment_shader)
20656f0823da09384cc1b557385b9e19a9cc7e901ad7Ian Romanick	       && (earlier->mode != ir_var_in)) {
20666f0823da09384cc1b557385b9e19a9cc7e901ad7Ian Romanick	    _mesa_glsl_error(& loc, state,
20676f0823da09384cc1b557385b9e19a9cc7e901ad7Ian Romanick			     "`%s' cannot be marked invariant, fragment shader "
20686f0823da09384cc1b557385b9e19a9cc7e901ad7Ian Romanick			     "inputs only\n", decl->identifier);
2069bd33055ef4b6dd18d6247ff7d9e47496ff4acc51Ian Romanick	 } else if (earlier->used) {
2070bd33055ef4b6dd18d6247ff7d9e47496ff4acc51Ian Romanick	    _mesa_glsl_error(& loc, state,
2071bd33055ef4b6dd18d6247ff7d9e47496ff4acc51Ian Romanick			     "variable `%s' may not be redeclared "
2072bd33055ef4b6dd18d6247ff7d9e47496ff4acc51Ian Romanick			     "`invariant' after being used",
2073bd33055ef4b6dd18d6247ff7d9e47496ff4acc51Ian Romanick			     earlier->name);
20746f0823da09384cc1b557385b9e19a9cc7e901ad7Ian Romanick	 } else {
20756f0823da09384cc1b557385b9e19a9cc7e901ad7Ian Romanick	    earlier->invariant = true;
20766f0823da09384cc1b557385b9e19a9cc7e901ad7Ian Romanick	 }
20776f0823da09384cc1b557385b9e19a9cc7e901ad7Ian Romanick      }
20786f0823da09384cc1b557385b9e19a9cc7e901ad7Ian Romanick
20796f0823da09384cc1b557385b9e19a9cc7e901ad7Ian Romanick      /* Invariant redeclarations do not have r-values.
20806f0823da09384cc1b557385b9e19a9cc7e901ad7Ian Romanick       */
20816f0823da09384cc1b557385b9e19a9cc7e901ad7Ian Romanick      return NULL;
20826f0823da09384cc1b557385b9e19a9cc7e901ad7Ian Romanick   }
20836f0823da09384cc1b557385b9e19a9cc7e901ad7Ian Romanick
20846f0823da09384cc1b557385b9e19a9cc7e901ad7Ian Romanick   assert(this->type != NULL);
20856f0823da09384cc1b557385b9e19a9cc7e901ad7Ian Romanick   assert(!this->invariant);
20866f0823da09384cc1b557385b9e19a9cc7e901ad7Ian Romanick
20873455ce614424a5a23a23037e23d0454e476bceeaIan Romanick   /* The type specifier may contain a structure definition.  Process that
20883455ce614424a5a23a23037e23d0454e476bceeaIan Romanick    * before any of the variable declarations.
20893455ce614424a5a23a23037e23d0454e476bceeaIan Romanick    */
20903455ce614424a5a23a23037e23d0454e476bceeaIan Romanick   (void) this->type->specifier->hir(instructions, state);
20913455ce614424a5a23a23037e23d0454e476bceeaIan Romanick
2092d612a127ccf12c11204f7f72a332de12f58f85a2Ian Romanick   decl_type = this->type->specifier->glsl_type(& type_name, state);
2093304ea90233baeac6801a98e981658cb7a2d2501cIan Romanick   if (this->declarations.is_empty()) {
20946f0823da09384cc1b557385b9e19a9cc7e901ad7Ian Romanick      /* The only valid case where the declaration list can be empty is when
20956f0823da09384cc1b557385b9e19a9cc7e901ad7Ian Romanick       * the declaration is setting the default precision of a built-in type
20966f0823da09384cc1b557385b9e19a9cc7e901ad7Ian Romanick       * (e.g., 'precision highp vec4;').
2097c824e35dd092a9cc0dbfd36d90fcdf1488c8942dIan Romanick       */
2098c824e35dd092a9cc0dbfd36d90fcdf1488c8942dIan Romanick
20996f0823da09384cc1b557385b9e19a9cc7e901ad7Ian Romanick      if (decl_type != NULL) {
2100c824e35dd092a9cc0dbfd36d90fcdf1488c8942dIan Romanick      } else {
2101c824e35dd092a9cc0dbfd36d90fcdf1488c8942dIan Romanick	    _mesa_glsl_error(& loc, state, "incomplete declaration");
2102c824e35dd092a9cc0dbfd36d90fcdf1488c8942dIan Romanick      }
2103c824e35dd092a9cc0dbfd36d90fcdf1488c8942dIan Romanick   }
2104a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick
21052b97dc657a0e762bc67216405419cd348eb948c0Ian Romanick   foreach_list_typed (ast_declaration, decl, link, &this->declarations) {
2106a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick      const struct glsl_type *var_type;
2107768b55a5268572ff9fd03e57e92775882eb0a821Ian Romanick      ir_variable *var;
2108a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick
2109a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick      /* FINISHME: Emit a warning if a variable declaration shadows a
2110a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick       * FINISHME: declaration at a higher scope.
2111a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick       */
2112a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick
2113cec65a6b76290ee4da91691bd3ef01c3fb8a0c37Ian Romanick      if ((decl_type == NULL) || decl_type->is_void()) {
2114a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick	 if (type_name != NULL) {
2115a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick	    _mesa_glsl_error(& loc, state,
2116a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick			     "invalid type `%s' in declaration of `%s'",
2117a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick			     type_name, decl->identifier);
2118a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick	 } else {
2119a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick	    _mesa_glsl_error(& loc, state,
2120a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick			     "invalid type in declaration of `%s'",
2121a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick			     decl->identifier);
2122a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick	 }
2123a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick	 continue;
2124a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick      }
2125a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick
2126a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick      if (decl->is_array) {
2127d8e34e29eb58c38ef60226156aab8f4a93b397b7Kenneth Graunke	 var_type = process_array_type(&loc, decl_type, decl->array_size,
2128d8e34e29eb58c38ef60226156aab8f4a93b397b7Kenneth Graunke				       state);
2129a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick      } else {
2130a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick	 var_type = decl_type;
2131a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick      }
2132a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick
21337e2aa91507a5883e33473e0a94215ee3985baad1Ian Romanick      var = new(ctx) ir_variable(var_type, decl->identifier, ir_var_auto);
2134a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick
21353f151509327629ce7d7cbfec42cae987ebf6639fEric Anholt      /* From page 22 (page 28 of the PDF) of the GLSL 1.10 specification;
21363f151509327629ce7d7cbfec42cae987ebf6639fEric Anholt       *
21373f151509327629ce7d7cbfec42cae987ebf6639fEric Anholt       *     "Global variables can only use the qualifiers const,
21383f151509327629ce7d7cbfec42cae987ebf6639fEric Anholt       *     attribute, uni form, or varying. Only one may be
21393f151509327629ce7d7cbfec42cae987ebf6639fEric Anholt       *     specified.
21403f151509327629ce7d7cbfec42cae987ebf6639fEric Anholt       *
21413f151509327629ce7d7cbfec42cae987ebf6639fEric Anholt       *     Local variables can only use the qualifier const."
21423f151509327629ce7d7cbfec42cae987ebf6639fEric Anholt       *
214382c4b4f88af97395a3d1b01e1998ec828cd5d305Ian Romanick       * This is relaxed in GLSL 1.30.  It is also relaxed by any extension
214482c4b4f88af97395a3d1b01e1998ec828cd5d305Ian Romanick       * that adds the 'layout' keyword.
21453f151509327629ce7d7cbfec42cae987ebf6639fEric Anholt       */
214682c4b4f88af97395a3d1b01e1998ec828cd5d305Ian Romanick      if ((state->language_version < 130)
214782c4b4f88af97395a3d1b01e1998ec828cd5d305Ian Romanick	  && !state->ARB_explicit_attrib_location_enable
214882c4b4f88af97395a3d1b01e1998ec828cd5d305Ian Romanick	  && !state->ARB_fragment_coord_conventions_enable) {
2149e24d35a5b59ca1e75b69a32db6294787378a963fIan Romanick	 if (this->type->qualifier.flags.q.out) {
21503f151509327629ce7d7cbfec42cae987ebf6639fEric Anholt	    _mesa_glsl_error(& loc, state,
21513f151509327629ce7d7cbfec42cae987ebf6639fEric Anholt			     "`out' qualifier in declaration of `%s' "
2152469ea695bbbc984ebec26b2413ab70d450a283caIan Romanick			     "only valid for function parameters in %s.",
2153469ea695bbbc984ebec26b2413ab70d450a283caIan Romanick			     decl->identifier, state->version_string);
21543f151509327629ce7d7cbfec42cae987ebf6639fEric Anholt	 }
2155e24d35a5b59ca1e75b69a32db6294787378a963fIan Romanick	 if (this->type->qualifier.flags.q.in) {
21563f151509327629ce7d7cbfec42cae987ebf6639fEric Anholt	    _mesa_glsl_error(& loc, state,
21573f151509327629ce7d7cbfec42cae987ebf6639fEric Anholt			     "`in' qualifier in declaration of `%s' "
2158469ea695bbbc984ebec26b2413ab70d450a283caIan Romanick			     "only valid for function parameters in %s.",
2159469ea695bbbc984ebec26b2413ab70d450a283caIan Romanick			     decl->identifier, state->version_string);
21603f151509327629ce7d7cbfec42cae987ebf6639fEric Anholt	 }
21613f151509327629ce7d7cbfec42cae987ebf6639fEric Anholt	 /* FINISHME: Test for other invalid qualifiers. */
21623f151509327629ce7d7cbfec42cae987ebf6639fEric Anholt      }
21633f151509327629ce7d7cbfec42cae987ebf6639fEric Anholt
21642e063f1adf9e529697483eaabc7e015b4b740267Eric Anholt      apply_type_qualifier_to_variable(& this->type->qualifier, var, state,
21652e063f1adf9e529697483eaabc7e015b4b740267Eric Anholt				       & loc);
2166a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick
2167e24d35a5b59ca1e75b69a32db6294787378a963fIan Romanick      if (this->type->qualifier.flags.q.invariant) {
2168046bef235744e891e4a48076e1a3ff9a61a63092Eric Anholt	 if ((state->target == vertex_shader) && !(var->mode == ir_var_out ||
2169046bef235744e891e4a48076e1a3ff9a61a63092Eric Anholt						   var->mode == ir_var_inout)) {
2170046bef235744e891e4a48076e1a3ff9a61a63092Eric Anholt	    /* FINISHME: Note that this doesn't work for invariant on
2171046bef235744e891e4a48076e1a3ff9a61a63092Eric Anholt	     * a function signature outval
2172046bef235744e891e4a48076e1a3ff9a61a63092Eric Anholt	     */
21736f0823da09384cc1b557385b9e19a9cc7e901ad7Ian Romanick	    _mesa_glsl_error(& loc, state,
21746f0823da09384cc1b557385b9e19a9cc7e901ad7Ian Romanick			     "`%s' cannot be marked invariant, vertex shader "
21756f0823da09384cc1b557385b9e19a9cc7e901ad7Ian Romanick			     "outputs only\n", var->name);
2176046bef235744e891e4a48076e1a3ff9a61a63092Eric Anholt	 } else if ((state->target == fragment_shader) &&
2177046bef235744e891e4a48076e1a3ff9a61a63092Eric Anholt		    !(var->mode == ir_var_in || var->mode == ir_var_inout)) {
2178046bef235744e891e4a48076e1a3ff9a61a63092Eric Anholt	    /* FINISHME: Note that this doesn't work for invariant on
2179046bef235744e891e4a48076e1a3ff9a61a63092Eric Anholt	     * a function signature inval
2180046bef235744e891e4a48076e1a3ff9a61a63092Eric Anholt	     */
21816f0823da09384cc1b557385b9e19a9cc7e901ad7Ian Romanick	    _mesa_glsl_error(& loc, state,
21826f0823da09384cc1b557385b9e19a9cc7e901ad7Ian Romanick			     "`%s' cannot be marked invariant, fragment shader "
21836f0823da09384cc1b557385b9e19a9cc7e901ad7Ian Romanick			     "inputs only\n", var->name);
21846f0823da09384cc1b557385b9e19a9cc7e901ad7Ian Romanick	 }
21856f0823da09384cc1b557385b9e19a9cc7e901ad7Ian Romanick      }
21866f0823da09384cc1b557385b9e19a9cc7e901ad7Ian Romanick
2187e1c1a3f3bd139da47a1184a8c69af6239973a90cIan Romanick      if (state->current_function != NULL) {
2188b168e53452592ce7364a3ce46a6d30c5b746fc3bIan Romanick	 const char *mode = NULL;
2189e0800062daf237a9e4f893bc3db473da8f7472c0Ian Romanick	 const char *extra = "";
2190b168e53452592ce7364a3ce46a6d30c5b746fc3bIan Romanick
2191e0800062daf237a9e4f893bc3db473da8f7472c0Ian Romanick	 /* There is no need to check for 'inout' here because the parser will
2192e0800062daf237a9e4f893bc3db473da8f7472c0Ian Romanick	  * only allow that in function parameter lists.
2193e1c1a3f3bd139da47a1184a8c69af6239973a90cIan Romanick	  */
2194e24d35a5b59ca1e75b69a32db6294787378a963fIan Romanick	 if (this->type->qualifier.flags.q.attribute) {
2195b168e53452592ce7364a3ce46a6d30c5b746fc3bIan Romanick	    mode = "attribute";
2196e24d35a5b59ca1e75b69a32db6294787378a963fIan Romanick	 } else if (this->type->qualifier.flags.q.uniform) {
2197b168e53452592ce7364a3ce46a6d30c5b746fc3bIan Romanick	    mode = "uniform";
2198e24d35a5b59ca1e75b69a32db6294787378a963fIan Romanick	 } else if (this->type->qualifier.flags.q.varying) {
2199b168e53452592ce7364a3ce46a6d30c5b746fc3bIan Romanick	    mode = "varying";
2200e24d35a5b59ca1e75b69a32db6294787378a963fIan Romanick	 } else if (this->type->qualifier.flags.q.in) {
2201e0800062daf237a9e4f893bc3db473da8f7472c0Ian Romanick	    mode = "in";
2202e0800062daf237a9e4f893bc3db473da8f7472c0Ian Romanick	    extra = " or in function parameter list";
2203e24d35a5b59ca1e75b69a32db6294787378a963fIan Romanick	 } else if (this->type->qualifier.flags.q.out) {
2204e0800062daf237a9e4f893bc3db473da8f7472c0Ian Romanick	    mode = "out";
2205e0800062daf237a9e4f893bc3db473da8f7472c0Ian Romanick	    extra = " or in function parameter list";
2206b168e53452592ce7364a3ce46a6d30c5b746fc3bIan Romanick	 }
2207b168e53452592ce7364a3ce46a6d30c5b746fc3bIan Romanick
2208b168e53452592ce7364a3ce46a6d30c5b746fc3bIan Romanick	 if (mode) {
2209e1c1a3f3bd139da47a1184a8c69af6239973a90cIan Romanick	    _mesa_glsl_error(& loc, state,
2210b168e53452592ce7364a3ce46a6d30c5b746fc3bIan Romanick			     "%s variable `%s' must be declared at "
2211e0800062daf237a9e4f893bc3db473da8f7472c0Ian Romanick			     "global scope%s",
2212e0800062daf237a9e4f893bc3db473da8f7472c0Ian Romanick			     mode, var->name, extra);
2213e1c1a3f3bd139da47a1184a8c69af6239973a90cIan Romanick	 }
2214e1c1a3f3bd139da47a1184a8c69af6239973a90cIan Romanick      } else if (var->mode == ir_var_in) {
221501a584d09350d2c726312e2c9e88c5dbc54bdb70Chad Versace         var->read_only = true;
221601a584d09350d2c726312e2c9e88c5dbc54bdb70Chad Versace
2217fb9f5b0675bd714fd6d6325479f62435aaabc2eeIan Romanick	 if (state->target == vertex_shader) {
2218fb9f5b0675bd714fd6d6325479f62435aaabc2eeIan Romanick	    bool error_emitted = false;
2219fb9f5b0675bd714fd6d6325479f62435aaabc2eeIan Romanick
2220fb9f5b0675bd714fd6d6325479f62435aaabc2eeIan Romanick	    /* From page 31 (page 37 of the PDF) of the GLSL 1.50 spec:
2221fb9f5b0675bd714fd6d6325479f62435aaabc2eeIan Romanick	     *
2222fb9f5b0675bd714fd6d6325479f62435aaabc2eeIan Romanick	     *    "Vertex shader inputs can only be float, floating-point
2223fb9f5b0675bd714fd6d6325479f62435aaabc2eeIan Romanick	     *    vectors, matrices, signed and unsigned integers and integer
2224fb9f5b0675bd714fd6d6325479f62435aaabc2eeIan Romanick	     *    vectors. Vertex shader inputs can also form arrays of these
2225fb9f5b0675bd714fd6d6325479f62435aaabc2eeIan Romanick	     *    types, but not structures."
2226fb9f5b0675bd714fd6d6325479f62435aaabc2eeIan Romanick	     *
22272d816204c875ace0fc363d3eeada2255a5009d5cIan Romanick	     * From page 31 (page 27 of the PDF) of the GLSL 1.30 spec:
22282d816204c875ace0fc363d3eeada2255a5009d5cIan Romanick	     *
22292d816204c875ace0fc363d3eeada2255a5009d5cIan Romanick	     *    "Vertex shader inputs can only be float, floating-point
22302d816204c875ace0fc363d3eeada2255a5009d5cIan Romanick	     *    vectors, matrices, signed and unsigned integers and integer
22312d816204c875ace0fc363d3eeada2255a5009d5cIan Romanick	     *    vectors. They cannot be arrays or structures."
22322d816204c875ace0fc363d3eeada2255a5009d5cIan Romanick	     *
2233fb9f5b0675bd714fd6d6325479f62435aaabc2eeIan Romanick	     * From page 23 (page 29 of the PDF) of the GLSL 1.20 spec:
2234fb9f5b0675bd714fd6d6325479f62435aaabc2eeIan Romanick	     *
2235fb9f5b0675bd714fd6d6325479f62435aaabc2eeIan Romanick	     *    "The attribute qualifier can be used only with float,
2236fb9f5b0675bd714fd6d6325479f62435aaabc2eeIan Romanick	     *    floating-point vectors, and matrices. Attribute variables
2237fb9f5b0675bd714fd6d6325479f62435aaabc2eeIan Romanick	     *    cannot be declared as arrays or structures."
2238fb9f5b0675bd714fd6d6325479f62435aaabc2eeIan Romanick	     */
2239fb9f5b0675bd714fd6d6325479f62435aaabc2eeIan Romanick	    const glsl_type *check_type = var->type->is_array()
2240fb9f5b0675bd714fd6d6325479f62435aaabc2eeIan Romanick	       ? var->type->fields.array : var->type;
2241fb9f5b0675bd714fd6d6325479f62435aaabc2eeIan Romanick
2242fb9f5b0675bd714fd6d6325479f62435aaabc2eeIan Romanick	    switch (check_type->base_type) {
2243fb9f5b0675bd714fd6d6325479f62435aaabc2eeIan Romanick	    case GLSL_TYPE_FLOAT:
2244fb9f5b0675bd714fd6d6325479f62435aaabc2eeIan Romanick	       break;
2245fb9f5b0675bd714fd6d6325479f62435aaabc2eeIan Romanick	    case GLSL_TYPE_UINT:
2246fb9f5b0675bd714fd6d6325479f62435aaabc2eeIan Romanick	    case GLSL_TYPE_INT:
2247fb9f5b0675bd714fd6d6325479f62435aaabc2eeIan Romanick	       if (state->language_version > 120)
2248fb9f5b0675bd714fd6d6325479f62435aaabc2eeIan Romanick		  break;
2249fb9f5b0675bd714fd6d6325479f62435aaabc2eeIan Romanick	       /* FALLTHROUGH */
2250fb9f5b0675bd714fd6d6325479f62435aaabc2eeIan Romanick	    default:
2251fb9f5b0675bd714fd6d6325479f62435aaabc2eeIan Romanick	       _mesa_glsl_error(& loc, state,
2252fb9f5b0675bd714fd6d6325479f62435aaabc2eeIan Romanick				"vertex shader input / attribute cannot have "
2253fb9f5b0675bd714fd6d6325479f62435aaabc2eeIan Romanick				"type %s`%s'",
2254fb9f5b0675bd714fd6d6325479f62435aaabc2eeIan Romanick				var->type->is_array() ? "array of " : "",
2255fb9f5b0675bd714fd6d6325479f62435aaabc2eeIan Romanick				check_type->name);
2256fb9f5b0675bd714fd6d6325479f62435aaabc2eeIan Romanick	       error_emitted = true;
2257fb9f5b0675bd714fd6d6325479f62435aaabc2eeIan Romanick	    }
2258fb9f5b0675bd714fd6d6325479f62435aaabc2eeIan Romanick
22592d816204c875ace0fc363d3eeada2255a5009d5cIan Romanick	    if (!error_emitted && (state->language_version <= 130)
2260fb9f5b0675bd714fd6d6325479f62435aaabc2eeIan Romanick		&& var->type->is_array()) {
2261fb9f5b0675bd714fd6d6325479f62435aaabc2eeIan Romanick	       _mesa_glsl_error(& loc, state,
2262fb9f5b0675bd714fd6d6325479f62435aaabc2eeIan Romanick				"vertex shader input / attribute cannot have "
2263fb9f5b0675bd714fd6d6325479f62435aaabc2eeIan Romanick				"array type");
2264fb9f5b0675bd714fd6d6325479f62435aaabc2eeIan Romanick	       error_emitted = true;
2265fb9f5b0675bd714fd6d6325479f62435aaabc2eeIan Romanick	    }
2266fb9f5b0675bd714fd6d6325479f62435aaabc2eeIan Romanick	 }
2267fb9f5b0675bd714fd6d6325479f62435aaabc2eeIan Romanick      }
2268fb9f5b0675bd714fd6d6325479f62435aaabc2eeIan Romanick
226968d06b1454aea30c492c7318ab4e8514df8f38fdChad Versace      /* Integer vertex outputs must be qualified with 'flat'.
227068d06b1454aea30c492c7318ab4e8514df8f38fdChad Versace       *
227168d06b1454aea30c492c7318ab4e8514df8f38fdChad Versace       * From section 4.3.6 of the GLSL 1.30 spec:
227268d06b1454aea30c492c7318ab4e8514df8f38fdChad Versace       *    "If a vertex output is a signed or unsigned integer or integer
227368d06b1454aea30c492c7318ab4e8514df8f38fdChad Versace       *    vector, then it must be qualified with the interpolation qualifier
227468d06b1454aea30c492c7318ab4e8514df8f38fdChad Versace       *    flat."
227568d06b1454aea30c492c7318ab4e8514df8f38fdChad Versace       */
227668d06b1454aea30c492c7318ab4e8514df8f38fdChad Versace      if (state->language_version >= 130
227768d06b1454aea30c492c7318ab4e8514df8f38fdChad Versace          && state->target == vertex_shader
227868d06b1454aea30c492c7318ab4e8514df8f38fdChad Versace          && state->current_function == NULL
227968d06b1454aea30c492c7318ab4e8514df8f38fdChad Versace          && var->type->is_integer()
228068d06b1454aea30c492c7318ab4e8514df8f38fdChad Versace          && var->mode == ir_var_out
228168d06b1454aea30c492c7318ab4e8514df8f38fdChad Versace          && var->interpolation != ir_var_flat) {
228268d06b1454aea30c492c7318ab4e8514df8f38fdChad Versace
228368d06b1454aea30c492c7318ab4e8514df8f38fdChad Versace         _mesa_glsl_error(&loc, state, "If a vertex output is an integer, "
228468d06b1454aea30c492c7318ab4e8514df8f38fdChad Versace                          "then it must be qualified with 'flat'");
228568d06b1454aea30c492c7318ab4e8514df8f38fdChad Versace      }
228668d06b1454aea30c492c7318ab4e8514df8f38fdChad Versace
228768d06b1454aea30c492c7318ab4e8514df8f38fdChad Versace
2288605aacc67d73db0926e0046a90a07fcd93a2d613Chad Versace      /* Interpolation qualifiers cannot be applied to 'centroid' and
2289605aacc67d73db0926e0046a90a07fcd93a2d613Chad Versace       * 'centroid varying'.
2290605aacc67d73db0926e0046a90a07fcd93a2d613Chad Versace       *
2291605aacc67d73db0926e0046a90a07fcd93a2d613Chad Versace       * From page 29 (page 35 of the PDF) of the GLSL 1.30 spec:
2292605aacc67d73db0926e0046a90a07fcd93a2d613Chad Versace       *    "interpolation qualifiers may only precede the qualifiers in,
2293605aacc67d73db0926e0046a90a07fcd93a2d613Chad Versace       *    centroid in, out, or centroid out in a declaration. They do not apply
2294605aacc67d73db0926e0046a90a07fcd93a2d613Chad Versace       *    to the deprecated storage qualifiers varying or centroid varying."
2295605aacc67d73db0926e0046a90a07fcd93a2d613Chad Versace       */
2296605aacc67d73db0926e0046a90a07fcd93a2d613Chad Versace      if (state->language_version >= 130
2297605aacc67d73db0926e0046a90a07fcd93a2d613Chad Versace          && this->type->qualifier.has_interpolation()
2298605aacc67d73db0926e0046a90a07fcd93a2d613Chad Versace          && this->type->qualifier.flags.q.varying) {
2299605aacc67d73db0926e0046a90a07fcd93a2d613Chad Versace
2300605aacc67d73db0926e0046a90a07fcd93a2d613Chad Versace         const char *i = this->type->qualifier.interpolation_string();
2301605aacc67d73db0926e0046a90a07fcd93a2d613Chad Versace         assert(i != NULL);
2302605aacc67d73db0926e0046a90a07fcd93a2d613Chad Versace         const char *s;
2303605aacc67d73db0926e0046a90a07fcd93a2d613Chad Versace         if (this->type->qualifier.flags.q.centroid)
2304605aacc67d73db0926e0046a90a07fcd93a2d613Chad Versace            s = "centroid varying";
2305605aacc67d73db0926e0046a90a07fcd93a2d613Chad Versace         else
2306605aacc67d73db0926e0046a90a07fcd93a2d613Chad Versace            s = "varying";
2307605aacc67d73db0926e0046a90a07fcd93a2d613Chad Versace
2308605aacc67d73db0926e0046a90a07fcd93a2d613Chad Versace         _mesa_glsl_error(&loc, state,
2309605aacc67d73db0926e0046a90a07fcd93a2d613Chad Versace                          "qualifier '%s' cannot be applied to the "
2310605aacc67d73db0926e0046a90a07fcd93a2d613Chad Versace                          "deprecated storage qualifier '%s'", i, s);
2311605aacc67d73db0926e0046a90a07fcd93a2d613Chad Versace      }
2312605aacc67d73db0926e0046a90a07fcd93a2d613Chad Versace
2313605aacc67d73db0926e0046a90a07fcd93a2d613Chad Versace
23148faaa4a672c1062e486eda2525287715b554342dChad Versace      /* Interpolation qualifiers can only apply to vertex shader outputs and
23158faaa4a672c1062e486eda2525287715b554342dChad Versace       * fragment shader inputs.
23168faaa4a672c1062e486eda2525287715b554342dChad Versace       *
23178faaa4a672c1062e486eda2525287715b554342dChad Versace       * From page 29 (page 35 of the PDF) of the GLSL 1.30 spec:
23188faaa4a672c1062e486eda2525287715b554342dChad Versace       *    "Outputs from a vertex shader (out) and inputs to a fragment
23198faaa4a672c1062e486eda2525287715b554342dChad Versace       *    shader (in) can be further qualified with one or more of these
23208faaa4a672c1062e486eda2525287715b554342dChad Versace       *    interpolation qualifiers"
23218faaa4a672c1062e486eda2525287715b554342dChad Versace       */
23228faaa4a672c1062e486eda2525287715b554342dChad Versace      if (state->language_version >= 130
23238faaa4a672c1062e486eda2525287715b554342dChad Versace          && this->type->qualifier.has_interpolation()) {
23248faaa4a672c1062e486eda2525287715b554342dChad Versace
23258faaa4a672c1062e486eda2525287715b554342dChad Versace         const char *i = this->type->qualifier.interpolation_string();
23268faaa4a672c1062e486eda2525287715b554342dChad Versace         assert(i != NULL);
23278faaa4a672c1062e486eda2525287715b554342dChad Versace
23288faaa4a672c1062e486eda2525287715b554342dChad Versace         switch (state->target) {
23298faaa4a672c1062e486eda2525287715b554342dChad Versace         case vertex_shader:
23308faaa4a672c1062e486eda2525287715b554342dChad Versace            if (this->type->qualifier.flags.q.in) {
23318faaa4a672c1062e486eda2525287715b554342dChad Versace               _mesa_glsl_error(&loc, state,
23328faaa4a672c1062e486eda2525287715b554342dChad Versace                                "qualifier '%s' cannot be applied to vertex "
23338faaa4a672c1062e486eda2525287715b554342dChad Versace                                "shader inputs", i);
23348faaa4a672c1062e486eda2525287715b554342dChad Versace            }
23358faaa4a672c1062e486eda2525287715b554342dChad Versace            break;
23368faaa4a672c1062e486eda2525287715b554342dChad Versace         case fragment_shader:
23378faaa4a672c1062e486eda2525287715b554342dChad Versace            if (this->type->qualifier.flags.q.out) {
23388faaa4a672c1062e486eda2525287715b554342dChad Versace               _mesa_glsl_error(&loc, state,
23398faaa4a672c1062e486eda2525287715b554342dChad Versace                                "qualifier '%s' cannot be applied to fragment "
23408faaa4a672c1062e486eda2525287715b554342dChad Versace                                "shader outputs", i);
23418faaa4a672c1062e486eda2525287715b554342dChad Versace            }
23428faaa4a672c1062e486eda2525287715b554342dChad Versace            break;
23438faaa4a672c1062e486eda2525287715b554342dChad Versace         default:
23448faaa4a672c1062e486eda2525287715b554342dChad Versace            assert(0);
23458faaa4a672c1062e486eda2525287715b554342dChad Versace         }
23468faaa4a672c1062e486eda2525287715b554342dChad Versace      }
23478faaa4a672c1062e486eda2525287715b554342dChad Versace
23488faaa4a672c1062e486eda2525287715b554342dChad Versace
23491eb0f17fa4aa548779cb7d8ffbd86de3523d6796Chad Versace      /* From section 4.3.4 of the GLSL 1.30 spec:
23501eb0f17fa4aa548779cb7d8ffbd86de3523d6796Chad Versace       *    "It is an error to use centroid in in a vertex shader."
23511eb0f17fa4aa548779cb7d8ffbd86de3523d6796Chad Versace       */
23521eb0f17fa4aa548779cb7d8ffbd86de3523d6796Chad Versace      if (state->language_version >= 130
23531eb0f17fa4aa548779cb7d8ffbd86de3523d6796Chad Versace          && this->type->qualifier.flags.q.centroid
23541eb0f17fa4aa548779cb7d8ffbd86de3523d6796Chad Versace          && this->type->qualifier.flags.q.in
23551eb0f17fa4aa548779cb7d8ffbd86de3523d6796Chad Versace          && state->target == vertex_shader) {
23561eb0f17fa4aa548779cb7d8ffbd86de3523d6796Chad Versace
23571eb0f17fa4aa548779cb7d8ffbd86de3523d6796Chad Versace         _mesa_glsl_error(&loc, state,
23581eb0f17fa4aa548779cb7d8ffbd86de3523d6796Chad Versace                          "'centroid in' cannot be used in a vertex shader");
23591eb0f17fa4aa548779cb7d8ffbd86de3523d6796Chad Versace      }
23601eb0f17fa4aa548779cb7d8ffbd86de3523d6796Chad Versace
23611eb0f17fa4aa548779cb7d8ffbd86de3523d6796Chad Versace
2362889e1a5b6c6602198d649ea5881e0010dec575e9Chad Versace      /* Precision qualifiers exists only in GLSL versions 1.00 and >= 1.30.
2363889e1a5b6c6602198d649ea5881e0010dec575e9Chad Versace       */
2364889e1a5b6c6602198d649ea5881e0010dec575e9Chad Versace      if (this->type->specifier->precision != ast_precision_none
2365889e1a5b6c6602198d649ea5881e0010dec575e9Chad Versace          && state->language_version != 100
2366889e1a5b6c6602198d649ea5881e0010dec575e9Chad Versace          && state->language_version < 130) {
2367889e1a5b6c6602198d649ea5881e0010dec575e9Chad Versace
2368889e1a5b6c6602198d649ea5881e0010dec575e9Chad Versace         _mesa_glsl_error(&loc, state,
2369889e1a5b6c6602198d649ea5881e0010dec575e9Chad Versace                          "precision qualifiers are supported only in GLSL ES "
2370889e1a5b6c6602198d649ea5881e0010dec575e9Chad Versace                          "1.00, and GLSL 1.30 and later");
2371889e1a5b6c6602198d649ea5881e0010dec575e9Chad Versace      }
2372889e1a5b6c6602198d649ea5881e0010dec575e9Chad Versace
2373889e1a5b6c6602198d649ea5881e0010dec575e9Chad Versace
237445e8e6c6b1b7f3bc00a578fa6809c9bc719c171aChad Versace      /* Precision qualifiers only apply to floating point and integer types.
2375889e1a5b6c6602198d649ea5881e0010dec575e9Chad Versace       *
2376889e1a5b6c6602198d649ea5881e0010dec575e9Chad Versace       * From section 4.5.2 of the GLSL 1.30 spec:
2377889e1a5b6c6602198d649ea5881e0010dec575e9Chad Versace       *    "Any floating point or any integer declaration can have the type
2378889e1a5b6c6602198d649ea5881e0010dec575e9Chad Versace       *    preceded by one of these precision qualifiers [...] Literal
2379889e1a5b6c6602198d649ea5881e0010dec575e9Chad Versace       *    constants do not have precision qualifiers. Neither do Boolean
2380889e1a5b6c6602198d649ea5881e0010dec575e9Chad Versace       *    variables.
2381889e1a5b6c6602198d649ea5881e0010dec575e9Chad Versace       */
2382889e1a5b6c6602198d649ea5881e0010dec575e9Chad Versace      if (this->type->specifier->precision != ast_precision_none
238345e8e6c6b1b7f3bc00a578fa6809c9bc719c171aChad Versace          && !var->type->is_float()
238445e8e6c6b1b7f3bc00a578fa6809c9bc719c171aChad Versace          && !var->type->is_integer()
238545e8e6c6b1b7f3bc00a578fa6809c9bc719c171aChad Versace          && !(var->type->is_array()
238645e8e6c6b1b7f3bc00a578fa6809c9bc719c171aChad Versace               && (var->type->fields.array->is_float()
238745e8e6c6b1b7f3bc00a578fa6809c9bc719c171aChad Versace                   || var->type->fields.array->is_integer()))) {
2388889e1a5b6c6602198d649ea5881e0010dec575e9Chad Versace
2389889e1a5b6c6602198d649ea5881e0010dec575e9Chad Versace         _mesa_glsl_error(&loc, state,
239045e8e6c6b1b7f3bc00a578fa6809c9bc719c171aChad Versace                          "precision qualifiers apply only to floating point "
239145e8e6c6b1b7f3bc00a578fa6809c9bc719c171aChad Versace                          "and integer types");
2392889e1a5b6c6602198d649ea5881e0010dec575e9Chad Versace      }
2393889e1a5b6c6602198d649ea5881e0010dec575e9Chad Versace
2394e78e0fa42b49b50ed1150f7fdb74bf942ebd6bcfIan Romanick      /* Process the initializer and add its instructions to a temporary
2395e78e0fa42b49b50ed1150f7fdb74bf942ebd6bcfIan Romanick       * list.  This list will be added to the instruction stream (below) after
2396e78e0fa42b49b50ed1150f7fdb74bf942ebd6bcfIan Romanick       * the declaration is added.  This is done because in some cases (such as
2397e78e0fa42b49b50ed1150f7fdb74bf942ebd6bcfIan Romanick       * redeclarations) the declaration may not actually be added to the
2398e78e0fa42b49b50ed1150f7fdb74bf942ebd6bcfIan Romanick       * instruction stream.
2399e78e0fa42b49b50ed1150f7fdb74bf942ebd6bcfIan Romanick       */
2400fa33d0b85403da94e3f4a7e6c868af215c076b4bEric Anholt      exec_list initializer_instructions;
240166faec4895b7bb59a614087a200c05157191b4aeIan Romanick      if (decl->initializer != NULL) {
240243de17282017bdf187d6e646de3262cc64b7f46bIan Romanick	 YYLTYPE initializer_loc = decl->initializer->get_location();
240343de17282017bdf187d6e646de3262cc64b7f46bIan Romanick
240466faec4895b7bb59a614087a200c05157191b4aeIan Romanick	 /* From page 24 (page 30 of the PDF) of the GLSL 1.10 spec:
240566faec4895b7bb59a614087a200c05157191b4aeIan Romanick	  *
240666faec4895b7bb59a614087a200c05157191b4aeIan Romanick	  *    "All uniform variables are read-only and are initialized either
240766faec4895b7bb59a614087a200c05157191b4aeIan Romanick	  *    directly by an application via API commands, or indirectly by
240866faec4895b7bb59a614087a200c05157191b4aeIan Romanick	  *    OpenGL."
240966faec4895b7bb59a614087a200c05157191b4aeIan Romanick	  */
241066faec4895b7bb59a614087a200c05157191b4aeIan Romanick	 if ((state->language_version <= 110)
241166faec4895b7bb59a614087a200c05157191b4aeIan Romanick	     && (var->mode == ir_var_uniform)) {
241243de17282017bdf187d6e646de3262cc64b7f46bIan Romanick	    _mesa_glsl_error(& initializer_loc, state,
241343de17282017bdf187d6e646de3262cc64b7f46bIan Romanick			     "cannot initialize uniforms in GLSL 1.10");
241443de17282017bdf187d6e646de3262cc64b7f46bIan Romanick	 }
241543de17282017bdf187d6e646de3262cc64b7f46bIan Romanick
241643de17282017bdf187d6e646de3262cc64b7f46bIan Romanick	 if (var->type->is_sampler()) {
241743de17282017bdf187d6e646de3262cc64b7f46bIan Romanick	    _mesa_glsl_error(& initializer_loc, state,
241843de17282017bdf187d6e646de3262cc64b7f46bIan Romanick			     "cannot initialize samplers");
241943de17282017bdf187d6e646de3262cc64b7f46bIan Romanick	 }
242019360152f5bd8cff93359dbfe5a50a90b699c118Ian Romanick
242143de17282017bdf187d6e646de3262cc64b7f46bIan Romanick	 if ((var->mode == ir_var_in) && (state->current_function == NULL)) {
242243de17282017bdf187d6e646de3262cc64b7f46bIan Romanick	    _mesa_glsl_error(& initializer_loc, state,
242343de17282017bdf187d6e646de3262cc64b7f46bIan Romanick			     "cannot initialize %s shader input / %s",
2424ae4c4c07959f059e557ea44e98552ced1fec9f47Ian Romanick			     _mesa_glsl_shader_target_name(state->target),
242543de17282017bdf187d6e646de3262cc64b7f46bIan Romanick			     (state->target == vertex_shader)
242643de17282017bdf187d6e646de3262cc64b7f46bIan Romanick			     ? "attribute" : "varying");
242766faec4895b7bb59a614087a200c05157191b4aeIan Romanick	 }
242866faec4895b7bb59a614087a200c05157191b4aeIan Romanick
24291660a2954797e056caba319c5d6c70b0d4be22feCarl Worth	 ir_dereference *const lhs = new(ctx) ir_dereference_variable(var);
2430fa33d0b85403da94e3f4a7e6c868af215c076b4bEric Anholt	 ir_rvalue *rhs = decl->initializer->hir(&initializer_instructions,
2431e78e0fa42b49b50ed1150f7fdb74bf942ebd6bcfIan Romanick						 state);
243219360152f5bd8cff93359dbfe5a50a90b699c118Ian Romanick
2433ce030884064046925a655413097dd8257e9392ddIan Romanick	 /* Calculate the constant value if this is a const or uniform
2434307c71bf24a3c99409ccf4b8b10f161e4b032cbaEric Anholt	  * declaration.
243566faec4895b7bb59a614087a200c05157191b4aeIan Romanick	  */
2436e24d35a5b59ca1e75b69a32db6294787378a963fIan Romanick	 if (this->type->qualifier.flags.q.constant
2437e24d35a5b59ca1e75b69a32db6294787378a963fIan Romanick	     || this->type->qualifier.flags.q.uniform) {
2438e1d71850faba23d1bea3858a8c2e05a45fd21143Kenneth Graunke	    ir_rvalue *new_rhs = validate_assignment(state, var->type, rhs);
2439e1d71850faba23d1bea3858a8c2e05a45fd21143Kenneth Graunke	    if (new_rhs != NULL) {
2440e1d71850faba23d1bea3858a8c2e05a45fd21143Kenneth Graunke	       rhs = new_rhs;
2441e11757bb896e3dadc54fb3d18adf4b71e3e883b3Eric Anholt
2442e11757bb896e3dadc54fb3d18adf4b71e3e883b3Eric Anholt	       ir_constant *constant_value = rhs->constant_expression_value();
2443e11757bb896e3dadc54fb3d18adf4b71e3e883b3Eric Anholt	       if (!constant_value) {
2444e11757bb896e3dadc54fb3d18adf4b71e3e883b3Eric Anholt		  _mesa_glsl_error(& initializer_loc, state,
2445e11757bb896e3dadc54fb3d18adf4b71e3e883b3Eric Anholt				   "initializer of %s variable `%s' must be a "
2446e11757bb896e3dadc54fb3d18adf4b71e3e883b3Eric Anholt				   "constant expression",
2447e24d35a5b59ca1e75b69a32db6294787378a963fIan Romanick				   (this->type->qualifier.flags.q.constant)
2448e11757bb896e3dadc54fb3d18adf4b71e3e883b3Eric Anholt				   ? "const" : "uniform",
2449e11757bb896e3dadc54fb3d18adf4b71e3e883b3Eric Anholt				   decl->identifier);
2450e11757bb896e3dadc54fb3d18adf4b71e3e883b3Eric Anholt		  if (var->type->is_numeric()) {
2451e11757bb896e3dadc54fb3d18adf4b71e3e883b3Eric Anholt		     /* Reduce cascading errors. */
2452e11757bb896e3dadc54fb3d18adf4b71e3e883b3Eric Anholt		     var->constant_value = ir_constant::zero(ctx, var->type);
2453e11757bb896e3dadc54fb3d18adf4b71e3e883b3Eric Anholt		  }
2454e11757bb896e3dadc54fb3d18adf4b71e3e883b3Eric Anholt	       } else {
2455e11757bb896e3dadc54fb3d18adf4b71e3e883b3Eric Anholt		  rhs = constant_value;
2456e11757bb896e3dadc54fb3d18adf4b71e3e883b3Eric Anholt		  var->constant_value = constant_value;
2457e11757bb896e3dadc54fb3d18adf4b71e3e883b3Eric Anholt	       }
2458e1d71850faba23d1bea3858a8c2e05a45fd21143Kenneth Graunke	    } else {
2459e1d71850faba23d1bea3858a8c2e05a45fd21143Kenneth Graunke	       _mesa_glsl_error(&initializer_loc, state,
2460e1d71850faba23d1bea3858a8c2e05a45fd21143Kenneth Graunke			        "initializer of type %s cannot be assigned to "
2461e1d71850faba23d1bea3858a8c2e05a45fd21143Kenneth Graunke				"variable of type %s",
2462e1d71850faba23d1bea3858a8c2e05a45fd21143Kenneth Graunke				rhs->type->name, var->type->name);
2463e11757bb896e3dadc54fb3d18adf4b71e3e883b3Eric Anholt	       if (var->type->is_numeric()) {
2464e11757bb896e3dadc54fb3d18adf4b71e3e883b3Eric Anholt		  /* Reduce cascading errors. */
2465e11757bb896e3dadc54fb3d18adf4b71e3e883b3Eric Anholt		  var->constant_value = ir_constant::zero(ctx, var->type);
2466e11757bb896e3dadc54fb3d18adf4b71e3e883b3Eric Anholt	       }
2467307c71bf24a3c99409ccf4b8b10f161e4b032cbaEric Anholt	    }
2468307c71bf24a3c99409ccf4b8b10f161e4b032cbaEric Anholt	 }
246966faec4895b7bb59a614087a200c05157191b4aeIan Romanick
2470307c71bf24a3c99409ccf4b8b10f161e4b032cbaEric Anholt	 if (rhs && !rhs->type->is_error()) {
2471ac3af37d27c49704dd3b2d303b4497b08f8b47fdEric Anholt	    bool temp = var->read_only;
2472e24d35a5b59ca1e75b69a32db6294787378a963fIan Romanick	    if (this->type->qualifier.flags.q.constant)
2473ac3af37d27c49704dd3b2d303b4497b08f8b47fdEric Anholt	       var->read_only = false;
2474ce030884064046925a655413097dd8257e9392ddIan Romanick
2475d7f27e2e76eac9bc2ee0fa36f52542fdcb9563ddIan Romanick	    /* Never emit code to initialize a uniform.
2476d7f27e2e76eac9bc2ee0fa36f52542fdcb9563ddIan Romanick	     */
2477d7f27e2e76eac9bc2ee0fa36f52542fdcb9563ddIan Romanick	    const glsl_type *initializer_type;
2478d7f27e2e76eac9bc2ee0fa36f52542fdcb9563ddIan Romanick	    if (!this->type->qualifier.flags.q.uniform) {
2479d7f27e2e76eac9bc2ee0fa36f52542fdcb9563ddIan Romanick	       result = do_assignment(&initializer_instructions, state,
2480d7f27e2e76eac9bc2ee0fa36f52542fdcb9563ddIan Romanick				      lhs, rhs,
2481d7f27e2e76eac9bc2ee0fa36f52542fdcb9563ddIan Romanick				      this->get_location());
2482d7f27e2e76eac9bc2ee0fa36f52542fdcb9563ddIan Romanick	       initializer_type = result->type;
2483d7f27e2e76eac9bc2ee0fa36f52542fdcb9563ddIan Romanick	    } else
2484d7f27e2e76eac9bc2ee0fa36f52542fdcb9563ddIan Romanick	       initializer_type = rhs->type;
2485d7f27e2e76eac9bc2ee0fa36f52542fdcb9563ddIan Romanick
2486b0fc5103cbc9116806a9888f747baed4b8166246Ian Romanick	    /* If the declared variable is an unsized array, it must inherrit
2487b0fc5103cbc9116806a9888f747baed4b8166246Ian Romanick	     * its full type from the initializer.  A declaration such as
2488b0fc5103cbc9116806a9888f747baed4b8166246Ian Romanick	     *
2489b0fc5103cbc9116806a9888f747baed4b8166246Ian Romanick	     *     uniform float a[] = float[](1.0, 2.0, 3.0, 3.0);
2490b0fc5103cbc9116806a9888f747baed4b8166246Ian Romanick	     *
2491b0fc5103cbc9116806a9888f747baed4b8166246Ian Romanick	     * becomes
2492b0fc5103cbc9116806a9888f747baed4b8166246Ian Romanick	     *
2493b0fc5103cbc9116806a9888f747baed4b8166246Ian Romanick	     *     uniform float a[4] = float[](1.0, 2.0, 3.0, 3.0);
2494b0fc5103cbc9116806a9888f747baed4b8166246Ian Romanick	     *
2495b0fc5103cbc9116806a9888f747baed4b8166246Ian Romanick	     * The assignment generated in the if-statement (below) will also
2496b0fc5103cbc9116806a9888f747baed4b8166246Ian Romanick	     * automatically handle this case for non-uniforms.
2497b0fc5103cbc9116806a9888f747baed4b8166246Ian Romanick	     *
2498b0fc5103cbc9116806a9888f747baed4b8166246Ian Romanick	     * If the declared variable is not an array, the types must
2499b0fc5103cbc9116806a9888f747baed4b8166246Ian Romanick	     * already match exactly.  As a result, the type assignment
2500d7f27e2e76eac9bc2ee0fa36f52542fdcb9563ddIan Romanick	     * here can be done unconditionally.  For non-uniforms the call
2501d7f27e2e76eac9bc2ee0fa36f52542fdcb9563ddIan Romanick	     * to do_assignment can change the type of the initializer (via
2502d7f27e2e76eac9bc2ee0fa36f52542fdcb9563ddIan Romanick	     * the implicit conversion rules).  For uniforms the initializer
2503d7f27e2e76eac9bc2ee0fa36f52542fdcb9563ddIan Romanick	     * must be a constant expression, and the type of that expression
2504d7f27e2e76eac9bc2ee0fa36f52542fdcb9563ddIan Romanick	     * was validated above.
2505b0fc5103cbc9116806a9888f747baed4b8166246Ian Romanick	     */
2506d7f27e2e76eac9bc2ee0fa36f52542fdcb9563ddIan Romanick	    var->type = initializer_type;
2507b0fc5103cbc9116806a9888f747baed4b8166246Ian Romanick
2508ac3af37d27c49704dd3b2d303b4497b08f8b47fdEric Anholt	    var->read_only = temp;
250966faec4895b7bb59a614087a200c05157191b4aeIan Romanick	 }
251066faec4895b7bb59a614087a200c05157191b4aeIan Romanick      }
251117d86f4371da413176ba365ca26a58bac172d365Ian Romanick
25120ed61257253fc0df1dde9042cb0e7fe22d58077aEric Anholt      /* From page 23 (page 29 of the PDF) of the GLSL 1.10 spec:
25130ed61257253fc0df1dde9042cb0e7fe22d58077aEric Anholt       *
25140ed61257253fc0df1dde9042cb0e7fe22d58077aEric Anholt       *     "It is an error to write to a const variable outside of
25150ed61257253fc0df1dde9042cb0e7fe22d58077aEric Anholt       *      its declaration, so they must be initialized when
25160ed61257253fc0df1dde9042cb0e7fe22d58077aEric Anholt       *      declared."
25170ed61257253fc0df1dde9042cb0e7fe22d58077aEric Anholt       */
2518e24d35a5b59ca1e75b69a32db6294787378a963fIan Romanick      if (this->type->qualifier.flags.q.constant && decl->initializer == NULL) {
25190ed61257253fc0df1dde9042cb0e7fe22d58077aEric Anholt	 _mesa_glsl_error(& loc, state,
252046f7105df487c91569f7e4a8da74d673c12e5619Chad Versace			  "const declaration of `%s' must be initialized",
252146f7105df487c91569f7e4a8da74d673c12e5619Chad Versace			  decl->identifier);
25220ed61257253fc0df1dde9042cb0e7fe22d58077aEric Anholt      }
25230ed61257253fc0df1dde9042cb0e7fe22d58077aEric Anholt
25245d25746640ee27882b69a962459727cf924443dbKenneth Graunke      /* Check if this declaration is actually a re-declaration, either to
25255d25746640ee27882b69a962459727cf924443dbKenneth Graunke       * resize an array or add qualifiers to an existing variable.
25265466b63968b98c9627b8dd207ea2bebf838b5268Ian Romanick       *
2527a044285e25615f2d97636fe3ba47d580c3537bc4Kenneth Graunke       * This is allowed for variables in the current scope, or when at
2528a044285e25615f2d97636fe3ba47d580c3537bc4Kenneth Graunke       * global scope (for built-ins in the implicit outer scope).
25295466b63968b98c9627b8dd207ea2bebf838b5268Ian Romanick       */
25305d25746640ee27882b69a962459727cf924443dbKenneth Graunke      ir_variable *earlier = state->symbols->get_variable(decl->identifier);
2531a044285e25615f2d97636fe3ba47d580c3537bc4Kenneth Graunke      if (earlier != NULL && (state->current_function == NULL ||
2532a044285e25615f2d97636fe3ba47d580c3537bc4Kenneth Graunke	  state->symbols->name_declared_this_scope(decl->identifier))) {
25335466b63968b98c9627b8dd207ea2bebf838b5268Ian Romanick
25345d25746640ee27882b69a962459727cf924443dbKenneth Graunke	 /* From page 24 (page 30 of the PDF) of the GLSL 1.50 spec,
25355d25746640ee27882b69a962459727cf924443dbKenneth Graunke	  *
25365d25746640ee27882b69a962459727cf924443dbKenneth Graunke	  * "It is legal to declare an array without a size and then
25375d25746640ee27882b69a962459727cf924443dbKenneth Graunke	  *  later re-declare the same name as an array of the same
25385d25746640ee27882b69a962459727cf924443dbKenneth Graunke	  *  type and specify a size."
25395d25746640ee27882b69a962459727cf924443dbKenneth Graunke	  */
25405d25746640ee27882b69a962459727cf924443dbKenneth Graunke	 if ((earlier->type->array_size() == 0)
25415466b63968b98c9627b8dd207ea2bebf838b5268Ian Romanick	     && var->type->is_array()
25425466b63968b98c9627b8dd207ea2bebf838b5268Ian Romanick	     && (var->type->element_type() == earlier->type->element_type())) {
25435466b63968b98c9627b8dd207ea2bebf838b5268Ian Romanick	    /* FINISHME: This doesn't match the qualifiers on the two
25445466b63968b98c9627b8dd207ea2bebf838b5268Ian Romanick	     * FINISHME: declarations.  It's not 100% clear whether this is
25455466b63968b98c9627b8dd207ea2bebf838b5268Ian Romanick	     * FINISHME: required or not.
25465466b63968b98c9627b8dd207ea2bebf838b5268Ian Romanick	     */
25475466b63968b98c9627b8dd207ea2bebf838b5268Ian Romanick
2548cd00d5b88caa41ebf4b407126f314832f9fdae54Ian Romanick	    /* From page 54 (page 60 of the PDF) of the GLSL 1.20 spec:
2549cd00d5b88caa41ebf4b407126f314832f9fdae54Ian Romanick	     *
2550cd00d5b88caa41ebf4b407126f314832f9fdae54Ian Romanick	     *     "The size [of gl_TexCoord] can be at most
2551cd00d5b88caa41ebf4b407126f314832f9fdae54Ian Romanick	     *     gl_MaxTextureCoords."
2552cd00d5b88caa41ebf4b407126f314832f9fdae54Ian Romanick	     */
2553127308b4be077e5bdf60f76320307550921e86bbIan Romanick	    const unsigned size = unsigned(var->type->array_size());
2554cd00d5b88caa41ebf4b407126f314832f9fdae54Ian Romanick	    if ((strcmp("gl_TexCoord", var->name) == 0)
2555127308b4be077e5bdf60f76320307550921e86bbIan Romanick		&& (size > state->Const.MaxTextureCoords)) {
2556cd00d5b88caa41ebf4b407126f314832f9fdae54Ian Romanick	       YYLTYPE loc = this->get_location();
2557cd00d5b88caa41ebf4b407126f314832f9fdae54Ian Romanick
2558cd00d5b88caa41ebf4b407126f314832f9fdae54Ian Romanick	       _mesa_glsl_error(& loc, state, "`gl_TexCoord' array size cannot "
2559cd00d5b88caa41ebf4b407126f314832f9fdae54Ian Romanick				"be larger than gl_MaxTextureCoords (%u)\n",
2560127308b4be077e5bdf60f76320307550921e86bbIan Romanick				state->Const.MaxTextureCoords);
256112873fa4e332959295154edfe957c0af79af5e74Ian Romanick	    } else if ((size > 0) && (size <= earlier->max_array_access)) {
25625466b63968b98c9627b8dd207ea2bebf838b5268Ian Romanick	       YYLTYPE loc = this->get_location();
25635466b63968b98c9627b8dd207ea2bebf838b5268Ian Romanick
25645466b63968b98c9627b8dd207ea2bebf838b5268Ian Romanick	       _mesa_glsl_error(& loc, state, "array size must be > %u due to "
25655466b63968b98c9627b8dd207ea2bebf838b5268Ian Romanick				"previous access",
25665466b63968b98c9627b8dd207ea2bebf838b5268Ian Romanick				earlier->max_array_access);
25675466b63968b98c9627b8dd207ea2bebf838b5268Ian Romanick	    }
25685466b63968b98c9627b8dd207ea2bebf838b5268Ian Romanick
25695466b63968b98c9627b8dd207ea2bebf838b5268Ian Romanick	    earlier->type = var->type;
25705466b63968b98c9627b8dd207ea2bebf838b5268Ian Romanick	    delete var;
25715466b63968b98c9627b8dd207ea2bebf838b5268Ian Romanick	    var = NULL;
25726e006273840282e06a08655553821ef8176b2d9cChad Versace	 } else if (state->ARB_fragment_coord_conventions_enable
25735d25746640ee27882b69a962459727cf924443dbKenneth Graunke		    && strcmp(var->name, "gl_FragCoord") == 0
25745d25746640ee27882b69a962459727cf924443dbKenneth Graunke		    && earlier->type == var->type
25755d25746640ee27882b69a962459727cf924443dbKenneth Graunke		    && earlier->mode == var->mode) {
25764a962170d7cf4243d6ae156fca20a6167388925dEric Anholt	    /* Allow redeclaration of gl_FragCoord for ARB_fcc layout
25774a962170d7cf4243d6ae156fca20a6167388925dEric Anholt	     * qualifiers.
25784a962170d7cf4243d6ae156fca20a6167388925dEric Anholt	     */
25794a962170d7cf4243d6ae156fca20a6167388925dEric Anholt	    earlier->origin_upper_left = var->origin_upper_left;
25804a962170d7cf4243d6ae156fca20a6167388925dEric Anholt	    earlier->pixel_center_integer = var->pixel_center_integer;
2581b84e3f570f4b5aba1dd96760e090ae976d0e1cbaChad Versace
2582b84e3f570f4b5aba1dd96760e090ae976d0e1cbaChad Versace	 /* According to section 4.3.7 of the GLSL 1.30 spec,
2583b84e3f570f4b5aba1dd96760e090ae976d0e1cbaChad Versace	  * the following built-in varaibles can be redeclared with an
2584b84e3f570f4b5aba1dd96760e090ae976d0e1cbaChad Versace	  * interpolation qualifier:
2585b84e3f570f4b5aba1dd96760e090ae976d0e1cbaChad Versace	  *    * gl_FrontColor
2586b84e3f570f4b5aba1dd96760e090ae976d0e1cbaChad Versace	  *    * gl_BackColor
2587b84e3f570f4b5aba1dd96760e090ae976d0e1cbaChad Versace	  *    * gl_FrontSecondaryColor
2588b84e3f570f4b5aba1dd96760e090ae976d0e1cbaChad Versace	  *    * gl_BackSecondaryColor
2589b84e3f570f4b5aba1dd96760e090ae976d0e1cbaChad Versace	  *    * gl_Color
2590b84e3f570f4b5aba1dd96760e090ae976d0e1cbaChad Versace	  *    * gl_SecondaryColor
2591b84e3f570f4b5aba1dd96760e090ae976d0e1cbaChad Versace	  */
2592b84e3f570f4b5aba1dd96760e090ae976d0e1cbaChad Versace	 } else if (state->language_version >= 130
2593b84e3f570f4b5aba1dd96760e090ae976d0e1cbaChad Versace	            && (strcmp(var->name, "gl_FrontColor") == 0
2594b84e3f570f4b5aba1dd96760e090ae976d0e1cbaChad Versace                        || strcmp(var->name, "gl_BackColor") == 0
2595b84e3f570f4b5aba1dd96760e090ae976d0e1cbaChad Versace                        || strcmp(var->name, "gl_FrontSecondaryColor") == 0
2596b84e3f570f4b5aba1dd96760e090ae976d0e1cbaChad Versace                        || strcmp(var->name, "gl_BackSecondaryColor") == 0
2597b84e3f570f4b5aba1dd96760e090ae976d0e1cbaChad Versace                        || strcmp(var->name, "gl_Color") == 0
2598b84e3f570f4b5aba1dd96760e090ae976d0e1cbaChad Versace                        || strcmp(var->name, "gl_SecondaryColor") == 0)
2599b84e3f570f4b5aba1dd96760e090ae976d0e1cbaChad Versace	            && earlier->type == var->type
2600b84e3f570f4b5aba1dd96760e090ae976d0e1cbaChad Versace	            && earlier->mode == var->mode) {
2601b84e3f570f4b5aba1dd96760e090ae976d0e1cbaChad Versace	    earlier->interpolation = var->interpolation;
26025466b63968b98c9627b8dd207ea2bebf838b5268Ian Romanick	 } else {
26035466b63968b98c9627b8dd207ea2bebf838b5268Ian Romanick	    YYLTYPE loc = this->get_location();
26045d25746640ee27882b69a962459727cf924443dbKenneth Graunke	    _mesa_glsl_error(&loc, state, "`%s' redeclared", decl->identifier);
26055466b63968b98c9627b8dd207ea2bebf838b5268Ian Romanick	 }
26065466b63968b98c9627b8dd207ea2bebf838b5268Ian Romanick
26075466b63968b98c9627b8dd207ea2bebf838b5268Ian Romanick	 continue;
26085466b63968b98c9627b8dd207ea2bebf838b5268Ian Romanick      }
26095466b63968b98c9627b8dd207ea2bebf838b5268Ian Romanick
26105d25746640ee27882b69a962459727cf924443dbKenneth Graunke      /* By now, we know it's a new variable declaration (we didn't hit the
26115d25746640ee27882b69a962459727cf924443dbKenneth Graunke       * above "continue").
26125d25746640ee27882b69a962459727cf924443dbKenneth Graunke       *
26135d25746640ee27882b69a962459727cf924443dbKenneth Graunke       * From page 15 (page 21 of the PDF) of the GLSL 1.10 spec,
26145466b63968b98c9627b8dd207ea2bebf838b5268Ian Romanick       *
26155466b63968b98c9627b8dd207ea2bebf838b5268Ian Romanick       *   "Identifiers starting with "gl_" are reserved for use by
26165466b63968b98c9627b8dd207ea2bebf838b5268Ian Romanick       *   OpenGL, and may not be declared in a shader as either a
26175466b63968b98c9627b8dd207ea2bebf838b5268Ian Romanick       *   variable or a function."
26185466b63968b98c9627b8dd207ea2bebf838b5268Ian Romanick       */
2619de3b40d8cdc42cc1cd71dd65c90d6d569d922fc6Ian Romanick      if (strncmp(decl->identifier, "gl_", 3) == 0)
26205466b63968b98c9627b8dd207ea2bebf838b5268Ian Romanick	 _mesa_glsl_error(& loc, state,
26215466b63968b98c9627b8dd207ea2bebf838b5268Ian Romanick			  "identifier `%s' uses reserved `gl_' prefix",
26225466b63968b98c9627b8dd207ea2bebf838b5268Ian Romanick			  decl->identifier);
26235466b63968b98c9627b8dd207ea2bebf838b5268Ian Romanick
26245d25746640ee27882b69a962459727cf924443dbKenneth Graunke      /* Add the variable to the symbol table.  Note that the initializer's
26255d25746640ee27882b69a962459727cf924443dbKenneth Graunke       * IR was already processed earlier (though it hasn't been emitted yet),
26265d25746640ee27882b69a962459727cf924443dbKenneth Graunke       * without the variable in scope.
26275d25746640ee27882b69a962459727cf924443dbKenneth Graunke       *
26285d25746640ee27882b69a962459727cf924443dbKenneth Graunke       * This differs from most C-like languages, but it follows the GLSL
26295d25746640ee27882b69a962459727cf924443dbKenneth Graunke       * specification.  From page 28 (page 34 of the PDF) of the GLSL 1.50
26305d25746640ee27882b69a962459727cf924443dbKenneth Graunke       * spec:
26315d25746640ee27882b69a962459727cf924443dbKenneth Graunke       *
26325d25746640ee27882b69a962459727cf924443dbKenneth Graunke       *     "Within a declaration, the scope of a name starts immediately
26335d25746640ee27882b69a962459727cf924443dbKenneth Graunke       *     after the initializer if present or immediately after the name
26345d25746640ee27882b69a962459727cf924443dbKenneth Graunke       *     being declared if not."
26355d25746640ee27882b69a962459727cf924443dbKenneth Graunke       */
2636001eee52d461233b1e1d6ed3577965e9bcb209e8Eric Anholt      if (!state->symbols->add_variable(var)) {
26375d25746640ee27882b69a962459727cf924443dbKenneth Graunke	 YYLTYPE loc = this->get_location();
26385d25746640ee27882b69a962459727cf924443dbKenneth Graunke	 _mesa_glsl_error(&loc, state, "name `%s' already taken in the "
26395d25746640ee27882b69a962459727cf924443dbKenneth Graunke			  "current scope", decl->identifier);
26405d25746640ee27882b69a962459727cf924443dbKenneth Graunke	 continue;
26415d25746640ee27882b69a962459727cf924443dbKenneth Graunke      }
26425d25746640ee27882b69a962459727cf924443dbKenneth Graunke
26438048226b7b1bbe8fd89f9c32fa4fadca4b8760c4Eric Anholt      /* Push the variable declaration to the top.  It means that all
26448048226b7b1bbe8fd89f9c32fa4fadca4b8760c4Eric Anholt       * the variable declarations will appear in a funny
26458048226b7b1bbe8fd89f9c32fa4fadca4b8760c4Eric Anholt       * last-to-first order, but otherwise we run into trouble if a
26468048226b7b1bbe8fd89f9c32fa4fadca4b8760c4Eric Anholt       * function is prototyped, a global var is decled, then the
26478048226b7b1bbe8fd89f9c32fa4fadca4b8760c4Eric Anholt       * function is defined with usage of the global var.  See
26488048226b7b1bbe8fd89f9c32fa4fadca4b8760c4Eric Anholt       * glslparsertest's CorrectModule.frag.
26498048226b7b1bbe8fd89f9c32fa4fadca4b8760c4Eric Anholt       */
26508048226b7b1bbe8fd89f9c32fa4fadca4b8760c4Eric Anholt      instructions->push_head(var);
2651fa33d0b85403da94e3f4a7e6c868af215c076b4bEric Anholt      instructions->append_list(&initializer_instructions);
2652a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   }
2653a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick
26548558459512594216c5aed0bb8d2b0efcbc8b921cEric Anholt
26558558459512594216c5aed0bb8d2b0efcbc8b921cEric Anholt   /* Generally, variable declarations do not have r-values.  However,
26568558459512594216c5aed0bb8d2b0efcbc8b921cEric Anholt    * one is used for the declaration in
26578558459512594216c5aed0bb8d2b0efcbc8b921cEric Anholt    *
26588558459512594216c5aed0bb8d2b0efcbc8b921cEric Anholt    * while (bool b = some_condition()) {
26598558459512594216c5aed0bb8d2b0efcbc8b921cEric Anholt    *   ...
26608558459512594216c5aed0bb8d2b0efcbc8b921cEric Anholt    * }
26618558459512594216c5aed0bb8d2b0efcbc8b921cEric Anholt    *
26628558459512594216c5aed0bb8d2b0efcbc8b921cEric Anholt    * so we return the rvalue from the last seen declaration here.
2663a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick    */
26648558459512594216c5aed0bb8d2b0efcbc8b921cEric Anholt   return result;
2665a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick}
2666a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick
2667a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick
2668fb9fb5f51deca28ed1ec7b71759fb71fc26a0ab6Kenneth Graunkeir_rvalue *
26690044e7edcea22d2456c051a1c4b744a26960ad27Ian Romanickast_parameter_declarator::hir(exec_list *instructions,
267018238de6c34a1a32c452f1006ed13d8adc1bc9d7Ian Romanick			      struct _mesa_glsl_parse_state *state)
2671a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick{
2672953ff1283d3d52e6a6b4850c2b0b574111625010Kenneth Graunke   void *ctx = state;
2673a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   const struct glsl_type *type;
2674a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   const char *name = NULL;
26752e063f1adf9e529697483eaabc7e015b4b740267Eric Anholt   YYLTYPE loc = this->get_location();
2676a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick
2677d612a127ccf12c11204f7f72a332de12f58f85a2Ian Romanick   type = this->type->specifier->glsl_type(& name, state);
2678a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick
2679a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   if (type == NULL) {
2680a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick      if (name != NULL) {
2681a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick	 _mesa_glsl_error(& loc, state,
2682a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick			  "invalid type `%s' in declaration of `%s'",
268318238de6c34a1a32c452f1006ed13d8adc1bc9d7Ian Romanick			  name, this->identifier);
2684a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick      } else {
2685a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick	 _mesa_glsl_error(& loc, state,
2686a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick			  "invalid type in declaration of `%s'",
268718238de6c34a1a32c452f1006ed13d8adc1bc9d7Ian Romanick			  this->identifier);
2688a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick      }
2689a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick
26900471e8b0896e05b3bc81ccad6184e6e35fb61425Ian Romanick      type = glsl_type::error_type;
2691a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   }
2692a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick
2693068c80cfe0a280490353b6b007165d717c672eedEric Anholt   /* From page 62 (page 68 of the PDF) of the GLSL 1.50 spec:
2694068c80cfe0a280490353b6b007165d717c672eedEric Anholt    *
2695068c80cfe0a280490353b6b007165d717c672eedEric Anholt    *    "Functions that accept no input arguments need not use void in the
2696068c80cfe0a280490353b6b007165d717c672eedEric Anholt    *    argument list because prototypes (or definitions) are required and
2697068c80cfe0a280490353b6b007165d717c672eedEric Anholt    *    therefore there is no ambiguity when an empty argument list "( )" is
2698068c80cfe0a280490353b6b007165d717c672eedEric Anholt    *    declared. The idiom "(void)" as a parameter list is provided for
2699068c80cfe0a280490353b6b007165d717c672eedEric Anholt    *    convenience."
2700068c80cfe0a280490353b6b007165d717c672eedEric Anholt    *
2701068c80cfe0a280490353b6b007165d717c672eedEric Anholt    * Placing this check here prevents a void parameter being set up
2702068c80cfe0a280490353b6b007165d717c672eedEric Anholt    * for a function, which avoids tripping up checks for main taking
2703068c80cfe0a280490353b6b007165d717c672eedEric Anholt    * parameters and lookups of an unnamed symbol.
2704068c80cfe0a280490353b6b007165d717c672eedEric Anholt    */
2705cf37c9e8dad4349e45cb91d36957484fd76ce264Ian Romanick   if (type->is_void()) {
2706cf37c9e8dad4349e45cb91d36957484fd76ce264Ian Romanick      if (this->identifier != NULL)
2707cf37c9e8dad4349e45cb91d36957484fd76ce264Ian Romanick	 _mesa_glsl_error(& loc, state,
2708cf37c9e8dad4349e45cb91d36957484fd76ce264Ian Romanick			  "named parameter cannot have type `void'");
2709cf37c9e8dad4349e45cb91d36957484fd76ce264Ian Romanick
2710cf37c9e8dad4349e45cb91d36957484fd76ce264Ian Romanick      is_void = true;
2711068c80cfe0a280490353b6b007165d717c672eedEric Anholt      return NULL;
2712cf37c9e8dad4349e45cb91d36957484fd76ce264Ian Romanick   }
2713068c80cfe0a280490353b6b007165d717c672eedEric Anholt
271445d8a70c12ee6ea956baaf898324a828496382f6Ian Romanick   if (formal_parameter && (this->identifier == NULL)) {
271545d8a70c12ee6ea956baaf898324a828496382f6Ian Romanick      _mesa_glsl_error(& loc, state, "formal parameter lacks a name");
271645d8a70c12ee6ea956baaf898324a828496382f6Ian Romanick      return NULL;
271745d8a70c12ee6ea956baaf898324a828496382f6Ian Romanick   }
271845d8a70c12ee6ea956baaf898324a828496382f6Ian Romanick
2719e511a35fc53fb75a2401d8a94c0c35634175c575Kenneth Graunke   /* This only handles "vec4 foo[..]".  The earlier specifier->glsl_type(...)
2720e511a35fc53fb75a2401d8a94c0c35634175c575Kenneth Graunke    * call already handled the "vec4[..] foo" case.
2721e511a35fc53fb75a2401d8a94c0c35634175c575Kenneth Graunke    */
2722e511a35fc53fb75a2401d8a94c0c35634175c575Kenneth Graunke   if (this->is_array) {
2723d8e34e29eb58c38ef60226156aab8f4a93b397b7Kenneth Graunke      type = process_array_type(&loc, type, this->array_size, state);
2724e511a35fc53fb75a2401d8a94c0c35634175c575Kenneth Graunke   }
2725e511a35fc53fb75a2401d8a94c0c35634175c575Kenneth Graunke
2726e511a35fc53fb75a2401d8a94c0c35634175c575Kenneth Graunke   if (type->array_size() == 0) {
2727e511a35fc53fb75a2401d8a94c0c35634175c575Kenneth Graunke      _mesa_glsl_error(&loc, state, "arrays passed as parameters must have "
2728e511a35fc53fb75a2401d8a94c0c35634175c575Kenneth Graunke		       "a declared size.");
2729e511a35fc53fb75a2401d8a94c0c35634175c575Kenneth Graunke      type = glsl_type::error_type;
2730e511a35fc53fb75a2401d8a94c0c35634175c575Kenneth Graunke   }
2731e511a35fc53fb75a2401d8a94c0c35634175c575Kenneth Graunke
2732cf37c9e8dad4349e45cb91d36957484fd76ce264Ian Romanick   is_void = false;
27337e2aa91507a5883e33473e0a94215ee3985baad1Ian Romanick   ir_variable *var = new(ctx) ir_variable(type, this->identifier, ir_var_in);
2734a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick
2735cdb8d54b6808b13092cb85e44cf02e4e91c3a669Ian Romanick   /* Apply any specified qualifiers to the parameter declaration.  Note that
2736cdb8d54b6808b13092cb85e44cf02e4e91c3a669Ian Romanick    * for function parameters the default mode is 'in'.
2737cdb8d54b6808b13092cb85e44cf02e4e91c3a669Ian Romanick    */
27382e063f1adf9e529697483eaabc7e015b4b740267Eric Anholt   apply_type_qualifier_to_variable(& this->type->qualifier, var, state, & loc);
2739a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick
27400044e7edcea22d2456c051a1c4b744a26960ad27Ian Romanick   instructions->push_tail(var);
2741a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick
2742a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   /* Parameter declarations do not have r-values.
2743a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick    */
2744a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   return NULL;
2745a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick}
2746a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick
2747a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick
274845d8a70c12ee6ea956baaf898324a828496382f6Ian Romanickvoid
2749304ea90233baeac6801a98e981658cb7a2d2501cIan Romanickast_parameter_declarator::parameters_to_hir(exec_list *ast_parameters,
275045d8a70c12ee6ea956baaf898324a828496382f6Ian Romanick					    bool formal,
275145d8a70c12ee6ea956baaf898324a828496382f6Ian Romanick					    exec_list *ir_parameters,
275245d8a70c12ee6ea956baaf898324a828496382f6Ian Romanick					    _mesa_glsl_parse_state *state)
2753a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick{
2754cf37c9e8dad4349e45cb91d36957484fd76ce264Ian Romanick   ast_parameter_declarator *void_param = NULL;
2755cf37c9e8dad4349e45cb91d36957484fd76ce264Ian Romanick   unsigned count = 0;
2756a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick
27572b97dc657a0e762bc67216405419cd348eb948c0Ian Romanick   foreach_list_typed (ast_parameter_declarator, param, link, ast_parameters) {
275845d8a70c12ee6ea956baaf898324a828496382f6Ian Romanick      param->formal_parameter = formal;
2759068c80cfe0a280490353b6b007165d717c672eedEric Anholt      param->hir(ir_parameters, state);
2760cf37c9e8dad4349e45cb91d36957484fd76ce264Ian Romanick
2761cf37c9e8dad4349e45cb91d36957484fd76ce264Ian Romanick      if (param->is_void)
2762cf37c9e8dad4349e45cb91d36957484fd76ce264Ian Romanick	 void_param = param;
2763cf37c9e8dad4349e45cb91d36957484fd76ce264Ian Romanick
2764cf37c9e8dad4349e45cb91d36957484fd76ce264Ian Romanick      count++;
2765cf37c9e8dad4349e45cb91d36957484fd76ce264Ian Romanick   }
2766cf37c9e8dad4349e45cb91d36957484fd76ce264Ian Romanick
2767cf37c9e8dad4349e45cb91d36957484fd76ce264Ian Romanick   if ((void_param != NULL) && (count > 1)) {
2768cf37c9e8dad4349e45cb91d36957484fd76ce264Ian Romanick      YYLTYPE loc = void_param->get_location();
2769cf37c9e8dad4349e45cb91d36957484fd76ce264Ian Romanick
2770cf37c9e8dad4349e45cb91d36957484fd76ce264Ian Romanick      _mesa_glsl_error(& loc, state,
2771cf37c9e8dad4349e45cb91d36957484fd76ce264Ian Romanick		       "`void' parameter must be only parameter");
2772a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   }
2773a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick}
2774a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick
2775a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick
27766fae1e4c4d33769e2f255d50907b5aa0ab80edd4Kenneth Graunkevoid
27776fae1e4c4d33769e2f255d50907b5aa0ab80edd4Kenneth Graunkeemit_function(_mesa_glsl_parse_state *state, exec_list *instructions,
27786fae1e4c4d33769e2f255d50907b5aa0ab80edd4Kenneth Graunke	      ir_function *f)
27796fae1e4c4d33769e2f255d50907b5aa0ab80edd4Kenneth Graunke{
27806fae1e4c4d33769e2f255d50907b5aa0ab80edd4Kenneth Graunke   /* Emit the new function header */
27816fae1e4c4d33769e2f255d50907b5aa0ab80edd4Kenneth Graunke   if (state->current_function == NULL) {
27826fae1e4c4d33769e2f255d50907b5aa0ab80edd4Kenneth Graunke      instructions->push_tail(f);
27836fae1e4c4d33769e2f255d50907b5aa0ab80edd4Kenneth Graunke   } else {
27846fae1e4c4d33769e2f255d50907b5aa0ab80edd4Kenneth Graunke      /* IR invariants disallow function declarations or definitions nested
27856fae1e4c4d33769e2f255d50907b5aa0ab80edd4Kenneth Graunke       * within other function definitions.  Insert the new ir_function
27866fae1e4c4d33769e2f255d50907b5aa0ab80edd4Kenneth Graunke       * block in the instruction sequence before the ir_function block
27876fae1e4c4d33769e2f255d50907b5aa0ab80edd4Kenneth Graunke       * containing the current ir_function_signature.
27886fae1e4c4d33769e2f255d50907b5aa0ab80edd4Kenneth Graunke       */
27896fae1e4c4d33769e2f255d50907b5aa0ab80edd4Kenneth Graunke      ir_function *const curr =
27906fae1e4c4d33769e2f255d50907b5aa0ab80edd4Kenneth Graunke	 const_cast<ir_function *>(state->current_function->function());
27916fae1e4c4d33769e2f255d50907b5aa0ab80edd4Kenneth Graunke
27926fae1e4c4d33769e2f255d50907b5aa0ab80edd4Kenneth Graunke      curr->insert_before(f);
27936fae1e4c4d33769e2f255d50907b5aa0ab80edd4Kenneth Graunke   }
27946fae1e4c4d33769e2f255d50907b5aa0ab80edd4Kenneth Graunke}
27956fae1e4c4d33769e2f255d50907b5aa0ab80edd4Kenneth Graunke
27966fae1e4c4d33769e2f255d50907b5aa0ab80edd4Kenneth Graunke
2797fb9fb5f51deca28ed1ec7b71759fb71fc26a0ab6Kenneth Graunkeir_rvalue *
279892318a947958892497722772b03c643ebc943294Ian Romanickast_function::hir(exec_list *instructions,
279992318a947958892497722772b03c643ebc943294Ian Romanick		  struct _mesa_glsl_parse_state *state)
2800a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick{
2801953ff1283d3d52e6a6b4850c2b0b574111625010Kenneth Graunke   void *ctx = state;
280218238de6c34a1a32c452f1006ed13d8adc1bc9d7Ian Romanick   ir_function *f = NULL;
280392318a947958892497722772b03c643ebc943294Ian Romanick   ir_function_signature *sig = NULL;
280492318a947958892497722772b03c643ebc943294Ian Romanick   exec_list hir_parameters;
2805a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick
2806ac04c257e31fe012dac750bcf5bf3134ba07ebdcKenneth Graunke   const char *const name = identifier;
2807a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick
280863b80f8cc181ded154668e60ac2cf0a6a82d118fIan Romanick   /* From page 21 (page 27 of the PDF) of the GLSL 1.20 spec,
280963b80f8cc181ded154668e60ac2cf0a6a82d118fIan Romanick    *
281063b80f8cc181ded154668e60ac2cf0a6a82d118fIan Romanick    *   "Function declarations (prototypes) cannot occur inside of functions;
281163b80f8cc181ded154668e60ac2cf0a6a82d118fIan Romanick    *   they must be at global scope, or for the built-in functions, outside
281263b80f8cc181ded154668e60ac2cf0a6a82d118fIan Romanick    *   the global scope."
281363b80f8cc181ded154668e60ac2cf0a6a82d118fIan Romanick    *
281463b80f8cc181ded154668e60ac2cf0a6a82d118fIan Romanick    * From page 27 (page 33 of the PDF) of the GLSL ES 1.00.16 spec,
281563b80f8cc181ded154668e60ac2cf0a6a82d118fIan Romanick    *
281663b80f8cc181ded154668e60ac2cf0a6a82d118fIan Romanick    *   "User defined functions may only be defined within the global scope."
281763b80f8cc181ded154668e60ac2cf0a6a82d118fIan Romanick    *
281863b80f8cc181ded154668e60ac2cf0a6a82d118fIan Romanick    * Note that this language does not appear in GLSL 1.10.
281963b80f8cc181ded154668e60ac2cf0a6a82d118fIan Romanick    */
282063b80f8cc181ded154668e60ac2cf0a6a82d118fIan Romanick   if ((state->current_function != NULL) && (state->language_version != 110)) {
282163b80f8cc181ded154668e60ac2cf0a6a82d118fIan Romanick      YYLTYPE loc = this->get_location();
282263b80f8cc181ded154668e60ac2cf0a6a82d118fIan Romanick      _mesa_glsl_error(&loc, state,
282363b80f8cc181ded154668e60ac2cf0a6a82d118fIan Romanick		       "declaration of function `%s' not allowed within "
282463b80f8cc181ded154668e60ac2cf0a6a82d118fIan Romanick		       "function body", name);
282563b80f8cc181ded154668e60ac2cf0a6a82d118fIan Romanick   }
282663b80f8cc181ded154668e60ac2cf0a6a82d118fIan Romanick
2827edd180f03216d2fcb2771aeea34e7015fb2b83c3Kenneth Graunke   /* From page 15 (page 21 of the PDF) of the GLSL 1.10 spec,
2828edd180f03216d2fcb2771aeea34e7015fb2b83c3Kenneth Graunke    *
2829edd180f03216d2fcb2771aeea34e7015fb2b83c3Kenneth Graunke    *   "Identifiers starting with "gl_" are reserved for use by
2830edd180f03216d2fcb2771aeea34e7015fb2b83c3Kenneth Graunke    *   OpenGL, and may not be declared in a shader as either a
2831edd180f03216d2fcb2771aeea34e7015fb2b83c3Kenneth Graunke    *   variable or a function."
2832edd180f03216d2fcb2771aeea34e7015fb2b83c3Kenneth Graunke    */
2833edd180f03216d2fcb2771aeea34e7015fb2b83c3Kenneth Graunke   if (strncmp(name, "gl_", 3) == 0) {
2834edd180f03216d2fcb2771aeea34e7015fb2b83c3Kenneth Graunke      YYLTYPE loc = this->get_location();
2835edd180f03216d2fcb2771aeea34e7015fb2b83c3Kenneth Graunke      _mesa_glsl_error(&loc, state,
2836edd180f03216d2fcb2771aeea34e7015fb2b83c3Kenneth Graunke		       "identifier `%s' uses reserved `gl_' prefix", name);
2837edd180f03216d2fcb2771aeea34e7015fb2b83c3Kenneth Graunke   }
2838edd180f03216d2fcb2771aeea34e7015fb2b83c3Kenneth Graunke
2839a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   /* Convert the list of function parameters to HIR now so that they can be
2840a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick    * used below to compare this function's signature with previously seen
2841a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick    * signatures for functions with the same name.
2842a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick    */
284345d8a70c12ee6ea956baaf898324a828496382f6Ian Romanick   ast_parameter_declarator::parameters_to_hir(& this->parameters,
284445d8a70c12ee6ea956baaf898324a828496382f6Ian Romanick					       is_definition,
284545d8a70c12ee6ea956baaf898324a828496382f6Ian Romanick					       & hir_parameters, state);
2846a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick
2847e39cc69fa3cb830b803fe0c4f6c30915aa886b5bIan Romanick   const char *return_type_name;
2848e39cc69fa3cb830b803fe0c4f6c30915aa886b5bIan Romanick   const glsl_type *return_type =
284992318a947958892497722772b03c643ebc943294Ian Romanick      this->return_type->specifier->glsl_type(& return_type_name, state);
2850e39cc69fa3cb830b803fe0c4f6c30915aa886b5bIan Romanick
285176e96d74f49cc262ceaf2ed6c48d2f4ed21d219fEric Anholt   if (!return_type) {
285276e96d74f49cc262ceaf2ed6c48d2f4ed21d219fEric Anholt      YYLTYPE loc = this->get_location();
285376e96d74f49cc262ceaf2ed6c48d2f4ed21d219fEric Anholt      _mesa_glsl_error(&loc, state,
285476e96d74f49cc262ceaf2ed6c48d2f4ed21d219fEric Anholt		       "function `%s' has undeclared return type `%s'",
285576e96d74f49cc262ceaf2ed6c48d2f4ed21d219fEric Anholt		       name, return_type_name);
285676e96d74f49cc262ceaf2ed6c48d2f4ed21d219fEric Anholt      return_type = glsl_type::error_type;
285776e96d74f49cc262ceaf2ed6c48d2f4ed21d219fEric Anholt   }
2858e39cc69fa3cb830b803fe0c4f6c30915aa886b5bIan Romanick
2859ac04c257e31fe012dac750bcf5bf3134ba07ebdcKenneth Graunke   /* From page 56 (page 62 of the PDF) of the GLSL 1.30 spec:
2860ac04c257e31fe012dac750bcf5bf3134ba07ebdcKenneth Graunke    * "No qualifier is allowed on the return type of a function."
2861ac04c257e31fe012dac750bcf5bf3134ba07ebdcKenneth Graunke    */
2862ac04c257e31fe012dac750bcf5bf3134ba07ebdcKenneth Graunke   if (this->return_type->has_qualifiers()) {
2863ac04c257e31fe012dac750bcf5bf3134ba07ebdcKenneth Graunke      YYLTYPE loc = this->get_location();
2864ac04c257e31fe012dac750bcf5bf3134ba07ebdcKenneth Graunke      _mesa_glsl_error(& loc, state,
2865ac04c257e31fe012dac750bcf5bf3134ba07ebdcKenneth Graunke		       "function `%s' return type has qualifiers", name);
2866ac04c257e31fe012dac750bcf5bf3134ba07ebdcKenneth Graunke   }
2867ac04c257e31fe012dac750bcf5bf3134ba07ebdcKenneth Graunke
2868a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   /* Verify that this function's signature either doesn't match a previously
2869a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick    * seen signature for a function with the same name, or, if a match is found,
2870a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick    * that the previously seen signature does not have an associated definition.
2871a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick    */
2872e466b182bbf21f62fe6542091f4af3275555db80Ian Romanick   f = state->symbols->get_function(name);
287381f03393982c29f8f4165b5629c8e8fb708b97a3Kenneth Graunke   if (f != NULL && (state->es_shader || f->has_user_signature())) {
2874202604e8160157e4e80b3458175e0170d168e557Ian Romanick      sig = f->exact_matching_signature(&hir_parameters);
28750d605cb97c9cd2f9a170e3aa15bdf4021a75fc14Kenneth Graunke      if (sig != NULL) {
28760d605cb97c9cd2f9a170e3aa15bdf4021a75fc14Kenneth Graunke	 const char *badvar = sig->qualifiers_match(&hir_parameters);
28770d605cb97c9cd2f9a170e3aa15bdf4021a75fc14Kenneth Graunke	 if (badvar != NULL) {
28780d605cb97c9cd2f9a170e3aa15bdf4021a75fc14Kenneth Graunke	    YYLTYPE loc = this->get_location();
2879abd40b15210c17b2a3ba8fcffc868fda203efa01Kenneth Graunke
28800d605cb97c9cd2f9a170e3aa15bdf4021a75fc14Kenneth Graunke	    _mesa_glsl_error(&loc, state, "function `%s' parameter `%s' "
28810d605cb97c9cd2f9a170e3aa15bdf4021a75fc14Kenneth Graunke			     "qualifiers don't match prototype", name, badvar);
28820d605cb97c9cd2f9a170e3aa15bdf4021a75fc14Kenneth Graunke	 }
28831e7ec3ce128a9d30d7d9e1707a22b270eb525075Eric Anholt
28840d605cb97c9cd2f9a170e3aa15bdf4021a75fc14Kenneth Graunke	 if (sig->return_type != return_type) {
28850d605cb97c9cd2f9a170e3aa15bdf4021a75fc14Kenneth Graunke	    YYLTYPE loc = this->get_location();
288660be7626b829af7e1d07330b9a88468924ba350eEric Anholt
28870d605cb97c9cd2f9a170e3aa15bdf4021a75fc14Kenneth Graunke	    _mesa_glsl_error(&loc, state, "function `%s' return type doesn't "
28880d605cb97c9cd2f9a170e3aa15bdf4021a75fc14Kenneth Graunke			     "match prototype", name);
28890d605cb97c9cd2f9a170e3aa15bdf4021a75fc14Kenneth Graunke	 }
2890a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick
28910d605cb97c9cd2f9a170e3aa15bdf4021a75fc14Kenneth Graunke	 if (is_definition && sig->is_defined) {
28920d605cb97c9cd2f9a170e3aa15bdf4021a75fc14Kenneth Graunke	    YYLTYPE loc = this->get_location();
2893a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick
28940d605cb97c9cd2f9a170e3aa15bdf4021a75fc14Kenneth Graunke	    _mesa_glsl_error(& loc, state, "function `%s' redefined", name);
2895a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick	 }
2896a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick      }
2897a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   } else {
28981660a2954797e056caba319c5d6c70b0d4be22feCarl Worth      f = new(ctx) ir_function(name);
2899e8f5ebf313da3ce33ccbbcf9b72946853035fbddEric Anholt      if (!state->symbols->add_function(f)) {
2900e09591317b2470fe9c104606577d4e10255727c0Kenneth Graunke	 /* This function name shadows a non-function use of the same name. */
2901e09591317b2470fe9c104606577d4e10255727c0Kenneth Graunke	 YYLTYPE loc = this->get_location();
2902e09591317b2470fe9c104606577d4e10255727c0Kenneth Graunke
2903e09591317b2470fe9c104606577d4e10255727c0Kenneth Graunke	 _mesa_glsl_error(&loc, state, "function name `%s' conflicts with "
2904e09591317b2470fe9c104606577d4e10255727c0Kenneth Graunke			  "non-function", name);
2905e09591317b2470fe9c104606577d4e10255727c0Kenneth Graunke	 return NULL;
2906e09591317b2470fe9c104606577d4e10255727c0Kenneth Graunke      }
29079fa99f3b6c84fe927ba97e6584cd919f097a6c9aKenneth Graunke
29086fae1e4c4d33769e2f255d50907b5aa0ab80edd4Kenneth Graunke      emit_function(state, instructions, f);
2909a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   }
2910a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick
2911ab372dab2a013e5d0c8ee57bb799a76c9a78abf2Eric Anholt   /* Verify the return type of main() */
2912ab372dab2a013e5d0c8ee57bb799a76c9a78abf2Eric Anholt   if (strcmp(name, "main") == 0) {
291325711a85c22bed305c9b52b89feb9c600d1892dfIan Romanick      if (! return_type->is_void()) {
2914ab372dab2a013e5d0c8ee57bb799a76c9a78abf2Eric Anholt	 YYLTYPE loc = this->get_location();
2915ab372dab2a013e5d0c8ee57bb799a76c9a78abf2Eric Anholt
2916ab372dab2a013e5d0c8ee57bb799a76c9a78abf2Eric Anholt	 _mesa_glsl_error(& loc, state, "main() must return void");
2917ab372dab2a013e5d0c8ee57bb799a76c9a78abf2Eric Anholt      }
2918174cc03edcd6861ba416cc1afb19d4d43933ac84Eric Anholt
291992318a947958892497722772b03c643ebc943294Ian Romanick      if (!hir_parameters.is_empty()) {
2920174cc03edcd6861ba416cc1afb19d4d43933ac84Eric Anholt	 YYLTYPE loc = this->get_location();
2921174cc03edcd6861ba416cc1afb19d4d43933ac84Eric Anholt
2922174cc03edcd6861ba416cc1afb19d4d43933ac84Eric Anholt	 _mesa_glsl_error(& loc, state, "main() must not take any parameters");
2923174cc03edcd6861ba416cc1afb19d4d43933ac84Eric Anholt      }
2924ab372dab2a013e5d0c8ee57bb799a76c9a78abf2Eric Anholt   }
2925a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick
2926a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   /* Finish storing the information about this new function in its signature.
2927a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick    */
292892318a947958892497722772b03c643ebc943294Ian Romanick   if (sig == NULL) {
29291660a2954797e056caba319c5d6c70b0d4be22feCarl Worth      sig = new(ctx) ir_function_signature(return_type);
293092318a947958892497722772b03c643ebc943294Ian Romanick      f->add_signature(sig);
2931a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   }
2932a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick
2933bff6013d469b3d4e54cdc5731801c56994a523ecKenneth Graunke   sig->replace_parameters(&hir_parameters);
293492318a947958892497722772b03c643ebc943294Ian Romanick   signature = sig;
293592318a947958892497722772b03c643ebc943294Ian Romanick
293692318a947958892497722772b03c643ebc943294Ian Romanick   /* Function declarations (prototypes) do not have r-values.
293792318a947958892497722772b03c643ebc943294Ian Romanick    */
293892318a947958892497722772b03c643ebc943294Ian Romanick   return NULL;
293992318a947958892497722772b03c643ebc943294Ian Romanick}
294092318a947958892497722772b03c643ebc943294Ian Romanick
294192318a947958892497722772b03c643ebc943294Ian Romanick
294292318a947958892497722772b03c643ebc943294Ian Romanickir_rvalue *
294392318a947958892497722772b03c643ebc943294Ian Romanickast_function_definition::hir(exec_list *instructions,
294492318a947958892497722772b03c643ebc943294Ian Romanick			     struct _mesa_glsl_parse_state *state)
294592318a947958892497722772b03c643ebc943294Ian Romanick{
294692318a947958892497722772b03c643ebc943294Ian Romanick   prototype->is_definition = true;
294792318a947958892497722772b03c643ebc943294Ian Romanick   prototype->hir(instructions, state);
2948e29a5859891eb9e1587396dea0e8010f7d88f68cIan Romanick
294992318a947958892497722772b03c643ebc943294Ian Romanick   ir_function_signature *signature = prototype->signature;
2950826a39cb14244820e8539a2328bb52447348f184Kenneth Graunke   if (signature == NULL)
2951826a39cb14244820e8539a2328bb52447348f184Kenneth Graunke      return NULL;
2952a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick
295341ec6a47ab81620bab9182f987e4bc4780e3a6abIan Romanick   assert(state->current_function == NULL);
295441ec6a47ab81620bab9182f987e4bc4780e3a6abIan Romanick   state->current_function = signature;
29556de825650560198eb97f19e72b2d56e68e3d7a63Kenneth Graunke   state->found_return = false;
295641ec6a47ab81620bab9182f987e4bc4780e3a6abIan Romanick
2957e29a5859891eb9e1587396dea0e8010f7d88f68cIan Romanick   /* Duplicate parameters declared in the prototype as concrete variables.
2958e29a5859891eb9e1587396dea0e8010f7d88f68cIan Romanick    * Add these to the symbol table.
2959a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick    */
29608bde4cec6b189564b1f2d58514bd7e7a4b40f714Ian Romanick   state->symbols->push_scope();
2961e29a5859891eb9e1587396dea0e8010f7d88f68cIan Romanick   foreach_iter(exec_list_iterator, iter, signature->parameters) {
2962fbc7c0b8f2e161bce1c048c63d2d5cfcdeb096f1Eric Anholt      ir_variable *const var = ((ir_instruction *) iter.get())->as_variable();
2963e29a5859891eb9e1587396dea0e8010f7d88f68cIan Romanick
2964fbc7c0b8f2e161bce1c048c63d2d5cfcdeb096f1Eric Anholt      assert(var != NULL);
2965a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick
29663359e58eac19dd7771a78310c8a0e3d3ded55063Ian Romanick      /* The only way a parameter would "exist" is if two parameters have
29673359e58eac19dd7771a78310c8a0e3d3ded55063Ian Romanick       * the same name.
29683359e58eac19dd7771a78310c8a0e3d3ded55063Ian Romanick       */
29693359e58eac19dd7771a78310c8a0e3d3ded55063Ian Romanick      if (state->symbols->name_declared_this_scope(var->name)) {
29703359e58eac19dd7771a78310c8a0e3d3ded55063Ian Romanick	 YYLTYPE loc = this->get_location();
29713359e58eac19dd7771a78310c8a0e3d3ded55063Ian Romanick
29723359e58eac19dd7771a78310c8a0e3d3ded55063Ian Romanick	 _mesa_glsl_error(& loc, state, "parameter `%s' redeclared", var->name);
29733359e58eac19dd7771a78310c8a0e3d3ded55063Ian Romanick      } else {
2974001eee52d461233b1e1d6ed3577965e9bcb209e8Eric Anholt	 state->symbols->add_variable(var);
29753359e58eac19dd7771a78310c8a0e3d3ded55063Ian Romanick      }
2976a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   }
2977a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick
29789fa99f3b6c84fe927ba97e6584cd919f097a6c9aKenneth Graunke   /* Convert the body of the function to HIR. */
2979894ea972a4defdaafeaa3a248c113b06c7ae0c7eEric Anholt   this->body->hir(&signature->body, state);
29809fa99f3b6c84fe927ba97e6584cd919f097a6c9aKenneth Graunke   signature->is_defined = true;
2981a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick
29828bde4cec6b189564b1f2d58514bd7e7a4b40f714Ian Romanick   state->symbols->pop_scope();
2983a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick
298441ec6a47ab81620bab9182f987e4bc4780e3a6abIan Romanick   assert(state->current_function == signature);
298541ec6a47ab81620bab9182f987e4bc4780e3a6abIan Romanick   state->current_function = NULL;
2986a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick
29876de825650560198eb97f19e72b2d56e68e3d7a63Kenneth Graunke   if (!signature->return_type->is_void() && !state->found_return) {
29886de825650560198eb97f19e72b2d56e68e3d7a63Kenneth Graunke      YYLTYPE loc = this->get_location();
29896de825650560198eb97f19e72b2d56e68e3d7a63Kenneth Graunke      _mesa_glsl_error(& loc, state, "function `%s' has non-void return type "
29906de825650560198eb97f19e72b2d56e68e3d7a63Kenneth Graunke		       "%s, but no return statement",
29916de825650560198eb97f19e72b2d56e68e3d7a63Kenneth Graunke		       signature->function_name(),
29926de825650560198eb97f19e72b2d56e68e3d7a63Kenneth Graunke		       signature->return_type->name);
29936de825650560198eb97f19e72b2d56e68e3d7a63Kenneth Graunke   }
29946de825650560198eb97f19e72b2d56e68e3d7a63Kenneth Graunke
2995a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   /* Function definitions do not have r-values.
2996a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick    */
2997a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   return NULL;
2998a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick}
299916a246c049fa3c8d7841f87c8defdd0f26f302eeIan Romanick
300016a246c049fa3c8d7841f87c8defdd0f26f302eeIan Romanick
3001fb9fb5f51deca28ed1ec7b71759fb71fc26a0ab6Kenneth Graunkeir_rvalue *
300216a246c049fa3c8d7841f87c8defdd0f26f302eeIan Romanickast_jump_statement::hir(exec_list *instructions,
300316a246c049fa3c8d7841f87c8defdd0f26f302eeIan Romanick			struct _mesa_glsl_parse_state *state)
300416a246c049fa3c8d7841f87c8defdd0f26f302eeIan Romanick{
3005953ff1283d3d52e6a6b4850c2b0b574111625010Kenneth Graunke   void *ctx = state;
300616a246c049fa3c8d7841f87c8defdd0f26f302eeIan Romanick
3007c0e76d8352fbe96efb0338e9d98b08494671e504Ian Romanick   switch (mode) {
3008c0e76d8352fbe96efb0338e9d98b08494671e504Ian Romanick   case ast_return: {
300916a246c049fa3c8d7841f87c8defdd0f26f302eeIan Romanick      ir_return *inst;
3010aad7c7793788f34e98fb7264dc2219fc73002877Eric Anholt      assert(state->current_function);
301116a246c049fa3c8d7841f87c8defdd0f26f302eeIan Romanick
301216a246c049fa3c8d7841f87c8defdd0f26f302eeIan Romanick      if (opt_return_value) {
3013ab79d4ec6e7c5639084f71f93857f39239e8b848Eric Anholt	 if (state->current_function->return_type->base_type ==
3014ab79d4ec6e7c5639084f71f93857f39239e8b848Eric Anholt	     GLSL_TYPE_VOID) {
3015ab79d4ec6e7c5639084f71f93857f39239e8b848Eric Anholt	    YYLTYPE loc = this->get_location();
3016ab79d4ec6e7c5639084f71f93857f39239e8b848Eric Anholt
3017ab79d4ec6e7c5639084f71f93857f39239e8b848Eric Anholt	    _mesa_glsl_error(& loc, state,
3018ab79d4ec6e7c5639084f71f93857f39239e8b848Eric Anholt			     "`return` with a value, in function `%s' "
3019ab79d4ec6e7c5639084f71f93857f39239e8b848Eric Anholt			     "returning void",
3020f96c52ba2e290e3ba5f14cd7f87ba5b4382a1785Kenneth Graunke			     state->current_function->function_name());
3021ab79d4ec6e7c5639084f71f93857f39239e8b848Eric Anholt	 }
302216a246c049fa3c8d7841f87c8defdd0f26f302eeIan Romanick
3023b4cdba687c098eea2ecc61349a4ea02a8769909eChad Versace	 ir_rvalue *const ret = opt_return_value->hir(instructions, state);
302416a246c049fa3c8d7841f87c8defdd0f26f302eeIan Romanick	 assert(ret != NULL);
302516a246c049fa3c8d7841f87c8defdd0f26f302eeIan Romanick
302618707eba1cd6c07fa8b63d0ba5b26f6433f1ae91Kenneth Graunke	 /* Implicit conversions are not allowed for return values. */
302718707eba1cd6c07fa8b63d0ba5b26f6433f1ae91Kenneth Graunke	 if (state->current_function->return_type != ret->type) {
302818707eba1cd6c07fa8b63d0ba5b26f6433f1ae91Kenneth Graunke	    YYLTYPE loc = this->get_location();
302918707eba1cd6c07fa8b63d0ba5b26f6433f1ae91Kenneth Graunke
303018707eba1cd6c07fa8b63d0ba5b26f6433f1ae91Kenneth Graunke	    _mesa_glsl_error(& loc, state,
303118707eba1cd6c07fa8b63d0ba5b26f6433f1ae91Kenneth Graunke			     "`return' with wrong type %s, in function `%s' "
303218707eba1cd6c07fa8b63d0ba5b26f6433f1ae91Kenneth Graunke			     "returning %s",
303318707eba1cd6c07fa8b63d0ba5b26f6433f1ae91Kenneth Graunke			     ret->type->name,
303418707eba1cd6c07fa8b63d0ba5b26f6433f1ae91Kenneth Graunke			     state->current_function->function_name(),
303518707eba1cd6c07fa8b63d0ba5b26f6433f1ae91Kenneth Graunke			     state->current_function->return_type->name);
303618707eba1cd6c07fa8b63d0ba5b26f6433f1ae91Kenneth Graunke	 }
303716a246c049fa3c8d7841f87c8defdd0f26f302eeIan Romanick
30381660a2954797e056caba319c5d6c70b0d4be22feCarl Worth	 inst = new(ctx) ir_return(ret);
303916a246c049fa3c8d7841f87c8defdd0f26f302eeIan Romanick      } else {
3040aad7c7793788f34e98fb7264dc2219fc73002877Eric Anholt	 if (state->current_function->return_type->base_type !=
3041aad7c7793788f34e98fb7264dc2219fc73002877Eric Anholt	     GLSL_TYPE_VOID) {
3042aad7c7793788f34e98fb7264dc2219fc73002877Eric Anholt	    YYLTYPE loc = this->get_location();
3043aad7c7793788f34e98fb7264dc2219fc73002877Eric Anholt
3044aad7c7793788f34e98fb7264dc2219fc73002877Eric Anholt	    _mesa_glsl_error(& loc, state,
3045aad7c7793788f34e98fb7264dc2219fc73002877Eric Anholt			     "`return' with no value, in function %s returning "
3046aad7c7793788f34e98fb7264dc2219fc73002877Eric Anholt			     "non-void",
3047f96c52ba2e290e3ba5f14cd7f87ba5b4382a1785Kenneth Graunke			     state->current_function->function_name());
3048aad7c7793788f34e98fb7264dc2219fc73002877Eric Anholt	 }
30491660a2954797e056caba319c5d6c70b0d4be22feCarl Worth	 inst = new(ctx) ir_return;
305016a246c049fa3c8d7841f87c8defdd0f26f302eeIan Romanick      }
305116a246c049fa3c8d7841f87c8defdd0f26f302eeIan Romanick
30526de825650560198eb97f19e72b2d56e68e3d7a63Kenneth Graunke      state->found_return = true;
305316a246c049fa3c8d7841f87c8defdd0f26f302eeIan Romanick      instructions->push_tail(inst);
3054c0e76d8352fbe96efb0338e9d98b08494671e504Ian Romanick      break;
305516a246c049fa3c8d7841f87c8defdd0f26f302eeIan Romanick   }
305616a246c049fa3c8d7841f87c8defdd0f26f302eeIan Romanick
3057c0e76d8352fbe96efb0338e9d98b08494671e504Ian Romanick   case ast_discard:
3058b98020770730bd4a7e9bd5c2e4ab2ae8c1eb0376Eric Anholt      if (state->target != fragment_shader) {
3059b98020770730bd4a7e9bd5c2e4ab2ae8c1eb0376Eric Anholt	 YYLTYPE loc = this->get_location();
3060b98020770730bd4a7e9bd5c2e4ab2ae8c1eb0376Eric Anholt
3061b98020770730bd4a7e9bd5c2e4ab2ae8c1eb0376Eric Anholt	 _mesa_glsl_error(& loc, state,
3062b98020770730bd4a7e9bd5c2e4ab2ae8c1eb0376Eric Anholt			  "`discard' may only appear in a fragment shader");
3063b98020770730bd4a7e9bd5c2e4ab2ae8c1eb0376Eric Anholt      }
306477049a702ad54e09c4102fe8c964e069944f83e5Kenneth Graunke      instructions->push_tail(new(ctx) ir_discard);
3065c0e76d8352fbe96efb0338e9d98b08494671e504Ian Romanick      break;
3066c0e76d8352fbe96efb0338e9d98b08494671e504Ian Romanick
3067c0e76d8352fbe96efb0338e9d98b08494671e504Ian Romanick   case ast_break:
3068c0e76d8352fbe96efb0338e9d98b08494671e504Ian Romanick   case ast_continue:
30694cf20cd37c12c6243a09d52739d3d47f030a1799Ian Romanick      /* FINISHME: Handle switch-statements.  They cannot contain 'continue',
30704cf20cd37c12c6243a09d52739d3d47f030a1799Ian Romanick       * FINISHME: and they use a different IR instruction for 'break'.
30714cf20cd37c12c6243a09d52739d3d47f030a1799Ian Romanick       */
30724cf20cd37c12c6243a09d52739d3d47f030a1799Ian Romanick      /* FINISHME: Correctly handle the nesting.  If a switch-statement is
30734cf20cd37c12c6243a09d52739d3d47f030a1799Ian Romanick       * FINISHME: inside a loop, a 'continue' is valid and will bind to the
30744cf20cd37c12c6243a09d52739d3d47f030a1799Ian Romanick       * FINISHME: loop.
30754cf20cd37c12c6243a09d52739d3d47f030a1799Ian Romanick       */
30764cf20cd37c12c6243a09d52739d3d47f030a1799Ian Romanick      if (state->loop_or_switch_nesting == NULL) {
30774cf20cd37c12c6243a09d52739d3d47f030a1799Ian Romanick	 YYLTYPE loc = this->get_location();
30784cf20cd37c12c6243a09d52739d3d47f030a1799Ian Romanick
30794cf20cd37c12c6243a09d52739d3d47f030a1799Ian Romanick	 _mesa_glsl_error(& loc, state,
30804cf20cd37c12c6243a09d52739d3d47f030a1799Ian Romanick			  "`%s' may only appear in a loop",
30814cf20cd37c12c6243a09d52739d3d47f030a1799Ian Romanick			  (mode == ast_break) ? "break" : "continue");
30824cf20cd37c12c6243a09d52739d3d47f030a1799Ian Romanick      } else {
30834cf20cd37c12c6243a09d52739d3d47f030a1799Ian Romanick	 ir_loop *const loop = state->loop_or_switch_nesting->as_loop();
30844cf20cd37c12c6243a09d52739d3d47f030a1799Ian Romanick
30852d1ed7b1b112cf13dd7eda7f500691f4c98a1cccEric Anholt	 /* Inline the for loop expression again, since we don't know
30862d1ed7b1b112cf13dd7eda7f500691f4c98a1cccEric Anholt	  * where near the end of the loop body the normal copy of it
30872d1ed7b1b112cf13dd7eda7f500691f4c98a1cccEric Anholt	  * is going to be placed.
30882d1ed7b1b112cf13dd7eda7f500691f4c98a1cccEric Anholt	  */
30892d1ed7b1b112cf13dd7eda7f500691f4c98a1cccEric Anholt	 if (mode == ast_continue &&
30902d1ed7b1b112cf13dd7eda7f500691f4c98a1cccEric Anholt	     state->loop_or_switch_nesting_ast->rest_expression) {
30912d1ed7b1b112cf13dd7eda7f500691f4c98a1cccEric Anholt	    state->loop_or_switch_nesting_ast->rest_expression->hir(instructions,
30922d1ed7b1b112cf13dd7eda7f500691f4c98a1cccEric Anholt								    state);
30932d1ed7b1b112cf13dd7eda7f500691f4c98a1cccEric Anholt	 }
30942d1ed7b1b112cf13dd7eda7f500691f4c98a1cccEric Anholt
30954cf20cd37c12c6243a09d52739d3d47f030a1799Ian Romanick	 if (loop != NULL) {
30964cf20cd37c12c6243a09d52739d3d47f030a1799Ian Romanick	    ir_loop_jump *const jump =
30971660a2954797e056caba319c5d6c70b0d4be22feCarl Worth	       new(ctx) ir_loop_jump((mode == ast_break)
30981660a2954797e056caba319c5d6c70b0d4be22feCarl Worth				     ? ir_loop_jump::jump_break
30991660a2954797e056caba319c5d6c70b0d4be22feCarl Worth				     : ir_loop_jump::jump_continue);
31004cf20cd37c12c6243a09d52739d3d47f030a1799Ian Romanick	    instructions->push_tail(jump);
31014cf20cd37c12c6243a09d52739d3d47f030a1799Ian Romanick	 }
31024cf20cd37c12c6243a09d52739d3d47f030a1799Ian Romanick      }
31034cf20cd37c12c6243a09d52739d3d47f030a1799Ian Romanick
3104c0e76d8352fbe96efb0338e9d98b08494671e504Ian Romanick      break;
3105b98020770730bd4a7e9bd5c2e4ab2ae8c1eb0376Eric Anholt   }
3106b98020770730bd4a7e9bd5c2e4ab2ae8c1eb0376Eric Anholt
310716a246c049fa3c8d7841f87c8defdd0f26f302eeIan Romanick   /* Jump instructions do not have r-values.
310816a246c049fa3c8d7841f87c8defdd0f26f302eeIan Romanick    */
310916a246c049fa3c8d7841f87c8defdd0f26f302eeIan Romanick   return NULL;
311016a246c049fa3c8d7841f87c8defdd0f26f302eeIan Romanick}
31113c6fea3048a0d9add2fec621d30c32f3519d8868Ian Romanick
31123c6fea3048a0d9add2fec621d30c32f3519d8868Ian Romanick
31133c6fea3048a0d9add2fec621d30c32f3519d8868Ian Romanickir_rvalue *
31143c6fea3048a0d9add2fec621d30c32f3519d8868Ian Romanickast_selection_statement::hir(exec_list *instructions,
31153c6fea3048a0d9add2fec621d30c32f3519d8868Ian Romanick			     struct _mesa_glsl_parse_state *state)
31163c6fea3048a0d9add2fec621d30c32f3519d8868Ian Romanick{
3117953ff1283d3d52e6a6b4850c2b0b574111625010Kenneth Graunke   void *ctx = state;
31181660a2954797e056caba319c5d6c70b0d4be22feCarl Worth
31193c6fea3048a0d9add2fec621d30c32f3519d8868Ian Romanick   ir_rvalue *const condition = this->condition->hir(instructions, state);
31203c6fea3048a0d9add2fec621d30c32f3519d8868Ian Romanick
31213c6fea3048a0d9add2fec621d30c32f3519d8868Ian Romanick   /* From page 66 (page 72 of the PDF) of the GLSL 1.50 spec:
31223c6fea3048a0d9add2fec621d30c32f3519d8868Ian Romanick    *
31233c6fea3048a0d9add2fec621d30c32f3519d8868Ian Romanick    *    "Any expression whose type evaluates to a Boolean can be used as the
31243c6fea3048a0d9add2fec621d30c32f3519d8868Ian Romanick    *    conditional expression bool-expression. Vector types are not accepted
31253c6fea3048a0d9add2fec621d30c32f3519d8868Ian Romanick    *    as the expression to if."
31263c6fea3048a0d9add2fec621d30c32f3519d8868Ian Romanick    *
31273c6fea3048a0d9add2fec621d30c32f3519d8868Ian Romanick    * The checks are separated so that higher quality diagnostics can be
31283c6fea3048a0d9add2fec621d30c32f3519d8868Ian Romanick    * generated for cases where both rules are violated.
31293c6fea3048a0d9add2fec621d30c32f3519d8868Ian Romanick    */
31303c6fea3048a0d9add2fec621d30c32f3519d8868Ian Romanick   if (!condition->type->is_boolean() || !condition->type->is_scalar()) {
31313c6fea3048a0d9add2fec621d30c32f3519d8868Ian Romanick      YYLTYPE loc = this->condition->get_location();
31323c6fea3048a0d9add2fec621d30c32f3519d8868Ian Romanick
31333c6fea3048a0d9add2fec621d30c32f3519d8868Ian Romanick      _mesa_glsl_error(& loc, state, "if-statement condition must be scalar "
31343c6fea3048a0d9add2fec621d30c32f3519d8868Ian Romanick		       "boolean");
31353c6fea3048a0d9add2fec621d30c32f3519d8868Ian Romanick   }
31363c6fea3048a0d9add2fec621d30c32f3519d8868Ian Romanick
31371660a2954797e056caba319c5d6c70b0d4be22feCarl Worth   ir_if *const stmt = new(ctx) ir_if(condition);
31383c6fea3048a0d9add2fec621d30c32f3519d8868Ian Romanick
3139665d75cc5a23f8024034d0c4176fb281f94a30e9Kenneth Graunke   if (then_statement != NULL) {
3140665d75cc5a23f8024034d0c4176fb281f94a30e9Kenneth Graunke      state->symbols->push_scope();
31414f9d72fa9e2a4ff1a2aca6de8ee4fa93639c75f1Ian Romanick      then_statement->hir(& stmt->then_instructions, state);
3142665d75cc5a23f8024034d0c4176fb281f94a30e9Kenneth Graunke      state->symbols->pop_scope();
3143665d75cc5a23f8024034d0c4176fb281f94a30e9Kenneth Graunke   }
31443c6fea3048a0d9add2fec621d30c32f3519d8868Ian Romanick
3145665d75cc5a23f8024034d0c4176fb281f94a30e9Kenneth Graunke   if (else_statement != NULL) {
3146665d75cc5a23f8024034d0c4176fb281f94a30e9Kenneth Graunke      state->symbols->push_scope();
31474f9d72fa9e2a4ff1a2aca6de8ee4fa93639c75f1Ian Romanick      else_statement->hir(& stmt->else_instructions, state);
3148665d75cc5a23f8024034d0c4176fb281f94a30e9Kenneth Graunke      state->symbols->pop_scope();
3149665d75cc5a23f8024034d0c4176fb281f94a30e9Kenneth Graunke   }
31503c6fea3048a0d9add2fec621d30c32f3519d8868Ian Romanick
31513c6fea3048a0d9add2fec621d30c32f3519d8868Ian Romanick   instructions->push_tail(stmt);
31523c6fea3048a0d9add2fec621d30c32f3519d8868Ian Romanick
31533c6fea3048a0d9add2fec621d30c32f3519d8868Ian Romanick   /* if-statements do not have r-values.
31543c6fea3048a0d9add2fec621d30c32f3519d8868Ian Romanick    */
31553c6fea3048a0d9add2fec621d30c32f3519d8868Ian Romanick   return NULL;
31563c6fea3048a0d9add2fec621d30c32f3519d8868Ian Romanick}
31579e7d010ee0ed89f1fe07a06a9d9bb22e15106ae2Ian Romanick
31589e7d010ee0ed89f1fe07a06a9d9bb22e15106ae2Ian Romanick
31598c46ed24906ee10dd2f2cfaf4cf9803eca1ba523Ian Romanickvoid
31608c46ed24906ee10dd2f2cfaf4cf9803eca1ba523Ian Romanickast_iteration_statement::condition_to_hir(ir_loop *stmt,
31618c46ed24906ee10dd2f2cfaf4cf9803eca1ba523Ian Romanick					  struct _mesa_glsl_parse_state *state)
31629e7d010ee0ed89f1fe07a06a9d9bb22e15106ae2Ian Romanick{
3163953ff1283d3d52e6a6b4850c2b0b574111625010Kenneth Graunke   void *ctx = state;
31641660a2954797e056caba319c5d6c70b0d4be22feCarl Worth
31659e7d010ee0ed89f1fe07a06a9d9bb22e15106ae2Ian Romanick   if (condition != NULL) {
31669e7d010ee0ed89f1fe07a06a9d9bb22e15106ae2Ian Romanick      ir_rvalue *const cond =
31679e7d010ee0ed89f1fe07a06a9d9bb22e15106ae2Ian Romanick	 condition->hir(& stmt->body_instructions, state);
31689e7d010ee0ed89f1fe07a06a9d9bb22e15106ae2Ian Romanick
31699e7d010ee0ed89f1fe07a06a9d9bb22e15106ae2Ian Romanick      if ((cond == NULL)
31709e7d010ee0ed89f1fe07a06a9d9bb22e15106ae2Ian Romanick	  || !cond->type->is_boolean() || !cond->type->is_scalar()) {
31719e7d010ee0ed89f1fe07a06a9d9bb22e15106ae2Ian Romanick	 YYLTYPE loc = condition->get_location();
31729e7d010ee0ed89f1fe07a06a9d9bb22e15106ae2Ian Romanick
31739e7d010ee0ed89f1fe07a06a9d9bb22e15106ae2Ian Romanick	 _mesa_glsl_error(& loc, state,
31749e7d010ee0ed89f1fe07a06a9d9bb22e15106ae2Ian Romanick			  "loop condition must be scalar boolean");
31759e7d010ee0ed89f1fe07a06a9d9bb22e15106ae2Ian Romanick      } else {
31769e7d010ee0ed89f1fe07a06a9d9bb22e15106ae2Ian Romanick	 /* As the first code in the loop body, generate a block that looks
31779e7d010ee0ed89f1fe07a06a9d9bb22e15106ae2Ian Romanick	  * like 'if (!condition) break;' as the loop termination condition.
31789e7d010ee0ed89f1fe07a06a9d9bb22e15106ae2Ian Romanick	  */
31799e7d010ee0ed89f1fe07a06a9d9bb22e15106ae2Ian Romanick	 ir_rvalue *const not_cond =
31801660a2954797e056caba319c5d6c70b0d4be22feCarl Worth	    new(ctx) ir_expression(ir_unop_logic_not, glsl_type::bool_type, cond,
31811660a2954797e056caba319c5d6c70b0d4be22feCarl Worth				   NULL);
31829e7d010ee0ed89f1fe07a06a9d9bb22e15106ae2Ian Romanick
31831660a2954797e056caba319c5d6c70b0d4be22feCarl Worth	 ir_if *const if_stmt = new(ctx) ir_if(not_cond);
31849e7d010ee0ed89f1fe07a06a9d9bb22e15106ae2Ian Romanick
31859e7d010ee0ed89f1fe07a06a9d9bb22e15106ae2Ian Romanick	 ir_jump *const break_stmt =
31861660a2954797e056caba319c5d6c70b0d4be22feCarl Worth	    new(ctx) ir_loop_jump(ir_loop_jump::jump_break);
31879e7d010ee0ed89f1fe07a06a9d9bb22e15106ae2Ian Romanick
31889e7d010ee0ed89f1fe07a06a9d9bb22e15106ae2Ian Romanick	 if_stmt->then_instructions.push_tail(break_stmt);
31899e7d010ee0ed89f1fe07a06a9d9bb22e15106ae2Ian Romanick	 stmt->body_instructions.push_tail(if_stmt);
31909e7d010ee0ed89f1fe07a06a9d9bb22e15106ae2Ian Romanick      }
31919e7d010ee0ed89f1fe07a06a9d9bb22e15106ae2Ian Romanick   }
31928c46ed24906ee10dd2f2cfaf4cf9803eca1ba523Ian Romanick}
31938c46ed24906ee10dd2f2cfaf4cf9803eca1ba523Ian Romanick
31948c46ed24906ee10dd2f2cfaf4cf9803eca1ba523Ian Romanick
31958c46ed24906ee10dd2f2cfaf4cf9803eca1ba523Ian Romanickir_rvalue *
31968c46ed24906ee10dd2f2cfaf4cf9803eca1ba523Ian Romanickast_iteration_statement::hir(exec_list *instructions,
31978c46ed24906ee10dd2f2cfaf4cf9803eca1ba523Ian Romanick			     struct _mesa_glsl_parse_state *state)
31988c46ed24906ee10dd2f2cfaf4cf9803eca1ba523Ian Romanick{
3199953ff1283d3d52e6a6b4850c2b0b574111625010Kenneth Graunke   void *ctx = state;
32001660a2954797e056caba319c5d6c70b0d4be22feCarl Worth
3201484606610e36ec7598f7733e9787d888b6a63d64Ian Romanick   /* For-loops and while-loops start a new scope, but do-while loops do not.
32028c46ed24906ee10dd2f2cfaf4cf9803eca1ba523Ian Romanick    */
3203484606610e36ec7598f7733e9787d888b6a63d64Ian Romanick   if (mode != ast_do_while)
32048c46ed24906ee10dd2f2cfaf4cf9803eca1ba523Ian Romanick      state->symbols->push_scope();
32058c46ed24906ee10dd2f2cfaf4cf9803eca1ba523Ian Romanick
32068c46ed24906ee10dd2f2cfaf4cf9803eca1ba523Ian Romanick   if (init_statement != NULL)
32078c46ed24906ee10dd2f2cfaf4cf9803eca1ba523Ian Romanick      init_statement->hir(instructions, state);
32088c46ed24906ee10dd2f2cfaf4cf9803eca1ba523Ian Romanick
32091660a2954797e056caba319c5d6c70b0d4be22feCarl Worth   ir_loop *const stmt = new(ctx) ir_loop();
32108c46ed24906ee10dd2f2cfaf4cf9803eca1ba523Ian Romanick   instructions->push_tail(stmt);
32118c46ed24906ee10dd2f2cfaf4cf9803eca1ba523Ian Romanick
32128c46ed24906ee10dd2f2cfaf4cf9803eca1ba523Ian Romanick   /* Track the current loop and / or switch-statement nesting.
32138c46ed24906ee10dd2f2cfaf4cf9803eca1ba523Ian Romanick    */
32148c46ed24906ee10dd2f2cfaf4cf9803eca1ba523Ian Romanick   ir_instruction *const nesting = state->loop_or_switch_nesting;
32152d1ed7b1b112cf13dd7eda7f500691f4c98a1cccEric Anholt   ast_iteration_statement *nesting_ast = state->loop_or_switch_nesting_ast;
32162d1ed7b1b112cf13dd7eda7f500691f4c98a1cccEric Anholt
32178c46ed24906ee10dd2f2cfaf4cf9803eca1ba523Ian Romanick   state->loop_or_switch_nesting = stmt;
32182d1ed7b1b112cf13dd7eda7f500691f4c98a1cccEric Anholt   state->loop_or_switch_nesting_ast = this;
32198c46ed24906ee10dd2f2cfaf4cf9803eca1ba523Ian Romanick
32208c46ed24906ee10dd2f2cfaf4cf9803eca1ba523Ian Romanick   if (mode != ast_do_while)
32218c46ed24906ee10dd2f2cfaf4cf9803eca1ba523Ian Romanick      condition_to_hir(stmt, state);
32229e7d010ee0ed89f1fe07a06a9d9bb22e15106ae2Ian Romanick
32234f9d72fa9e2a4ff1a2aca6de8ee4fa93639c75f1Ian Romanick   if (body != NULL)
32244f9d72fa9e2a4ff1a2aca6de8ee4fa93639c75f1Ian Romanick      body->hir(& stmt->body_instructions, state);
32259e7d010ee0ed89f1fe07a06a9d9bb22e15106ae2Ian Romanick
32269e7d010ee0ed89f1fe07a06a9d9bb22e15106ae2Ian Romanick   if (rest_expression != NULL)
32279e7d010ee0ed89f1fe07a06a9d9bb22e15106ae2Ian Romanick      rest_expression->hir(& stmt->body_instructions, state);
32289e7d010ee0ed89f1fe07a06a9d9bb22e15106ae2Ian Romanick
32298c46ed24906ee10dd2f2cfaf4cf9803eca1ba523Ian Romanick   if (mode == ast_do_while)
32308c46ed24906ee10dd2f2cfaf4cf9803eca1ba523Ian Romanick      condition_to_hir(stmt, state);
32318c46ed24906ee10dd2f2cfaf4cf9803eca1ba523Ian Romanick
3232484606610e36ec7598f7733e9787d888b6a63d64Ian Romanick   if (mode != ast_do_while)
32339e7d010ee0ed89f1fe07a06a9d9bb22e15106ae2Ian Romanick      state->symbols->pop_scope();
32349e7d010ee0ed89f1fe07a06a9d9bb22e15106ae2Ian Romanick
3235e9d0f265aabb39928d4d8a527684bf3b9eebc21cIan Romanick   /* Restore previous nesting before returning.
3236e9d0f265aabb39928d4d8a527684bf3b9eebc21cIan Romanick    */
3237e9d0f265aabb39928d4d8a527684bf3b9eebc21cIan Romanick   state->loop_or_switch_nesting = nesting;
32382d1ed7b1b112cf13dd7eda7f500691f4c98a1cccEric Anholt   state->loop_or_switch_nesting_ast = nesting_ast;
3239e9d0f265aabb39928d4d8a527684bf3b9eebc21cIan Romanick
32409e7d010ee0ed89f1fe07a06a9d9bb22e15106ae2Ian Romanick   /* Loops do not have r-values.
32419e7d010ee0ed89f1fe07a06a9d9bb22e15106ae2Ian Romanick    */
32429e7d010ee0ed89f1fe07a06a9d9bb22e15106ae2Ian Romanick   return NULL;
32439e7d010ee0ed89f1fe07a06a9d9bb22e15106ae2Ian Romanick}
32443455ce614424a5a23a23037e23d0454e476bceeaIan Romanick
32453455ce614424a5a23a23037e23d0454e476bceeaIan Romanick
32463455ce614424a5a23a23037e23d0454e476bceeaIan Romanickir_rvalue *
32473455ce614424a5a23a23037e23d0454e476bceeaIan Romanickast_type_specifier::hir(exec_list *instructions,
32483455ce614424a5a23a23037e23d0454e476bceeaIan Romanick			  struct _mesa_glsl_parse_state *state)
32493455ce614424a5a23a23037e23d0454e476bceeaIan Romanick{
325008a286c9cc8fecb081057e0f551c88a446c47b6fChad Versace   if (!this->is_precision_statement && this->structure == NULL)
325108a286c9cc8fecb081057e0f551c88a446c47b6fChad Versace      return NULL;
325208a286c9cc8fecb081057e0f551c88a446c47b6fChad Versace
325308a286c9cc8fecb081057e0f551c88a446c47b6fChad Versace   YYLTYPE loc = this->get_location();
325408a286c9cc8fecb081057e0f551c88a446c47b6fChad Versace
325508a286c9cc8fecb081057e0f551c88a446c47b6fChad Versace   if (this->precision != ast_precision_none
325608a286c9cc8fecb081057e0f551c88a446c47b6fChad Versace       && state->language_version != 100
325708a286c9cc8fecb081057e0f551c88a446c47b6fChad Versace       && state->language_version < 130) {
325808a286c9cc8fecb081057e0f551c88a446c47b6fChad Versace      _mesa_glsl_error(&loc, state,
325908a286c9cc8fecb081057e0f551c88a446c47b6fChad Versace                       "precision qualifiers exist only in "
326008a286c9cc8fecb081057e0f551c88a446c47b6fChad Versace                       "GLSL ES 1.00, and GLSL 1.30 and later");
326108a286c9cc8fecb081057e0f551c88a446c47b6fChad Versace      return NULL;
326208a286c9cc8fecb081057e0f551c88a446c47b6fChad Versace   }
326308a286c9cc8fecb081057e0f551c88a446c47b6fChad Versace   if (this->precision != ast_precision_none
326408a286c9cc8fecb081057e0f551c88a446c47b6fChad Versace       && this->structure != NULL) {
326508a286c9cc8fecb081057e0f551c88a446c47b6fChad Versace      _mesa_glsl_error(&loc, state,
326608a286c9cc8fecb081057e0f551c88a446c47b6fChad Versace                       "precision qualifiers do not apply to structures");
326708a286c9cc8fecb081057e0f551c88a446c47b6fChad Versace      return NULL;
326808a286c9cc8fecb081057e0f551c88a446c47b6fChad Versace   }
326908a286c9cc8fecb081057e0f551c88a446c47b6fChad Versace
327008a286c9cc8fecb081057e0f551c88a446c47b6fChad Versace   /* If this is a precision statement, check that the type to which it is
327108a286c9cc8fecb081057e0f551c88a446c47b6fChad Versace    * applied is either float or int.
327208a286c9cc8fecb081057e0f551c88a446c47b6fChad Versace    *
327308a286c9cc8fecb081057e0f551c88a446c47b6fChad Versace    * From section 4.5.3 of the GLSL 1.30 spec:
327408a286c9cc8fecb081057e0f551c88a446c47b6fChad Versace    *    "The precision statement
327508a286c9cc8fecb081057e0f551c88a446c47b6fChad Versace    *       precision precision-qualifier type;
327608a286c9cc8fecb081057e0f551c88a446c47b6fChad Versace    *    can be used to establish a default precision qualifier. The type
327708a286c9cc8fecb081057e0f551c88a446c47b6fChad Versace    *    field can be either int or float [...].  Any other types or
327808a286c9cc8fecb081057e0f551c88a446c47b6fChad Versace    *    qualifiers will result in an error.
327908a286c9cc8fecb081057e0f551c88a446c47b6fChad Versace    */
328008a286c9cc8fecb081057e0f551c88a446c47b6fChad Versace   if (this->is_precision_statement) {
328108a286c9cc8fecb081057e0f551c88a446c47b6fChad Versace      assert(this->precision != ast_precision_none);
328208a286c9cc8fecb081057e0f551c88a446c47b6fChad Versace      assert(this->structure == NULL); /* The check for structures was
328308a286c9cc8fecb081057e0f551c88a446c47b6fChad Versace                                        * performed above. */
328408a286c9cc8fecb081057e0f551c88a446c47b6fChad Versace      if (this->is_array) {
328508a286c9cc8fecb081057e0f551c88a446c47b6fChad Versace         _mesa_glsl_error(&loc, state,
328608a286c9cc8fecb081057e0f551c88a446c47b6fChad Versace                          "default precision statements do not apply to "
328708a286c9cc8fecb081057e0f551c88a446c47b6fChad Versace                          "arrays");
328808a286c9cc8fecb081057e0f551c88a446c47b6fChad Versace         return NULL;
328908a286c9cc8fecb081057e0f551c88a446c47b6fChad Versace      }
329008a286c9cc8fecb081057e0f551c88a446c47b6fChad Versace      if (this->type_specifier != ast_float
329108a286c9cc8fecb081057e0f551c88a446c47b6fChad Versace          && this->type_specifier != ast_int) {
329208a286c9cc8fecb081057e0f551c88a446c47b6fChad Versace         _mesa_glsl_error(&loc, state,
329308a286c9cc8fecb081057e0f551c88a446c47b6fChad Versace                          "default precision statements apply only to types "
329408a286c9cc8fecb081057e0f551c88a446c47b6fChad Versace                          "float and int");
329508a286c9cc8fecb081057e0f551c88a446c47b6fChad Versace         return NULL;
329608a286c9cc8fecb081057e0f551c88a446c47b6fChad Versace      }
329708a286c9cc8fecb081057e0f551c88a446c47b6fChad Versace
329808a286c9cc8fecb081057e0f551c88a446c47b6fChad Versace      /* FINISHME: Translate precision statements into IR. */
329908a286c9cc8fecb081057e0f551c88a446c47b6fChad Versace      return NULL;
330008a286c9cc8fecb081057e0f551c88a446c47b6fChad Versace   }
330108a286c9cc8fecb081057e0f551c88a446c47b6fChad Versace
33023455ce614424a5a23a23037e23d0454e476bceeaIan Romanick   if (this->structure != NULL)
33033455ce614424a5a23a23037e23d0454e476bceeaIan Romanick      return this->structure->hir(instructions, state);
330485ba37b97df8edd18b757bc475b12b66f4b117edIan Romanick
330585ba37b97df8edd18b757bc475b12b66f4b117edIan Romanick   return NULL;
33063455ce614424a5a23a23037e23d0454e476bceeaIan Romanick}
33073455ce614424a5a23a23037e23d0454e476bceeaIan Romanick
33083455ce614424a5a23a23037e23d0454e476bceeaIan Romanick
33093455ce614424a5a23a23037e23d0454e476bceeaIan Romanickir_rvalue *
33103455ce614424a5a23a23037e23d0454e476bceeaIan Romanickast_struct_specifier::hir(exec_list *instructions,
33113455ce614424a5a23a23037e23d0454e476bceeaIan Romanick			  struct _mesa_glsl_parse_state *state)
33123455ce614424a5a23a23037e23d0454e476bceeaIan Romanick{
33133455ce614424a5a23a23037e23d0454e476bceeaIan Romanick   unsigned decl_count = 0;
33143455ce614424a5a23a23037e23d0454e476bceeaIan Romanick
33153455ce614424a5a23a23037e23d0454e476bceeaIan Romanick   /* Make an initial pass over the list of structure fields to determine how
33163455ce614424a5a23a23037e23d0454e476bceeaIan Romanick    * many there are.  Each element in this list is an ast_declarator_list.
33173455ce614424a5a23a23037e23d0454e476bceeaIan Romanick    * This means that we actually need to count the number of elements in the
33183455ce614424a5a23a23037e23d0454e476bceeaIan Romanick    * 'declarations' list in each of the elements.
33193455ce614424a5a23a23037e23d0454e476bceeaIan Romanick    */
33202b97dc657a0e762bc67216405419cd348eb948c0Ian Romanick   foreach_list_typed (ast_declarator_list, decl_list, link,
33212b97dc657a0e762bc67216405419cd348eb948c0Ian Romanick		       &this->declarations) {
3322304ea90233baeac6801a98e981658cb7a2d2501cIan Romanick      foreach_list_const (decl_ptr, & decl_list->declarations) {
33233455ce614424a5a23a23037e23d0454e476bceeaIan Romanick	 decl_count++;
33243455ce614424a5a23a23037e23d0454e476bceeaIan Romanick      }
33253455ce614424a5a23a23037e23d0454e476bceeaIan Romanick   }
33263455ce614424a5a23a23037e23d0454e476bceeaIan Romanick
33273455ce614424a5a23a23037e23d0454e476bceeaIan Romanick   /* Allocate storage for the structure fields and process the field
33283455ce614424a5a23a23037e23d0454e476bceeaIan Romanick    * declarations.  As the declarations are processed, try to also convert
33293455ce614424a5a23a23037e23d0454e476bceeaIan Romanick    * the types to HIR.  This ensures that structure definitions embedded in
33303455ce614424a5a23a23037e23d0454e476bceeaIan Romanick    * other structure definitions are processed.
33313455ce614424a5a23a23037e23d0454e476bceeaIan Romanick    */
333221b0dbd79937e9d6787f045af7d60d4b6c649ec8Eric Anholt   glsl_struct_field *const fields = talloc_array(state, glsl_struct_field,
333321b0dbd79937e9d6787f045af7d60d4b6c649ec8Eric Anholt						  decl_count);
33343455ce614424a5a23a23037e23d0454e476bceeaIan Romanick
33353455ce614424a5a23a23037e23d0454e476bceeaIan Romanick   unsigned i = 0;
33362b97dc657a0e762bc67216405419cd348eb948c0Ian Romanick   foreach_list_typed (ast_declarator_list, decl_list, link,
33372b97dc657a0e762bc67216405419cd348eb948c0Ian Romanick		       &this->declarations) {
33383455ce614424a5a23a23037e23d0454e476bceeaIan Romanick      const char *type_name;
33393455ce614424a5a23a23037e23d0454e476bceeaIan Romanick
33403455ce614424a5a23a23037e23d0454e476bceeaIan Romanick      decl_list->type->specifier->hir(instructions, state);
33413455ce614424a5a23a23037e23d0454e476bceeaIan Romanick
3342c98deb18d5836f75cf62562f9304e4d90e0ea920Kenneth Graunke      /* Section 10.9 of the GLSL ES 1.00 specification states that
3343c98deb18d5836f75cf62562f9304e4d90e0ea920Kenneth Graunke       * embedded structure definitions have been removed from the language.
3344c98deb18d5836f75cf62562f9304e4d90e0ea920Kenneth Graunke       */
3345c98deb18d5836f75cf62562f9304e4d90e0ea920Kenneth Graunke      if (state->es_shader && decl_list->type->specifier->structure != NULL) {
3346c98deb18d5836f75cf62562f9304e4d90e0ea920Kenneth Graunke	 YYLTYPE loc = this->get_location();
3347c98deb18d5836f75cf62562f9304e4d90e0ea920Kenneth Graunke	 _mesa_glsl_error(&loc, state, "Embedded structure definitions are "
3348c98deb18d5836f75cf62562f9304e4d90e0ea920Kenneth Graunke			  "not allowed in GLSL ES 1.00.");
3349c98deb18d5836f75cf62562f9304e4d90e0ea920Kenneth Graunke      }
3350c98deb18d5836f75cf62562f9304e4d90e0ea920Kenneth Graunke
33513455ce614424a5a23a23037e23d0454e476bceeaIan Romanick      const glsl_type *decl_type =
33523455ce614424a5a23a23037e23d0454e476bceeaIan Romanick	 decl_list->type->specifier->glsl_type(& type_name, state);
33533455ce614424a5a23a23037e23d0454e476bceeaIan Romanick
33542b97dc657a0e762bc67216405419cd348eb948c0Ian Romanick      foreach_list_typed (ast_declaration, decl, link,
33552b97dc657a0e762bc67216405419cd348eb948c0Ian Romanick			  &decl_list->declarations) {
3356d8e34e29eb58c38ef60226156aab8f4a93b397b7Kenneth Graunke	 const struct glsl_type *field_type = decl_type;
3357d8e34e29eb58c38ef60226156aab8f4a93b397b7Kenneth Graunke	 if (decl->is_array) {
3358d8e34e29eb58c38ef60226156aab8f4a93b397b7Kenneth Graunke	    YYLTYPE loc = decl->get_location();
3359d8e34e29eb58c38ef60226156aab8f4a93b397b7Kenneth Graunke	    field_type = process_array_type(&loc, decl_type, decl->array_size,
3360d8e34e29eb58c38ef60226156aab8f4a93b397b7Kenneth Graunke					    state);
3361d8e34e29eb58c38ef60226156aab8f4a93b397b7Kenneth Graunke	 }
336273986a7a262807ab2cfd6d46ae17cfc7a30cdfecIan Romanick	 fields[i].type = (field_type != NULL)
336373986a7a262807ab2cfd6d46ae17cfc7a30cdfecIan Romanick	    ? field_type : glsl_type::error_type;
33643455ce614424a5a23a23037e23d0454e476bceeaIan Romanick	 fields[i].name = decl->identifier;
33653455ce614424a5a23a23037e23d0454e476bceeaIan Romanick	 i++;
33663455ce614424a5a23a23037e23d0454e476bceeaIan Romanick      }
33673455ce614424a5a23a23037e23d0454e476bceeaIan Romanick   }
33683455ce614424a5a23a23037e23d0454e476bceeaIan Romanick
33693455ce614424a5a23a23037e23d0454e476bceeaIan Romanick   assert(i == decl_count);
33703455ce614424a5a23a23037e23d0454e476bceeaIan Romanick
337149e3577b91f44013746f7a3db411e7041b7d899eIan Romanick   const glsl_type *t =
3372ca92ae2699c4aad21c0811b9a5562b9223816cafKenneth Graunke      glsl_type::get_record_instance(fields, decl_count, this->name);
33731d28b617ba66cfcb1641c9f516146d51aa82b118Ian Romanick
3374ab89927a91a0ea6ffdb56e5e75044472f7277f4aIan Romanick   YYLTYPE loc = this->get_location();
3375a789ca649cb143c0c5bf3209ff1bde398fbd777eIan Romanick   if (!state->symbols->add_type(name, t)) {
3376ab89927a91a0ea6ffdb56e5e75044472f7277f4aIan Romanick      _mesa_glsl_error(& loc, state, "struct `%s' previously defined", name);
3377ab89927a91a0ea6ffdb56e5e75044472f7277f4aIan Romanick   } else {
3378a2c6df556655e3619f5a0cd82b0d11aac37c5692Ian Romanick
3379a2c6df556655e3619f5a0cd82b0d11aac37c5692Ian Romanick      const glsl_type **s = (const glsl_type **)
3380a2c6df556655e3619f5a0cd82b0d11aac37c5692Ian Romanick	 realloc(state->user_structures,
3381a2c6df556655e3619f5a0cd82b0d11aac37c5692Ian Romanick		 sizeof(state->user_structures[0]) *
3382a2c6df556655e3619f5a0cd82b0d11aac37c5692Ian Romanick		 (state->num_user_structures + 1));
3383a2c6df556655e3619f5a0cd82b0d11aac37c5692Ian Romanick      if (s != NULL) {
3384a2c6df556655e3619f5a0cd82b0d11aac37c5692Ian Romanick	 s[state->num_user_structures] = t;
3385a2c6df556655e3619f5a0cd82b0d11aac37c5692Ian Romanick	 state->user_structures = s;
3386a2c6df556655e3619f5a0cd82b0d11aac37c5692Ian Romanick	 state->num_user_structures++;
3387a2c6df556655e3619f5a0cd82b0d11aac37c5692Ian Romanick      }
3388ab89927a91a0ea6ffdb56e5e75044472f7277f4aIan Romanick   }
33893455ce614424a5a23a23037e23d0454e476bceeaIan Romanick
33903455ce614424a5a23a23037e23d0454e476bceeaIan Romanick   /* Structure type definitions do not have r-values.
33913455ce614424a5a23a23037e23d0454e476bceeaIan Romanick    */
33923455ce614424a5a23a23037e23d0454e476bceeaIan Romanick   return NULL;
33933455ce614424a5a23a23037e23d0454e476bceeaIan Romanick}
3394