Replace "mode" type tag with virtual as_foo() downcasting functions.
[mesa.git] / ast_to_hir.cpp
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 #include <stdio.h>
52 #include "main/imports.h"
53 #include "glsl_symbol_table.h"
54 #include "glsl_parser_extras.h"
55 #include "ast.h"
56 #include "glsl_types.h"
57 #include "ir.h"
58
59 void
60 _mesa_ast_to_hir(exec_list *instructions, struct _mesa_glsl_parse_state *state)
61 {
62 struct simple_node *ptr;
63
64 _mesa_glsl_initialize_variables(instructions, state);
65 _mesa_glsl_initialize_constructors(instructions, state);
66
67 state->current_function = NULL;
68
69 foreach (ptr, & state->translation_unit) {
70 ((ast_node *)ptr)->hir(instructions, state);
71 }
72 }
73
74
75 static const struct glsl_type *
76 arithmetic_result_type(const struct glsl_type *type_a,
77 const struct glsl_type *type_b,
78 bool multiply,
79 struct _mesa_glsl_parse_state *state)
80 {
81 /* From GLSL 1.50 spec, page 56:
82 *
83 * "The arithmetic binary operators add (+), subtract (-),
84 * multiply (*), and divide (/) operate on integer and
85 * floating-point scalars, vectors, and matrices."
86 */
87 if (!type_a->is_numeric() || !type_b->is_numeric()) {
88 return glsl_error_type;
89 }
90
91
92 /* "If one operand is floating-point based and the other is
93 * not, then the conversions from Section 4.1.10 "Implicit
94 * Conversions" are applied to the non-floating-point-based operand."
95 *
96 * This conversion was added in GLSL 1.20. If the compilation mode is
97 * GLSL 1.10, the conversion is skipped.
98 */
99 if (state->language_version >= 120) {
100 if ((type_a->base_type == GLSL_TYPE_FLOAT)
101 && (type_b->base_type != GLSL_TYPE_FLOAT)) {
102 } else if ((type_a->base_type != GLSL_TYPE_FLOAT)
103 && (type_b->base_type == GLSL_TYPE_FLOAT)) {
104 }
105 }
106
107 /* "If the operands are integer types, they must both be signed or
108 * both be unsigned."
109 *
110 * From this rule and the preceeding conversion it can be inferred that
111 * both types must be GLSL_TYPE_FLOAT, or GLSL_TYPE_UINT, or GLSL_TYPE_INT.
112 * The is_numeric check above already filtered out the case where either
113 * type is not one of these, so now the base types need only be tested for
114 * equality.
115 */
116 if (type_a->base_type != type_b->base_type) {
117 return glsl_error_type;
118 }
119
120 /* "All arithmetic binary operators result in the same fundamental type
121 * (signed integer, unsigned integer, or floating-point) as the
122 * operands they operate on, after operand type conversion. After
123 * conversion, the following cases are valid
124 *
125 * * The two operands are scalars. In this case the operation is
126 * applied, resulting in a scalar."
127 */
128 if (type_a->is_scalar() && type_b->is_scalar())
129 return type_a;
130
131 /* "* One operand is a scalar, and the other is a vector or matrix.
132 * In this case, the scalar operation is applied independently to each
133 * component of the vector or matrix, resulting in the same size
134 * vector or matrix."
135 */
136 if (type_a->is_scalar()) {
137 if (!type_b->is_scalar())
138 return type_b;
139 } else if (type_b->is_scalar()) {
140 return type_a;
141 }
142
143 /* All of the combinations of <scalar, scalar>, <vector, scalar>,
144 * <scalar, vector>, <scalar, matrix>, and <matrix, scalar> have been
145 * handled.
146 */
147 assert(!type_a->is_scalar());
148 assert(!type_b->is_scalar());
149
150 /* "* The two operands are vectors of the same size. In this case, the
151 * operation is done component-wise resulting in the same size
152 * vector."
153 */
154 if (type_a->is_vector() && type_b->is_vector()) {
155 return (type_a == type_b) ? type_a : glsl_error_type;
156 }
157
158 /* All of the combinations of <scalar, scalar>, <vector, scalar>,
159 * <scalar, vector>, <scalar, matrix>, <matrix, scalar>, and
160 * <vector, vector> have been handled. At least one of the operands must
161 * be matrix. Further, since there are no integer matrix types, the base
162 * type of both operands must be float.
163 */
164 assert(type_a->is_matrix() || type_b->is_matrix());
165 assert(type_a->base_type == GLSL_TYPE_FLOAT);
166 assert(type_b->base_type == GLSL_TYPE_FLOAT);
167
168 /* "* The operator is add (+), subtract (-), or divide (/), and the
169 * operands are matrices with the same number of rows and the same
170 * number of columns. In this case, the operation is done component-
171 * wise resulting in the same size matrix."
172 * * The operator is multiply (*), where both operands are matrices or
173 * one operand is a vector and the other a matrix. A right vector
174 * operand is treated as a column vector and a left vector operand as a
175 * row vector. In all these cases, it is required that the number of
176 * columns of the left operand is equal to the number of rows of the
177 * right operand. Then, the multiply (*) operation does a linear
178 * algebraic multiply, yielding an object that has the same number of
179 * rows as the left operand and the same number of columns as the right
180 * operand. Section 5.10 "Vector and Matrix Operations" explains in
181 * more detail how vectors and matrices are operated on."
182 */
183 if (! multiply) {
184 return (type_a == type_b) ? type_a : glsl_error_type;
185 } else {
186 if (type_a->is_matrix() && type_b->is_matrix()) {
187 /* Matrix multiply. The columns of A must match the rows of B. Given
188 * the other previously tested constraints, this means the vector type
189 * of a row from A must be the same as the vector type of a column from
190 * B.
191 */
192 if (type_a->row_type() == type_b->column_type()) {
193 /* The resulting matrix has the number of columns of matrix B and
194 * the number of rows of matrix A. We get the row count of A by
195 * looking at the size of a vector that makes up a column. The
196 * transpose (size of a row) is done for B.
197 */
198 return
199 glsl_type::get_instance(type_a->base_type,
200 type_a->column_type()->vector_elements,
201 type_b->row_type()->vector_elements);
202 }
203 } else if (type_a->is_matrix()) {
204 /* A is a matrix and B is a column vector. Columns of A must match
205 * rows of B. Given the other previously tested constraints, this
206 * means the vector type of a row from A must be the same as the
207 * vector the type of B.
208 */
209 if (type_a->row_type() == type_b)
210 return type_b;
211 } else {
212 assert(type_b->is_matrix());
213
214 /* A is a row vector and B is a matrix. Columns of A must match rows
215 * of B. Given the other previously tested constraints, this means
216 * the type of A must be the same as the vector type of a column from
217 * B.
218 */
219 if (type_a == type_b->column_type())
220 return type_a;
221 }
222 }
223
224
225 /* "All other cases are illegal."
226 */
227 return glsl_error_type;
228 }
229
230
231 static const struct glsl_type *
232 unary_arithmetic_result_type(const struct glsl_type *type)
233 {
234 /* From GLSL 1.50 spec, page 57:
235 *
236 * "The arithmetic unary operators negate (-), post- and pre-increment
237 * and decrement (-- and ++) operate on integer or floating-point
238 * values (including vectors and matrices). All unary operators work
239 * component-wise on their operands. These result with the same type
240 * they operated on."
241 */
242 if (!is_numeric_base_type(type->base_type))
243 return glsl_error_type;
244
245 return type;
246 }
247
248
249 static const struct glsl_type *
250 modulus_result_type(const struct glsl_type *type_a,
251 const struct glsl_type *type_b)
252 {
253 /* From GLSL 1.50 spec, page 56:
254 * "The operator modulus (%) operates on signed or unsigned integers or
255 * integer vectors. The operand types must both be signed or both be
256 * unsigned."
257 */
258 if (! is_integer_base_type(type_a->base_type)
259 || ! is_integer_base_type(type_b->base_type)
260 || (type_a->base_type != type_b->base_type)) {
261 return glsl_error_type;
262 }
263
264 /* "The operands cannot be vectors of differing size. If one operand is
265 * a scalar and the other vector, then the scalar is applied component-
266 * wise to the vector, resulting in the same type as the vector. If both
267 * are vectors of the same size, the result is computed component-wise."
268 */
269 if (type_a->is_vector()) {
270 if (!type_b->is_vector()
271 || (type_a->vector_elements == type_b->vector_elements))
272 return type_a;
273 } else
274 return type_b;
275
276 /* "The operator modulus (%) is not defined for any other data types
277 * (non-integer types)."
278 */
279 return glsl_error_type;
280 }
281
282
283 static const struct glsl_type *
284 relational_result_type(const struct glsl_type *type_a,
285 const struct glsl_type *type_b,
286 struct _mesa_glsl_parse_state *state)
287 {
288 /* From GLSL 1.50 spec, page 56:
289 * "The relational operators greater than (>), less than (<), greater
290 * than or equal (>=), and less than or equal (<=) operate only on
291 * scalar integer and scalar floating-point expressions."
292 */
293 if (! is_numeric_base_type(type_a->base_type)
294 || ! is_numeric_base_type(type_b->base_type)
295 || !type_a->is_scalar()
296 || !type_b->is_scalar())
297 return glsl_error_type;
298
299 /* "Either the operands' types must match, or the conversions from
300 * Section 4.1.10 "Implicit Conversions" will be applied to the integer
301 * operand, after which the types must match."
302 *
303 * This conversion was added in GLSL 1.20. If the compilation mode is
304 * GLSL 1.10, the conversion is skipped.
305 */
306 if (state->language_version >= 120) {
307 if ((type_a->base_type == GLSL_TYPE_FLOAT)
308 && (type_b->base_type != GLSL_TYPE_FLOAT)) {
309 /* FINISHME: Generate the implicit type conversion. */
310 } else if ((type_a->base_type != GLSL_TYPE_FLOAT)
311 && (type_b->base_type == GLSL_TYPE_FLOAT)) {
312 /* FINISHME: Generate the implicit type conversion. */
313 }
314 }
315
316 if (type_a->base_type != type_b->base_type)
317 return glsl_error_type;
318
319 /* "The result is scalar Boolean."
320 */
321 return glsl_bool_type;
322 }
323
324
325 /**
326 * Validates that a value can be assigned to a location with a specified type
327 *
328 * Validates that \c rhs can be assigned to some location. If the types are
329 * not an exact match but an automatic conversion is possible, \c rhs will be
330 * converted.
331 *
332 * \return
333 * \c NULL if \c rhs cannot be assigned to a location with type \c lhs_type.
334 * Otherwise the actual RHS to be assigned will be returned. This may be
335 * \c rhs, or it may be \c rhs after some type conversion.
336 *
337 * \note
338 * In addition to being used for assignments, this function is used to
339 * type-check return values.
340 */
341 ir_instruction *
342 validate_assignment(const glsl_type *lhs_type, ir_instruction *rhs)
343 {
344 const glsl_type *const rhs_type = rhs->type;
345
346 /* If there is already some error in the RHS, just return it. Anything
347 * else will lead to an avalanche of error message back to the user.
348 */
349 if (rhs_type->is_error())
350 return rhs;
351
352 /* FINISHME: For GLSL 1.10, check that the types are not arrays. */
353
354 /* If the types are identical, the assignment can trivially proceed.
355 */
356 if (rhs_type == lhs_type)
357 return rhs;
358
359 /* FINISHME: Check for and apply automatic conversions. */
360 return NULL;
361 }
362
363
364 ir_instruction *
365 ast_node::hir(exec_list *instructions,
366 struct _mesa_glsl_parse_state *state)
367 {
368 (void) instructions;
369 (void) state;
370
371 return NULL;
372 }
373
374
375 ir_instruction *
376 ast_expression::hir(exec_list *instructions,
377 struct _mesa_glsl_parse_state *state)
378 {
379 static const int operations[AST_NUM_OPERATORS] = {
380 -1, /* ast_assign doesn't convert to ir_expression. */
381 -1, /* ast_plus doesn't convert to ir_expression. */
382 ir_unop_neg,
383 ir_binop_add,
384 ir_binop_sub,
385 ir_binop_mul,
386 ir_binop_div,
387 ir_binop_mod,
388 ir_binop_lshift,
389 ir_binop_rshift,
390 ir_binop_less,
391 ir_binop_greater,
392 ir_binop_lequal,
393 ir_binop_gequal,
394 ir_binop_equal,
395 ir_binop_nequal,
396 ir_binop_bit_and,
397 ir_binop_bit_xor,
398 ir_binop_bit_or,
399 ir_unop_bit_not,
400 ir_binop_logic_and,
401 ir_binop_logic_xor,
402 ir_binop_logic_or,
403 ir_unop_logic_not,
404
405 /* Note: The following block of expression types actually convert
406 * to multiple IR instructions.
407 */
408 ir_binop_mul, /* ast_mul_assign */
409 ir_binop_div, /* ast_div_assign */
410 ir_binop_mod, /* ast_mod_assign */
411 ir_binop_add, /* ast_add_assign */
412 ir_binop_sub, /* ast_sub_assign */
413 ir_binop_lshift, /* ast_ls_assign */
414 ir_binop_rshift, /* ast_rs_assign */
415 ir_binop_bit_and, /* ast_and_assign */
416 ir_binop_bit_xor, /* ast_xor_assign */
417 ir_binop_bit_or, /* ast_or_assign */
418
419 -1, /* ast_conditional doesn't convert to ir_expression. */
420 -1, /* ast_pre_inc doesn't convert to ir_expression. */
421 -1, /* ast_pre_dec doesn't convert to ir_expression. */
422 -1, /* ast_post_inc doesn't convert to ir_expression. */
423 -1, /* ast_post_dec doesn't convert to ir_expression. */
424 -1, /* ast_field_selection doesn't conv to ir_expression. */
425 -1, /* ast_array_index doesn't convert to ir_expression. */
426 -1, /* ast_function_call doesn't conv to ir_expression. */
427 -1, /* ast_identifier doesn't convert to ir_expression. */
428 -1, /* ast_int_constant doesn't convert to ir_expression. */
429 -1, /* ast_uint_constant doesn't conv to ir_expression. */
430 -1, /* ast_float_constant doesn't conv to ir_expression. */
431 -1, /* ast_bool_constant doesn't conv to ir_expression. */
432 -1, /* ast_sequence doesn't convert to ir_expression. */
433 };
434 ir_instruction *result = NULL;
435 ir_instruction *op[2];
436 struct simple_node op_list;
437 const struct glsl_type *type = glsl_error_type;
438 bool error_emitted = false;
439 YYLTYPE loc;
440
441 loc = this->get_location();
442 make_empty_list(& op_list);
443
444 switch (this->oper) {
445 case ast_assign: {
446 op[0] = this->subexpressions[0]->hir(instructions, state);
447 op[1] = this->subexpressions[1]->hir(instructions, state);
448
449 error_emitted = ((op[0]->type == glsl_error_type)
450 || (op[1]->type == glsl_error_type));
451
452 type = op[0]->type;
453 if (!error_emitted) {
454 YYLTYPE loc;
455
456 /* FINISHME: This does not handle 'foo.bar.a.b.c[5].d = 5' */
457 loc = this->subexpressions[0]->get_location();
458 const ir_dereference *const ref = op[0]->as_dereference();
459 if (ref == NULL) {
460 _mesa_glsl_error(& loc, state, "invalid lvalue in assignment");
461 error_emitted = true;
462
463 type = glsl_error_type;
464 } else {
465 const ir_variable *const var = (ir_variable *) ref->var;
466
467 if (var != NULL && var->read_only) {
468 _mesa_glsl_error(& loc, state, "cannot assign to read-only "
469 "variable `%s'", var->name);
470 error_emitted = true;
471
472 type = glsl_error_type;
473 }
474 }
475 }
476
477 ir_instruction *rhs = validate_assignment(op[0]->type, op[1]);
478 if (rhs == NULL) {
479 type = glsl_error_type;
480 rhs = op[1];
481 }
482
483 ir_instruction *tmp = new ir_assignment(op[0], op[1], NULL);
484 instructions->push_tail(tmp);
485
486 result = op[0];
487 break;
488 }
489
490 case ast_plus:
491 op[0] = this->subexpressions[0]->hir(instructions, state);
492
493 error_emitted = (op[0]->type == glsl_error_type);
494 if (type == glsl_error_type)
495 op[0]->type = type;
496
497 result = op[0];
498 break;
499
500 case ast_neg:
501 op[0] = this->subexpressions[0]->hir(instructions, state);
502
503 type = unary_arithmetic_result_type(op[0]->type);
504
505 error_emitted = (op[0]->type == glsl_error_type);
506
507 result = new ir_expression(operations[this->oper], type,
508 op[0], NULL);
509 break;
510
511 case ast_add:
512 case ast_sub:
513 case ast_mul:
514 case ast_div:
515 op[0] = this->subexpressions[0]->hir(instructions, state);
516 op[1] = this->subexpressions[1]->hir(instructions, state);
517
518 type = arithmetic_result_type(op[0]->type, op[1]->type,
519 (this->oper == ast_mul),
520 state);
521
522 result = new ir_expression(operations[this->oper], type,
523 op[0], op[1]);
524 break;
525
526 case ast_mod:
527 op[0] = this->subexpressions[0]->hir(instructions, state);
528 op[1] = this->subexpressions[1]->hir(instructions, state);
529
530 error_emitted = ((op[0]->type == glsl_error_type)
531 || (op[1]->type == glsl_error_type));
532
533 type = modulus_result_type(op[0]->type, op[1]->type);
534
535 assert(operations[this->oper] == ir_binop_mod);
536
537 result = new ir_expression(operations[this->oper], type,
538 op[0], op[1]);
539 break;
540
541 case ast_lshift:
542 case ast_rshift:
543 /* FINISHME: Implement bit-shift operators. */
544 break;
545
546 case ast_less:
547 case ast_greater:
548 case ast_lequal:
549 case ast_gequal:
550 op[0] = this->subexpressions[0]->hir(instructions, state);
551 op[1] = this->subexpressions[1]->hir(instructions, state);
552
553 error_emitted = ((op[0]->type == glsl_error_type)
554 || (op[1]->type == glsl_error_type));
555
556 type = relational_result_type(op[0]->type, op[1]->type, state);
557
558 /* The relational operators must either generate an error or result
559 * in a scalar boolean. See page 57 of the GLSL 1.50 spec.
560 */
561 assert((type == glsl_error_type)
562 || ((type->base_type == GLSL_TYPE_BOOL)
563 && type->is_scalar()));
564
565 result = new ir_expression(operations[this->oper], type,
566 op[0], op[1]);
567 break;
568
569 case ast_nequal:
570 case ast_equal:
571 /* FINISHME: Implement equality operators. */
572 break;
573
574 case ast_bit_and:
575 case ast_bit_xor:
576 case ast_bit_or:
577 case ast_bit_not:
578 /* FINISHME: Implement bit-wise operators. */
579 break;
580
581 case ast_logic_and:
582 case ast_logic_xor:
583 case ast_logic_or:
584 case ast_logic_not:
585 /* FINISHME: Implement logical operators. */
586 break;
587
588 case ast_mul_assign:
589 case ast_div_assign:
590 case ast_add_assign:
591 case ast_sub_assign: {
592 struct ir_instruction *temp_rhs;
593
594 op[0] = this->subexpressions[0]->hir(instructions, state);
595 op[1] = this->subexpressions[1]->hir(instructions, state);
596
597 error_emitted = ((op[0]->type == glsl_error_type)
598 || (op[1]->type == glsl_error_type));
599
600 type = arithmetic_result_type(op[0]->type, op[1]->type,
601 (this->oper == ast_mul_assign),
602 state);
603
604 temp_rhs = new ir_expression(operations[this->oper], type,
605 op[0], op[1]);
606
607 /* FINISHME: This is copied from ast_assign above. It should
608 * FINISHME: probably be consolidated.
609 */
610 error_emitted = ((op[0]->type == glsl_error_type)
611 || (temp_rhs->type == glsl_error_type));
612
613 type = op[0]->type;
614 if (!error_emitted) {
615 YYLTYPE loc;
616
617 /* FINISHME: This does not handle 'foo.bar.a.b.c[5].d = 5' */
618 loc = this->subexpressions[0]->get_location();
619 const ir_dereference *const ref = op[0]->as_dereference();
620 if (ref == NULL) {
621 _mesa_glsl_error(& loc, state, "invalid lvalue in assignment");
622 error_emitted = true;
623
624 type = glsl_error_type;
625 } else {
626 const ir_variable *const var = (ir_variable *) ref->var;
627
628 if (var != NULL && var->read_only) {
629 _mesa_glsl_error(& loc, state, "cannot assign to read-only "
630 "variable `%s'", var->name);
631 error_emitted = true;
632
633 type = glsl_error_type;
634 }
635 }
636 }
637
638 ir_instruction *rhs = validate_assignment(op[0]->type, temp_rhs);
639 if (rhs == NULL) {
640 type = glsl_error_type;
641 rhs = temp_rhs;
642 }
643
644 ir_instruction *tmp = new ir_assignment(op[0], rhs, NULL);
645 instructions->push_tail(tmp);
646
647 /* GLSL 1.10 does not allow array assignment. However, we don't have to
648 * explicitly test for this because none of the binary expression
649 * operators allow array operands either.
650 */
651
652 result = op[0];
653 break;
654 }
655
656 case ast_mod_assign:
657
658 case ast_ls_assign:
659 case ast_rs_assign:
660
661 case ast_and_assign:
662 case ast_xor_assign:
663 case ast_or_assign:
664
665 case ast_conditional:
666
667 case ast_pre_inc:
668 case ast_pre_dec:
669
670 case ast_post_inc:
671 case ast_post_dec:
672 break;
673
674 case ast_field_selection:
675 result = _mesa_ast_field_selection_to_hir(this, instructions, state);
676 type = result->type;
677 break;
678
679 case ast_array_index:
680 break;
681
682 case ast_function_call:
683 /* Should *NEVER* get here. ast_function_call should always be handled
684 * by ast_function_expression::hir.
685 */
686 assert(0);
687 break;
688
689 case ast_identifier: {
690 /* ast_identifier can appear several places in a full abstract syntax
691 * tree. This particular use must be at location specified in the grammar
692 * as 'variable_identifier'.
693 */
694 ir_variable *var =
695 state->symbols->get_variable(this->primary_expression.identifier);
696
697 result = new ir_dereference(var);
698
699 if (var != NULL) {
700 type = result->type;
701 } else {
702 _mesa_glsl_error(& loc, state, "`%s' undeclared",
703 this->primary_expression.identifier);
704
705 error_emitted = true;
706 }
707 break;
708 }
709
710 case ast_int_constant:
711 type = glsl_int_type;
712 result = new ir_constant(type, & this->primary_expression);
713 break;
714
715 case ast_uint_constant:
716 type = glsl_uint_type;
717 result = new ir_constant(type, & this->primary_expression);
718 break;
719
720 case ast_float_constant:
721 type = glsl_float_type;
722 result = new ir_constant(type, & this->primary_expression);
723 break;
724
725 case ast_bool_constant:
726 type = glsl_bool_type;
727 result = new ir_constant(type, & this->primary_expression);
728 break;
729
730 case ast_sequence: {
731 struct simple_node *ptr;
732
733 /* It should not be possible to generate a sequence in the AST without
734 * any expressions in it.
735 */
736 assert(!is_empty_list(&this->expressions));
737
738 /* The r-value of a sequence is the last expression in the sequence. If
739 * the other expressions in the sequence do not have side-effects (and
740 * therefore add instructions to the instruction list), they get dropped
741 * on the floor.
742 */
743 foreach (ptr, &this->expressions)
744 result = ((ast_node *)ptr)->hir(instructions, state);
745
746 type = result->type;
747
748 /* Any errors should have already been emitted in the loop above.
749 */
750 error_emitted = true;
751 break;
752 }
753 }
754
755 if (is_error_type(type) && !error_emitted)
756 _mesa_glsl_error(& loc, state, "type mismatch");
757
758 return result;
759 }
760
761
762 ir_instruction *
763 ast_expression_statement::hir(exec_list *instructions,
764 struct _mesa_glsl_parse_state *state)
765 {
766 /* It is possible to have expression statements that don't have an
767 * expression. This is the solitary semicolon:
768 *
769 * for (i = 0; i < 5; i++)
770 * ;
771 *
772 * In this case the expression will be NULL. Test for NULL and don't do
773 * anything in that case.
774 */
775 if (expression != NULL)
776 expression->hir(instructions, state);
777
778 /* Statements do not have r-values.
779 */
780 return NULL;
781 }
782
783
784 ir_instruction *
785 ast_compound_statement::hir(exec_list *instructions,
786 struct _mesa_glsl_parse_state *state)
787 {
788 struct simple_node *ptr;
789
790
791 if (new_scope)
792 state->symbols->push_scope();
793
794 foreach (ptr, &statements)
795 ((ast_node *)ptr)->hir(instructions, state);
796
797 if (new_scope)
798 state->symbols->pop_scope();
799
800 /* Compound statements do not have r-values.
801 */
802 return NULL;
803 }
804
805
806 static const struct glsl_type *
807 type_specifier_to_glsl_type(const struct ast_type_specifier *spec,
808 const char **name,
809 struct _mesa_glsl_parse_state *state)
810 {
811 struct glsl_type *type;
812
813 if (spec->type_specifier == ast_struct) {
814 /* FINISHME: Handle annonymous structures. */
815 type = NULL;
816 } else {
817 type = state->symbols->get_type(spec->type_name);
818 *name = spec->type_name;
819
820 /* FINISHME: Handle array declarations. Note that this requires complete
821 * FINISHME: handling of constant expressions.
822 */
823 }
824
825 return type;
826 }
827
828
829 static void
830 apply_type_qualifier_to_variable(const struct ast_type_qualifier *qual,
831 struct ir_variable *var,
832 struct _mesa_glsl_parse_state *state)
833 {
834 if (qual->invariant)
835 var->invariant = 1;
836
837 /* FINISHME: Mark 'in' variables at global scope as read-only. */
838 if (qual->constant || qual->attribute || qual->uniform
839 || (qual->varying && (state->target == fragment_shader)))
840 var->read_only = 1;
841
842 if (qual->centroid)
843 var->centroid = 1;
844
845 if (qual->in && qual->out)
846 var->mode = ir_var_inout;
847 else if (qual->attribute || qual->in
848 || (qual->varying && (state->target == fragment_shader)))
849 var->mode = ir_var_in;
850 else if (qual->out || (qual->varying && (state->target == vertex_shader)))
851 var->mode = ir_var_out;
852 else if (qual->uniform)
853 var->mode = ir_var_uniform;
854 else
855 var->mode = ir_var_auto;
856
857 if (qual->flat)
858 var->interpolation = ir_var_flat;
859 else if (qual->noperspective)
860 var->interpolation = ir_var_noperspective;
861 else
862 var->interpolation = ir_var_smooth;
863 }
864
865
866 ir_instruction *
867 ast_declarator_list::hir(exec_list *instructions,
868 struct _mesa_glsl_parse_state *state)
869 {
870 struct simple_node *ptr;
871 const struct glsl_type *decl_type;
872 const char *type_name = NULL;
873
874
875 /* FINISHME: Handle vertex shader "invariant" declarations that do not
876 * FINISHME: include a type. These re-declare built-in variables to be
877 * FINISHME: invariant.
878 */
879
880 decl_type = type_specifier_to_glsl_type(this->type->specifier,
881 & type_name, state);
882
883 foreach (ptr, &this->declarations) {
884 struct ast_declaration *const decl = (struct ast_declaration * )ptr;
885 const struct glsl_type *var_type;
886 struct ir_variable *var;
887
888
889 /* FINISHME: Emit a warning if a variable declaration shadows a
890 * FINISHME: declaration at a higher scope.
891 */
892
893 if ((decl_type == NULL) || decl_type->is_void()) {
894 YYLTYPE loc;
895
896 loc = this->get_location();
897 if (type_name != NULL) {
898 _mesa_glsl_error(& loc, state,
899 "invalid type `%s' in declaration of `%s'",
900 type_name, decl->identifier);
901 } else {
902 _mesa_glsl_error(& loc, state,
903 "invalid type in declaration of `%s'",
904 decl->identifier);
905 }
906 continue;
907 }
908
909 if (decl->is_array) {
910 /* FINISHME: Handle array declarations. Note that this requires
911 * FINISHME: complete handling of constant expressions.
912 */
913
914 /* FINISHME: Reject delcarations of multidimensional arrays. */
915 } else {
916 var_type = decl_type;
917 }
918
919 var = new ir_variable(var_type, decl->identifier);
920
921 /* FINISHME: Variables that are attribute, uniform, varying, in, or
922 * FINISHME: out varibles must be declared either at global scope or
923 * FINISHME: in a parameter list (in and out only).
924 */
925
926 apply_type_qualifier_to_variable(& this->type->qualifier, var, state);
927
928 /* Attempt to add the variable to the symbol table. If this fails, it
929 * means the variable has already been declared at this scope.
930 */
931 if (state->symbols->name_declared_this_scope(decl->identifier)) {
932 YYLTYPE loc = this->get_location();
933
934 _mesa_glsl_error(& loc, state, "`%s' redeclared",
935 decl->identifier);
936 continue;
937 }
938
939 const bool added_variable =
940 state->symbols->add_variable(decl->identifier, var);
941 assert(added_variable);
942
943 instructions->push_tail(var);
944
945 /* FINISHME: Process the declaration initializer. */
946 }
947
948 /* Variable declarations do not have r-values.
949 */
950 return NULL;
951 }
952
953
954 ir_instruction *
955 ast_parameter_declarator::hir(exec_list *instructions,
956 struct _mesa_glsl_parse_state *state)
957 {
958 const struct glsl_type *type;
959 const char *name = NULL;
960
961
962 type = type_specifier_to_glsl_type(this->type->specifier, & name, state);
963
964 if (type == NULL) {
965 YYLTYPE loc = this->get_location();
966 if (name != NULL) {
967 _mesa_glsl_error(& loc, state,
968 "invalid type `%s' in declaration of `%s'",
969 name, this->identifier);
970 } else {
971 _mesa_glsl_error(& loc, state,
972 "invalid type in declaration of `%s'",
973 this->identifier);
974 }
975
976 type = glsl_error_type;
977 }
978
979 ir_variable *var = new ir_variable(type, this->identifier);
980
981 /* FINISHME: Handle array declarations. Note that this requires
982 * FINISHME: complete handling of constant expressions.
983 */
984
985 /* Apply any specified qualifiers to the parameter declaration. Note that
986 * for function parameters the default mode is 'in'.
987 */
988 apply_type_qualifier_to_variable(& this->type->qualifier, var, state);
989 if (var->mode == ir_var_auto)
990 var->mode = ir_var_in;
991
992 instructions->push_tail(var);
993
994 /* Parameter declarations do not have r-values.
995 */
996 return NULL;
997 }
998
999
1000 static void
1001 ast_function_parameters_to_hir(struct simple_node *ast_parameters,
1002 exec_list *ir_parameters,
1003 struct _mesa_glsl_parse_state *state)
1004 {
1005 struct simple_node *ptr;
1006
1007 foreach (ptr, ast_parameters) {
1008 ((ast_node *)ptr)->hir(ir_parameters, state);
1009 }
1010 }
1011
1012
1013 static bool
1014 parameter_lists_match(exec_list *list_a, exec_list *list_b)
1015 {
1016 exec_list_iterator iter_a = list_a->iterator();
1017 exec_list_iterator iter_b = list_b->iterator();
1018
1019 while (iter_a.has_next()) {
1020 /* If all of the parameters from the other parameter list have been
1021 * exhausted, the lists have different length and, by definition,
1022 * do not match.
1023 */
1024 if (!iter_b.has_next())
1025 return false;
1026
1027 /* If the types of the parameters do not match, the parameters lists
1028 * are different.
1029 */
1030 /* FINISHME */
1031
1032
1033 iter_a.next();
1034 iter_b.next();
1035 }
1036
1037 return true;
1038 }
1039
1040
1041 ir_instruction *
1042 ast_function_definition::hir(exec_list *instructions,
1043 struct _mesa_glsl_parse_state *state)
1044 {
1045 ir_label *label;
1046 ir_function_signature *signature = NULL;
1047 ir_function *f = NULL;
1048 exec_list parameters;
1049
1050
1051 /* Convert the list of function parameters to HIR now so that they can be
1052 * used below to compare this function's signature with previously seen
1053 * signatures for functions with the same name.
1054 */
1055 ast_function_parameters_to_hir(& this->prototype->parameters, & parameters,
1056 state);
1057
1058 const char *return_type_name;
1059 const glsl_type *return_type =
1060 type_specifier_to_glsl_type(this->prototype->return_type->specifier,
1061 & return_type_name, state);
1062
1063 assert(return_type != NULL);
1064
1065
1066 /* Verify that this function's signature either doesn't match a previously
1067 * seen signature for a function with the same name, or, if a match is found,
1068 * that the previously seen signature does not have an associated definition.
1069 */
1070 const char *const name = this->prototype->identifier;
1071 f = state->symbols->get_function(name);
1072 if (f != NULL) {
1073 foreach_iter(exec_list_iterator, iter, f->signatures) {
1074 signature = (struct ir_function_signature *) iter.get();
1075
1076 /* Compare the parameter list of the function being defined to the
1077 * existing function. If the parameter lists match, then the return
1078 * type must also match and the existing function must not have a
1079 * definition.
1080 */
1081 if (parameter_lists_match(& parameters, & signature->parameters)) {
1082 /* FINISHME: Compare return types. */
1083
1084 if (signature->definition != NULL) {
1085 YYLTYPE loc = this->get_location();
1086
1087 _mesa_glsl_error(& loc, state, "function `%s' redefined", name);
1088 signature = NULL;
1089 break;
1090 }
1091 }
1092
1093 signature = NULL;
1094 }
1095
1096 } else if (state->symbols->name_declared_this_scope(name)) {
1097 /* This function name shadows a non-function use of the same name.
1098 */
1099 YYLTYPE loc = this->get_location();
1100
1101 _mesa_glsl_error(& loc, state, "function name `%s' conflicts with "
1102 "non-function", name);
1103 signature = NULL;
1104 } else {
1105 f = new ir_function(name);
1106 state->symbols->add_function(f->name, f);
1107 }
1108
1109
1110 /* Finish storing the information about this new function in its signature.
1111 */
1112 if (signature == NULL) {
1113 signature = new ir_function_signature(return_type);
1114 f->signatures.push_tail(signature);
1115 } else {
1116 /* Destroy all of the previous parameter information. The previous
1117 * parameter information comes from the function prototype, and it can
1118 * either include invalid parameter names or may not have names at all.
1119 */
1120 foreach_iter(exec_list_iterator, iter, signature->parameters) {
1121 assert(((ir_instruction *) iter.get())->as_variable() != NULL);
1122
1123 iter.remove();
1124 delete iter.get();
1125 }
1126 }
1127
1128
1129 assert(state->current_function == NULL);
1130 state->current_function = signature;
1131
1132 ast_function_parameters_to_hir(& this->prototype->parameters,
1133 & signature->parameters,
1134 state);
1135 /* FINISHME: Set signature->return_type */
1136
1137 label = new ir_label(name);
1138 if (signature->definition == NULL) {
1139 signature->definition = label;
1140 }
1141 instructions->push_tail(label);
1142
1143 /* Add the function parameters to the symbol table. During this step the
1144 * parameter declarations are also moved from the temporary "parameters" list
1145 * to the instruction list. There are other more efficient ways to do this,
1146 * but they involve ugly linked-list gymnastics.
1147 */
1148 state->symbols->push_scope();
1149 foreach_iter(exec_list_iterator, iter, parameters) {
1150 ir_variable *const var = (ir_variable *) iter.get();
1151
1152 assert(((ir_instruction *) var)->as_variable() != NULL);
1153
1154 iter.remove();
1155 instructions->push_tail(var);
1156
1157 /* The only way a parameter would "exist" is if two parameters have
1158 * the same name.
1159 */
1160 if (state->symbols->name_declared_this_scope(var->name)) {
1161 YYLTYPE loc = this->get_location();
1162
1163 _mesa_glsl_error(& loc, state, "parameter `%s' redeclared", var->name);
1164 } else {
1165 state->symbols->add_variable(var->name, var);
1166 }
1167 }
1168
1169 /* Convert the body of the function to HIR, and append the resulting
1170 * instructions to the list that currently consists of the function label
1171 * and the function parameters.
1172 */
1173 this->body->hir(instructions, state);
1174
1175 state->symbols->pop_scope();
1176
1177 assert(state->current_function == signature);
1178 state->current_function = NULL;
1179
1180 /* Function definitions do not have r-values.
1181 */
1182 return NULL;
1183 }
1184
1185
1186 ir_instruction *
1187 ast_jump_statement::hir(exec_list *instructions,
1188 struct _mesa_glsl_parse_state *state)
1189 {
1190
1191 if (mode == ast_return) {
1192 ir_return *inst;
1193
1194 if (opt_return_value) {
1195 /* FINISHME: Make sure the enclosing function has a non-void return
1196 * FINISHME: type.
1197 */
1198
1199 ir_expression *const ret = (ir_expression *)
1200 opt_return_value->hir(instructions, state);
1201 assert(ret != NULL);
1202
1203 /* FINISHME: Make sure the type of the return value matches the return
1204 * FINISHME: type of the enclosing function.
1205 */
1206
1207 inst = new ir_return(ret);
1208 } else {
1209 /* FINISHME: Make sure the enclosing function has a void return type.
1210 */
1211 inst = new ir_return;
1212 }
1213
1214 instructions->push_tail(inst);
1215 }
1216
1217 /* Jump instructions do not have r-values.
1218 */
1219 return NULL;
1220 }