1 /*
2  * Copyright © 2010 Intel Corporation
3  *
4  * Permission is hereby granted, free of charge, to any person obtaining a
5  * copy of this software and associated documentation files (the "Software"),
6  * to deal in the Software without restriction, including without limitation
7  * the rights to use, copy, modify, merge, publish, distribute, sublicense,
8  * and/or sell copies of the Software, and to permit persons to whom the
9  * Software is furnished to do so, subject to the following conditions:
10  *
11  * The above copyright notice and this permission notice (including the next
12  * paragraph) shall be included in all copies or substantial portions of the
13  * Software.
14  *
15  * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16  * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17  * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL
18  * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19  * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
20  * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
21  * DEALINGS IN THE SOFTWARE.
22  */
23 
24 /**
25  * \file ast_to_hir.c
26  * Convert abstract syntax to to high-level intermediate reprensentation (HIR).
27  *
28  * During the conversion to HIR, the majority of the symantic checking is
29  * preformed on the program.  This includes:
30  *
31  *    * Symbol table management
32  *    * Type checking
33  *    * Function binding
34  *
35  * The majority of this work could be done during parsing, and the parser could
36  * probably generate HIR directly.  However, this results in frequent changes
37  * to the parser code.  Since we do not assume that every system this complier
38  * is built on will have Flex and Bison installed, we have to store the code
39  * generated by these tools in our version control system.  In other parts of
40  * the system we've seen problems where a parser was changed but the generated
41  * code was not committed, merge conflicts where created because two developers
42  * had slightly different versions of Bison installed, etc.
43  *
44  * I have also noticed that running Bison generated parsers in GDB is very
45  * irritating.  When you get a segfault on '$$ = $1->foo', you can't very
46  * well 'print $1' in GDB.
47  *
48  * As a result, my preference is to put as little C code as possible in the
49  * parser (and lexer) sources.
50  */
51 
52 #include "main/core.h" /* for struct gl_extensions */
53 #include "glsl_symbol_table.h"
54 #include "glsl_parser_extras.h"
55 #include "ast.h"
56 #include "glsl_types.h"
57 #include "program/hash_table.h"
58 #include "ir.h"
59 
60 static void
61 detect_conflicting_assignments(struct _mesa_glsl_parse_state *state,
62 			       exec_list *instructions);
63 
64 void
_mesa_ast_to_hir(exec_list * instructions,struct _mesa_glsl_parse_state * state)65 _mesa_ast_to_hir(exec_list *instructions, struct _mesa_glsl_parse_state *state)
66 {
67    _mesa_glsl_initialize_variables(instructions, state);
68 
69    state->symbols->language_version = state->language_version;
70 
71    state->current_function = NULL;
72 
73    state->toplevel_ir = instructions;
74 
75    /* Section 4.2 of the GLSL 1.20 specification states:
76     * "The built-in functions are scoped in a scope outside the global scope
77     *  users declare global variables in.  That is, a shader's global scope,
78     *  available for user-defined functions and global variables, is nested
79     *  inside the scope containing the built-in functions."
80     *
81     * Since built-in functions like ftransform() access built-in variables,
82     * it follows that those must be in the outer scope as well.
83     *
84     * We push scope here to create this nesting effect...but don't pop.
85     * This way, a shader's globals are still in the symbol table for use
86     * by the linker.
87     */
88    state->symbols->push_scope();
89 
90    foreach_list_typed (ast_node, ast, link, & state->translation_unit)
91       ast->hir(instructions, state);
92 
93    detect_recursion_unlinked(state, instructions);
94    detect_conflicting_assignments(state, instructions);
95 
96    state->toplevel_ir = NULL;
97 }
98 
99 
100 /**
101  * If a conversion is available, convert one operand to a different type
102  *
103  * The \c from \c ir_rvalue is converted "in place".
104  *
105  * \param to     Type that the operand it to be converted to
106  * \param from   Operand that is being converted
107  * \param state  GLSL compiler state
108  *
109  * \return
110  * If a conversion is possible (or unnecessary), \c true is returned.
111  * Otherwise \c false is returned.
112  */
113 bool
apply_implicit_conversion(const glsl_type * to,ir_rvalue * & from,struct _mesa_glsl_parse_state * state)114 apply_implicit_conversion(const glsl_type *to, ir_rvalue * &from,
115 			  struct _mesa_glsl_parse_state *state)
116 {
117    void *ctx = state;
118    if (to->base_type == from->type->base_type)
119       return true;
120 
121    /* This conversion was added in GLSL 1.20.  If the compilation mode is
122     * GLSL 1.10, the conversion is skipped.
123     */
124    if (state->language_version < 120)
125       return false;
126 
127    /* From page 27 (page 33 of the PDF) of the GLSL 1.50 spec:
128     *
129     *    "There are no implicit array or structure conversions. For
130     *    example, an array of int cannot be implicitly converted to an
131     *    array of float. There are no implicit conversions between
132     *    signed and unsigned integers."
133     */
134    /* FINISHME: The above comment is partially a lie.  There is int/uint
135     * FINISHME: conversion for immediate constants.
136     */
137    if (!to->is_float() || !from->type->is_numeric())
138       return false;
139 
140    /* Convert to a floating point type with the same number of components
141     * as the original type - i.e. int to float, not int to vec4.
142     */
143    to = glsl_type::get_instance(GLSL_TYPE_FLOAT, from->type->vector_elements,
144 			        from->type->matrix_columns);
145 
146    switch (from->type->base_type) {
147    case GLSL_TYPE_INT:
148       from = new(ctx) ir_expression(ir_unop_i2f, to, from, NULL);
149       break;
150    case GLSL_TYPE_UINT:
151       from = new(ctx) ir_expression(ir_unop_u2f, to, from, NULL);
152       break;
153    case GLSL_TYPE_BOOL:
154       from = new(ctx) ir_expression(ir_unop_b2f, to, from, NULL);
155       break;
156    default:
157       assert(0);
158    }
159 
160    return true;
161 }
162 
163 
164 static const struct glsl_type *
arithmetic_result_type(ir_rvalue * & value_a,ir_rvalue * & value_b,bool multiply,struct _mesa_glsl_parse_state * state,YYLTYPE * loc)165 arithmetic_result_type(ir_rvalue * &value_a, ir_rvalue * &value_b,
166 		       bool multiply,
167 		       struct _mesa_glsl_parse_state *state, YYLTYPE *loc)
168 {
169    const glsl_type *type_a = value_a->type;
170    const glsl_type *type_b = value_b->type;
171 
172    /* From GLSL 1.50 spec, page 56:
173     *
174     *    "The arithmetic binary operators add (+), subtract (-),
175     *    multiply (*), and divide (/) operate on integer and
176     *    floating-point scalars, vectors, and matrices."
177     */
178    if (!type_a->is_numeric() || !type_b->is_numeric()) {
179       _mesa_glsl_error(loc, state,
180 		       "Operands to arithmetic operators must be numeric");
181       return glsl_type::error_type;
182    }
183 
184 
185    /*    "If one operand is floating-point based and the other is
186     *    not, then the conversions from Section 4.1.10 "Implicit
187     *    Conversions" are applied to the non-floating-point-based operand."
188     */
189    if (!apply_implicit_conversion(type_a, value_b, state)
190        && !apply_implicit_conversion(type_b, value_a, state)) {
191       _mesa_glsl_error(loc, state,
192 		       "Could not implicitly convert operands to "
193 		       "arithmetic operator");
194       return glsl_type::error_type;
195    }
196    type_a = value_a->type;
197    type_b = value_b->type;
198 
199    /*    "If the operands are integer types, they must both be signed or
200     *    both be unsigned."
201     *
202     * From this rule and the preceeding conversion it can be inferred that
203     * both types must be GLSL_TYPE_FLOAT, or GLSL_TYPE_UINT, or GLSL_TYPE_INT.
204     * The is_numeric check above already filtered out the case where either
205     * type is not one of these, so now the base types need only be tested for
206     * equality.
207     */
208    if (type_a->base_type != type_b->base_type) {
209       _mesa_glsl_error(loc, state,
210 		       "base type mismatch for arithmetic operator");
211       return glsl_type::error_type;
212    }
213 
214    /*    "All arithmetic binary operators result in the same fundamental type
215     *    (signed integer, unsigned integer, or floating-point) as the
216     *    operands they operate on, after operand type conversion. After
217     *    conversion, the following cases are valid
218     *
219     *    * The two operands are scalars. In this case the operation is
220     *      applied, resulting in a scalar."
221     */
222    if (type_a->is_scalar() && type_b->is_scalar())
223       return type_a;
224 
225    /*   "* One operand is a scalar, and the other is a vector or matrix.
226     *      In this case, the scalar operation is applied independently to each
227     *      component of the vector or matrix, resulting in the same size
228     *      vector or matrix."
229     */
230    if (type_a->is_scalar()) {
231       if (!type_b->is_scalar())
232 	 return type_b;
233    } else if (type_b->is_scalar()) {
234       return type_a;
235    }
236 
237    /* All of the combinations of <scalar, scalar>, <vector, scalar>,
238     * <scalar, vector>, <scalar, matrix>, and <matrix, scalar> have been
239     * handled.
240     */
241    assert(!type_a->is_scalar());
242    assert(!type_b->is_scalar());
243 
244    /*   "* The two operands are vectors of the same size. In this case, the
245     *      operation is done component-wise resulting in the same size
246     *      vector."
247     */
248    if (type_a->is_vector() && type_b->is_vector()) {
249       if (type_a == type_b) {
250 	 return type_a;
251       } else {
252 	 _mesa_glsl_error(loc, state,
253 			  "vector size mismatch for arithmetic operator");
254 	 return glsl_type::error_type;
255       }
256    }
257 
258    /* All of the combinations of <scalar, scalar>, <vector, scalar>,
259     * <scalar, vector>, <scalar, matrix>, <matrix, scalar>, and
260     * <vector, vector> have been handled.  At least one of the operands must
261     * be matrix.  Further, since there are no integer matrix types, the base
262     * type of both operands must be float.
263     */
264    assert(type_a->is_matrix() || type_b->is_matrix());
265    assert(type_a->base_type == GLSL_TYPE_FLOAT);
266    assert(type_b->base_type == GLSL_TYPE_FLOAT);
267 
268    /*   "* The operator is add (+), subtract (-), or divide (/), and the
269     *      operands are matrices with the same number of rows and the same
270     *      number of columns. In this case, the operation is done component-
271     *      wise resulting in the same size matrix."
272     *    * The operator is multiply (*), where both operands are matrices or
273     *      one operand is a vector and the other a matrix. A right vector
274     *      operand is treated as a column vector and a left vector operand as a
275     *      row vector. In all these cases, it is required that the number of
276     *      columns of the left operand is equal to the number of rows of the
277     *      right operand. Then, the multiply (*) operation does a linear
278     *      algebraic multiply, yielding an object that has the same number of
279     *      rows as the left operand and the same number of columns as the right
280     *      operand. Section 5.10 "Vector and Matrix Operations" explains in
281     *      more detail how vectors and matrices are operated on."
282     */
283    if (! multiply) {
284       if (type_a == type_b)
285 	 return type_a;
286    } else {
287       if (type_a->is_matrix() && type_b->is_matrix()) {
288 	 /* Matrix multiply.  The columns of A must match the rows of B.  Given
289 	  * the other previously tested constraints, this means the vector type
290 	  * of a row from A must be the same as the vector type of a column from
291 	  * B.
292 	  */
293 	 if (type_a->row_type() == type_b->column_type()) {
294 	    /* The resulting matrix has the number of columns of matrix B and
295 	     * the number of rows of matrix A.  We get the row count of A by
296 	     * looking at the size of a vector that makes up a column.  The
297 	     * transpose (size of a row) is done for B.
298 	     */
299 	    const glsl_type *const type =
300 	       glsl_type::get_instance(type_a->base_type,
301 				       type_a->column_type()->vector_elements,
302 				       type_b->row_type()->vector_elements);
303 	    assert(type != glsl_type::error_type);
304 
305 	    return type;
306 	 }
307       } else if (type_a->is_matrix()) {
308 	 /* A is a matrix and B is a column vector.  Columns of A must match
309 	  * rows of B.  Given the other previously tested constraints, this
310 	  * means the vector type of a row from A must be the same as the
311 	  * vector the type of B.
312 	  */
313 	 if (type_a->row_type() == type_b) {
314 	    /* The resulting vector has a number of elements equal to
315 	     * the number of rows of matrix A. */
316 	    const glsl_type *const type =
317 	       glsl_type::get_instance(type_a->base_type,
318 				       type_a->column_type()->vector_elements,
319 				       1);
320 	    assert(type != glsl_type::error_type);
321 
322 	    return type;
323 	 }
324       } else {
325 	 assert(type_b->is_matrix());
326 
327 	 /* A is a row vector and B is a matrix.  Columns of A must match rows
328 	  * of B.  Given the other previously tested constraints, this means
329 	  * the type of A must be the same as the vector type of a column from
330 	  * B.
331 	  */
332 	 if (type_a == type_b->column_type()) {
333 	    /* The resulting vector has a number of elements equal to
334 	     * the number of columns of matrix B. */
335 	    const glsl_type *const type =
336 	       glsl_type::get_instance(type_a->base_type,
337 				       type_b->row_type()->vector_elements,
338 				       1);
339 	    assert(type != glsl_type::error_type);
340 
341 	    return type;
342 	 }
343       }
344 
345       _mesa_glsl_error(loc, state, "size mismatch for matrix multiplication");
346       return glsl_type::error_type;
347    }
348 
349 
350    /*    "All other cases are illegal."
351     */
352    _mesa_glsl_error(loc, state, "type mismatch");
353    return glsl_type::error_type;
354 }
355 
356 
357 static const struct glsl_type *
unary_arithmetic_result_type(const struct glsl_type * type,struct _mesa_glsl_parse_state * state,YYLTYPE * loc)358 unary_arithmetic_result_type(const struct glsl_type *type,
359 			     struct _mesa_glsl_parse_state *state, YYLTYPE *loc)
360 {
361    /* From GLSL 1.50 spec, page 57:
362     *
363     *    "The arithmetic unary operators negate (-), post- and pre-increment
364     *     and decrement (-- and ++) operate on integer or floating-point
365     *     values (including vectors and matrices). All unary operators work
366     *     component-wise on their operands. These result with the same type
367     *     they operated on."
368     */
369    if (!type->is_numeric()) {
370       _mesa_glsl_error(loc, state,
371 		       "Operands to arithmetic operators must be numeric");
372       return glsl_type::error_type;
373    }
374 
375    return type;
376 }
377 
378 /**
379  * \brief Return the result type of a bit-logic operation.
380  *
381  * If the given types to the bit-logic operator are invalid, return
382  * glsl_type::error_type.
383  *
384  * \param type_a Type of LHS of bit-logic op
385  * \param type_b Type of RHS of bit-logic op
386  */
387 static const struct glsl_type *
bit_logic_result_type(const struct glsl_type * type_a,const struct glsl_type * type_b,ast_operators op,struct _mesa_glsl_parse_state * state,YYLTYPE * loc)388 bit_logic_result_type(const struct glsl_type *type_a,
389                       const struct glsl_type *type_b,
390                       ast_operators op,
391                       struct _mesa_glsl_parse_state *state, YYLTYPE *loc)
392 {
393     if (state->language_version < 130) {
394        _mesa_glsl_error(loc, state, "bit operations require GLSL 1.30");
395        return glsl_type::error_type;
396     }
397 
398     /* From page 50 (page 56 of PDF) of GLSL 1.30 spec:
399      *
400      *     "The bitwise operators and (&), exclusive-or (^), and inclusive-or
401      *     (|). The operands must be of type signed or unsigned integers or
402      *     integer vectors."
403      */
404     if (!type_a->is_integer()) {
405        _mesa_glsl_error(loc, state, "LHS of `%s' must be an integer",
406                          ast_expression::operator_string(op));
407        return glsl_type::error_type;
408     }
409     if (!type_b->is_integer()) {
410        _mesa_glsl_error(loc, state, "RHS of `%s' must be an integer",
411                         ast_expression::operator_string(op));
412        return glsl_type::error_type;
413     }
414 
415     /*     "The fundamental types of the operands (signed or unsigned) must
416      *     match,"
417      */
418     if (type_a->base_type != type_b->base_type) {
419        _mesa_glsl_error(loc, state, "operands of `%s' must have the same "
420                         "base type", ast_expression::operator_string(op));
421        return glsl_type::error_type;
422     }
423 
424     /*     "The operands cannot be vectors of differing size." */
425     if (type_a->is_vector() &&
426         type_b->is_vector() &&
427         type_a->vector_elements != type_b->vector_elements) {
428        _mesa_glsl_error(loc, state, "operands of `%s' cannot be vectors of "
429                         "different sizes", ast_expression::operator_string(op));
430        return glsl_type::error_type;
431     }
432 
433     /*     "If one operand is a scalar and the other a vector, the scalar is
434      *     applied component-wise to the vector, resulting in the same type as
435      *     the vector. The fundamental types of the operands [...] will be the
436      *     resulting fundamental type."
437      */
438     if (type_a->is_scalar())
439         return type_b;
440     else
441         return type_a;
442 }
443 
444 static const struct glsl_type *
modulus_result_type(const struct glsl_type * type_a,const struct glsl_type * type_b,struct _mesa_glsl_parse_state * state,YYLTYPE * loc)445 modulus_result_type(const struct glsl_type *type_a,
446 		    const struct glsl_type *type_b,
447 		    struct _mesa_glsl_parse_state *state, YYLTYPE *loc)
448 {
449    if (state->language_version < 130) {
450       _mesa_glsl_error(loc, state,
451                        "operator '%%' is reserved in %s",
452                        state->version_string);
453       return glsl_type::error_type;
454    }
455 
456    /* From GLSL 1.50 spec, page 56:
457     *    "The operator modulus (%) operates on signed or unsigned integers or
458     *    integer vectors. The operand types must both be signed or both be
459     *    unsigned."
460     */
461    if (!type_a->is_integer()) {
462       _mesa_glsl_error(loc, state, "LHS of operator %% must be an integer.");
463       return glsl_type::error_type;
464    }
465    if (!type_b->is_integer()) {
466       _mesa_glsl_error(loc, state, "RHS of operator %% must be an integer.");
467       return glsl_type::error_type;
468    }
469    if (type_a->base_type != type_b->base_type) {
470       _mesa_glsl_error(loc, state,
471 		       "operands of %% must have the same base type");
472       return glsl_type::error_type;
473    }
474 
475    /*    "The operands cannot be vectors of differing size. If one operand is
476     *    a scalar and the other vector, then the scalar is applied component-
477     *    wise to the vector, resulting in the same type as the vector. If both
478     *    are vectors of the same size, the result is computed component-wise."
479     */
480    if (type_a->is_vector()) {
481       if (!type_b->is_vector()
482 	  || (type_a->vector_elements == type_b->vector_elements))
483 	 return type_a;
484    } else
485       return type_b;
486 
487    /*    "The operator modulus (%) is not defined for any other data types
488     *    (non-integer types)."
489     */
490    _mesa_glsl_error(loc, state, "type mismatch");
491    return glsl_type::error_type;
492 }
493 
494 
495 static const struct glsl_type *
relational_result_type(ir_rvalue * & value_a,ir_rvalue * & value_b,struct _mesa_glsl_parse_state * state,YYLTYPE * loc)496 relational_result_type(ir_rvalue * &value_a, ir_rvalue * &value_b,
497 		       struct _mesa_glsl_parse_state *state, YYLTYPE *loc)
498 {
499    const glsl_type *type_a = value_a->type;
500    const glsl_type *type_b = value_b->type;
501 
502    /* From GLSL 1.50 spec, page 56:
503     *    "The relational operators greater than (>), less than (<), greater
504     *    than or equal (>=), and less than or equal (<=) operate only on
505     *    scalar integer and scalar floating-point expressions."
506     */
507    if (!type_a->is_numeric()
508        || !type_b->is_numeric()
509        || !type_a->is_scalar()
510        || !type_b->is_scalar()) {
511       _mesa_glsl_error(loc, state,
512 		       "Operands to relational operators must be scalar and "
513 		       "numeric");
514       return glsl_type::error_type;
515    }
516 
517    /*    "Either the operands' types must match, or the conversions from
518     *    Section 4.1.10 "Implicit Conversions" will be applied to the integer
519     *    operand, after which the types must match."
520     */
521    if (!apply_implicit_conversion(type_a, value_b, state)
522        && !apply_implicit_conversion(type_b, value_a, state)) {
523       _mesa_glsl_error(loc, state,
524 		       "Could not implicitly convert operands to "
525 		       "relational operator");
526       return glsl_type::error_type;
527    }
528    type_a = value_a->type;
529    type_b = value_b->type;
530 
531    if (type_a->base_type != type_b->base_type) {
532       _mesa_glsl_error(loc, state, "base type mismatch");
533       return glsl_type::error_type;
534    }
535 
536    /*    "The result is scalar Boolean."
537     */
538    return glsl_type::bool_type;
539 }
540 
541 /**
542  * \brief Return the result type of a bit-shift operation.
543  *
544  * If the given types to the bit-shift operator are invalid, return
545  * glsl_type::error_type.
546  *
547  * \param type_a Type of LHS of bit-shift op
548  * \param type_b Type of RHS of bit-shift op
549  */
550 static const struct glsl_type *
shift_result_type(const struct glsl_type * type_a,const struct glsl_type * type_b,ast_operators op,struct _mesa_glsl_parse_state * state,YYLTYPE * loc)551 shift_result_type(const struct glsl_type *type_a,
552                   const struct glsl_type *type_b,
553                   ast_operators op,
554                   struct _mesa_glsl_parse_state *state, YYLTYPE *loc)
555 {
556    if (state->language_version < 130) {
557       _mesa_glsl_error(loc, state, "bit operations require GLSL 1.30");
558       return glsl_type::error_type;
559    }
560 
561    /* From page 50 (page 56 of the PDF) of the GLSL 1.30 spec:
562     *
563     *     "The shift operators (<<) and (>>). For both operators, the operands
564     *     must be signed or unsigned integers or integer vectors. One operand
565     *     can be signed while the other is unsigned."
566     */
567    if (!type_a->is_integer()) {
568       _mesa_glsl_error(loc, state, "LHS of operator %s must be an integer or "
569               "integer vector", ast_expression::operator_string(op));
570      return glsl_type::error_type;
571 
572    }
573    if (!type_b->is_integer()) {
574       _mesa_glsl_error(loc, state, "RHS of operator %s must be an integer or "
575               "integer vector", ast_expression::operator_string(op));
576      return glsl_type::error_type;
577    }
578 
579    /*     "If the first operand is a scalar, the second operand has to be
580     *     a scalar as well."
581     */
582    if (type_a->is_scalar() && !type_b->is_scalar()) {
583       _mesa_glsl_error(loc, state, "If the first operand of %s is scalar, the "
584               "second must be scalar as well",
585               ast_expression::operator_string(op));
586      return glsl_type::error_type;
587    }
588 
589    /* If both operands are vectors, check that they have same number of
590     * elements.
591     */
592    if (type_a->is_vector() &&
593       type_b->is_vector() &&
594       type_a->vector_elements != type_b->vector_elements) {
595       _mesa_glsl_error(loc, state, "Vector operands to operator %s must "
596               "have same number of elements",
597               ast_expression::operator_string(op));
598      return glsl_type::error_type;
599    }
600 
601    /*     "In all cases, the resulting type will be the same type as the left
602     *     operand."
603     */
604    return type_a;
605 }
606 
607 /**
608  * Validates that a value can be assigned to a location with a specified type
609  *
610  * Validates that \c rhs can be assigned to some location.  If the types are
611  * not an exact match but an automatic conversion is possible, \c rhs will be
612  * converted.
613  *
614  * \return
615  * \c NULL if \c rhs cannot be assigned to a location with type \c lhs_type.
616  * Otherwise the actual RHS to be assigned will be returned.  This may be
617  * \c rhs, or it may be \c rhs after some type conversion.
618  *
619  * \note
620  * In addition to being used for assignments, this function is used to
621  * type-check return values.
622  */
623 ir_rvalue *
validate_assignment(struct _mesa_glsl_parse_state * state,const glsl_type * lhs_type,ir_rvalue * rhs,bool is_initializer)624 validate_assignment(struct _mesa_glsl_parse_state *state,
625 		    const glsl_type *lhs_type, ir_rvalue *rhs,
626 		    bool is_initializer)
627 {
628    /* If there is already some error in the RHS, just return it.  Anything
629     * else will lead to an avalanche of error message back to the user.
630     */
631    if (rhs->type->is_error())
632       return rhs;
633 
634    /* If the types are identical, the assignment can trivially proceed.
635     */
636    if (rhs->type == lhs_type)
637       return rhs;
638 
639    /* If the array element types are the same and the size of the LHS is zero,
640     * the assignment is okay for initializers embedded in variable
641     * declarations.
642     *
643     * Note: Whole-array assignments are not permitted in GLSL 1.10, but this
644     * is handled by ir_dereference::is_lvalue.
645     */
646    if (is_initializer && lhs_type->is_array() && rhs->type->is_array()
647        && (lhs_type->element_type() == rhs->type->element_type())
648        && (lhs_type->array_size() == 0)) {
649       return rhs;
650    }
651 
652    /* Check for implicit conversion in GLSL 1.20 */
653    if (apply_implicit_conversion(lhs_type, rhs, state)) {
654       if (rhs->type == lhs_type)
655 	 return rhs;
656    }
657 
658    return NULL;
659 }
660 
661 static void
mark_whole_array_access(ir_rvalue * access)662 mark_whole_array_access(ir_rvalue *access)
663 {
664    ir_dereference_variable *deref = access->as_dereference_variable();
665 
666    if (deref && deref->var) {
667       deref->var->max_array_access = deref->type->length - 1;
668    }
669 }
670 
671 ir_rvalue *
do_assignment(exec_list * instructions,struct _mesa_glsl_parse_state * state,const char * non_lvalue_description,ir_rvalue * lhs,ir_rvalue * rhs,bool is_initializer,YYLTYPE lhs_loc)672 do_assignment(exec_list *instructions, struct _mesa_glsl_parse_state *state,
673 	      const char *non_lvalue_description,
674 	      ir_rvalue *lhs, ir_rvalue *rhs, bool is_initializer,
675 	      YYLTYPE lhs_loc)
676 {
677    void *ctx = state;
678    bool error_emitted = (lhs->type->is_error() || rhs->type->is_error());
679 
680    ir_variable *lhs_var = lhs->variable_referenced();
681    if (lhs_var)
682       lhs_var->assigned = true;
683 
684    if (!error_emitted) {
685       if (non_lvalue_description != NULL) {
686          _mesa_glsl_error(&lhs_loc, state,
687                           "assignment to %s",
688 			  non_lvalue_description);
689 	 error_emitted = true;
690       } else if (lhs->variable_referenced() != NULL
691 		 && lhs->variable_referenced()->read_only) {
692          _mesa_glsl_error(&lhs_loc, state,
693                           "assignment to read-only variable '%s'",
694                           lhs->variable_referenced()->name);
695          error_emitted = true;
696 
697       } else if (state->language_version <= 110 && lhs->type->is_array()) {
698 	 /* From page 32 (page 38 of the PDF) of the GLSL 1.10 spec:
699 	  *
700 	  *    "Other binary or unary expressions, non-dereferenced
701 	  *     arrays, function names, swizzles with repeated fields,
702 	  *     and constants cannot be l-values."
703 	  */
704 	 _mesa_glsl_error(&lhs_loc, state, "whole array assignment is not "
705 			  "allowed in GLSL 1.10 or GLSL ES 1.00.");
706 	 error_emitted = true;
707       } else if (!lhs->is_lvalue()) {
708 	 _mesa_glsl_error(& lhs_loc, state, "non-lvalue in assignment");
709 	 error_emitted = true;
710       }
711    }
712 
713    ir_rvalue *new_rhs =
714       validate_assignment(state, lhs->type, rhs, is_initializer);
715    if (new_rhs == NULL) {
716       _mesa_glsl_error(& lhs_loc, state, "type mismatch");
717    } else {
718       rhs = new_rhs;
719 
720       /* If the LHS array was not declared with a size, it takes it size from
721        * the RHS.  If the LHS is an l-value and a whole array, it must be a
722        * dereference of a variable.  Any other case would require that the LHS
723        * is either not an l-value or not a whole array.
724        */
725       if (lhs->type->array_size() == 0) {
726 	 ir_dereference *const d = lhs->as_dereference();
727 
728 	 assert(d != NULL);
729 
730 	 ir_variable *const var = d->variable_referenced();
731 
732 	 assert(var != NULL);
733 
734 	 if (var->max_array_access >= unsigned(rhs->type->array_size())) {
735 	    /* FINISHME: This should actually log the location of the RHS. */
736 	    _mesa_glsl_error(& lhs_loc, state, "array size must be > %u due to "
737 			     "previous access",
738 			     var->max_array_access);
739 	 }
740 
741 	 var->type = glsl_type::get_array_instance(lhs->type->element_type(),
742 						   rhs->type->array_size());
743 	 d->type = var->type;
744       }
745       mark_whole_array_access(rhs);
746       mark_whole_array_access(lhs);
747    }
748 
749    /* Most callers of do_assignment (assign, add_assign, pre_inc/dec,
750     * but not post_inc) need the converted assigned value as an rvalue
751     * to handle things like:
752     *
753     * i = j += 1;
754     *
755     * So we always just store the computed value being assigned to a
756     * temporary and return a deref of that temporary.  If the rvalue
757     * ends up not being used, the temp will get copy-propagated out.
758     */
759    ir_variable *var = new(ctx) ir_variable(rhs->type, "assignment_tmp",
760 					   ir_var_temporary);
761    ir_dereference_variable *deref_var = new(ctx) ir_dereference_variable(var);
762    instructions->push_tail(var);
763    instructions->push_tail(new(ctx) ir_assignment(deref_var, rhs));
764    deref_var = new(ctx) ir_dereference_variable(var);
765 
766    if (!error_emitted)
767       instructions->push_tail(new(ctx) ir_assignment(lhs, deref_var));
768 
769    return new(ctx) ir_dereference_variable(var);
770 }
771 
772 static ir_rvalue *
get_lvalue_copy(exec_list * instructions,ir_rvalue * lvalue)773 get_lvalue_copy(exec_list *instructions, ir_rvalue *lvalue)
774 {
775    void *ctx = ralloc_parent(lvalue);
776    ir_variable *var;
777 
778    var = new(ctx) ir_variable(lvalue->type, "_post_incdec_tmp",
779 			      ir_var_temporary);
780    instructions->push_tail(var);
781    var->mode = ir_var_auto;
782 
783    instructions->push_tail(new(ctx) ir_assignment(new(ctx) ir_dereference_variable(var),
784 						  lvalue));
785 
786    return new(ctx) ir_dereference_variable(var);
787 }
788 
789 
790 ir_rvalue *
hir(exec_list * instructions,struct _mesa_glsl_parse_state * state)791 ast_node::hir(exec_list *instructions,
792 	      struct _mesa_glsl_parse_state *state)
793 {
794    (void) instructions;
795    (void) state;
796 
797    return NULL;
798 }
799 
800 static ir_rvalue *
do_comparison(void * mem_ctx,int operation,ir_rvalue * op0,ir_rvalue * op1)801 do_comparison(void *mem_ctx, int operation, ir_rvalue *op0, ir_rvalue *op1)
802 {
803    int join_op;
804    ir_rvalue *cmp = NULL;
805 
806    if (operation == ir_binop_all_equal)
807       join_op = ir_binop_logic_and;
808    else
809       join_op = ir_binop_logic_or;
810 
811    switch (op0->type->base_type) {
812    case GLSL_TYPE_FLOAT:
813    case GLSL_TYPE_UINT:
814    case GLSL_TYPE_INT:
815    case GLSL_TYPE_BOOL:
816       return new(mem_ctx) ir_expression(operation, op0, op1);
817 
818    case GLSL_TYPE_ARRAY: {
819       for (unsigned int i = 0; i < op0->type->length; i++) {
820 	 ir_rvalue *e0, *e1, *result;
821 
822 	 e0 = new(mem_ctx) ir_dereference_array(op0->clone(mem_ctx, NULL),
823 						new(mem_ctx) ir_constant(i));
824 	 e1 = new(mem_ctx) ir_dereference_array(op1->clone(mem_ctx, NULL),
825 						new(mem_ctx) ir_constant(i));
826 	 result = do_comparison(mem_ctx, operation, e0, e1);
827 
828 	 if (cmp) {
829 	    cmp = new(mem_ctx) ir_expression(join_op, cmp, result);
830 	 } else {
831 	    cmp = result;
832 	 }
833       }
834 
835       mark_whole_array_access(op0);
836       mark_whole_array_access(op1);
837       break;
838    }
839 
840    case GLSL_TYPE_STRUCT: {
841       for (unsigned int i = 0; i < op0->type->length; i++) {
842 	 ir_rvalue *e0, *e1, *result;
843 	 const char *field_name = op0->type->fields.structure[i].name;
844 
845 	 e0 = new(mem_ctx) ir_dereference_record(op0->clone(mem_ctx, NULL),
846 						 field_name);
847 	 e1 = new(mem_ctx) ir_dereference_record(op1->clone(mem_ctx, NULL),
848 						 field_name);
849 	 result = do_comparison(mem_ctx, operation, e0, e1);
850 
851 	 if (cmp) {
852 	    cmp = new(mem_ctx) ir_expression(join_op, cmp, result);
853 	 } else {
854 	    cmp = result;
855 	 }
856       }
857       break;
858    }
859 
860    case GLSL_TYPE_ERROR:
861    case GLSL_TYPE_VOID:
862    case GLSL_TYPE_SAMPLER:
863       /* I assume a comparison of a struct containing a sampler just
864        * ignores the sampler present in the type.
865        */
866       break;
867 
868    default:
869       assert(!"Should not get here.");
870       break;
871    }
872 
873    if (cmp == NULL)
874       cmp = new(mem_ctx) ir_constant(true);
875 
876    return cmp;
877 }
878 
879 /* For logical operations, we want to ensure that the operands are
880  * scalar booleans.  If it isn't, emit an error and return a constant
881  * boolean to avoid triggering cascading error messages.
882  */
883 ir_rvalue *
get_scalar_boolean_operand(exec_list * instructions,struct _mesa_glsl_parse_state * state,ast_expression * parent_expr,int operand,const char * operand_name,bool * error_emitted)884 get_scalar_boolean_operand(exec_list *instructions,
885 			   struct _mesa_glsl_parse_state *state,
886 			   ast_expression *parent_expr,
887 			   int operand,
888 			   const char *operand_name,
889 			   bool *error_emitted)
890 {
891    ast_expression *expr = parent_expr->subexpressions[operand];
892    void *ctx = state;
893    ir_rvalue *val = expr->hir(instructions, state);
894 
895    if (val->type->is_boolean() && val->type->is_scalar())
896       return val;
897 
898    if (!*error_emitted) {
899       YYLTYPE loc = expr->get_location();
900       _mesa_glsl_error(&loc, state, "%s of `%s' must be scalar boolean",
901 		       operand_name,
902 		       parent_expr->operator_string(parent_expr->oper));
903       *error_emitted = true;
904    }
905 
906    return new(ctx) ir_constant(true);
907 }
908 
909 /**
910  * If name refers to a builtin array whose maximum allowed size is less than
911  * size, report an error and return true.  Otherwise return false.
912  */
913 static bool
check_builtin_array_max_size(const char * name,unsigned size,YYLTYPE loc,struct _mesa_glsl_parse_state * state)914 check_builtin_array_max_size(const char *name, unsigned size,
915                              YYLTYPE loc, struct _mesa_glsl_parse_state *state)
916 {
917    if ((strcmp("gl_TexCoord", name) == 0)
918        && (size > state->Const.MaxTextureCoords)) {
919       /* From page 54 (page 60 of the PDF) of the GLSL 1.20 spec:
920        *
921        *     "The size [of gl_TexCoord] can be at most
922        *     gl_MaxTextureCoords."
923        */
924       _mesa_glsl_error(&loc, state, "`gl_TexCoord' array size cannot "
925                        "be larger than gl_MaxTextureCoords (%u)\n",
926                        state->Const.MaxTextureCoords);
927       return true;
928    } else if (strcmp("gl_ClipDistance", name) == 0
929               && size > state->Const.MaxClipPlanes) {
930       /* From section 7.1 (Vertex Shader Special Variables) of the
931        * GLSL 1.30 spec:
932        *
933        *   "The gl_ClipDistance array is predeclared as unsized and
934        *   must be sized by the shader either redeclaring it with a
935        *   size or indexing it only with integral constant
936        *   expressions. ... The size can be at most
937        *   gl_MaxClipDistances."
938        */
939       _mesa_glsl_error(&loc, state, "`gl_ClipDistance' array size cannot "
940                        "be larger than gl_MaxClipDistances (%u)\n",
941                        state->Const.MaxClipPlanes);
942       return true;
943    }
944    return false;
945 }
946 
947 /**
948  * Create the constant 1, of a which is appropriate for incrementing and
949  * decrementing values of the given GLSL type.  For example, if type is vec4,
950  * this creates a constant value of 1.0 having type float.
951  *
952  * If the given type is invalid for increment and decrement operators, return
953  * a floating point 1--the error will be detected later.
954  */
955 static ir_rvalue *
constant_one_for_inc_dec(void * ctx,const glsl_type * type)956 constant_one_for_inc_dec(void *ctx, const glsl_type *type)
957 {
958    switch (type->base_type) {
959    case GLSL_TYPE_UINT:
960       return new(ctx) ir_constant((unsigned) 1);
961    case GLSL_TYPE_INT:
962       return new(ctx) ir_constant(1);
963    default:
964    case GLSL_TYPE_FLOAT:
965       return new(ctx) ir_constant(1.0f);
966    }
967 }
968 
969 ir_rvalue *
hir(exec_list * instructions,struct _mesa_glsl_parse_state * state)970 ast_expression::hir(exec_list *instructions,
971 		    struct _mesa_glsl_parse_state *state)
972 {
973    void *ctx = state;
974    static const int operations[AST_NUM_OPERATORS] = {
975       -1,               /* ast_assign doesn't convert to ir_expression. */
976       -1,               /* ast_plus doesn't convert to ir_expression. */
977       ir_unop_neg,
978       ir_binop_add,
979       ir_binop_sub,
980       ir_binop_mul,
981       ir_binop_div,
982       ir_binop_mod,
983       ir_binop_lshift,
984       ir_binop_rshift,
985       ir_binop_less,
986       ir_binop_greater,
987       ir_binop_lequal,
988       ir_binop_gequal,
989       ir_binop_all_equal,
990       ir_binop_any_nequal,
991       ir_binop_bit_and,
992       ir_binop_bit_xor,
993       ir_binop_bit_or,
994       ir_unop_bit_not,
995       ir_binop_logic_and,
996       ir_binop_logic_xor,
997       ir_binop_logic_or,
998       ir_unop_logic_not,
999 
1000       /* Note: The following block of expression types actually convert
1001        * to multiple IR instructions.
1002        */
1003       ir_binop_mul,     /* ast_mul_assign */
1004       ir_binop_div,     /* ast_div_assign */
1005       ir_binop_mod,     /* ast_mod_assign */
1006       ir_binop_add,     /* ast_add_assign */
1007       ir_binop_sub,     /* ast_sub_assign */
1008       ir_binop_lshift,  /* ast_ls_assign */
1009       ir_binop_rshift,  /* ast_rs_assign */
1010       ir_binop_bit_and, /* ast_and_assign */
1011       ir_binop_bit_xor, /* ast_xor_assign */
1012       ir_binop_bit_or,  /* ast_or_assign */
1013 
1014       -1,               /* ast_conditional doesn't convert to ir_expression. */
1015       ir_binop_add,     /* ast_pre_inc. */
1016       ir_binop_sub,     /* ast_pre_dec. */
1017       ir_binop_add,     /* ast_post_inc. */
1018       ir_binop_sub,     /* ast_post_dec. */
1019       -1,               /* ast_field_selection doesn't conv to ir_expression. */
1020       -1,               /* ast_array_index doesn't convert to ir_expression. */
1021       -1,               /* ast_function_call doesn't conv to ir_expression. */
1022       -1,               /* ast_identifier doesn't convert to ir_expression. */
1023       -1,               /* ast_int_constant doesn't convert to ir_expression. */
1024       -1,               /* ast_uint_constant doesn't conv to ir_expression. */
1025       -1,               /* ast_float_constant doesn't conv to ir_expression. */
1026       -1,               /* ast_bool_constant doesn't conv to ir_expression. */
1027       -1,               /* ast_sequence doesn't convert to ir_expression. */
1028    };
1029    ir_rvalue *result = NULL;
1030    ir_rvalue *op[3];
1031    const struct glsl_type *type; /* a temporary variable for switch cases */
1032    bool error_emitted = false;
1033    YYLTYPE loc;
1034 
1035    loc = this->get_location();
1036 
1037    switch (this->oper) {
1038    case ast_assign: {
1039       op[0] = this->subexpressions[0]->hir(instructions, state);
1040       op[1] = this->subexpressions[1]->hir(instructions, state);
1041 
1042       result = do_assignment(instructions, state,
1043 			     this->subexpressions[0]->non_lvalue_description,
1044 			     op[0], op[1], false,
1045 			     this->subexpressions[0]->get_location());
1046       error_emitted = result->type->is_error();
1047       break;
1048    }
1049 
1050    case ast_plus:
1051       op[0] = this->subexpressions[0]->hir(instructions, state);
1052 
1053       type = unary_arithmetic_result_type(op[0]->type, state, & loc);
1054 
1055       error_emitted = type->is_error();
1056 
1057       result = op[0];
1058       break;
1059 
1060    case ast_neg:
1061       op[0] = this->subexpressions[0]->hir(instructions, state);
1062 
1063       type = unary_arithmetic_result_type(op[0]->type, state, & loc);
1064 
1065       error_emitted = type->is_error();
1066 
1067       result = new(ctx) ir_expression(operations[this->oper], type,
1068 				      op[0], NULL);
1069       break;
1070 
1071    case ast_add:
1072    case ast_sub:
1073    case ast_mul:
1074    case ast_div:
1075       op[0] = this->subexpressions[0]->hir(instructions, state);
1076       op[1] = this->subexpressions[1]->hir(instructions, state);
1077 
1078       type = arithmetic_result_type(op[0], op[1],
1079 				    (this->oper == ast_mul),
1080 				    state, & loc);
1081       error_emitted = type->is_error();
1082 
1083       result = new(ctx) ir_expression(operations[this->oper], type,
1084 				      op[0], op[1]);
1085       break;
1086 
1087    case ast_mod:
1088       op[0] = this->subexpressions[0]->hir(instructions, state);
1089       op[1] = this->subexpressions[1]->hir(instructions, state);
1090 
1091       type = modulus_result_type(op[0]->type, op[1]->type, state, & loc);
1092 
1093       assert(operations[this->oper] == ir_binop_mod);
1094 
1095       result = new(ctx) ir_expression(operations[this->oper], type,
1096 				      op[0], op[1]);
1097       error_emitted = type->is_error();
1098       break;
1099 
1100    case ast_lshift:
1101    case ast_rshift:
1102        if (state->language_version < 130) {
1103           _mesa_glsl_error(&loc, state, "operator %s requires GLSL 1.30",
1104               operator_string(this->oper));
1105           error_emitted = true;
1106        }
1107 
1108        op[0] = this->subexpressions[0]->hir(instructions, state);
1109        op[1] = this->subexpressions[1]->hir(instructions, state);
1110        type = shift_result_type(op[0]->type, op[1]->type, this->oper, state,
1111                                 &loc);
1112        result = new(ctx) ir_expression(operations[this->oper], type,
1113                                        op[0], op[1]);
1114        error_emitted = op[0]->type->is_error() || op[1]->type->is_error();
1115        break;
1116 
1117    case ast_less:
1118    case ast_greater:
1119    case ast_lequal:
1120    case ast_gequal:
1121       op[0] = this->subexpressions[0]->hir(instructions, state);
1122       op[1] = this->subexpressions[1]->hir(instructions, state);
1123 
1124       type = relational_result_type(op[0], op[1], state, & loc);
1125 
1126       /* The relational operators must either generate an error or result
1127        * in a scalar boolean.  See page 57 of the GLSL 1.50 spec.
1128        */
1129       assert(type->is_error()
1130 	     || ((type->base_type == GLSL_TYPE_BOOL)
1131 		 && type->is_scalar()));
1132 
1133       result = new(ctx) ir_expression(operations[this->oper], type,
1134 				      op[0], op[1]);
1135       error_emitted = type->is_error();
1136       break;
1137 
1138    case ast_nequal:
1139    case ast_equal:
1140       op[0] = this->subexpressions[0]->hir(instructions, state);
1141       op[1] = this->subexpressions[1]->hir(instructions, state);
1142 
1143       /* From page 58 (page 64 of the PDF) of the GLSL 1.50 spec:
1144        *
1145        *    "The equality operators equal (==), and not equal (!=)
1146        *    operate on all types. They result in a scalar Boolean. If
1147        *    the operand types do not match, then there must be a
1148        *    conversion from Section 4.1.10 "Implicit Conversions"
1149        *    applied to one operand that can make them match, in which
1150        *    case this conversion is done."
1151        */
1152       if ((!apply_implicit_conversion(op[0]->type, op[1], state)
1153 	   && !apply_implicit_conversion(op[1]->type, op[0], state))
1154 	  || (op[0]->type != op[1]->type)) {
1155 	 _mesa_glsl_error(& loc, state, "operands of `%s' must have the same "
1156 			  "type", (this->oper == ast_equal) ? "==" : "!=");
1157 	 error_emitted = true;
1158       } else if ((state->language_version <= 110)
1159 		 && (op[0]->type->is_array() || op[1]->type->is_array())) {
1160 	 _mesa_glsl_error(& loc, state, "array comparisons forbidden in "
1161 			  "GLSL 1.10");
1162 	 error_emitted = true;
1163       }
1164 
1165       if (error_emitted) {
1166 	 result = new(ctx) ir_constant(false);
1167       } else {
1168 	 result = do_comparison(ctx, operations[this->oper], op[0], op[1]);
1169 	 assert(result->type == glsl_type::bool_type);
1170       }
1171       break;
1172 
1173    case ast_bit_and:
1174    case ast_bit_xor:
1175    case ast_bit_or:
1176       op[0] = this->subexpressions[0]->hir(instructions, state);
1177       op[1] = this->subexpressions[1]->hir(instructions, state);
1178       type = bit_logic_result_type(op[0]->type, op[1]->type, this->oper,
1179                                    state, &loc);
1180       result = new(ctx) ir_expression(operations[this->oper], type,
1181 				      op[0], op[1]);
1182       error_emitted = op[0]->type->is_error() || op[1]->type->is_error();
1183       break;
1184 
1185    case ast_bit_not:
1186       op[0] = this->subexpressions[0]->hir(instructions, state);
1187 
1188       if (state->language_version < 130) {
1189 	 _mesa_glsl_error(&loc, state, "bit-wise operations require GLSL 1.30");
1190 	 error_emitted = true;
1191       }
1192 
1193       if (!op[0]->type->is_integer()) {
1194 	 _mesa_glsl_error(&loc, state, "operand of `~' must be an integer");
1195 	 error_emitted = true;
1196       }
1197 
1198       type = error_emitted ? glsl_type::error_type : op[0]->type;
1199       result = new(ctx) ir_expression(ir_unop_bit_not, type, op[0], NULL);
1200       break;
1201 
1202    case ast_logic_and: {
1203       exec_list rhs_instructions;
1204       op[0] = get_scalar_boolean_operand(instructions, state, this, 0,
1205 					 "LHS", &error_emitted);
1206       op[1] = get_scalar_boolean_operand(&rhs_instructions, state, this, 1,
1207 					 "RHS", &error_emitted);
1208 
1209       if (rhs_instructions.is_empty()) {
1210 	 result = new(ctx) ir_expression(ir_binop_logic_and, op[0], op[1]);
1211 	 type = result->type;
1212       } else {
1213 	 ir_variable *const tmp = new(ctx) ir_variable(glsl_type::bool_type,
1214 						       "and_tmp",
1215 						       ir_var_temporary);
1216 	 instructions->push_tail(tmp);
1217 
1218 	 ir_if *const stmt = new(ctx) ir_if(op[0]);
1219 	 instructions->push_tail(stmt);
1220 
1221 	 stmt->then_instructions.append_list(&rhs_instructions);
1222 	 ir_dereference *const then_deref = new(ctx) ir_dereference_variable(tmp);
1223 	 ir_assignment *const then_assign =
1224 	    new(ctx) ir_assignment(then_deref, op[1]);
1225 	 stmt->then_instructions.push_tail(then_assign);
1226 
1227 	 ir_dereference *const else_deref = new(ctx) ir_dereference_variable(tmp);
1228 	 ir_assignment *const else_assign =
1229 	    new(ctx) ir_assignment(else_deref, new(ctx) ir_constant(false));
1230 	 stmt->else_instructions.push_tail(else_assign);
1231 
1232 	 result = new(ctx) ir_dereference_variable(tmp);
1233 	 type = tmp->type;
1234       }
1235       break;
1236    }
1237 
1238    case ast_logic_or: {
1239       exec_list rhs_instructions;
1240       op[0] = get_scalar_boolean_operand(instructions, state, this, 0,
1241 					 "LHS", &error_emitted);
1242       op[1] = get_scalar_boolean_operand(&rhs_instructions, state, this, 1,
1243 					 "RHS", &error_emitted);
1244 
1245       if (rhs_instructions.is_empty()) {
1246 	 result = new(ctx) ir_expression(ir_binop_logic_or, op[0], op[1]);
1247 	 type = result->type;
1248       } else {
1249 	 ir_variable *const tmp = new(ctx) ir_variable(glsl_type::bool_type,
1250 						       "or_tmp",
1251 						       ir_var_temporary);
1252 	 instructions->push_tail(tmp);
1253 
1254 	 ir_if *const stmt = new(ctx) ir_if(op[0]);
1255 	 instructions->push_tail(stmt);
1256 
1257 	 ir_dereference *const then_deref = new(ctx) ir_dereference_variable(tmp);
1258 	 ir_assignment *const then_assign =
1259 	    new(ctx) ir_assignment(then_deref, new(ctx) ir_constant(true));
1260 	 stmt->then_instructions.push_tail(then_assign);
1261 
1262 	 stmt->else_instructions.append_list(&rhs_instructions);
1263 	 ir_dereference *const else_deref = new(ctx) ir_dereference_variable(tmp);
1264 	 ir_assignment *const else_assign =
1265 	    new(ctx) ir_assignment(else_deref, op[1]);
1266 	 stmt->else_instructions.push_tail(else_assign);
1267 
1268 	 result = new(ctx) ir_dereference_variable(tmp);
1269 	 type = tmp->type;
1270       }
1271       break;
1272    }
1273 
1274    case ast_logic_xor:
1275       /* From page 33 (page 39 of the PDF) of the GLSL 1.10 spec:
1276        *
1277        *    "The logical binary operators and (&&), or ( | | ), and
1278        *     exclusive or (^^). They operate only on two Boolean
1279        *     expressions and result in a Boolean expression."
1280        */
1281       op[0] = get_scalar_boolean_operand(instructions, state, this, 0, "LHS",
1282 					 &error_emitted);
1283       op[1] = get_scalar_boolean_operand(instructions, state, this, 1, "RHS",
1284 					 &error_emitted);
1285 
1286       result = new(ctx) ir_expression(operations[this->oper], glsl_type::bool_type,
1287 				      op[0], op[1]);
1288       break;
1289 
1290    case ast_logic_not:
1291       op[0] = get_scalar_boolean_operand(instructions, state, this, 0,
1292 					 "operand", &error_emitted);
1293 
1294       result = new(ctx) ir_expression(operations[this->oper], glsl_type::bool_type,
1295 				      op[0], NULL);
1296       break;
1297 
1298    case ast_mul_assign:
1299    case ast_div_assign:
1300    case ast_add_assign:
1301    case ast_sub_assign: {
1302       op[0] = this->subexpressions[0]->hir(instructions, state);
1303       op[1] = this->subexpressions[1]->hir(instructions, state);
1304 
1305       type = arithmetic_result_type(op[0], op[1],
1306 				    (this->oper == ast_mul_assign),
1307 				    state, & loc);
1308 
1309       ir_rvalue *temp_rhs = new(ctx) ir_expression(operations[this->oper], type,
1310 						   op[0], op[1]);
1311 
1312       result = do_assignment(instructions, state,
1313 			     this->subexpressions[0]->non_lvalue_description,
1314 			     op[0]->clone(ctx, NULL), temp_rhs, false,
1315 			     this->subexpressions[0]->get_location());
1316       error_emitted = (op[0]->type->is_error());
1317 
1318       /* GLSL 1.10 does not allow array assignment.  However, we don't have to
1319        * explicitly test for this because none of the binary expression
1320        * operators allow array operands either.
1321        */
1322 
1323       break;
1324    }
1325 
1326    case ast_mod_assign: {
1327       op[0] = this->subexpressions[0]->hir(instructions, state);
1328       op[1] = this->subexpressions[1]->hir(instructions, state);
1329 
1330       type = modulus_result_type(op[0]->type, op[1]->type, state, & loc);
1331 
1332       assert(operations[this->oper] == ir_binop_mod);
1333 
1334       ir_rvalue *temp_rhs;
1335       temp_rhs = new(ctx) ir_expression(operations[this->oper], type,
1336 					op[0], op[1]);
1337 
1338       result = do_assignment(instructions, state,
1339 			     this->subexpressions[0]->non_lvalue_description,
1340 			     op[0]->clone(ctx, NULL), temp_rhs, false,
1341 			     this->subexpressions[0]->get_location());
1342       error_emitted = type->is_error();
1343       break;
1344    }
1345 
1346    case ast_ls_assign:
1347    case ast_rs_assign: {
1348       op[0] = this->subexpressions[0]->hir(instructions, state);
1349       op[1] = this->subexpressions[1]->hir(instructions, state);
1350       type = shift_result_type(op[0]->type, op[1]->type, this->oper, state,
1351                                &loc);
1352       ir_rvalue *temp_rhs = new(ctx) ir_expression(operations[this->oper],
1353                                                    type, op[0], op[1]);
1354       result = do_assignment(instructions, state,
1355 			     this->subexpressions[0]->non_lvalue_description,
1356 			     op[0]->clone(ctx, NULL), temp_rhs, false,
1357                              this->subexpressions[0]->get_location());
1358       error_emitted = op[0]->type->is_error() || op[1]->type->is_error();
1359       break;
1360    }
1361 
1362    case ast_and_assign:
1363    case ast_xor_assign:
1364    case ast_or_assign: {
1365       op[0] = this->subexpressions[0]->hir(instructions, state);
1366       op[1] = this->subexpressions[1]->hir(instructions, state);
1367       type = bit_logic_result_type(op[0]->type, op[1]->type, this->oper,
1368                                    state, &loc);
1369       ir_rvalue *temp_rhs = new(ctx) ir_expression(operations[this->oper],
1370                                                    type, op[0], op[1]);
1371       result = do_assignment(instructions, state,
1372 			     this->subexpressions[0]->non_lvalue_description,
1373 			     op[0]->clone(ctx, NULL), temp_rhs, false,
1374                              this->subexpressions[0]->get_location());
1375       error_emitted = op[0]->type->is_error() || op[1]->type->is_error();
1376       break;
1377    }
1378 
1379    case ast_conditional: {
1380       /* From page 59 (page 65 of the PDF) of the GLSL 1.50 spec:
1381        *
1382        *    "The ternary selection operator (?:). It operates on three
1383        *    expressions (exp1 ? exp2 : exp3). This operator evaluates the
1384        *    first expression, which must result in a scalar Boolean."
1385        */
1386       op[0] = get_scalar_boolean_operand(instructions, state, this, 0,
1387 					 "condition", &error_emitted);
1388 
1389       /* The :? operator is implemented by generating an anonymous temporary
1390        * followed by an if-statement.  The last instruction in each branch of
1391        * the if-statement assigns a value to the anonymous temporary.  This
1392        * temporary is the r-value of the expression.
1393        */
1394       exec_list then_instructions;
1395       exec_list else_instructions;
1396 
1397       op[1] = this->subexpressions[1]->hir(&then_instructions, state);
1398       op[2] = this->subexpressions[2]->hir(&else_instructions, state);
1399 
1400       /* From page 59 (page 65 of the PDF) of the GLSL 1.50 spec:
1401        *
1402        *     "The second and third expressions can be any type, as
1403        *     long their types match, or there is a conversion in
1404        *     Section 4.1.10 "Implicit Conversions" that can be applied
1405        *     to one of the expressions to make their types match. This
1406        *     resulting matching type is the type of the entire
1407        *     expression."
1408        */
1409       if ((!apply_implicit_conversion(op[1]->type, op[2], state)
1410 	   && !apply_implicit_conversion(op[2]->type, op[1], state))
1411 	  || (op[1]->type != op[2]->type)) {
1412 	 YYLTYPE loc = this->subexpressions[1]->get_location();
1413 
1414 	 _mesa_glsl_error(& loc, state, "Second and third operands of ?: "
1415 			  "operator must have matching types.");
1416 	 error_emitted = true;
1417 	 type = glsl_type::error_type;
1418       } else {
1419 	 type = op[1]->type;
1420       }
1421 
1422       /* From page 33 (page 39 of the PDF) of the GLSL 1.10 spec:
1423        *
1424        *    "The second and third expressions must be the same type, but can
1425        *    be of any type other than an array."
1426        */
1427       if ((state->language_version <= 110) && type->is_array()) {
1428 	 _mesa_glsl_error(& loc, state, "Second and third operands of ?: "
1429 			  "operator must not be arrays.");
1430 	 error_emitted = true;
1431       }
1432 
1433       ir_constant *cond_val = op[0]->constant_expression_value();
1434       ir_constant *then_val = op[1]->constant_expression_value();
1435       ir_constant *else_val = op[2]->constant_expression_value();
1436 
1437       if (then_instructions.is_empty()
1438 	  && else_instructions.is_empty()
1439 	  && (cond_val != NULL) && (then_val != NULL) && (else_val != NULL)) {
1440 	 result = (cond_val->value.b[0]) ? then_val : else_val;
1441       } else {
1442 	 ir_variable *const tmp =
1443 	    new(ctx) ir_variable(type, "conditional_tmp", ir_var_temporary);
1444 	 instructions->push_tail(tmp);
1445 
1446 	 ir_if *const stmt = new(ctx) ir_if(op[0]);
1447 	 instructions->push_tail(stmt);
1448 
1449 	 then_instructions.move_nodes_to(& stmt->then_instructions);
1450 	 ir_dereference *const then_deref =
1451 	    new(ctx) ir_dereference_variable(tmp);
1452 	 ir_assignment *const then_assign =
1453 	    new(ctx) ir_assignment(then_deref, op[1]);
1454 	 stmt->then_instructions.push_tail(then_assign);
1455 
1456 	 else_instructions.move_nodes_to(& stmt->else_instructions);
1457 	 ir_dereference *const else_deref =
1458 	    new(ctx) ir_dereference_variable(tmp);
1459 	 ir_assignment *const else_assign =
1460 	    new(ctx) ir_assignment(else_deref, op[2]);
1461 	 stmt->else_instructions.push_tail(else_assign);
1462 
1463 	 result = new(ctx) ir_dereference_variable(tmp);
1464       }
1465       break;
1466    }
1467 
1468    case ast_pre_inc:
1469    case ast_pre_dec: {
1470       this->non_lvalue_description = (this->oper == ast_pre_inc)
1471 	 ? "pre-increment operation" : "pre-decrement operation";
1472 
1473       op[0] = this->subexpressions[0]->hir(instructions, state);
1474       op[1] = constant_one_for_inc_dec(ctx, op[0]->type);
1475 
1476       type = arithmetic_result_type(op[0], op[1], false, state, & loc);
1477 
1478       ir_rvalue *temp_rhs;
1479       temp_rhs = new(ctx) ir_expression(operations[this->oper], type,
1480 					op[0], op[1]);
1481 
1482       result = do_assignment(instructions, state,
1483 			     this->subexpressions[0]->non_lvalue_description,
1484 			     op[0]->clone(ctx, NULL), temp_rhs, false,
1485 			     this->subexpressions[0]->get_location());
1486       error_emitted = op[0]->type->is_error();
1487       break;
1488    }
1489 
1490    case ast_post_inc:
1491    case ast_post_dec: {
1492       this->non_lvalue_description = (this->oper == ast_post_inc)
1493 	 ? "post-increment operation" : "post-decrement operation";
1494       op[0] = this->subexpressions[0]->hir(instructions, state);
1495       op[1] = constant_one_for_inc_dec(ctx, op[0]->type);
1496 
1497       error_emitted = op[0]->type->is_error() || op[1]->type->is_error();
1498 
1499       type = arithmetic_result_type(op[0], op[1], false, state, & loc);
1500 
1501       ir_rvalue *temp_rhs;
1502       temp_rhs = new(ctx) ir_expression(operations[this->oper], type,
1503 					op[0], op[1]);
1504 
1505       /* Get a temporary of a copy of the lvalue before it's modified.
1506        * This may get thrown away later.
1507        */
1508       result = get_lvalue_copy(instructions, op[0]->clone(ctx, NULL));
1509 
1510       (void)do_assignment(instructions, state,
1511 			  this->subexpressions[0]->non_lvalue_description,
1512 			  op[0]->clone(ctx, NULL), temp_rhs, false,
1513 			  this->subexpressions[0]->get_location());
1514 
1515       error_emitted = op[0]->type->is_error();
1516       break;
1517    }
1518 
1519    case ast_field_selection:
1520       result = _mesa_ast_field_selection_to_hir(this, instructions, state);
1521       break;
1522 
1523    case ast_array_index: {
1524       YYLTYPE index_loc = subexpressions[1]->get_location();
1525 
1526       op[0] = subexpressions[0]->hir(instructions, state);
1527       op[1] = subexpressions[1]->hir(instructions, state);
1528 
1529       error_emitted = op[0]->type->is_error() || op[1]->type->is_error();
1530 
1531       ir_rvalue *const array = op[0];
1532 
1533       result = new(ctx) ir_dereference_array(op[0], op[1]);
1534 
1535       /* Do not use op[0] after this point.  Use array.
1536        */
1537       op[0] = NULL;
1538 
1539 
1540       if (error_emitted)
1541 	 break;
1542 
1543       if (!array->type->is_array()
1544 	  && !array->type->is_matrix()
1545 	  && !array->type->is_vector()) {
1546 	 _mesa_glsl_error(& index_loc, state,
1547 			  "cannot dereference non-array / non-matrix / "
1548 			  "non-vector");
1549 	 error_emitted = true;
1550       }
1551 
1552       if (!op[1]->type->is_integer()) {
1553 	 _mesa_glsl_error(& index_loc, state,
1554 			  "array index must be integer type");
1555 	 error_emitted = true;
1556       } else if (!op[1]->type->is_scalar()) {
1557 	 _mesa_glsl_error(& index_loc, state,
1558 			  "array index must be scalar");
1559 	 error_emitted = true;
1560       }
1561 
1562       /* If the array index is a constant expression and the array has a
1563        * declared size, ensure that the access is in-bounds.  If the array
1564        * index is not a constant expression, ensure that the array has a
1565        * declared size.
1566        */
1567       ir_constant *const const_index = op[1]->constant_expression_value();
1568       if (const_index != NULL) {
1569 	 const int idx = const_index->value.i[0];
1570 	 const char *type_name;
1571 	 unsigned bound = 0;
1572 
1573 	 if (array->type->is_matrix()) {
1574 	    type_name = "matrix";
1575 	 } else if (array->type->is_vector()) {
1576 	    type_name = "vector";
1577 	 } else {
1578 	    type_name = "array";
1579 	 }
1580 
1581 	 /* From page 24 (page 30 of the PDF) of the GLSL 1.50 spec:
1582 	  *
1583 	  *    "It is illegal to declare an array with a size, and then
1584 	  *    later (in the same shader) index the same array with an
1585 	  *    integral constant expression greater than or equal to the
1586 	  *    declared size. It is also illegal to index an array with a
1587 	  *    negative constant expression."
1588 	  */
1589 	 if (array->type->is_matrix()) {
1590 	    if (array->type->row_type()->vector_elements <= idx) {
1591 	       bound = array->type->row_type()->vector_elements;
1592 	    }
1593 	 } else if (array->type->is_vector()) {
1594 	    if (array->type->vector_elements <= idx) {
1595 	       bound = array->type->vector_elements;
1596 	    }
1597 	 } else {
1598 	    if ((array->type->array_size() > 0)
1599 		&& (array->type->array_size() <= idx)) {
1600 	       bound = array->type->array_size();
1601 	    }
1602 	 }
1603 
1604 	 if (bound > 0) {
1605 	    _mesa_glsl_error(& loc, state, "%s index must be < %u",
1606 			     type_name, bound);
1607 	    error_emitted = true;
1608 	 } else if (idx < 0) {
1609 	    _mesa_glsl_error(& loc, state, "%s index must be >= 0",
1610 			     type_name);
1611 	    error_emitted = true;
1612 	 }
1613 
1614 	 if (array->type->is_array()) {
1615 	    /* If the array is a variable dereference, it dereferences the
1616 	     * whole array, by definition.  Use this to get the variable.
1617 	     *
1618 	     * FINISHME: Should some methods for getting / setting / testing
1619 	     * FINISHME: array access limits be added to ir_dereference?
1620 	     */
1621 	    ir_variable *const v = array->whole_variable_referenced();
1622 	    if ((v != NULL) && (unsigned(idx) > v->max_array_access)) {
1623 	       v->max_array_access = idx;
1624 
1625                /* Check whether this access will, as a side effect, implicitly
1626                 * cause the size of a built-in array to be too large.
1627                 */
1628                if (check_builtin_array_max_size(v->name, idx+1, loc, state))
1629                   error_emitted = true;
1630             }
1631 	 }
1632       } else if (array->type->array_size() == 0) {
1633 	 _mesa_glsl_error(&loc, state, "unsized array index must be constant");
1634       } else {
1635 	 if (array->type->is_array()) {
1636 	    /* whole_variable_referenced can return NULL if the array is a
1637 	     * member of a structure.  In this case it is safe to not update
1638 	     * the max_array_access field because it is never used for fields
1639 	     * of structures.
1640 	     */
1641 	    ir_variable *v = array->whole_variable_referenced();
1642 	    if (v != NULL)
1643 	       v->max_array_access = array->type->array_size() - 1;
1644 	 }
1645       }
1646 
1647       /* From page 23 (29 of the PDF) of the GLSL 1.30 spec:
1648        *
1649        *    "Samplers aggregated into arrays within a shader (using square
1650        *    brackets [ ]) can only be indexed with integral constant
1651        *    expressions [...]."
1652        *
1653        * This restriction was added in GLSL 1.30.  Shaders using earlier version
1654        * of the language should not be rejected by the compiler front-end for
1655        * using this construct.  This allows useful things such as using a loop
1656        * counter as the index to an array of samplers.  If the loop in unrolled,
1657        * the code should compile correctly.  Instead, emit a warning.
1658        */
1659       if (array->type->is_array() &&
1660           array->type->element_type()->is_sampler() &&
1661           const_index == NULL) {
1662 
1663 	 if (state->language_version == 100) {
1664 	    _mesa_glsl_warning(&loc, state,
1665 			       "sampler arrays indexed with non-constant "
1666 			       "expressions is optional in GLSL ES 1.00");
1667 	 } else if (state->language_version < 130) {
1668 	    _mesa_glsl_warning(&loc, state,
1669 			       "sampler arrays indexed with non-constant "
1670 			       "expressions is forbidden in GLSL 1.30 and "
1671 			       "later");
1672 	 } else {
1673 	    _mesa_glsl_error(&loc, state,
1674 			     "sampler arrays indexed with non-constant "
1675 			     "expressions is forbidden in GLSL 1.30 and "
1676 			     "later");
1677 	    error_emitted = true;
1678 	 }
1679       }
1680 
1681       if (error_emitted)
1682 	 result->type = glsl_type::error_type;
1683 
1684       break;
1685    }
1686 
1687    case ast_function_call:
1688       /* Should *NEVER* get here.  ast_function_call should always be handled
1689        * by ast_function_expression::hir.
1690        */
1691       assert(0);
1692       break;
1693 
1694    case ast_identifier: {
1695       /* ast_identifier can appear several places in a full abstract syntax
1696        * tree.  This particular use must be at location specified in the grammar
1697        * as 'variable_identifier'.
1698        */
1699       ir_variable *var =
1700 	 state->symbols->get_variable(this->primary_expression.identifier);
1701 
1702       if (var != NULL) {
1703 	 var->used = true;
1704 	 result = new(ctx) ir_dereference_variable(var);
1705       } else {
1706 	 _mesa_glsl_error(& loc, state, "`%s' undeclared",
1707 			  this->primary_expression.identifier);
1708 
1709 	 result = ir_rvalue::error_value(ctx);
1710 	 error_emitted = true;
1711       }
1712       break;
1713    }
1714 
1715    case ast_int_constant:
1716       result = new(ctx) ir_constant(this->primary_expression.int_constant);
1717       break;
1718 
1719    case ast_uint_constant:
1720       result = new(ctx) ir_constant(this->primary_expression.uint_constant);
1721       break;
1722 
1723    case ast_float_constant:
1724       result = new(ctx) ir_constant(this->primary_expression.float_constant);
1725       break;
1726 
1727    case ast_bool_constant:
1728       result = new(ctx) ir_constant(bool(this->primary_expression.bool_constant));
1729       break;
1730 
1731    case ast_sequence: {
1732       /* It should not be possible to generate a sequence in the AST without
1733        * any expressions in it.
1734        */
1735       assert(!this->expressions.is_empty());
1736 
1737       /* The r-value of a sequence is the last expression in the sequence.  If
1738        * the other expressions in the sequence do not have side-effects (and
1739        * therefore add instructions to the instruction list), they get dropped
1740        * on the floor.
1741        */
1742       exec_node *previous_tail_pred = NULL;
1743       YYLTYPE previous_operand_loc = loc;
1744 
1745       foreach_list_typed (ast_node, ast, link, &this->expressions) {
1746 	 /* If one of the operands of comma operator does not generate any
1747 	  * code, we want to emit a warning.  At each pass through the loop
1748 	  * previous_tail_pred will point to the last instruction in the
1749 	  * stream *before* processing the previous operand.  Naturally,
1750 	  * instructions->tail_pred will point to the last instruction in the
1751 	  * stream *after* processing the previous operand.  If the two
1752 	  * pointers match, then the previous operand had no effect.
1753 	  *
1754 	  * The warning behavior here differs slightly from GCC.  GCC will
1755 	  * only emit a warning if none of the left-hand operands have an
1756 	  * effect.  However, it will emit a warning for each.  I believe that
1757 	  * there are some cases in C (especially with GCC extensions) where
1758 	  * it is useful to have an intermediate step in a sequence have no
1759 	  * effect, but I don't think these cases exist in GLSL.  Either way,
1760 	  * it would be a giant hassle to replicate that behavior.
1761 	  */
1762 	 if (previous_tail_pred == instructions->tail_pred) {
1763 	    _mesa_glsl_warning(&previous_operand_loc, state,
1764 			       "left-hand operand of comma expression has "
1765 			       "no effect");
1766 	 }
1767 
1768 	 /* tail_pred is directly accessed instead of using the get_tail()
1769 	  * method for performance reasons.  get_tail() has extra code to
1770 	  * return NULL when the list is empty.  We don't care about that
1771 	  * here, so using tail_pred directly is fine.
1772 	  */
1773 	 previous_tail_pred = instructions->tail_pred;
1774 	 previous_operand_loc = ast->get_location();
1775 
1776 	 result = ast->hir(instructions, state);
1777       }
1778 
1779       /* Any errors should have already been emitted in the loop above.
1780        */
1781       error_emitted = true;
1782       break;
1783    }
1784    }
1785    type = NULL; /* use result->type, not type. */
1786    assert(result != NULL);
1787 
1788    if (result->type->is_error() && !error_emitted)
1789       _mesa_glsl_error(& loc, state, "type mismatch");
1790 
1791    return result;
1792 }
1793 
1794 
1795 ir_rvalue *
hir(exec_list * instructions,struct _mesa_glsl_parse_state * state)1796 ast_expression_statement::hir(exec_list *instructions,
1797 			      struct _mesa_glsl_parse_state *state)
1798 {
1799    /* It is possible to have expression statements that don't have an
1800     * expression.  This is the solitary semicolon:
1801     *
1802     * for (i = 0; i < 5; i++)
1803     *     ;
1804     *
1805     * In this case the expression will be NULL.  Test for NULL and don't do
1806     * anything in that case.
1807     */
1808    if (expression != NULL)
1809       expression->hir(instructions, state);
1810 
1811    /* Statements do not have r-values.
1812     */
1813    return NULL;
1814 }
1815 
1816 
1817 ir_rvalue *
hir(exec_list * instructions,struct _mesa_glsl_parse_state * state)1818 ast_compound_statement::hir(exec_list *instructions,
1819 			    struct _mesa_glsl_parse_state *state)
1820 {
1821    if (new_scope)
1822       state->symbols->push_scope();
1823 
1824    foreach_list_typed (ast_node, ast, link, &this->statements)
1825       ast->hir(instructions, state);
1826 
1827    if (new_scope)
1828       state->symbols->pop_scope();
1829 
1830    /* Compound statements do not have r-values.
1831     */
1832    return NULL;
1833 }
1834 
1835 
1836 static const glsl_type *
process_array_type(YYLTYPE * loc,const glsl_type * base,ast_node * array_size,struct _mesa_glsl_parse_state * state)1837 process_array_type(YYLTYPE *loc, const glsl_type *base, ast_node *array_size,
1838 		   struct _mesa_glsl_parse_state *state)
1839 {
1840    unsigned length = 0;
1841 
1842    /* From page 19 (page 25) of the GLSL 1.20 spec:
1843     *
1844     *     "Only one-dimensional arrays may be declared."
1845     */
1846    if (base->is_array()) {
1847       _mesa_glsl_error(loc, state,
1848 		       "invalid array of `%s' (only one-dimensional arrays "
1849 		       "may be declared)",
1850 		       base->name);
1851       return glsl_type::error_type;
1852    }
1853 
1854    if (array_size != NULL) {
1855       exec_list dummy_instructions;
1856       ir_rvalue *const ir = array_size->hir(& dummy_instructions, state);
1857       YYLTYPE loc = array_size->get_location();
1858 
1859       if (ir != NULL) {
1860 	 if (!ir->type->is_integer()) {
1861 	    _mesa_glsl_error(& loc, state, "array size must be integer type");
1862 	 } else if (!ir->type->is_scalar()) {
1863 	    _mesa_glsl_error(& loc, state, "array size must be scalar type");
1864 	 } else {
1865 	    ir_constant *const size = ir->constant_expression_value();
1866 
1867 	    if (size == NULL) {
1868 	       _mesa_glsl_error(& loc, state, "array size must be a "
1869 				"constant valued expression");
1870 	    } else if (size->value.i[0] <= 0) {
1871 	       _mesa_glsl_error(& loc, state, "array size must be > 0");
1872 	    } else {
1873 	       assert(size->type == ir->type);
1874 	       length = size->value.u[0];
1875 
1876                /* If the array size is const (and we've verified that
1877                 * it is) then no instructions should have been emitted
1878                 * when we converted it to HIR.  If they were emitted,
1879                 * then either the array size isn't const after all, or
1880                 * we are emitting unnecessary instructions.
1881                 */
1882                assert(dummy_instructions.is_empty());
1883 	    }
1884 	 }
1885       }
1886    } else if (state->es_shader) {
1887       /* Section 10.17 of the GLSL ES 1.00 specification states that unsized
1888        * array declarations have been removed from the language.
1889        */
1890       _mesa_glsl_error(loc, state, "unsized array declarations are not "
1891 		       "allowed in GLSL ES 1.00.");
1892    }
1893 
1894    return glsl_type::get_array_instance(base, length);
1895 }
1896 
1897 
1898 const glsl_type *
glsl_type(const char ** name,struct _mesa_glsl_parse_state * state) const1899 ast_type_specifier::glsl_type(const char **name,
1900 			      struct _mesa_glsl_parse_state *state) const
1901 {
1902    const struct glsl_type *type;
1903 
1904    type = state->symbols->get_type(this->type_name);
1905    *name = this->type_name;
1906 
1907    if (this->is_array) {
1908       YYLTYPE loc = this->get_location();
1909       type = process_array_type(&loc, type, this->array_size, state);
1910    }
1911 
1912    return type;
1913 }
1914 
1915 
1916 static void
apply_type_qualifier_to_variable(const struct ast_type_qualifier * qual,ir_variable * var,struct _mesa_glsl_parse_state * state,YYLTYPE * loc,bool ubo_qualifiers_valid)1917 apply_type_qualifier_to_variable(const struct ast_type_qualifier *qual,
1918 				 ir_variable *var,
1919 				 struct _mesa_glsl_parse_state *state,
1920 				 YYLTYPE *loc,
1921 				 bool ubo_qualifiers_valid)
1922 {
1923    if (qual->flags.q.invariant) {
1924       if (var->used) {
1925 	 _mesa_glsl_error(loc, state,
1926 			  "variable `%s' may not be redeclared "
1927 			  "`invariant' after being used",
1928 			  var->name);
1929       } else {
1930 	 var->invariant = 1;
1931       }
1932    }
1933 
1934    if (qual->flags.q.constant || qual->flags.q.attribute
1935        || qual->flags.q.uniform
1936        || (qual->flags.q.varying && (state->target == fragment_shader)))
1937       var->read_only = 1;
1938 
1939    if (qual->flags.q.centroid)
1940       var->centroid = 1;
1941 
1942    if (qual->flags.q.attribute && state->target != vertex_shader) {
1943       var->type = glsl_type::error_type;
1944       _mesa_glsl_error(loc, state,
1945 		       "`attribute' variables may not be declared in the "
1946 		       "%s shader",
1947 		       _mesa_glsl_shader_target_name(state->target));
1948    }
1949 
1950    /* From page 25 (page 31 of the PDF) of the GLSL 1.10 spec:
1951     *
1952     *     "The varying qualifier can be used only with the data types
1953     *     float, vec2, vec3, vec4, mat2, mat3, and mat4, or arrays of
1954     *     these."
1955     */
1956    if (qual->flags.q.varying) {
1957       const glsl_type *non_array_type;
1958 
1959       if (var->type && var->type->is_array())
1960 	 non_array_type = var->type->fields.array;
1961       else
1962 	 non_array_type = var->type;
1963 
1964       if (non_array_type && non_array_type->base_type != GLSL_TYPE_FLOAT) {
1965 	 var->type = glsl_type::error_type;
1966 	 _mesa_glsl_error(loc, state,
1967 			  "varying variables must be of base type float");
1968       }
1969    }
1970 
1971    /* If there is no qualifier that changes the mode of the variable, leave
1972     * the setting alone.
1973     */
1974    if (qual->flags.q.in && qual->flags.q.out)
1975       var->mode = ir_var_inout;
1976    else if (qual->flags.q.attribute || qual->flags.q.in
1977 	    || (qual->flags.q.varying && (state->target == fragment_shader)))
1978       var->mode = ir_var_in;
1979    else if (qual->flags.q.out
1980 	    || (qual->flags.q.varying && (state->target == vertex_shader)))
1981       var->mode = ir_var_out;
1982    else if (qual->flags.q.uniform)
1983       var->mode = ir_var_uniform;
1984 
1985    if (state->all_invariant && (state->current_function == NULL)) {
1986       switch (state->target) {
1987       case vertex_shader:
1988 	 if (var->mode == ir_var_out)
1989 	    var->invariant = true;
1990 	 break;
1991       case geometry_shader:
1992 	 if ((var->mode == ir_var_in) || (var->mode == ir_var_out))
1993 	    var->invariant = true;
1994 	 break;
1995       case fragment_shader:
1996 	 if (var->mode == ir_var_in)
1997 	    var->invariant = true;
1998 	 break;
1999       }
2000    }
2001 
2002    if (qual->flags.q.flat)
2003       var->interpolation = INTERP_QUALIFIER_FLAT;
2004    else if (qual->flags.q.noperspective)
2005       var->interpolation = INTERP_QUALIFIER_NOPERSPECTIVE;
2006    else if (qual->flags.q.smooth)
2007       var->interpolation = INTERP_QUALIFIER_SMOOTH;
2008    else
2009       var->interpolation = INTERP_QUALIFIER_NONE;
2010 
2011    if (var->interpolation != INTERP_QUALIFIER_NONE &&
2012        !(state->target == vertex_shader && var->mode == ir_var_out) &&
2013        !(state->target == fragment_shader && var->mode == ir_var_in)) {
2014       _mesa_glsl_error(loc, state,
2015 		       "interpolation qualifier `%s' can only be applied to "
2016 		       "vertex shader outputs and fragment shader inputs.",
2017 		       var->interpolation_string());
2018    }
2019 
2020    var->pixel_center_integer = qual->flags.q.pixel_center_integer;
2021    var->origin_upper_left = qual->flags.q.origin_upper_left;
2022    if ((qual->flags.q.origin_upper_left || qual->flags.q.pixel_center_integer)
2023        && (strcmp(var->name, "gl_FragCoord") != 0)) {
2024       const char *const qual_string = (qual->flags.q.origin_upper_left)
2025 	 ? "origin_upper_left" : "pixel_center_integer";
2026 
2027       _mesa_glsl_error(loc, state,
2028 		       "layout qualifier `%s' can only be applied to "
2029 		       "fragment shader input `gl_FragCoord'",
2030 		       qual_string);
2031    }
2032 
2033    if (qual->flags.q.explicit_location) {
2034       const bool global_scope = (state->current_function == NULL);
2035       bool fail = false;
2036       const char *string = "";
2037 
2038       /* In the vertex shader only shader inputs can be given explicit
2039        * locations.
2040        *
2041        * In the fragment shader only shader outputs can be given explicit
2042        * locations.
2043        */
2044       switch (state->target) {
2045       case vertex_shader:
2046 	 if (!global_scope || (var->mode != ir_var_in)) {
2047 	    fail = true;
2048 	    string = "input";
2049 	 }
2050 	 break;
2051 
2052       case geometry_shader:
2053 	 _mesa_glsl_error(loc, state,
2054 			  "geometry shader variables cannot be given "
2055 			  "explicit locations\n");
2056 	 break;
2057 
2058       case fragment_shader:
2059 	 if (!global_scope || (var->mode != ir_var_out)) {
2060 	    fail = true;
2061 	    string = "output";
2062 	 }
2063 	 break;
2064       };
2065 
2066       if (fail) {
2067 	 _mesa_glsl_error(loc, state,
2068 			  "only %s shader %s variables can be given an "
2069 			  "explicit location\n",
2070 			  _mesa_glsl_shader_target_name(state->target),
2071 			  string);
2072       } else {
2073 	 var->explicit_location = true;
2074 
2075 	 /* This bit of silliness is needed because invalid explicit locations
2076 	  * are supposed to be flagged during linking.  Small negative values
2077 	  * biased by VERT_ATTRIB_GENERIC0 or FRAG_RESULT_DATA0 could alias
2078 	  * built-in values (e.g., -16+VERT_ATTRIB_GENERIC0 = VERT_ATTRIB_POS).
2079 	  * The linker needs to be able to differentiate these cases.  This
2080 	  * ensures that negative values stay negative.
2081 	  */
2082 	 if (qual->location >= 0) {
2083 	    var->location = (state->target == vertex_shader)
2084 	       ? (qual->location + VERT_ATTRIB_GENERIC0)
2085 	       : (qual->location + FRAG_RESULT_DATA0);
2086 	 } else {
2087 	    var->location = qual->location;
2088 	 }
2089 
2090 	 if (qual->flags.q.explicit_index) {
2091             /* From the GLSL 4.30 specification, section 4.4.2 (Output
2092              * Layout Qualifiers):
2093              *
2094              * "It is also a compile-time error if a fragment shader
2095              *  sets a layout index to less than 0 or greater than 1."
2096              *
2097              * Older specifications don't mandate a behavior; we take
2098              * this as a clarification and always generate the error.
2099              */
2100             if (qual->index < 0 || qual->index > 1) {
2101                _mesa_glsl_error(loc, state,
2102                                 "explicit index may only be 0 or 1\n");
2103             } else {
2104                var->explicit_index = true;
2105                var->index = qual->index;
2106             }
2107 	 }
2108       }
2109    } else if (qual->flags.q.explicit_index) {
2110 	 _mesa_glsl_error(loc, state,
2111 			  "explicit index requires explicit location\n");
2112    }
2113 
2114    /* Does the declaration use the 'layout' keyword?
2115     */
2116    const bool uses_layout = qual->flags.q.pixel_center_integer
2117       || qual->flags.q.origin_upper_left
2118       || qual->flags.q.explicit_location; /* no need for index since it relies on location */
2119 
2120    /* Does the declaration use the deprecated 'attribute' or 'varying'
2121     * keywords?
2122     */
2123    const bool uses_deprecated_qualifier = qual->flags.q.attribute
2124       || qual->flags.q.varying;
2125 
2126    /* Is the 'layout' keyword used with parameters that allow relaxed checking.
2127     * Many implementations of GL_ARB_fragment_coord_conventions_enable and some
2128     * implementations (only Mesa?) GL_ARB_explicit_attrib_location_enable
2129     * allowed the layout qualifier to be used with 'varying' and 'attribute'.
2130     * These extensions and all following extensions that add the 'layout'
2131     * keyword have been modified to require the use of 'in' or 'out'.
2132     *
2133     * The following extension do not allow the deprecated keywords:
2134     *
2135     *    GL_AMD_conservative_depth
2136     *    GL_ARB_conservative_depth
2137     *    GL_ARB_gpu_shader5
2138     *    GL_ARB_separate_shader_objects
2139     *    GL_ARB_tesselation_shader
2140     *    GL_ARB_transform_feedback3
2141     *    GL_ARB_uniform_buffer_object
2142     *
2143     * It is unknown whether GL_EXT_shader_image_load_store or GL_NV_gpu_shader5
2144     * allow layout with the deprecated keywords.
2145     */
2146    const bool relaxed_layout_qualifier_checking =
2147       state->ARB_fragment_coord_conventions_enable;
2148 
2149    if (uses_layout && uses_deprecated_qualifier) {
2150       if (relaxed_layout_qualifier_checking) {
2151 	 _mesa_glsl_warning(loc, state,
2152 			    "`layout' qualifier may not be used with "
2153 			    "`attribute' or `varying'");
2154       } else {
2155 	 _mesa_glsl_error(loc, state,
2156 			  "`layout' qualifier may not be used with "
2157 			  "`attribute' or `varying'");
2158       }
2159    }
2160 
2161    /* Layout qualifiers for gl_FragDepth, which are enabled by extension
2162     * AMD_conservative_depth.
2163     */
2164    int depth_layout_count = qual->flags.q.depth_any
2165       + qual->flags.q.depth_greater
2166       + qual->flags.q.depth_less
2167       + qual->flags.q.depth_unchanged;
2168    if (depth_layout_count > 0
2169        && !state->AMD_conservative_depth_enable
2170        && !state->ARB_conservative_depth_enable) {
2171        _mesa_glsl_error(loc, state,
2172                         "extension GL_AMD_conservative_depth or "
2173                         "GL_ARB_conservative_depth must be enabled "
2174 			"to use depth layout qualifiers");
2175    } else if (depth_layout_count > 0
2176               && strcmp(var->name, "gl_FragDepth") != 0) {
2177        _mesa_glsl_error(loc, state,
2178                         "depth layout qualifiers can be applied only to "
2179                         "gl_FragDepth");
2180    } else if (depth_layout_count > 1
2181               && strcmp(var->name, "gl_FragDepth") == 0) {
2182       _mesa_glsl_error(loc, state,
2183                        "at most one depth layout qualifier can be applied to "
2184                        "gl_FragDepth");
2185    }
2186    if (qual->flags.q.depth_any)
2187       var->depth_layout = ir_depth_layout_any;
2188    else if (qual->flags.q.depth_greater)
2189       var->depth_layout = ir_depth_layout_greater;
2190    else if (qual->flags.q.depth_less)
2191       var->depth_layout = ir_depth_layout_less;
2192    else if (qual->flags.q.depth_unchanged)
2193        var->depth_layout = ir_depth_layout_unchanged;
2194    else
2195        var->depth_layout = ir_depth_layout_none;
2196 
2197    if (qual->flags.q.std140 ||
2198        qual->flags.q.packed ||
2199        qual->flags.q.shared) {
2200       _mesa_glsl_error(loc, state,
2201                        "uniform block layout qualifiers std140, packed, and "
2202 		       "shared can only be applied to uniform blocks, not "
2203 		       "members");
2204    }
2205 
2206    if (!ubo_qualifiers_valid &&
2207        (qual->flags.q.row_major || qual->flags.q.column_major)) {
2208       _mesa_glsl_error(loc, state,
2209                        "uniform block layout qualifiers row_major and "
2210 		       "column_major can only be applied to uniform block "
2211 		       "members");
2212    }
2213 }
2214 
2215 /**
2216  * Get the variable that is being redeclared by this declaration
2217  *
2218  * Semantic checks to verify the validity of the redeclaration are also
2219  * performed.  If semantic checks fail, compilation error will be emitted via
2220  * \c _mesa_glsl_error, but a non-\c NULL pointer will still be returned.
2221  *
2222  * \returns
2223  * A pointer to an existing variable in the current scope if the declaration
2224  * is a redeclaration, \c NULL otherwise.
2225  */
2226 ir_variable *
get_variable_being_redeclared(ir_variable * var,ast_declaration * decl,struct _mesa_glsl_parse_state * state)2227 get_variable_being_redeclared(ir_variable *var, ast_declaration *decl,
2228 			      struct _mesa_glsl_parse_state *state)
2229 {
2230    /* Check if this declaration is actually a re-declaration, either to
2231     * resize an array or add qualifiers to an existing variable.
2232     *
2233     * This is allowed for variables in the current scope, or when at
2234     * global scope (for built-ins in the implicit outer scope).
2235     */
2236    ir_variable *earlier = state->symbols->get_variable(decl->identifier);
2237    if (earlier == NULL ||
2238        (state->current_function != NULL &&
2239 	!state->symbols->name_declared_this_scope(decl->identifier))) {
2240       return NULL;
2241    }
2242 
2243 
2244    YYLTYPE loc = decl->get_location();
2245 
2246    /* From page 24 (page 30 of the PDF) of the GLSL 1.50 spec,
2247     *
2248     * "It is legal to declare an array without a size and then
2249     *  later re-declare the same name as an array of the same
2250     *  type and specify a size."
2251     */
2252    if ((earlier->type->array_size() == 0)
2253        && var->type->is_array()
2254        && (var->type->element_type() == earlier->type->element_type())) {
2255       /* FINISHME: This doesn't match the qualifiers on the two
2256        * FINISHME: declarations.  It's not 100% clear whether this is
2257        * FINISHME: required or not.
2258        */
2259 
2260       const unsigned size = unsigned(var->type->array_size());
2261       check_builtin_array_max_size(var->name, size, loc, state);
2262       if ((size > 0) && (size <= earlier->max_array_access)) {
2263 	 _mesa_glsl_error(& loc, state, "array size must be > %u due to "
2264 			  "previous access",
2265 			  earlier->max_array_access);
2266       }
2267 
2268       earlier->type = var->type;
2269       delete var;
2270       var = NULL;
2271    } else if (state->ARB_fragment_coord_conventions_enable
2272 	      && strcmp(var->name, "gl_FragCoord") == 0
2273 	      && earlier->type == var->type
2274 	      && earlier->mode == var->mode) {
2275       /* Allow redeclaration of gl_FragCoord for ARB_fcc layout
2276        * qualifiers.
2277        */
2278       earlier->origin_upper_left = var->origin_upper_left;
2279       earlier->pixel_center_integer = var->pixel_center_integer;
2280 
2281       /* According to section 4.3.7 of the GLSL 1.30 spec,
2282        * the following built-in varaibles can be redeclared with an
2283        * interpolation qualifier:
2284        *    * gl_FrontColor
2285        *    * gl_BackColor
2286        *    * gl_FrontSecondaryColor
2287        *    * gl_BackSecondaryColor
2288        *    * gl_Color
2289        *    * gl_SecondaryColor
2290        */
2291    } else if (state->language_version >= 130
2292 	      && (strcmp(var->name, "gl_FrontColor") == 0
2293 		  || strcmp(var->name, "gl_BackColor") == 0
2294 		  || strcmp(var->name, "gl_FrontSecondaryColor") == 0
2295 		  || strcmp(var->name, "gl_BackSecondaryColor") == 0
2296 		  || strcmp(var->name, "gl_Color") == 0
2297 		  || strcmp(var->name, "gl_SecondaryColor") == 0)
2298 	      && earlier->type == var->type
2299 	      && earlier->mode == var->mode) {
2300       earlier->interpolation = var->interpolation;
2301 
2302       /* Layout qualifiers for gl_FragDepth. */
2303    } else if ((state->AMD_conservative_depth_enable ||
2304                state->ARB_conservative_depth_enable)
2305 	      && strcmp(var->name, "gl_FragDepth") == 0
2306 	      && earlier->type == var->type
2307 	      && earlier->mode == var->mode) {
2308 
2309       /** From the AMD_conservative_depth spec:
2310        *     Within any shader, the first redeclarations of gl_FragDepth
2311        *     must appear before any use of gl_FragDepth.
2312        */
2313       if (earlier->used) {
2314 	 _mesa_glsl_error(&loc, state,
2315 			  "the first redeclaration of gl_FragDepth "
2316 			  "must appear before any use of gl_FragDepth");
2317       }
2318 
2319       /* Prevent inconsistent redeclaration of depth layout qualifier. */
2320       if (earlier->depth_layout != ir_depth_layout_none
2321 	  && earlier->depth_layout != var->depth_layout) {
2322 	 _mesa_glsl_error(&loc, state,
2323 			  "gl_FragDepth: depth layout is declared here "
2324 			  "as '%s, but it was previously declared as "
2325 			  "'%s'",
2326 			  depth_layout_string(var->depth_layout),
2327 			  depth_layout_string(earlier->depth_layout));
2328       }
2329 
2330       earlier->depth_layout = var->depth_layout;
2331 
2332    } else {
2333       _mesa_glsl_error(&loc, state, "`%s' redeclared", decl->identifier);
2334    }
2335 
2336    return earlier;
2337 }
2338 
2339 /**
2340  * Generate the IR for an initializer in a variable declaration
2341  */
2342 ir_rvalue *
process_initializer(ir_variable * var,ast_declaration * decl,ast_fully_specified_type * type,exec_list * initializer_instructions,struct _mesa_glsl_parse_state * state)2343 process_initializer(ir_variable *var, ast_declaration *decl,
2344 		    ast_fully_specified_type *type,
2345 		    exec_list *initializer_instructions,
2346 		    struct _mesa_glsl_parse_state *state)
2347 {
2348    ir_rvalue *result = NULL;
2349 
2350    YYLTYPE initializer_loc = decl->initializer->get_location();
2351 
2352    /* From page 24 (page 30 of the PDF) of the GLSL 1.10 spec:
2353     *
2354     *    "All uniform variables are read-only and are initialized either
2355     *    directly by an application via API commands, or indirectly by
2356     *    OpenGL."
2357     */
2358    if ((state->language_version <= 110)
2359        && (var->mode == ir_var_uniform)) {
2360       _mesa_glsl_error(& initializer_loc, state,
2361 		       "cannot initialize uniforms in GLSL 1.10");
2362    }
2363 
2364    if (var->type->is_sampler()) {
2365       _mesa_glsl_error(& initializer_loc, state,
2366 		       "cannot initialize samplers");
2367    }
2368 
2369    if ((var->mode == ir_var_in) && (state->current_function == NULL)) {
2370       _mesa_glsl_error(& initializer_loc, state,
2371 		       "cannot initialize %s shader input / %s",
2372 		       _mesa_glsl_shader_target_name(state->target),
2373 		       (state->target == vertex_shader)
2374 		       ? "attribute" : "varying");
2375    }
2376 
2377    ir_dereference *const lhs = new(state) ir_dereference_variable(var);
2378    ir_rvalue *rhs = decl->initializer->hir(initializer_instructions,
2379 					   state);
2380 
2381    /* Calculate the constant value if this is a const or uniform
2382     * declaration.
2383     */
2384    if (type->qualifier.flags.q.constant
2385        || type->qualifier.flags.q.uniform) {
2386       ir_rvalue *new_rhs = validate_assignment(state, var->type, rhs, true);
2387       if (new_rhs != NULL) {
2388 	 rhs = new_rhs;
2389 
2390 	 ir_constant *constant_value = rhs->constant_expression_value();
2391 	 if (!constant_value) {
2392 	    _mesa_glsl_error(& initializer_loc, state,
2393 			     "initializer of %s variable `%s' must be a "
2394 			     "constant expression",
2395 			     (type->qualifier.flags.q.constant)
2396 			     ? "const" : "uniform",
2397 			     decl->identifier);
2398 	    if (var->type->is_numeric()) {
2399 	       /* Reduce cascading errors. */
2400 	       var->constant_value = ir_constant::zero(state, var->type);
2401 	    }
2402 	 } else {
2403 	    rhs = constant_value;
2404 	    var->constant_value = constant_value;
2405 	 }
2406       } else {
2407 	 _mesa_glsl_error(&initializer_loc, state,
2408 			  "initializer of type %s cannot be assigned to "
2409 			  "variable of type %s",
2410 			  rhs->type->name, var->type->name);
2411 	 if (var->type->is_numeric()) {
2412 	    /* Reduce cascading errors. */
2413 	    var->constant_value = ir_constant::zero(state, var->type);
2414 	 }
2415       }
2416    }
2417 
2418    if (rhs && !rhs->type->is_error()) {
2419       bool temp = var->read_only;
2420       if (type->qualifier.flags.q.constant)
2421 	 var->read_only = false;
2422 
2423       /* Never emit code to initialize a uniform.
2424        */
2425       const glsl_type *initializer_type;
2426       if (!type->qualifier.flags.q.uniform) {
2427 	 result = do_assignment(initializer_instructions, state,
2428 				NULL,
2429 				lhs, rhs, true,
2430 				type->get_location());
2431 	 initializer_type = result->type;
2432       } else
2433 	 initializer_type = rhs->type;
2434 
2435       var->constant_initializer = rhs->constant_expression_value();
2436       var->has_initializer = true;
2437 
2438       /* If the declared variable is an unsized array, it must inherrit
2439        * its full type from the initializer.  A declaration such as
2440        *
2441        *     uniform float a[] = float[](1.0, 2.0, 3.0, 3.0);
2442        *
2443        * becomes
2444        *
2445        *     uniform float a[4] = float[](1.0, 2.0, 3.0, 3.0);
2446        *
2447        * The assignment generated in the if-statement (below) will also
2448        * automatically handle this case for non-uniforms.
2449        *
2450        * If the declared variable is not an array, the types must
2451        * already match exactly.  As a result, the type assignment
2452        * here can be done unconditionally.  For non-uniforms the call
2453        * to do_assignment can change the type of the initializer (via
2454        * the implicit conversion rules).  For uniforms the initializer
2455        * must be a constant expression, and the type of that expression
2456        * was validated above.
2457        */
2458       var->type = initializer_type;
2459 
2460       var->read_only = temp;
2461    }
2462 
2463    return result;
2464 }
2465 
2466 ir_rvalue *
hir(exec_list * instructions,struct _mesa_glsl_parse_state * state)2467 ast_declarator_list::hir(exec_list *instructions,
2468 			 struct _mesa_glsl_parse_state *state)
2469 {
2470    void *ctx = state;
2471    const struct glsl_type *decl_type;
2472    const char *type_name = NULL;
2473    ir_rvalue *result = NULL;
2474    YYLTYPE loc = this->get_location();
2475 
2476    /* From page 46 (page 52 of the PDF) of the GLSL 1.50 spec:
2477     *
2478     *     "To ensure that a particular output variable is invariant, it is
2479     *     necessary to use the invariant qualifier. It can either be used to
2480     *     qualify a previously declared variable as being invariant
2481     *
2482     *         invariant gl_Position; // make existing gl_Position be invariant"
2483     *
2484     * In these cases the parser will set the 'invariant' flag in the declarator
2485     * list, and the type will be NULL.
2486     */
2487    if (this->invariant) {
2488       assert(this->type == NULL);
2489 
2490       if (state->current_function != NULL) {
2491 	 _mesa_glsl_error(& loc, state,
2492 			  "All uses of `invariant' keyword must be at global "
2493 			  "scope\n");
2494       }
2495 
2496       foreach_list_typed (ast_declaration, decl, link, &this->declarations) {
2497 	 assert(!decl->is_array);
2498 	 assert(decl->array_size == NULL);
2499 	 assert(decl->initializer == NULL);
2500 
2501 	 ir_variable *const earlier =
2502 	    state->symbols->get_variable(decl->identifier);
2503 	 if (earlier == NULL) {
2504 	    _mesa_glsl_error(& loc, state,
2505 			     "Undeclared variable `%s' cannot be marked "
2506 			     "invariant\n", decl->identifier);
2507 	 } else if ((state->target == vertex_shader)
2508 	       && (earlier->mode != ir_var_out)) {
2509 	    _mesa_glsl_error(& loc, state,
2510 			     "`%s' cannot be marked invariant, vertex shader "
2511 			     "outputs only\n", decl->identifier);
2512 	 } else if ((state->target == fragment_shader)
2513 	       && (earlier->mode != ir_var_in)) {
2514 	    _mesa_glsl_error(& loc, state,
2515 			     "`%s' cannot be marked invariant, fragment shader "
2516 			     "inputs only\n", decl->identifier);
2517 	 } else if (earlier->used) {
2518 	    _mesa_glsl_error(& loc, state,
2519 			     "variable `%s' may not be redeclared "
2520 			     "`invariant' after being used",
2521 			     earlier->name);
2522 	 } else {
2523 	    earlier->invariant = true;
2524 	 }
2525       }
2526 
2527       /* Invariant redeclarations do not have r-values.
2528        */
2529       return NULL;
2530    }
2531 
2532    assert(this->type != NULL);
2533    assert(!this->invariant);
2534 
2535    /* The type specifier may contain a structure definition.  Process that
2536     * before any of the variable declarations.
2537     */
2538    (void) this->type->specifier->hir(instructions, state);
2539 
2540    decl_type = this->type->specifier->glsl_type(& type_name, state);
2541    if (this->declarations.is_empty()) {
2542       /* If there is no structure involved in the program text, there are two
2543        * possible scenarios:
2544        *
2545        * - The program text contained something like 'vec4;'.  This is an
2546        *   empty declaration.  It is valid but weird.  Emit a warning.
2547        *
2548        * - The program text contained something like 'S;' and 'S' is not the
2549        *   name of a known structure type.  This is both invalid and weird.
2550        *   Emit an error.
2551        *
2552        * Note that if decl_type is NULL and there is a structure involved,
2553        * there must have been some sort of error with the structure.  In this
2554        * case we assume that an error was already generated on this line of
2555        * code for the structure.  There is no need to generate an additional,
2556        * confusing error.
2557        */
2558       assert(this->type->specifier->structure == NULL || decl_type != NULL
2559 	     || state->error);
2560       if (this->type->specifier->structure == NULL) {
2561 	 if (decl_type != NULL) {
2562 	    _mesa_glsl_warning(&loc, state, "empty declaration");
2563 	 } else {
2564 	    _mesa_glsl_error(&loc, state,
2565 			     "invalid type `%s' in empty declaration",
2566 			     type_name);
2567 	 }
2568       }
2569    }
2570 
2571    foreach_list_typed (ast_declaration, decl, link, &this->declarations) {
2572       const struct glsl_type *var_type;
2573       ir_variable *var;
2574 
2575       /* FINISHME: Emit a warning if a variable declaration shadows a
2576        * FINISHME: declaration at a higher scope.
2577        */
2578 
2579       if ((decl_type == NULL) || decl_type->is_void()) {
2580 	 if (type_name != NULL) {
2581 	    _mesa_glsl_error(& loc, state,
2582 			     "invalid type `%s' in declaration of `%s'",
2583 			     type_name, decl->identifier);
2584 	 } else {
2585 	    _mesa_glsl_error(& loc, state,
2586 			     "invalid type in declaration of `%s'",
2587 			     decl->identifier);
2588 	 }
2589 	 continue;
2590       }
2591 
2592       if (decl->is_array) {
2593 	 var_type = process_array_type(&loc, decl_type, decl->array_size,
2594 				       state);
2595 	 if (var_type->is_error())
2596 	    continue;
2597       } else {
2598 	 var_type = decl_type;
2599       }
2600 
2601       var = new(ctx) ir_variable(var_type, decl->identifier, ir_var_auto);
2602 
2603       /* From page 22 (page 28 of the PDF) of the GLSL 1.10 specification;
2604        *
2605        *     "Global variables can only use the qualifiers const,
2606        *     attribute, uni form, or varying. Only one may be
2607        *     specified.
2608        *
2609        *     Local variables can only use the qualifier const."
2610        *
2611        * This is relaxed in GLSL 1.30.  It is also relaxed by any extension
2612        * that adds the 'layout' keyword.
2613        */
2614       if ((state->language_version < 130)
2615 	  && !state->ARB_explicit_attrib_location_enable
2616 	  && !state->ARB_fragment_coord_conventions_enable) {
2617 	 if (this->type->qualifier.flags.q.out) {
2618 	    _mesa_glsl_error(& loc, state,
2619 			     "`out' qualifier in declaration of `%s' "
2620 			     "only valid for function parameters in %s.",
2621 			     decl->identifier, state->version_string);
2622 	 }
2623 	 if (this->type->qualifier.flags.q.in) {
2624 	    _mesa_glsl_error(& loc, state,
2625 			     "`in' qualifier in declaration of `%s' "
2626 			     "only valid for function parameters in %s.",
2627 			     decl->identifier, state->version_string);
2628 	 }
2629 	 /* FINISHME: Test for other invalid qualifiers. */
2630       }
2631 
2632       apply_type_qualifier_to_variable(& this->type->qualifier, var, state,
2633 				       & loc, this->ubo_qualifiers_valid);
2634 
2635       if (this->type->qualifier.flags.q.invariant) {
2636 	 if ((state->target == vertex_shader) && !(var->mode == ir_var_out ||
2637 						   var->mode == ir_var_inout)) {
2638 	    /* FINISHME: Note that this doesn't work for invariant on
2639 	     * a function signature outval
2640 	     */
2641 	    _mesa_glsl_error(& loc, state,
2642 			     "`%s' cannot be marked invariant, vertex shader "
2643 			     "outputs only\n", var->name);
2644 	 } else if ((state->target == fragment_shader) &&
2645 		    !(var->mode == ir_var_in || var->mode == ir_var_inout)) {
2646 	    /* FINISHME: Note that this doesn't work for invariant on
2647 	     * a function signature inval
2648 	     */
2649 	    _mesa_glsl_error(& loc, state,
2650 			     "`%s' cannot be marked invariant, fragment shader "
2651 			     "inputs only\n", var->name);
2652 	 }
2653       }
2654 
2655       if (state->current_function != NULL) {
2656 	 const char *mode = NULL;
2657 	 const char *extra = "";
2658 
2659 	 /* There is no need to check for 'inout' here because the parser will
2660 	  * only allow that in function parameter lists.
2661 	  */
2662 	 if (this->type->qualifier.flags.q.attribute) {
2663 	    mode = "attribute";
2664 	 } else if (this->type->qualifier.flags.q.uniform) {
2665 	    mode = "uniform";
2666 	 } else if (this->type->qualifier.flags.q.varying) {
2667 	    mode = "varying";
2668 	 } else if (this->type->qualifier.flags.q.in) {
2669 	    mode = "in";
2670 	    extra = " or in function parameter list";
2671 	 } else if (this->type->qualifier.flags.q.out) {
2672 	    mode = "out";
2673 	    extra = " or in function parameter list";
2674 	 }
2675 
2676 	 if (mode) {
2677 	    _mesa_glsl_error(& loc, state,
2678 			     "%s variable `%s' must be declared at "
2679 			     "global scope%s",
2680 			     mode, var->name, extra);
2681 	 }
2682       } else if (var->mode == ir_var_in) {
2683          var->read_only = true;
2684 
2685 	 if (state->target == vertex_shader) {
2686 	    bool error_emitted = false;
2687 
2688 	    /* From page 31 (page 37 of the PDF) of the GLSL 1.50 spec:
2689 	     *
2690 	     *    "Vertex shader inputs can only be float, floating-point
2691 	     *    vectors, matrices, signed and unsigned integers and integer
2692 	     *    vectors. Vertex shader inputs can also form arrays of these
2693 	     *    types, but not structures."
2694 	     *
2695 	     * From page 31 (page 27 of the PDF) of the GLSL 1.30 spec:
2696 	     *
2697 	     *    "Vertex shader inputs can only be float, floating-point
2698 	     *    vectors, matrices, signed and unsigned integers and integer
2699 	     *    vectors. They cannot be arrays or structures."
2700 	     *
2701 	     * From page 23 (page 29 of the PDF) of the GLSL 1.20 spec:
2702 	     *
2703 	     *    "The attribute qualifier can be used only with float,
2704 	     *    floating-point vectors, and matrices. Attribute variables
2705 	     *    cannot be declared as arrays or structures."
2706 	     */
2707 	    const glsl_type *check_type = var->type->is_array()
2708 	       ? var->type->fields.array : var->type;
2709 
2710 	    switch (check_type->base_type) {
2711 	    case GLSL_TYPE_FLOAT:
2712 	       break;
2713 	    case GLSL_TYPE_UINT:
2714 	    case GLSL_TYPE_INT:
2715 	       if (state->language_version > 120)
2716 		  break;
2717 	       /* FALLTHROUGH */
2718 	    default:
2719 	       _mesa_glsl_error(& loc, state,
2720 				"vertex shader input / attribute cannot have "
2721 				"type %s`%s'",
2722 				var->type->is_array() ? "array of " : "",
2723 				check_type->name);
2724 	       error_emitted = true;
2725 	    }
2726 
2727 	    if (!error_emitted && (state->language_version <= 130)
2728 		&& var->type->is_array()) {
2729 	       _mesa_glsl_error(& loc, state,
2730 				"vertex shader input / attribute cannot have "
2731 				"array type");
2732 	       error_emitted = true;
2733 	    }
2734 	 }
2735       }
2736 
2737       /* Integer vertex outputs must be qualified with 'flat'.
2738        *
2739        * From section 4.3.6 of the GLSL 1.30 spec:
2740        *    "If a vertex output is a signed or unsigned integer or integer
2741        *    vector, then it must be qualified with the interpolation qualifier
2742        *    flat."
2743        */
2744       if (state->language_version >= 130
2745           && state->target == vertex_shader
2746           && state->current_function == NULL
2747           && var->type->is_integer()
2748           && var->mode == ir_var_out
2749           && var->interpolation != INTERP_QUALIFIER_FLAT) {
2750 
2751          _mesa_glsl_error(&loc, state, "If a vertex output is an integer, "
2752                           "then it must be qualified with 'flat'");
2753       }
2754 
2755 
2756       /* Interpolation qualifiers cannot be applied to 'centroid' and
2757        * 'centroid varying'.
2758        *
2759        * From page 29 (page 35 of the PDF) of the GLSL 1.30 spec:
2760        *    "interpolation qualifiers may only precede the qualifiers in,
2761        *    centroid in, out, or centroid out in a declaration. They do not apply
2762        *    to the deprecated storage qualifiers varying or centroid varying."
2763        */
2764       if (state->language_version >= 130
2765           && this->type->qualifier.has_interpolation()
2766           && this->type->qualifier.flags.q.varying) {
2767 
2768          const char *i = this->type->qualifier.interpolation_string();
2769          assert(i != NULL);
2770          const char *s;
2771          if (this->type->qualifier.flags.q.centroid)
2772             s = "centroid varying";
2773          else
2774             s = "varying";
2775 
2776          _mesa_glsl_error(&loc, state,
2777                           "qualifier '%s' cannot be applied to the "
2778                           "deprecated storage qualifier '%s'", i, s);
2779       }
2780 
2781 
2782       /* Interpolation qualifiers can only apply to vertex shader outputs and
2783        * fragment shader inputs.
2784        *
2785        * From page 29 (page 35 of the PDF) of the GLSL 1.30 spec:
2786        *    "Outputs from a vertex shader (out) and inputs to a fragment
2787        *    shader (in) can be further qualified with one or more of these
2788        *    interpolation qualifiers"
2789        */
2790       if (state->language_version >= 130
2791           && this->type->qualifier.has_interpolation()) {
2792 
2793          const char *i = this->type->qualifier.interpolation_string();
2794          assert(i != NULL);
2795 
2796          switch (state->target) {
2797          case vertex_shader:
2798             if (this->type->qualifier.flags.q.in) {
2799                _mesa_glsl_error(&loc, state,
2800                                 "qualifier '%s' cannot be applied to vertex "
2801                                 "shader inputs", i);
2802             }
2803             break;
2804          case fragment_shader:
2805             if (this->type->qualifier.flags.q.out) {
2806                _mesa_glsl_error(&loc, state,
2807                                 "qualifier '%s' cannot be applied to fragment "
2808                                 "shader outputs", i);
2809             }
2810             break;
2811          default:
2812             assert(0);
2813          }
2814       }
2815 
2816 
2817       /* From section 4.3.4 of the GLSL 1.30 spec:
2818        *    "It is an error to use centroid in in a vertex shader."
2819        */
2820       if (state->language_version >= 130
2821           && this->type->qualifier.flags.q.centroid
2822           && this->type->qualifier.flags.q.in
2823           && state->target == vertex_shader) {
2824 
2825          _mesa_glsl_error(&loc, state,
2826                           "'centroid in' cannot be used in a vertex shader");
2827       }
2828 
2829 
2830       /* Precision qualifiers exists only in GLSL versions 1.00 and >= 1.30.
2831        */
2832       if (this->type->specifier->precision != ast_precision_none
2833           && state->language_version != 100
2834           && state->language_version < 130) {
2835 
2836          _mesa_glsl_error(&loc, state,
2837                           "precision qualifiers are supported only in GLSL ES "
2838                           "1.00, and GLSL 1.30 and later");
2839       }
2840 
2841 
2842       /* Precision qualifiers only apply to floating point and integer types.
2843        *
2844        * From section 4.5.2 of the GLSL 1.30 spec:
2845        *    "Any floating point or any integer declaration can have the type
2846        *    preceded by one of these precision qualifiers [...] Literal
2847        *    constants do not have precision qualifiers. Neither do Boolean
2848        *    variables.
2849        *
2850        * In GLSL ES, sampler types are also allowed.
2851        *
2852        * From page 87 of the GLSL ES spec:
2853        *    "RESOLUTION: Allow sampler types to take a precision qualifier."
2854        */
2855       if (this->type->specifier->precision != ast_precision_none
2856           && !var->type->is_float()
2857           && !var->type->is_integer()
2858           && !(var->type->is_sampler() && state->es_shader)
2859           && !(var->type->is_array()
2860                && (var->type->fields.array->is_float()
2861                    || var->type->fields.array->is_integer()))) {
2862 
2863          _mesa_glsl_error(&loc, state,
2864                           "precision qualifiers apply only to floating point"
2865                           "%s types", state->es_shader ? ", integer, and sampler"
2866 						       : "and integer");
2867       }
2868 
2869       /* From page 17 (page 23 of the PDF) of the GLSL 1.20 spec:
2870        *
2871        *    "[Sampler types] can only be declared as function
2872        *    parameters or uniform variables (see Section 4.3.5
2873        *    "Uniform")".
2874        */
2875       if (var_type->contains_sampler() &&
2876           !this->type->qualifier.flags.q.uniform) {
2877          _mesa_glsl_error(&loc, state, "samplers must be declared uniform");
2878       }
2879 
2880       /* Process the initializer and add its instructions to a temporary
2881        * list.  This list will be added to the instruction stream (below) after
2882        * the declaration is added.  This is done because in some cases (such as
2883        * redeclarations) the declaration may not actually be added to the
2884        * instruction stream.
2885        */
2886       exec_list initializer_instructions;
2887       ir_variable *earlier = get_variable_being_redeclared(var, decl, state);
2888 
2889       if (decl->initializer != NULL) {
2890 	 result = process_initializer((earlier == NULL) ? var : earlier,
2891 				      decl, this->type,
2892 				      &initializer_instructions, state);
2893       }
2894 
2895       /* From page 23 (page 29 of the PDF) of the GLSL 1.10 spec:
2896        *
2897        *     "It is an error to write to a const variable outside of
2898        *      its declaration, so they must be initialized when
2899        *      declared."
2900        */
2901       if (this->type->qualifier.flags.q.constant && decl->initializer == NULL) {
2902 	 _mesa_glsl_error(& loc, state,
2903 			  "const declaration of `%s' must be initialized",
2904 			  decl->identifier);
2905       }
2906 
2907       /* If the declaration is not a redeclaration, there are a few additional
2908        * semantic checks that must be applied.  In addition, variable that was
2909        * created for the declaration should be added to the IR stream.
2910        */
2911       if (earlier == NULL) {
2912 	 /* From page 15 (page 21 of the PDF) of the GLSL 1.10 spec,
2913 	  *
2914 	  *   "Identifiers starting with "gl_" are reserved for use by
2915 	  *   OpenGL, and may not be declared in a shader as either a
2916 	  *   variable or a function."
2917 	  */
2918 	 if (strncmp(decl->identifier, "gl_", 3) == 0)
2919 	    _mesa_glsl_error(& loc, state,
2920 			     "identifier `%s' uses reserved `gl_' prefix",
2921 			     decl->identifier);
2922 	 else if (strstr(decl->identifier, "__")) {
2923 	    /* From page 14 (page 20 of the PDF) of the GLSL 1.10
2924 	     * spec:
2925 	     *
2926 	     *     "In addition, all identifiers containing two
2927 	     *      consecutive underscores (__) are reserved as
2928 	     *      possible future keywords."
2929 	     */
2930 	    _mesa_glsl_error(& loc, state,
2931 			     "identifier `%s' uses reserved `__' string",
2932 			     decl->identifier);
2933 	 }
2934 
2935 	 /* Add the variable to the symbol table.  Note that the initializer's
2936 	  * IR was already processed earlier (though it hasn't been emitted
2937 	  * yet), without the variable in scope.
2938 	  *
2939 	  * This differs from most C-like languages, but it follows the GLSL
2940 	  * specification.  From page 28 (page 34 of the PDF) of the GLSL 1.50
2941 	  * spec:
2942 	  *
2943 	  *     "Within a declaration, the scope of a name starts immediately
2944 	  *     after the initializer if present or immediately after the name
2945 	  *     being declared if not."
2946 	  */
2947 	 if (!state->symbols->add_variable(var)) {
2948 	    YYLTYPE loc = this->get_location();
2949 	    _mesa_glsl_error(&loc, state, "name `%s' already taken in the "
2950 			     "current scope", decl->identifier);
2951 	    continue;
2952 	 }
2953 
2954 	 /* Push the variable declaration to the top.  It means that all the
2955 	  * variable declarations will appear in a funny last-to-first order,
2956 	  * but otherwise we run into trouble if a function is prototyped, a
2957 	  * global var is decled, then the function is defined with usage of
2958 	  * the global var.  See glslparsertest's CorrectModule.frag.
2959 	  */
2960 	 instructions->push_head(var);
2961       }
2962 
2963       instructions->append_list(&initializer_instructions);
2964    }
2965 
2966 
2967    /* Generally, variable declarations do not have r-values.  However,
2968     * one is used for the declaration in
2969     *
2970     * while (bool b = some_condition()) {
2971     *   ...
2972     * }
2973     *
2974     * so we return the rvalue from the last seen declaration here.
2975     */
2976    return result;
2977 }
2978 
2979 
2980 ir_rvalue *
hir(exec_list * instructions,struct _mesa_glsl_parse_state * state)2981 ast_parameter_declarator::hir(exec_list *instructions,
2982 			      struct _mesa_glsl_parse_state *state)
2983 {
2984    void *ctx = state;
2985    const struct glsl_type *type;
2986    const char *name = NULL;
2987    YYLTYPE loc = this->get_location();
2988 
2989    type = this->type->specifier->glsl_type(& name, state);
2990 
2991    if (type == NULL) {
2992       if (name != NULL) {
2993 	 _mesa_glsl_error(& loc, state,
2994 			  "invalid type `%s' in declaration of `%s'",
2995 			  name, this->identifier);
2996       } else {
2997 	 _mesa_glsl_error(& loc, state,
2998 			  "invalid type in declaration of `%s'",
2999 			  this->identifier);
3000       }
3001 
3002       type = glsl_type::error_type;
3003    }
3004 
3005    /* From page 62 (page 68 of the PDF) of the GLSL 1.50 spec:
3006     *
3007     *    "Functions that accept no input arguments need not use void in the
3008     *    argument list because prototypes (or definitions) are required and
3009     *    therefore there is no ambiguity when an empty argument list "( )" is
3010     *    declared. The idiom "(void)" as a parameter list is provided for
3011     *    convenience."
3012     *
3013     * Placing this check here prevents a void parameter being set up
3014     * for a function, which avoids tripping up checks for main taking
3015     * parameters and lookups of an unnamed symbol.
3016     */
3017    if (type->is_void()) {
3018       if (this->identifier != NULL)
3019 	 _mesa_glsl_error(& loc, state,
3020 			  "named parameter cannot have type `void'");
3021 
3022       is_void = true;
3023       return NULL;
3024    }
3025 
3026    if (formal_parameter && (this->identifier == NULL)) {
3027       _mesa_glsl_error(& loc, state, "formal parameter lacks a name");
3028       return NULL;
3029    }
3030 
3031    /* This only handles "vec4 foo[..]".  The earlier specifier->glsl_type(...)
3032     * call already handled the "vec4[..] foo" case.
3033     */
3034    if (this->is_array) {
3035       type = process_array_type(&loc, type, this->array_size, state);
3036    }
3037 
3038    if (!type->is_error() && type->array_size() == 0) {
3039       _mesa_glsl_error(&loc, state, "arrays passed as parameters must have "
3040 		       "a declared size.");
3041       type = glsl_type::error_type;
3042    }
3043 
3044    is_void = false;
3045    ir_variable *var = new(ctx) ir_variable(type, this->identifier, ir_var_in);
3046 
3047    /* Apply any specified qualifiers to the parameter declaration.  Note that
3048     * for function parameters the default mode is 'in'.
3049     */
3050    apply_type_qualifier_to_variable(& this->type->qualifier, var, state, & loc,
3051 				    false);
3052 
3053    /* From page 17 (page 23 of the PDF) of the GLSL 1.20 spec:
3054     *
3055     *    "Samplers cannot be treated as l-values; hence cannot be used
3056     *    as out or inout function parameters, nor can they be assigned
3057     *    into."
3058     */
3059    if ((var->mode == ir_var_inout || var->mode == ir_var_out)
3060        && type->contains_sampler()) {
3061       _mesa_glsl_error(&loc, state, "out and inout parameters cannot contain samplers");
3062       type = glsl_type::error_type;
3063    }
3064 
3065    /* From page 39 (page 45 of the PDF) of the GLSL 1.10 spec:
3066     *
3067     *    "When calling a function, expressions that do not evaluate to
3068     *     l-values cannot be passed to parameters declared as out or inout."
3069     *
3070     * From page 32 (page 38 of the PDF) of the GLSL 1.10 spec:
3071     *
3072     *    "Other binary or unary expressions, non-dereferenced arrays,
3073     *     function names, swizzles with repeated fields, and constants
3074     *     cannot be l-values."
3075     *
3076     * So for GLSL 1.10, passing an array as an out or inout parameter is not
3077     * allowed.  This restriction is removed in GLSL 1.20, and in GLSL ES.
3078     */
3079    if ((var->mode == ir_var_inout || var->mode == ir_var_out)
3080        && type->is_array() && state->language_version == 110) {
3081       _mesa_glsl_error(&loc, state, "Arrays cannot be out or inout parameters in GLSL 1.10");
3082       type = glsl_type::error_type;
3083    }
3084 
3085    instructions->push_tail(var);
3086 
3087    /* Parameter declarations do not have r-values.
3088     */
3089    return NULL;
3090 }
3091 
3092 
3093 void
parameters_to_hir(exec_list * ast_parameters,bool formal,exec_list * ir_parameters,_mesa_glsl_parse_state * state)3094 ast_parameter_declarator::parameters_to_hir(exec_list *ast_parameters,
3095 					    bool formal,
3096 					    exec_list *ir_parameters,
3097 					    _mesa_glsl_parse_state *state)
3098 {
3099    ast_parameter_declarator *void_param = NULL;
3100    unsigned count = 0;
3101 
3102    foreach_list_typed (ast_parameter_declarator, param, link, ast_parameters) {
3103       param->formal_parameter = formal;
3104       param->hir(ir_parameters, state);
3105 
3106       if (param->is_void)
3107 	 void_param = param;
3108 
3109       count++;
3110    }
3111 
3112    if ((void_param != NULL) && (count > 1)) {
3113       YYLTYPE loc = void_param->get_location();
3114 
3115       _mesa_glsl_error(& loc, state,
3116 		       "`void' parameter must be only parameter");
3117    }
3118 }
3119 
3120 
3121 void
emit_function(_mesa_glsl_parse_state * state,ir_function * f)3122 emit_function(_mesa_glsl_parse_state *state, ir_function *f)
3123 {
3124    /* IR invariants disallow function declarations or definitions
3125     * nested within other function definitions.  But there is no
3126     * requirement about the relative order of function declarations
3127     * and definitions with respect to one another.  So simply insert
3128     * the new ir_function block at the end of the toplevel instruction
3129     * list.
3130     */
3131    state->toplevel_ir->push_tail(f);
3132 }
3133 
3134 
3135 ir_rvalue *
hir(exec_list * instructions,struct _mesa_glsl_parse_state * state)3136 ast_function::hir(exec_list *instructions,
3137 		  struct _mesa_glsl_parse_state *state)
3138 {
3139    void *ctx = state;
3140    ir_function *f = NULL;
3141    ir_function_signature *sig = NULL;
3142    exec_list hir_parameters;
3143 
3144    const char *const name = identifier;
3145 
3146    /* New functions are always added to the top-level IR instruction stream,
3147     * so this instruction list pointer is ignored.  See also emit_function
3148     * (called below).
3149     */
3150    (void) instructions;
3151 
3152    /* From page 21 (page 27 of the PDF) of the GLSL 1.20 spec,
3153     *
3154     *   "Function declarations (prototypes) cannot occur inside of functions;
3155     *   they must be at global scope, or for the built-in functions, outside
3156     *   the global scope."
3157     *
3158     * From page 27 (page 33 of the PDF) of the GLSL ES 1.00.16 spec,
3159     *
3160     *   "User defined functions may only be defined within the global scope."
3161     *
3162     * Note that this language does not appear in GLSL 1.10.
3163     */
3164    if ((state->current_function != NULL) && (state->language_version != 110)) {
3165       YYLTYPE loc = this->get_location();
3166       _mesa_glsl_error(&loc, state,
3167 		       "declaration of function `%s' not allowed within "
3168 		       "function body", name);
3169    }
3170 
3171    /* From page 15 (page 21 of the PDF) of the GLSL 1.10 spec,
3172     *
3173     *   "Identifiers starting with "gl_" are reserved for use by
3174     *   OpenGL, and may not be declared in a shader as either a
3175     *   variable or a function."
3176     */
3177    if (strncmp(name, "gl_", 3) == 0) {
3178       YYLTYPE loc = this->get_location();
3179       _mesa_glsl_error(&loc, state,
3180 		       "identifier `%s' uses reserved `gl_' prefix", name);
3181    }
3182 
3183    /* Convert the list of function parameters to HIR now so that they can be
3184     * used below to compare this function's signature with previously seen
3185     * signatures for functions with the same name.
3186     */
3187    ast_parameter_declarator::parameters_to_hir(& this->parameters,
3188 					       is_definition,
3189 					       & hir_parameters, state);
3190 
3191    const char *return_type_name;
3192    const glsl_type *return_type =
3193       this->return_type->specifier->glsl_type(& return_type_name, state);
3194 
3195    if (!return_type) {
3196       YYLTYPE loc = this->get_location();
3197       _mesa_glsl_error(&loc, state,
3198 		       "function `%s' has undeclared return type `%s'",
3199 		       name, return_type_name);
3200       return_type = glsl_type::error_type;
3201    }
3202 
3203    /* From page 56 (page 62 of the PDF) of the GLSL 1.30 spec:
3204     * "No qualifier is allowed on the return type of a function."
3205     */
3206    if (this->return_type->has_qualifiers()) {
3207       YYLTYPE loc = this->get_location();
3208       _mesa_glsl_error(& loc, state,
3209 		       "function `%s' return type has qualifiers", name);
3210    }
3211 
3212    /* From page 17 (page 23 of the PDF) of the GLSL 1.20 spec:
3213     *
3214     *    "[Sampler types] can only be declared as function parameters
3215     *    or uniform variables (see Section 4.3.5 "Uniform")".
3216     */
3217    if (return_type->contains_sampler()) {
3218       YYLTYPE loc = this->get_location();
3219       _mesa_glsl_error(&loc, state,
3220                        "function `%s' return type can't contain a sampler",
3221                        name);
3222    }
3223 
3224    /* Verify that this function's signature either doesn't match a previously
3225     * seen signature for a function with the same name, or, if a match is found,
3226     * that the previously seen signature does not have an associated definition.
3227     */
3228    f = state->symbols->get_function(name);
3229    if (f != NULL && (state->es_shader || f->has_user_signature())) {
3230       sig = f->exact_matching_signature(&hir_parameters);
3231       if (sig != NULL) {
3232 	 const char *badvar = sig->qualifiers_match(&hir_parameters);
3233 	 if (badvar != NULL) {
3234 	    YYLTYPE loc = this->get_location();
3235 
3236 	    _mesa_glsl_error(&loc, state, "function `%s' parameter `%s' "
3237 			     "qualifiers don't match prototype", name, badvar);
3238 	 }
3239 
3240 	 if (sig->return_type != return_type) {
3241 	    YYLTYPE loc = this->get_location();
3242 
3243 	    _mesa_glsl_error(&loc, state, "function `%s' return type doesn't "
3244 			     "match prototype", name);
3245 	 }
3246 
3247 	 if (is_definition && sig->is_defined) {
3248 	    YYLTYPE loc = this->get_location();
3249 
3250 	    _mesa_glsl_error(& loc, state, "function `%s' redefined", name);
3251 	 }
3252       }
3253    } else {
3254       f = new(ctx) ir_function(name);
3255       if (!state->symbols->add_function(f)) {
3256 	 /* This function name shadows a non-function use of the same name. */
3257 	 YYLTYPE loc = this->get_location();
3258 
3259 	 _mesa_glsl_error(&loc, state, "function name `%s' conflicts with "
3260 			  "non-function", name);
3261 	 return NULL;
3262       }
3263 
3264       emit_function(state, f);
3265    }
3266 
3267    /* Verify the return type of main() */
3268    if (strcmp(name, "main") == 0) {
3269       if (! return_type->is_void()) {
3270 	 YYLTYPE loc = this->get_location();
3271 
3272 	 _mesa_glsl_error(& loc, state, "main() must return void");
3273       }
3274 
3275       if (!hir_parameters.is_empty()) {
3276 	 YYLTYPE loc = this->get_location();
3277 
3278 	 _mesa_glsl_error(& loc, state, "main() must not take any parameters");
3279       }
3280    }
3281 
3282    /* Finish storing the information about this new function in its signature.
3283     */
3284    if (sig == NULL) {
3285       sig = new(ctx) ir_function_signature(return_type);
3286       f->add_signature(sig);
3287    }
3288 
3289    sig->replace_parameters(&hir_parameters);
3290    signature = sig;
3291 
3292    /* Function declarations (prototypes) do not have r-values.
3293     */
3294    return NULL;
3295 }
3296 
3297 
3298 ir_rvalue *
hir(exec_list * instructions,struct _mesa_glsl_parse_state * state)3299 ast_function_definition::hir(exec_list *instructions,
3300 			     struct _mesa_glsl_parse_state *state)
3301 {
3302    prototype->is_definition = true;
3303    prototype->hir(instructions, state);
3304 
3305    ir_function_signature *signature = prototype->signature;
3306    if (signature == NULL)
3307       return NULL;
3308 
3309    assert(state->current_function == NULL);
3310    state->current_function = signature;
3311    state->found_return = false;
3312 
3313    /* Duplicate parameters declared in the prototype as concrete variables.
3314     * Add these to the symbol table.
3315     */
3316    state->symbols->push_scope();
3317    foreach_iter(exec_list_iterator, iter, signature->parameters) {
3318       ir_variable *const var = ((ir_instruction *) iter.get())->as_variable();
3319 
3320       assert(var != NULL);
3321 
3322       /* The only way a parameter would "exist" is if two parameters have
3323        * the same name.
3324        */
3325       if (state->symbols->name_declared_this_scope(var->name)) {
3326 	 YYLTYPE loc = this->get_location();
3327 
3328 	 _mesa_glsl_error(& loc, state, "parameter `%s' redeclared", var->name);
3329       } else {
3330 	 state->symbols->add_variable(var);
3331       }
3332    }
3333 
3334    /* Convert the body of the function to HIR. */
3335    this->body->hir(&signature->body, state);
3336    signature->is_defined = true;
3337 
3338    state->symbols->pop_scope();
3339 
3340    assert(state->current_function == signature);
3341    state->current_function = NULL;
3342 
3343    if (!signature->return_type->is_void() && !state->found_return) {
3344       YYLTYPE loc = this->get_location();
3345       _mesa_glsl_error(& loc, state, "function `%s' has non-void return type "
3346 		       "%s, but no return statement",
3347 		       signature->function_name(),
3348 		       signature->return_type->name);
3349    }
3350 
3351    /* Function definitions do not have r-values.
3352     */
3353    return NULL;
3354 }
3355 
3356 
3357 ir_rvalue *
hir(exec_list * instructions,struct _mesa_glsl_parse_state * state)3358 ast_jump_statement::hir(exec_list *instructions,
3359 			struct _mesa_glsl_parse_state *state)
3360 {
3361    void *ctx = state;
3362 
3363    switch (mode) {
3364    case ast_return: {
3365       ir_return *inst;
3366       assert(state->current_function);
3367 
3368       if (opt_return_value) {
3369 	 ir_rvalue *const ret = opt_return_value->hir(instructions, state);
3370 
3371 	 /* The value of the return type can be NULL if the shader says
3372 	  * 'return foo();' and foo() is a function that returns void.
3373 	  *
3374 	  * NOTE: The GLSL spec doesn't say that this is an error.  The type
3375 	  * of the return value is void.  If the return type of the function is
3376 	  * also void, then this should compile without error.  Seriously.
3377 	  */
3378 	 const glsl_type *const ret_type =
3379 	    (ret == NULL) ? glsl_type::void_type : ret->type;
3380 
3381 	 /* Implicit conversions are not allowed for return values. */
3382 	 if (state->current_function->return_type != ret_type) {
3383 	    YYLTYPE loc = this->get_location();
3384 
3385 	    _mesa_glsl_error(& loc, state,
3386 			     "`return' with wrong type %s, in function `%s' "
3387 			     "returning %s",
3388 			     ret_type->name,
3389 			     state->current_function->function_name(),
3390 			     state->current_function->return_type->name);
3391 	 }
3392 
3393 	 inst = new(ctx) ir_return(ret);
3394       } else {
3395 	 if (state->current_function->return_type->base_type !=
3396 	     GLSL_TYPE_VOID) {
3397 	    YYLTYPE loc = this->get_location();
3398 
3399 	    _mesa_glsl_error(& loc, state,
3400 			     "`return' with no value, in function %s returning "
3401 			     "non-void",
3402 			     state->current_function->function_name());
3403 	 }
3404 	 inst = new(ctx) ir_return;
3405       }
3406 
3407       state->found_return = true;
3408       instructions->push_tail(inst);
3409       break;
3410    }
3411 
3412    case ast_discard:
3413       if (state->target != fragment_shader) {
3414 	 YYLTYPE loc = this->get_location();
3415 
3416 	 _mesa_glsl_error(& loc, state,
3417 			  "`discard' may only appear in a fragment shader");
3418       }
3419       instructions->push_tail(new(ctx) ir_discard);
3420       break;
3421 
3422    case ast_break:
3423    case ast_continue:
3424       if (mode == ast_continue &&
3425 	  state->loop_nesting_ast == NULL) {
3426 	 YYLTYPE loc = this->get_location();
3427 
3428 	 _mesa_glsl_error(& loc, state,
3429 			  "continue may only appear in a loop");
3430       } else if (mode == ast_break &&
3431 		 state->loop_nesting_ast == NULL &&
3432 		 state->switch_state.switch_nesting_ast == NULL) {
3433 	 YYLTYPE loc = this->get_location();
3434 
3435 	 _mesa_glsl_error(& loc, state,
3436 			  "break may only appear in a loop or a switch");
3437       } else {
3438 	 /* For a loop, inline the for loop expression again,
3439 	  * since we don't know where near the end of
3440 	  * the loop body the normal copy of it
3441 	  * is going to be placed.
3442 	  */
3443 	 if (state->loop_nesting_ast != NULL &&
3444 	     mode == ast_continue &&
3445 	     state->loop_nesting_ast->rest_expression) {
3446 	    state->loop_nesting_ast->rest_expression->hir(instructions,
3447 							  state);
3448 	 }
3449 
3450 	 if (state->switch_state.is_switch_innermost &&
3451 	     mode == ast_break) {
3452 	    /* Force break out of switch by setting is_break switch state.
3453 	     */
3454 	    ir_variable *const is_break_var = state->switch_state.is_break_var;
3455 	    ir_dereference_variable *const deref_is_break_var =
3456 	       new(ctx) ir_dereference_variable(is_break_var);
3457 	    ir_constant *const true_val = new(ctx) ir_constant(true);
3458 	    ir_assignment *const set_break_var =
3459 	       new(ctx) ir_assignment(deref_is_break_var, true_val);
3460 
3461 	    instructions->push_tail(set_break_var);
3462 	 }
3463 	 else {
3464 	    ir_loop_jump *const jump =
3465 	       new(ctx) ir_loop_jump((mode == ast_break)
3466 				     ? ir_loop_jump::jump_break
3467 				     : ir_loop_jump::jump_continue);
3468 	    instructions->push_tail(jump);
3469 	 }
3470       }
3471 
3472       break;
3473    }
3474 
3475    /* Jump instructions do not have r-values.
3476     */
3477    return NULL;
3478 }
3479 
3480 
3481 ir_rvalue *
hir(exec_list * instructions,struct _mesa_glsl_parse_state * state)3482 ast_selection_statement::hir(exec_list *instructions,
3483 			     struct _mesa_glsl_parse_state *state)
3484 {
3485    void *ctx = state;
3486 
3487    ir_rvalue *const condition = this->condition->hir(instructions, state);
3488 
3489    /* From page 66 (page 72 of the PDF) of the GLSL 1.50 spec:
3490     *
3491     *    "Any expression whose type evaluates to a Boolean can be used as the
3492     *    conditional expression bool-expression. Vector types are not accepted
3493     *    as the expression to if."
3494     *
3495     * The checks are separated so that higher quality diagnostics can be
3496     * generated for cases where both rules are violated.
3497     */
3498    if (!condition->type->is_boolean() || !condition->type->is_scalar()) {
3499       YYLTYPE loc = this->condition->get_location();
3500 
3501       _mesa_glsl_error(& loc, state, "if-statement condition must be scalar "
3502 		       "boolean");
3503    }
3504 
3505    ir_if *const stmt = new(ctx) ir_if(condition);
3506 
3507    if (then_statement != NULL) {
3508       state->symbols->push_scope();
3509       then_statement->hir(& stmt->then_instructions, state);
3510       state->symbols->pop_scope();
3511    }
3512 
3513    if (else_statement != NULL) {
3514       state->symbols->push_scope();
3515       else_statement->hir(& stmt->else_instructions, state);
3516       state->symbols->pop_scope();
3517    }
3518 
3519    instructions->push_tail(stmt);
3520 
3521    /* if-statements do not have r-values.
3522     */
3523    return NULL;
3524 }
3525 
3526 
3527 ir_rvalue *
hir(exec_list * instructions,struct _mesa_glsl_parse_state * state)3528 ast_switch_statement::hir(exec_list *instructions,
3529 			  struct _mesa_glsl_parse_state *state)
3530 {
3531    void *ctx = state;
3532 
3533    ir_rvalue *const test_expression =
3534       this->test_expression->hir(instructions, state);
3535 
3536    /* From page 66 (page 55 of the PDF) of the GLSL 1.50 spec:
3537     *
3538     *    "The type of init-expression in a switch statement must be a
3539     *     scalar integer."
3540     */
3541    if (!test_expression->type->is_scalar() ||
3542        !test_expression->type->is_integer()) {
3543       YYLTYPE loc = this->test_expression->get_location();
3544 
3545       _mesa_glsl_error(& loc,
3546 		       state,
3547 		       "switch-statement expression must be scalar "
3548 		       "integer");
3549    }
3550 
3551    /* Track the switch-statement nesting in a stack-like manner.
3552     */
3553    struct glsl_switch_state saved = state->switch_state;
3554 
3555    state->switch_state.is_switch_innermost = true;
3556    state->switch_state.switch_nesting_ast = this;
3557    state->switch_state.labels_ht = hash_table_ctor(0, hash_table_pointer_hash,
3558 						   hash_table_pointer_compare);
3559    state->switch_state.previous_default = NULL;
3560 
3561    /* Initalize is_fallthru state to false.
3562     */
3563    ir_rvalue *const is_fallthru_val = new (ctx) ir_constant(false);
3564    state->switch_state.is_fallthru_var =
3565       new(ctx) ir_variable(glsl_type::bool_type,
3566 			   "switch_is_fallthru_tmp",
3567 			   ir_var_temporary);
3568    instructions->push_tail(state->switch_state.is_fallthru_var);
3569 
3570    ir_dereference_variable *deref_is_fallthru_var =
3571       new(ctx) ir_dereference_variable(state->switch_state.is_fallthru_var);
3572    instructions->push_tail(new(ctx) ir_assignment(deref_is_fallthru_var,
3573 						  is_fallthru_val));
3574 
3575    /* Initalize is_break state to false.
3576     */
3577    ir_rvalue *const is_break_val = new (ctx) ir_constant(false);
3578    state->switch_state.is_break_var = new(ctx) ir_variable(glsl_type::bool_type,
3579 							   "switch_is_break_tmp",
3580 							   ir_var_temporary);
3581    instructions->push_tail(state->switch_state.is_break_var);
3582 
3583    ir_dereference_variable *deref_is_break_var =
3584       new(ctx) ir_dereference_variable(state->switch_state.is_break_var);
3585    instructions->push_tail(new(ctx) ir_assignment(deref_is_break_var,
3586 						  is_break_val));
3587 
3588    /* Cache test expression.
3589     */
3590    test_to_hir(instructions, state);
3591 
3592    /* Emit code for body of switch stmt.
3593     */
3594    body->hir(instructions, state);
3595 
3596    hash_table_dtor(state->switch_state.labels_ht);
3597 
3598    state->switch_state = saved;
3599 
3600    /* Switch statements do not have r-values. */
3601    return NULL;
3602 }
3603 
3604 
3605 void
test_to_hir(exec_list * instructions,struct _mesa_glsl_parse_state * state)3606 ast_switch_statement::test_to_hir(exec_list *instructions,
3607 				  struct _mesa_glsl_parse_state *state)
3608 {
3609    void *ctx = state;
3610 
3611    /* Cache value of test expression. */
3612    ir_rvalue *const test_val =
3613       test_expression->hir(instructions,
3614 			   state);
3615 
3616    state->switch_state.test_var = new(ctx) ir_variable(test_val->type,
3617 						       "switch_test_tmp",
3618 						       ir_var_temporary);
3619    ir_dereference_variable *deref_test_var =
3620       new(ctx) ir_dereference_variable(state->switch_state.test_var);
3621 
3622    instructions->push_tail(state->switch_state.test_var);
3623    instructions->push_tail(new(ctx) ir_assignment(deref_test_var, test_val));
3624 }
3625 
3626 
3627 ir_rvalue *
hir(exec_list * instructions,struct _mesa_glsl_parse_state * state)3628 ast_switch_body::hir(exec_list *instructions,
3629 		     struct _mesa_glsl_parse_state *state)
3630 {
3631    if (stmts != NULL)
3632       stmts->hir(instructions, state);
3633 
3634    /* Switch bodies do not have r-values. */
3635    return NULL;
3636 }
3637 
3638 ir_rvalue *
hir(exec_list * instructions,struct _mesa_glsl_parse_state * state)3639 ast_case_statement_list::hir(exec_list *instructions,
3640 			     struct _mesa_glsl_parse_state *state)
3641 {
3642    foreach_list_typed (ast_case_statement, case_stmt, link, & this->cases)
3643       case_stmt->hir(instructions, state);
3644 
3645    /* Case statements do not have r-values. */
3646    return NULL;
3647 }
3648 
3649 ir_rvalue *
hir(exec_list * instructions,struct _mesa_glsl_parse_state * state)3650 ast_case_statement::hir(exec_list *instructions,
3651 			struct _mesa_glsl_parse_state *state)
3652 {
3653    labels->hir(instructions, state);
3654 
3655    /* Conditionally set fallthru state based on break state. */
3656    ir_constant *const false_val = new(state) ir_constant(false);
3657    ir_dereference_variable *const deref_is_fallthru_var =
3658       new(state) ir_dereference_variable(state->switch_state.is_fallthru_var);
3659    ir_dereference_variable *const deref_is_break_var =
3660       new(state) ir_dereference_variable(state->switch_state.is_break_var);
3661    ir_assignment *const reset_fallthru_on_break =
3662       new(state) ir_assignment(deref_is_fallthru_var,
3663 			       false_val,
3664 			       deref_is_break_var);
3665    instructions->push_tail(reset_fallthru_on_break);
3666 
3667    /* Guard case statements depending on fallthru state. */
3668    ir_dereference_variable *const deref_fallthru_guard =
3669       new(state) ir_dereference_variable(state->switch_state.is_fallthru_var);
3670    ir_if *const test_fallthru = new(state) ir_if(deref_fallthru_guard);
3671 
3672    foreach_list_typed (ast_node, stmt, link, & this->stmts)
3673       stmt->hir(& test_fallthru->then_instructions, state);
3674 
3675    instructions->push_tail(test_fallthru);
3676 
3677    /* Case statements do not have r-values. */
3678    return NULL;
3679 }
3680 
3681 
3682 ir_rvalue *
hir(exec_list * instructions,struct _mesa_glsl_parse_state * state)3683 ast_case_label_list::hir(exec_list *instructions,
3684 			 struct _mesa_glsl_parse_state *state)
3685 {
3686    foreach_list_typed (ast_case_label, label, link, & this->labels)
3687       label->hir(instructions, state);
3688 
3689    /* Case labels do not have r-values. */
3690    return NULL;
3691 }
3692 
3693 ir_rvalue *
hir(exec_list * instructions,struct _mesa_glsl_parse_state * state)3694 ast_case_label::hir(exec_list *instructions,
3695 		    struct _mesa_glsl_parse_state *state)
3696 {
3697    void *ctx = state;
3698 
3699    ir_dereference_variable *deref_fallthru_var =
3700       new(ctx) ir_dereference_variable(state->switch_state.is_fallthru_var);
3701 
3702    ir_rvalue *const true_val = new(ctx) ir_constant(true);
3703 
3704    /* If not default case, ... */
3705    if (this->test_value != NULL) {
3706       /* Conditionally set fallthru state based on
3707        * comparison of cached test expression value to case label.
3708        */
3709       ir_rvalue *const label_rval = this->test_value->hir(instructions, state);
3710       ir_constant *label_const = label_rval->constant_expression_value();
3711 
3712       if (!label_const) {
3713 	 YYLTYPE loc = this->test_value->get_location();
3714 
3715 	 _mesa_glsl_error(& loc, state,
3716 			  "switch statement case label must be a "
3717 			  "constant expression");
3718 
3719 	 /* Stuff a dummy value in to allow processing to continue. */
3720 	 label_const = new(ctx) ir_constant(0);
3721       } else {
3722 	 ast_expression *previous_label = (ast_expression *)
3723 	    hash_table_find(state->switch_state.labels_ht,
3724 			    (void *)(uintptr_t)label_const->value.u[0]);
3725 
3726 	 if (previous_label) {
3727 	    YYLTYPE loc = this->test_value->get_location();
3728 	    _mesa_glsl_error(& loc, state,
3729 			     "duplicate case value");
3730 
3731 	    loc = previous_label->get_location();
3732 	    _mesa_glsl_error(& loc, state,
3733 			     "this is the previous case label");
3734 	 } else {
3735 	    hash_table_insert(state->switch_state.labels_ht,
3736 			      this->test_value,
3737 			      (void *)(uintptr_t)label_const->value.u[0]);
3738 	 }
3739       }
3740 
3741       ir_dereference_variable *deref_test_var =
3742 	 new(ctx) ir_dereference_variable(state->switch_state.test_var);
3743 
3744       ir_rvalue *const test_cond = new(ctx) ir_expression(ir_binop_all_equal,
3745 							  label_const,
3746 							  deref_test_var);
3747 
3748       ir_assignment *set_fallthru_on_test =
3749 	 new(ctx) ir_assignment(deref_fallthru_var,
3750 				true_val,
3751 				test_cond);
3752 
3753       instructions->push_tail(set_fallthru_on_test);
3754    } else { /* default case */
3755       if (state->switch_state.previous_default) {
3756 	 YYLTYPE loc = this->get_location();
3757 	 _mesa_glsl_error(& loc, state,
3758 			  "multiple default labels in one switch");
3759 
3760 	 loc = state->switch_state.previous_default->get_location();
3761 	 _mesa_glsl_error(& loc, state,
3762 			  "this is the first default label");
3763       }
3764       state->switch_state.previous_default = this;
3765 
3766       /* Set falltrhu state. */
3767       ir_assignment *set_fallthru =
3768 	 new(ctx) ir_assignment(deref_fallthru_var, true_val);
3769 
3770       instructions->push_tail(set_fallthru);
3771    }
3772 
3773    /* Case statements do not have r-values. */
3774    return NULL;
3775 }
3776 
3777 void
condition_to_hir(ir_loop * stmt,struct _mesa_glsl_parse_state * state)3778 ast_iteration_statement::condition_to_hir(ir_loop *stmt,
3779 					  struct _mesa_glsl_parse_state *state)
3780 {
3781    void *ctx = state;
3782 
3783    if (condition != NULL) {
3784       ir_rvalue *const cond =
3785 	 condition->hir(& stmt->body_instructions, state);
3786 
3787       if ((cond == NULL)
3788 	  || !cond->type->is_boolean() || !cond->type->is_scalar()) {
3789 	 YYLTYPE loc = condition->get_location();
3790 
3791 	 _mesa_glsl_error(& loc, state,
3792 			  "loop condition must be scalar boolean");
3793       } else {
3794 	 /* As the first code in the loop body, generate a block that looks
3795 	  * like 'if (!condition) break;' as the loop termination condition.
3796 	  */
3797 	 ir_rvalue *const not_cond =
3798 	    new(ctx) ir_expression(ir_unop_logic_not, cond);
3799 
3800 	 ir_if *const if_stmt = new(ctx) ir_if(not_cond);
3801 
3802 	 ir_jump *const break_stmt =
3803 	    new(ctx) ir_loop_jump(ir_loop_jump::jump_break);
3804 
3805 	 if_stmt->then_instructions.push_tail(break_stmt);
3806 	 stmt->body_instructions.push_tail(if_stmt);
3807       }
3808    }
3809 }
3810 
3811 
3812 ir_rvalue *
hir(exec_list * instructions,struct _mesa_glsl_parse_state * state)3813 ast_iteration_statement::hir(exec_list *instructions,
3814 			     struct _mesa_glsl_parse_state *state)
3815 {
3816    void *ctx = state;
3817 
3818    /* For-loops and while-loops start a new scope, but do-while loops do not.
3819     */
3820    if (mode != ast_do_while)
3821       state->symbols->push_scope();
3822 
3823    if (init_statement != NULL)
3824       init_statement->hir(instructions, state);
3825 
3826    ir_loop *const stmt = new(ctx) ir_loop();
3827    instructions->push_tail(stmt);
3828 
3829    /* Track the current loop nesting. */
3830    ast_iteration_statement *nesting_ast = state->loop_nesting_ast;
3831 
3832    state->loop_nesting_ast = this;
3833 
3834    /* Likewise, indicate that following code is closest to a loop,
3835     * NOT closest to a switch.
3836     */
3837    bool saved_is_switch_innermost = state->switch_state.is_switch_innermost;
3838    state->switch_state.is_switch_innermost = false;
3839 
3840    if (mode != ast_do_while)
3841       condition_to_hir(stmt, state);
3842 
3843    if (body != NULL)
3844       body->hir(& stmt->body_instructions, state);
3845 
3846    if (rest_expression != NULL)
3847       rest_expression->hir(& stmt->body_instructions, state);
3848 
3849    if (mode == ast_do_while)
3850       condition_to_hir(stmt, state);
3851 
3852    if (mode != ast_do_while)
3853       state->symbols->pop_scope();
3854 
3855    /* Restore previous nesting before returning. */
3856    state->loop_nesting_ast = nesting_ast;
3857    state->switch_state.is_switch_innermost = saved_is_switch_innermost;
3858 
3859    /* Loops do not have r-values.
3860     */
3861    return NULL;
3862 }
3863 
3864 
3865 ir_rvalue *
hir(exec_list * instructions,struct _mesa_glsl_parse_state * state)3866 ast_type_specifier::hir(exec_list *instructions,
3867 			  struct _mesa_glsl_parse_state *state)
3868 {
3869    if (!this->is_precision_statement && this->structure == NULL)
3870       return NULL;
3871 
3872    YYLTYPE loc = this->get_location();
3873 
3874    if (this->precision != ast_precision_none
3875        && state->language_version != 100
3876        && state->language_version < 130) {
3877       _mesa_glsl_error(&loc, state,
3878                        "precision qualifiers exist only in "
3879                        "GLSL ES 1.00, and GLSL 1.30 and later");
3880       return NULL;
3881    }
3882    if (this->precision != ast_precision_none
3883        && this->structure != NULL) {
3884       _mesa_glsl_error(&loc, state,
3885                        "precision qualifiers do not apply to structures");
3886       return NULL;
3887    }
3888 
3889    /* If this is a precision statement, check that the type to which it is
3890     * applied is either float or int.
3891     *
3892     * From section 4.5.3 of the GLSL 1.30 spec:
3893     *    "The precision statement
3894     *       precision precision-qualifier type;
3895     *    can be used to establish a default precision qualifier. The type
3896     *    field can be either int or float [...].  Any other types or
3897     *    qualifiers will result in an error.
3898     */
3899    if (this->is_precision_statement) {
3900       assert(this->precision != ast_precision_none);
3901       assert(this->structure == NULL); /* The check for structures was
3902                                         * performed above. */
3903       if (this->is_array) {
3904          _mesa_glsl_error(&loc, state,
3905                           "default precision statements do not apply to "
3906                           "arrays");
3907          return NULL;
3908       }
3909       if (strcmp(this->type_name, "float") != 0 &&
3910 	  strcmp(this->type_name, "int") != 0) {
3911          _mesa_glsl_error(&loc, state,
3912                           "default precision statements apply only to types "
3913                           "float and int");
3914          return NULL;
3915       }
3916 
3917       /* FINISHME: Translate precision statements into IR. */
3918       return NULL;
3919    }
3920 
3921    if (this->structure != NULL)
3922       return this->structure->hir(instructions, state);
3923 
3924    return NULL;
3925 }
3926 
3927 
3928 ir_rvalue *
hir(exec_list * instructions,struct _mesa_glsl_parse_state * state)3929 ast_struct_specifier::hir(exec_list *instructions,
3930 			  struct _mesa_glsl_parse_state *state)
3931 {
3932    unsigned decl_count = 0;
3933 
3934    /* Make an initial pass over the list of structure fields to determine how
3935     * many there are.  Each element in this list is an ast_declarator_list.
3936     * This means that we actually need to count the number of elements in the
3937     * 'declarations' list in each of the elements.
3938     */
3939    foreach_list_typed (ast_declarator_list, decl_list, link,
3940 		       &this->declarations) {
3941       foreach_list_const (decl_ptr, & decl_list->declarations) {
3942 	 decl_count++;
3943       }
3944    }
3945 
3946    /* Allocate storage for the structure fields and process the field
3947     * declarations.  As the declarations are processed, try to also convert
3948     * the types to HIR.  This ensures that structure definitions embedded in
3949     * other structure definitions are processed.
3950     */
3951    glsl_struct_field *const fields = ralloc_array(state, glsl_struct_field,
3952 						  decl_count);
3953 
3954    unsigned i = 0;
3955    foreach_list_typed (ast_declarator_list, decl_list, link,
3956 		       &this->declarations) {
3957       const char *type_name;
3958 
3959       decl_list->type->specifier->hir(instructions, state);
3960 
3961       /* Section 10.9 of the GLSL ES 1.00 specification states that
3962        * embedded structure definitions have been removed from the language.
3963        */
3964       if (state->es_shader && decl_list->type->specifier->structure != NULL) {
3965 	 YYLTYPE loc = this->get_location();
3966 	 _mesa_glsl_error(&loc, state, "Embedded structure definitions are "
3967 			  "not allowed in GLSL ES 1.00.");
3968       }
3969 
3970       const glsl_type *decl_type =
3971 	 decl_list->type->specifier->glsl_type(& type_name, state);
3972 
3973       foreach_list_typed (ast_declaration, decl, link,
3974 			  &decl_list->declarations) {
3975 	 const struct glsl_type *field_type = decl_type;
3976 	 if (decl->is_array) {
3977 	    YYLTYPE loc = decl->get_location();
3978 	    field_type = process_array_type(&loc, decl_type, decl->array_size,
3979 					    state);
3980 	 }
3981 	 fields[i].type = (field_type != NULL)
3982 	    ? field_type : glsl_type::error_type;
3983 	 fields[i].name = decl->identifier;
3984 	 i++;
3985       }
3986    }
3987 
3988    assert(i == decl_count);
3989 
3990    const glsl_type *t =
3991       glsl_type::get_record_instance(fields, decl_count, this->name);
3992 
3993    YYLTYPE loc = this->get_location();
3994    if (!state->symbols->add_type(name, t)) {
3995       _mesa_glsl_error(& loc, state, "struct `%s' previously defined", name);
3996    } else {
3997       const glsl_type **s = reralloc(state, state->user_structures,
3998 				     const glsl_type *,
3999 				     state->num_user_structures + 1);
4000       if (s != NULL) {
4001 	 s[state->num_user_structures] = t;
4002 	 state->user_structures = s;
4003 	 state->num_user_structures++;
4004       }
4005    }
4006 
4007    /* Structure type definitions do not have r-values.
4008     */
4009    return NULL;
4010 }
4011 
4012 static struct gl_uniform_block *
get_next_uniform_block(struct _mesa_glsl_parse_state * state)4013 get_next_uniform_block(struct _mesa_glsl_parse_state *state)
4014 {
4015    if (state->num_uniform_blocks >= state->uniform_block_array_size) {
4016       state->uniform_block_array_size *= 2;
4017       if (state->uniform_block_array_size <= 4)
4018 	 state->uniform_block_array_size = 4;
4019 
4020       state->uniform_blocks = reralloc(state,
4021 				       state->uniform_blocks,
4022 				       struct gl_uniform_block,
4023 				       state->uniform_block_array_size);
4024    }
4025 
4026    memset(&state->uniform_blocks[state->num_uniform_blocks],
4027 	  0, sizeof(*state->uniform_blocks));
4028    return &state->uniform_blocks[state->num_uniform_blocks++];
4029 }
4030 
4031 ir_rvalue *
hir(exec_list * instructions,struct _mesa_glsl_parse_state * state)4032 ast_uniform_block::hir(exec_list *instructions,
4033 		       struct _mesa_glsl_parse_state *state)
4034 {
4035    /* The ast_uniform_block has a list of ast_declarator_lists.  We
4036     * need to turn those into ir_variables with an association
4037     * with this uniform block.
4038     */
4039    struct gl_uniform_block *ubo = get_next_uniform_block(state);
4040    ubo->Name = ralloc_strdup(state->uniform_blocks, this->block_name);
4041 
4042    if (!state->symbols->add_uniform_block(ubo)) {
4043       YYLTYPE loc = this->get_location();
4044       _mesa_glsl_error(&loc, state, "Uniform block name `%s' already taken in "
4045                        "the current scope.\n", ubo->Name);
4046    }
4047 
4048    unsigned int num_variables = 0;
4049    foreach_list_typed(ast_declarator_list, decl_list, link, &declarations) {
4050       foreach_list_const(node, &decl_list->declarations) {
4051 	 num_variables++;
4052       }
4053    }
4054 
4055    bool block_row_major = this->layout.flags.q.row_major;
4056 
4057    ubo->Uniforms = rzalloc_array(state->uniform_blocks,
4058 				 struct gl_uniform_buffer_variable,
4059 				 num_variables);
4060 
4061    foreach_list_typed(ast_declarator_list, decl_list, link, &declarations) {
4062       exec_list declared_variables;
4063 
4064       decl_list->hir(&declared_variables, state);
4065 
4066       foreach_list_const(node, &declared_variables) {
4067 	 struct ir_variable *var = (ir_variable *)node;
4068 
4069 	 struct gl_uniform_buffer_variable *ubo_var =
4070 	    &ubo->Uniforms[ubo->NumUniforms++];
4071 
4072 	 var->uniform_block = ubo - state->uniform_blocks;
4073 
4074 	 ubo_var->Name = ralloc_strdup(state->uniform_blocks, var->name);
4075 	 ubo_var->Type = var->type;
4076 	 ubo_var->Buffer = ubo - state->uniform_blocks;
4077 	 ubo_var->Offset = 0; /* Assigned at link time. */
4078 
4079 	 if (var->type->is_matrix() ||
4080 	     (var->type->is_array() && var->type->fields.array->is_matrix())) {
4081 	    ubo_var->RowMajor = block_row_major;
4082 	    if (decl_list->type->qualifier.flags.q.row_major)
4083 	       ubo_var->RowMajor = true;
4084 	    else if (decl_list->type->qualifier.flags.q.column_major)
4085 	       ubo_var->RowMajor = false;
4086 	 }
4087 
4088 	 /* From the GL_ARB_uniform_buffer_object spec:
4089 	  *
4090 	  *     "Sampler types are not allowed inside of uniform
4091 	  *      blocks. All other types, arrays, and structures
4092 	  *      allowed for uniforms are allowed within a uniform
4093 	  *      block."
4094 	  */
4095 	 if (var->type->contains_sampler()) {
4096 	    YYLTYPE loc = decl_list->get_location();
4097 	    _mesa_glsl_error(&loc, state,
4098 			     "Uniform in non-default uniform block contains sampler\n");
4099 	 }
4100       }
4101 
4102       instructions->append_list(&declared_variables);
4103    }
4104 
4105    return NULL;
4106 }
4107 
4108 static void
detect_conflicting_assignments(struct _mesa_glsl_parse_state * state,exec_list * instructions)4109 detect_conflicting_assignments(struct _mesa_glsl_parse_state *state,
4110 			       exec_list *instructions)
4111 {
4112    bool gl_FragColor_assigned = false;
4113    bool gl_FragData_assigned = false;
4114    bool user_defined_fs_output_assigned = false;
4115    ir_variable *user_defined_fs_output = NULL;
4116 
4117    /* It would be nice to have proper location information. */
4118    YYLTYPE loc;
4119    memset(&loc, 0, sizeof(loc));
4120 
4121    foreach_list(node, instructions) {
4122       ir_variable *var = ((ir_instruction *)node)->as_variable();
4123 
4124       if (!var || !var->assigned)
4125 	 continue;
4126 
4127       if (strcmp(var->name, "gl_FragColor") == 0)
4128 	 gl_FragColor_assigned = true;
4129       else if (strcmp(var->name, "gl_FragData") == 0)
4130 	 gl_FragData_assigned = true;
4131       else if (strncmp(var->name, "gl_", 3) != 0) {
4132 	 if (state->target == fragment_shader &&
4133 	     (var->mode == ir_var_out || var->mode == ir_var_inout)) {
4134 	    user_defined_fs_output_assigned = true;
4135 	    user_defined_fs_output = var;
4136 	 }
4137       }
4138    }
4139 
4140    /* From the GLSL 1.30 spec:
4141     *
4142     *     "If a shader statically assigns a value to gl_FragColor, it
4143     *      may not assign a value to any element of gl_FragData. If a
4144     *      shader statically writes a value to any element of
4145     *      gl_FragData, it may not assign a value to
4146     *      gl_FragColor. That is, a shader may assign values to either
4147     *      gl_FragColor or gl_FragData, but not both. Multiple shaders
4148     *      linked together must also consistently write just one of
4149     *      these variables.  Similarly, if user declared output
4150     *      variables are in use (statically assigned to), then the
4151     *      built-in variables gl_FragColor and gl_FragData may not be
4152     *      assigned to. These incorrect usages all generate compile
4153     *      time errors."
4154     */
4155    if (gl_FragColor_assigned && gl_FragData_assigned) {
4156       _mesa_glsl_error(&loc, state, "fragment shader writes to both "
4157 		       "`gl_FragColor' and `gl_FragData'\n");
4158    } else if (gl_FragColor_assigned && user_defined_fs_output_assigned) {
4159       _mesa_glsl_error(&loc, state, "fragment shader writes to both "
4160 		       "`gl_FragColor' and `%s'\n",
4161 		       user_defined_fs_output->name);
4162    } else if (gl_FragData_assigned && user_defined_fs_output_assigned) {
4163       _mesa_glsl_error(&loc, state, "fragment shader writes to both "
4164 		       "`gl_FragData' and `%s'\n",
4165 		       user_defined_fs_output->name);
4166    }
4167 }
4168