ast.h revision b8e80941
1/* -*- c++ -*- */ 2/* 3 * Copyright © 2009 Intel Corporation 4 * 5 * Permission is hereby granted, free of charge, to any person obtaining a 6 * copy of this software and associated documentation files (the "Software"), 7 * to deal in the Software without restriction, including without limitation 8 * the rights to use, copy, modify, merge, publish, distribute, sublicense, 9 * and/or sell copies of the Software, and to permit persons to whom the 10 * Software is furnished to do so, subject to the following conditions: 11 * 12 * The above copyright notice and this permission notice (including the next 13 * paragraph) shall be included in all copies or substantial portions of the 14 * Software. 15 * 16 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 17 * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 18 * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL 19 * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 20 * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING 21 * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER 22 * DEALINGS IN THE SOFTWARE. 23 */ 24 25#ifndef AST_H 26#define AST_H 27 28#include "list.h" 29#include "glsl_parser_extras.h" 30#include "compiler/glsl_types.h" 31#include "util/bitset.h" 32 33struct _mesa_glsl_parse_state; 34 35struct YYLTYPE; 36 37/** 38 * \defgroup AST Abstract syntax tree node definitions 39 * 40 * An abstract syntax tree is generated by the parser. This is a fairly 41 * direct representation of the gramma derivation for the source program. 42 * No symantic checking is done during the generation of the AST. Only 43 * syntactic checking is done. Symantic checking is performed by a later 44 * stage that converts the AST to a more generic intermediate representation. 45 * 46 *@{ 47 */ 48/** 49 * Base class of all abstract syntax tree nodes 50 */ 51class ast_node { 52public: 53 DECLARE_LINEAR_ZALLOC_CXX_OPERATORS(ast_node); 54 55 /** 56 * Print an AST node in something approximating the original GLSL code 57 */ 58 virtual void print(void) const; 59 60 /** 61 * Convert the AST node to the high-level intermediate representation 62 */ 63 virtual ir_rvalue *hir(exec_list *instructions, 64 struct _mesa_glsl_parse_state *state); 65 66 virtual bool has_sequence_subexpression() const; 67 68 /** 69 * Retrieve the source location of an AST node 70 * 71 * This function is primarily used to get the source position of an AST node 72 * into a form that can be passed to \c _mesa_glsl_error. 73 * 74 * \sa _mesa_glsl_error, ast_node::set_location 75 */ 76 struct YYLTYPE get_location(void) const 77 { 78 struct YYLTYPE locp; 79 80 locp.source = this->location.source; 81 locp.first_line = this->location.first_line; 82 locp.first_column = this->location.first_column; 83 locp.last_line = this->location.last_line; 84 locp.last_column = this->location.last_column; 85 86 return locp; 87 } 88 89 /** 90 * Set the source location of an AST node from a parser location 91 * 92 * \sa ast_node::get_location 93 */ 94 void set_location(const struct YYLTYPE &locp) 95 { 96 this->location.source = locp.source; 97 this->location.first_line = locp.first_line; 98 this->location.first_column = locp.first_column; 99 this->location.last_line = locp.last_line; 100 this->location.last_column = locp.last_column; 101 } 102 103 /** 104 * Set the source location range of an AST node using two location nodes 105 * 106 * \sa ast_node::set_location 107 */ 108 void set_location_range(const struct YYLTYPE &begin, const struct YYLTYPE &end) 109 { 110 this->location.source = begin.source; 111 this->location.first_line = begin.first_line; 112 this->location.last_line = end.last_line; 113 this->location.first_column = begin.first_column; 114 this->location.last_column = end.last_column; 115 } 116 117 /** 118 * Source location of the AST node. 119 */ 120 struct { 121 unsigned source; /**< GLSL source number. */ 122 unsigned first_line; /**< First line number within the source string. */ 123 unsigned first_column; /**< First column in the first line. */ 124 unsigned last_line; /**< Last line number within the source string. */ 125 unsigned last_column; /**< Last column in the last line. */ 126 } location; 127 128 exec_node link; 129 130 virtual void set_is_lhs(bool); 131 132protected: 133 /** 134 * The only constructor is protected so that only derived class objects can 135 * be created. 136 */ 137 ast_node(void); 138}; 139 140 141/** 142 * Operators for AST expression nodes. 143 */ 144enum ast_operators { 145 ast_assign, 146 ast_plus, /**< Unary + operator. */ 147 ast_neg, 148 ast_add, 149 ast_sub, 150 ast_mul, 151 ast_div, 152 ast_mod, 153 ast_lshift, 154 ast_rshift, 155 ast_less, 156 ast_greater, 157 ast_lequal, 158 ast_gequal, 159 ast_equal, 160 ast_nequal, 161 ast_bit_and, 162 ast_bit_xor, 163 ast_bit_or, 164 ast_bit_not, 165 ast_logic_and, 166 ast_logic_xor, 167 ast_logic_or, 168 ast_logic_not, 169 170 ast_mul_assign, 171 ast_div_assign, 172 ast_mod_assign, 173 ast_add_assign, 174 ast_sub_assign, 175 ast_ls_assign, 176 ast_rs_assign, 177 ast_and_assign, 178 ast_xor_assign, 179 ast_or_assign, 180 181 ast_conditional, 182 183 ast_pre_inc, 184 ast_pre_dec, 185 ast_post_inc, 186 ast_post_dec, 187 ast_field_selection, 188 ast_array_index, 189 ast_unsized_array_dim, 190 191 ast_function_call, 192 193 ast_identifier, 194 ast_int_constant, 195 ast_uint_constant, 196 ast_float_constant, 197 ast_bool_constant, 198 ast_double_constant, 199 ast_int64_constant, 200 ast_uint64_constant, 201 202 ast_sequence, 203 ast_aggregate 204 205 /** 206 * Number of possible operators for an ast_expression 207 * 208 * This is done as a define instead of as an additional value in the enum so 209 * that the compiler won't generate spurious messages like "warning: 210 * enumeration value ‘ast_num_operators’ not handled in switch" 211 */ 212 #define AST_NUM_OPERATORS (ast_aggregate + 1) 213}; 214 215/** 216 * Representation of any sort of expression. 217 */ 218class ast_expression : public ast_node { 219public: 220 ast_expression(int oper, ast_expression *, 221 ast_expression *, ast_expression *); 222 223 ast_expression(const char *identifier) : 224 oper(ast_identifier) 225 { 226 subexpressions[0] = NULL; 227 subexpressions[1] = NULL; 228 subexpressions[2] = NULL; 229 primary_expression.identifier = identifier; 230 this->non_lvalue_description = NULL; 231 this->is_lhs = false; 232 } 233 234 static const char *operator_string(enum ast_operators op); 235 236 virtual ir_rvalue *hir(exec_list *instructions, 237 struct _mesa_glsl_parse_state *state); 238 239 virtual void hir_no_rvalue(exec_list *instructions, 240 struct _mesa_glsl_parse_state *state); 241 242 virtual bool has_sequence_subexpression() const; 243 244 ir_rvalue *do_hir(exec_list *instructions, 245 struct _mesa_glsl_parse_state *state, 246 bool needs_rvalue); 247 248 virtual void print(void) const; 249 250 enum ast_operators oper; 251 252 ast_expression *subexpressions[3]; 253 254 union { 255 const char *identifier; 256 int int_constant; 257 float float_constant; 258 unsigned uint_constant; 259 int bool_constant; 260 double double_constant; 261 uint64_t uint64_constant; 262 int64_t int64_constant; 263 } primary_expression; 264 265 266 /** 267 * List of expressions for an \c ast_sequence or parameters for an 268 * \c ast_function_call 269 */ 270 exec_list expressions; 271 272 /** 273 * For things that can't be l-values, this describes what it is. 274 * 275 * This text is used by the code that generates IR for assignments to 276 * detect and emit useful messages for assignments to some things that 277 * can't be l-values. For example, pre- or post-incerement expressions. 278 * 279 * \note 280 * This pointer may be \c NULL. 281 */ 282 const char *non_lvalue_description; 283 284 void set_is_lhs(bool new_value); 285 286private: 287 bool is_lhs; 288}; 289 290class ast_expression_bin : public ast_expression { 291public: 292 ast_expression_bin(int oper, ast_expression *, ast_expression *); 293 294 virtual void print(void) const; 295}; 296 297/** 298 * Subclass of expressions for function calls 299 */ 300class ast_function_expression : public ast_expression { 301public: 302 ast_function_expression(ast_expression *callee) 303 : ast_expression(ast_function_call, callee, 304 NULL, NULL), 305 cons(false) 306 { 307 /* empty */ 308 } 309 310 ast_function_expression(class ast_type_specifier *type) 311 : ast_expression(ast_function_call, (ast_expression *) type, 312 NULL, NULL), 313 cons(true) 314 { 315 /* empty */ 316 } 317 318 bool is_constructor() const 319 { 320 return cons; 321 } 322 323 virtual ir_rvalue *hir(exec_list *instructions, 324 struct _mesa_glsl_parse_state *state); 325 326 virtual void hir_no_rvalue(exec_list *instructions, 327 struct _mesa_glsl_parse_state *state); 328 329 virtual bool has_sequence_subexpression() const; 330 331private: 332 /** 333 * Is this function call actually a constructor? 334 */ 335 bool cons; 336 ir_rvalue * 337 handle_method(exec_list *instructions, 338 struct _mesa_glsl_parse_state *state); 339}; 340 341class ast_subroutine_list : public ast_node 342{ 343public: 344 virtual void print(void) const; 345 exec_list declarations; 346}; 347 348class ast_array_specifier : public ast_node { 349public: 350 ast_array_specifier(const struct YYLTYPE &locp, ast_expression *dim) 351 { 352 set_location(locp); 353 array_dimensions.push_tail(&dim->link); 354 } 355 356 void add_dimension(ast_expression *dim) 357 { 358 array_dimensions.push_tail(&dim->link); 359 } 360 361 bool is_single_dimension() const 362 { 363 return this->array_dimensions.get_tail_raw()->prev != NULL && 364 this->array_dimensions.get_tail_raw()->prev->is_head_sentinel(); 365 } 366 367 virtual void print(void) const; 368 369 /* This list contains objects of type ast_node containing the 370 * array dimensions in outermost-to-innermost order. 371 */ 372 exec_list array_dimensions; 373}; 374 375class ast_layout_expression : public ast_node { 376public: 377 ast_layout_expression(const struct YYLTYPE &locp, ast_expression *expr) 378 { 379 set_location(locp); 380 layout_const_expressions.push_tail(&expr->link); 381 } 382 383 bool process_qualifier_constant(struct _mesa_glsl_parse_state *state, 384 const char *qual_indentifier, 385 unsigned *value, bool can_be_zero); 386 387 void merge_qualifier(ast_layout_expression *l_expr) 388 { 389 layout_const_expressions.append_list(&l_expr->layout_const_expressions); 390 } 391 392 exec_list layout_const_expressions; 393}; 394 395/** 396 * C-style aggregate initialization class 397 * 398 * Represents C-style initializers of vectors, matrices, arrays, and 399 * structures. E.g., vec3 pos = {1.0, 0.0, -1.0} is equivalent to 400 * vec3 pos = vec3(1.0, 0.0, -1.0). 401 * 402 * Specified in GLSL 4.20 and GL_ARB_shading_language_420pack. 403 * 404 * \sa _mesa_ast_set_aggregate_type 405 */ 406class ast_aggregate_initializer : public ast_expression { 407public: 408 ast_aggregate_initializer() 409 : ast_expression(ast_aggregate, NULL, NULL, NULL), 410 constructor_type(NULL) 411 { 412 /* empty */ 413 } 414 415 /** 416 * glsl_type of the aggregate, which is inferred from the LHS of whatever 417 * the aggregate is being used to initialize. This can't be inferred at 418 * parse time (since the parser deals with ast_type_specifiers, not 419 * glsl_types), so the parser leaves it NULL. However, the ast-to-hir 420 * conversion code makes sure to fill it in with the appropriate type 421 * before hir() is called. 422 */ 423 const glsl_type *constructor_type; 424 425 virtual ir_rvalue *hir(exec_list *instructions, 426 struct _mesa_glsl_parse_state *state); 427 428 virtual void hir_no_rvalue(exec_list *instructions, 429 struct _mesa_glsl_parse_state *state); 430}; 431 432 433class ast_compound_statement : public ast_node { 434public: 435 ast_compound_statement(int new_scope, ast_node *statements); 436 virtual void print(void) const; 437 438 virtual ir_rvalue *hir(exec_list *instructions, 439 struct _mesa_glsl_parse_state *state); 440 441 int new_scope; 442 exec_list statements; 443}; 444 445class ast_declaration : public ast_node { 446public: 447 ast_declaration(const char *identifier, 448 ast_array_specifier *array_specifier, 449 ast_expression *initializer); 450 virtual void print(void) const; 451 452 const char *identifier; 453 454 ast_array_specifier *array_specifier; 455 456 ast_expression *initializer; 457}; 458 459 460enum { 461 ast_precision_none = 0, /**< Absence of precision qualifier. */ 462 ast_precision_high, 463 ast_precision_medium, 464 ast_precision_low 465}; 466 467enum { 468 ast_depth_none = 0, /**< Absence of depth qualifier. */ 469 ast_depth_any, 470 ast_depth_greater, 471 ast_depth_less, 472 ast_depth_unchanged 473}; 474 475struct ast_type_qualifier { 476 DECLARE_RALLOC_CXX_OPERATORS(ast_type_qualifier); 477 /* Note: this bitset needs to have at least as many bits as the 'q' 478 * struct has flags, below. Previously, the size was 128 instead of 96. 479 * But an apparent bug in GCC 5.4.0 causes bad SSE code generation 480 * elsewhere, leading to a crash. 96 bits works around the issue. 481 * See https://bugs.freedesktop.org/show_bug.cgi?id=105497 482 */ 483 DECLARE_BITSET_T(bitset_t, 96); 484 485 union flags { 486 struct { 487 unsigned invariant:1; 488 unsigned precise:1; 489 unsigned constant:1; 490 unsigned attribute:1; 491 unsigned varying:1; 492 unsigned in:1; 493 unsigned out:1; 494 unsigned centroid:1; 495 unsigned sample:1; 496 unsigned patch:1; 497 unsigned uniform:1; 498 unsigned buffer:1; 499 unsigned shared_storage:1; 500 unsigned smooth:1; 501 unsigned flat:1; 502 unsigned noperspective:1; 503 504 /** \name Layout qualifiers for GL_ARB_fragment_coord_conventions */ 505 /*@{*/ 506 unsigned origin_upper_left:1; 507 unsigned pixel_center_integer:1; 508 /*@}*/ 509 510 /** 511 * Flag set if GL_ARB_enhanced_layouts "align" layout qualifier is 512 * used. 513 */ 514 unsigned explicit_align:1; 515 516 /** 517 * Flag set if GL_ARB_explicit_attrib_location "location" layout 518 * qualifier is used. 519 */ 520 unsigned explicit_location:1; 521 /** 522 * Flag set if GL_ARB_explicit_attrib_location "index" layout 523 * qualifier is used. 524 */ 525 unsigned explicit_index:1; 526 527 /** 528 * Flag set if GL_ARB_enhanced_layouts "component" layout 529 * qualifier is used. 530 */ 531 unsigned explicit_component:1; 532 533 /** 534 * Flag set if GL_ARB_shading_language_420pack "binding" layout 535 * qualifier is used. 536 */ 537 unsigned explicit_binding:1; 538 539 /** 540 * Flag set if GL_ARB_shader_atomic counter "offset" layout 541 * qualifier is used. 542 */ 543 unsigned explicit_offset:1; 544 545 /** \name Layout qualifiers for GL_AMD_conservative_depth */ 546 /** \{ */ 547 unsigned depth_type:1; 548 /** \} */ 549 550 /** \name Layout qualifiers for GL_ARB_uniform_buffer_object */ 551 /** \{ */ 552 unsigned std140:1; 553 unsigned std430:1; 554 unsigned shared:1; 555 unsigned packed:1; 556 unsigned column_major:1; 557 unsigned row_major:1; 558 /** \} */ 559 560 /** \name Layout qualifiers for GLSL 1.50 geometry shaders */ 561 /** \{ */ 562 unsigned prim_type:1; 563 unsigned max_vertices:1; 564 /** \} */ 565 566 /** 567 * local_size_{x,y,z} flags for compute shaders. Bit 0 represents 568 * local_size_x, and so on. 569 */ 570 unsigned local_size:3; 571 572 /** \name Layout qualifiers for ARB_compute_variable_group_size. */ 573 /** \{ */ 574 unsigned local_size_variable:1; 575 /** \} */ 576 577 /** \name Layout and memory qualifiers for ARB_shader_image_load_store. */ 578 /** \{ */ 579 unsigned early_fragment_tests:1; 580 unsigned explicit_image_format:1; 581 unsigned coherent:1; 582 unsigned _volatile:1; 583 unsigned restrict_flag:1; 584 unsigned read_only:1; /**< "readonly" qualifier. */ 585 unsigned write_only:1; /**< "writeonly" qualifier. */ 586 /** \} */ 587 588 /** \name Layout qualifiers for GL_ARB_gpu_shader5 */ 589 /** \{ */ 590 unsigned invocations:1; 591 unsigned stream:1; /**< Has stream value assigned */ 592 unsigned explicit_stream:1; /**< stream value assigned explicitly by shader code */ 593 /** \} */ 594 595 /** \name Layout qualifiers for GL_ARB_enhanced_layouts */ 596 /** \{ */ 597 unsigned explicit_xfb_offset:1; /**< xfb_offset value assigned explicitly by shader code */ 598 unsigned xfb_buffer:1; /**< Has xfb_buffer value assigned */ 599 unsigned explicit_xfb_buffer:1; /**< xfb_buffer value assigned explicitly by shader code */ 600 unsigned xfb_stride:1; /**< Is xfb_stride value yet to be merged with global values */ 601 unsigned explicit_xfb_stride:1; /**< xfb_stride value assigned explicitly by shader code */ 602 /** \} */ 603 604 /** \name Layout qualifiers for GL_ARB_tessellation_shader */ 605 /** \{ */ 606 /* tess eval input layout */ 607 /* gs prim_type reused for primitive mode */ 608 unsigned vertex_spacing:1; 609 unsigned ordering:1; 610 unsigned point_mode:1; 611 /* tess control output layout */ 612 unsigned vertices:1; 613 /** \} */ 614 615 /** \name Qualifiers for GL_ARB_shader_subroutine */ 616 /** \{ */ 617 unsigned subroutine:1; /**< Is this marked 'subroutine' */ 618 /** \} */ 619 620 /** \name Qualifiers for GL_KHR_blend_equation_advanced */ 621 /** \{ */ 622 unsigned blend_support:1; /**< Are there any blend_support_ qualifiers */ 623 /** \} */ 624 625 /** 626 * Flag set if GL_ARB_post_depth_coverage layout qualifier is used. 627 */ 628 unsigned post_depth_coverage:1; 629 630 /** 631 * Flags for the layout qualifers added by ARB_fragment_shader_interlock 632 */ 633 634 unsigned pixel_interlock_ordered:1; 635 unsigned pixel_interlock_unordered:1; 636 unsigned sample_interlock_ordered:1; 637 unsigned sample_interlock_unordered:1; 638 639 /** 640 * Flag set if GL_INTEL_conservartive_rasterization layout qualifier 641 * is used. 642 */ 643 unsigned inner_coverage:1; 644 645 /** \name Layout qualifiers for GL_ARB_bindless_texture */ 646 /** \{ */ 647 unsigned bindless_sampler:1; 648 unsigned bindless_image:1; 649 unsigned bound_sampler:1; 650 unsigned bound_image:1; 651 /** \} */ 652 653 /** \name Layout qualifiers for GL_EXT_shader_framebuffer_fetch_non_coherent */ 654 /** \{ */ 655 unsigned non_coherent:1; 656 /** \} */ 657 658 /** \name Layout qualifiers for NV_compute_shader_derivatives */ 659 /** \{ */ 660 unsigned derivative_group:1; 661 /** \} */ 662 } 663 /** \brief Set of flags, accessed by name. */ 664 q; 665 666 /** \brief Set of flags, accessed as a bitmask. */ 667 bitset_t i; 668 } flags; 669 670 /** Precision of the type (highp/medium/lowp). */ 671 unsigned precision:2; 672 673 /** Type of layout qualifiers for GL_AMD_conservative_depth. */ 674 unsigned depth_type:3; 675 676 /** 677 * Alignment specified via GL_ARB_enhanced_layouts "align" layout qualifier 678 */ 679 ast_expression *align; 680 681 /** Geometry shader invocations for GL_ARB_gpu_shader5. */ 682 ast_layout_expression *invocations; 683 684 /** 685 * Location specified via GL_ARB_explicit_attrib_location layout 686 * 687 * \note 688 * This field is only valid if \c explicit_location is set. 689 */ 690 ast_expression *location; 691 /** 692 * Index specified via GL_ARB_explicit_attrib_location layout 693 * 694 * \note 695 * This field is only valid if \c explicit_index is set. 696 */ 697 ast_expression *index; 698 699 /** 700 * Component specified via GL_ARB_enhaced_layouts 701 * 702 * \note 703 * This field is only valid if \c explicit_component is set. 704 */ 705 ast_expression *component; 706 707 /** Maximum output vertices in GLSL 1.50 geometry shaders. */ 708 ast_layout_expression *max_vertices; 709 710 /** Stream in GLSL 1.50 geometry shaders. */ 711 ast_expression *stream; 712 713 /** xfb_buffer specified via the GL_ARB_enhanced_layouts keyword. */ 714 ast_expression *xfb_buffer; 715 716 /** xfb_stride specified via the GL_ARB_enhanced_layouts keyword. */ 717 ast_expression *xfb_stride; 718 719 /** global xfb_stride values for each buffer */ 720 ast_layout_expression *out_xfb_stride[MAX_FEEDBACK_BUFFERS]; 721 722 /** 723 * Input or output primitive type in GLSL 1.50 geometry shaders 724 * and tessellation shaders. 725 */ 726 GLenum prim_type; 727 728 /** 729 * Binding specified via GL_ARB_shading_language_420pack's "binding" keyword. 730 * 731 * \note 732 * This field is only valid if \c explicit_binding is set. 733 */ 734 ast_expression *binding; 735 736 /** 737 * Offset specified via GL_ARB_shader_atomic_counter's or 738 * GL_ARB_enhanced_layouts "offset" keyword, or by GL_ARB_enhanced_layouts 739 * "xfb_offset" keyword. 740 * 741 * \note 742 * This field is only valid if \c explicit_offset is set. 743 */ 744 ast_expression *offset; 745 746 /** 747 * Local size specified via GL_ARB_compute_shader's "local_size_{x,y,z}" 748 * layout qualifier. Element i of this array is only valid if 749 * flags.q.local_size & (1 << i) is set. 750 */ 751 ast_layout_expression *local_size[3]; 752 753 /** Tessellation evaluation shader: vertex spacing (equal, fractional even/odd) */ 754 enum gl_tess_spacing vertex_spacing; 755 756 /** Tessellation evaluation shader: vertex ordering (CW or CCW) */ 757 GLenum ordering; 758 759 /** Tessellation evaluation shader: point mode */ 760 bool point_mode; 761 762 /** Tessellation control shader: number of output vertices */ 763 ast_layout_expression *vertices; 764 765 /** 766 * Image format specified with an ARB_shader_image_load_store 767 * layout qualifier. 768 * 769 * \note 770 * This field is only valid if \c explicit_image_format is set. 771 */ 772 GLenum image_format; 773 774 /** 775 * Arrangement of invocations used to calculate derivatives in a compute 776 * shader. From NV_compute_shader_derivatives. 777 */ 778 enum gl_derivative_group derivative_group; 779 780 /** 781 * Base type of the data read from or written to this image. Only 782 * the following enumerants are allowed: GLSL_TYPE_UINT, 783 * GLSL_TYPE_INT, GLSL_TYPE_FLOAT. 784 * 785 * \note 786 * This field is only valid if \c explicit_image_format is set. 787 */ 788 glsl_base_type image_base_type; 789 790 /** 791 * Return true if and only if an interpolation qualifier is present. 792 */ 793 bool has_interpolation() const; 794 795 /** 796 * Return whether a layout qualifier is present. 797 */ 798 bool has_layout() const; 799 800 /** 801 * Return whether a storage qualifier is present. 802 */ 803 bool has_storage() const; 804 805 /** 806 * Return whether an auxiliary storage qualifier is present. 807 */ 808 bool has_auxiliary_storage() const; 809 810 /** 811 * Return true if and only if a memory qualifier is present. 812 */ 813 bool has_memory() const; 814 815 /** 816 * Return true if the qualifier is a subroutine declaration. 817 */ 818 bool is_subroutine_decl() const; 819 820 bool merge_qualifier(YYLTYPE *loc, 821 _mesa_glsl_parse_state *state, 822 const ast_type_qualifier &q, 823 bool is_single_layout_merge, 824 bool is_multiple_layouts_merge = false); 825 826 /** 827 * Validate current qualifier against the global out one. 828 */ 829 bool validate_out_qualifier(YYLTYPE *loc, 830 _mesa_glsl_parse_state *state); 831 832 /** 833 * Merge current qualifier into the global out one. 834 */ 835 bool merge_into_out_qualifier(YYLTYPE *loc, 836 _mesa_glsl_parse_state *state, 837 ast_node* &node); 838 839 /** 840 * Validate current qualifier against the global in one. 841 */ 842 bool validate_in_qualifier(YYLTYPE *loc, 843 _mesa_glsl_parse_state *state); 844 845 /** 846 * Merge current qualifier into the global in one. 847 */ 848 bool merge_into_in_qualifier(YYLTYPE *loc, 849 _mesa_glsl_parse_state *state, 850 ast_node* &node); 851 852 /** 853 * Push pending layout qualifiers to the global values. 854 */ 855 bool push_to_global(YYLTYPE *loc, 856 _mesa_glsl_parse_state *state); 857 858 bool validate_flags(YYLTYPE *loc, 859 _mesa_glsl_parse_state *state, 860 const ast_type_qualifier &allowed_flags, 861 const char *message, const char *name); 862 863 ast_subroutine_list *subroutine_list; 864}; 865 866class ast_declarator_list; 867 868class ast_struct_specifier : public ast_node { 869public: 870 ast_struct_specifier(const char *identifier, 871 ast_declarator_list *declarator_list); 872 virtual void print(void) const; 873 874 virtual ir_rvalue *hir(exec_list *instructions, 875 struct _mesa_glsl_parse_state *state); 876 877 const char *name; 878 ast_type_qualifier *layout; 879 /* List of ast_declarator_list * */ 880 exec_list declarations; 881 bool is_declaration; 882 const glsl_type *type; 883}; 884 885 886 887class ast_type_specifier : public ast_node { 888public: 889 /** Construct a type specifier from a type name */ 890 ast_type_specifier(const char *name) 891 : type(NULL), type_name(name), structure(NULL), array_specifier(NULL), 892 default_precision(ast_precision_none) 893 { 894 /* empty */ 895 } 896 897 /** Construct a type specifier from a structure definition */ 898 ast_type_specifier(ast_struct_specifier *s) 899 : type(NULL), type_name(s->name), structure(s), array_specifier(NULL), 900 default_precision(ast_precision_none) 901 { 902 /* empty */ 903 } 904 905 ast_type_specifier(const glsl_type *t) 906 : type(t), type_name(t->name), structure(NULL), array_specifier(NULL), 907 default_precision(ast_precision_none) 908 { 909 /* empty */ 910 } 911 912 const struct glsl_type *glsl_type(const char **name, 913 struct _mesa_glsl_parse_state *state) 914 const; 915 916 virtual void print(void) const; 917 918 ir_rvalue *hir(exec_list *, struct _mesa_glsl_parse_state *); 919 920 const struct glsl_type *type; 921 const char *type_name; 922 ast_struct_specifier *structure; 923 924 ast_array_specifier *array_specifier; 925 926 /** For precision statements, this is the given precision; otherwise none. */ 927 unsigned default_precision:2; 928}; 929 930 931class ast_fully_specified_type : public ast_node { 932public: 933 virtual void print(void) const; 934 bool has_qualifiers(_mesa_glsl_parse_state *state) const; 935 936 ast_fully_specified_type() : qualifier(), specifier(NULL) 937 { 938 } 939 940 const struct glsl_type *glsl_type(const char **name, 941 struct _mesa_glsl_parse_state *state) 942 const; 943 944 ast_type_qualifier qualifier; 945 ast_type_specifier *specifier; 946}; 947 948 949class ast_declarator_list : public ast_node { 950public: 951 ast_declarator_list(ast_fully_specified_type *); 952 virtual void print(void) const; 953 954 virtual ir_rvalue *hir(exec_list *instructions, 955 struct _mesa_glsl_parse_state *state); 956 957 ast_fully_specified_type *type; 958 /** List of 'ast_declaration *' */ 959 exec_list declarations; 960 961 /** 962 * Flags for redeclarations. In these cases, no type is specified, to 963 * `type` is allowed to be NULL. In all other cases, this would be an error. 964 */ 965 int invariant; /** < `invariant` redeclaration */ 966 int precise; /** < `precise` redeclaration */ 967}; 968 969 970class ast_parameter_declarator : public ast_node { 971public: 972 ast_parameter_declarator() : 973 type(NULL), 974 identifier(NULL), 975 array_specifier(NULL), 976 formal_parameter(false), 977 is_void(false) 978 { 979 /* empty */ 980 } 981 982 virtual void print(void) const; 983 984 virtual ir_rvalue *hir(exec_list *instructions, 985 struct _mesa_glsl_parse_state *state); 986 987 ast_fully_specified_type *type; 988 const char *identifier; 989 ast_array_specifier *array_specifier; 990 991 static void parameters_to_hir(exec_list *ast_parameters, 992 bool formal, exec_list *ir_parameters, 993 struct _mesa_glsl_parse_state *state); 994 995private: 996 /** Is this parameter declaration part of a formal parameter list? */ 997 bool formal_parameter; 998 999 /** 1000 * Is this parameter 'void' type? 1001 * 1002 * This field is set by \c ::hir. 1003 */ 1004 bool is_void; 1005}; 1006 1007 1008class ast_function : public ast_node { 1009public: 1010 ast_function(void); 1011 1012 virtual void print(void) const; 1013 1014 virtual ir_rvalue *hir(exec_list *instructions, 1015 struct _mesa_glsl_parse_state *state); 1016 1017 ast_fully_specified_type *return_type; 1018 const char *identifier; 1019 1020 exec_list parameters; 1021 1022private: 1023 /** 1024 * Is this prototype part of the function definition? 1025 * 1026 * Used by ast_function_definition::hir to process the parameters, etc. 1027 * of the function. 1028 * 1029 * \sa ::hir 1030 */ 1031 bool is_definition; 1032 1033 /** 1034 * Function signature corresponding to this function prototype instance 1035 * 1036 * Used by ast_function_definition::hir to process the parameters, etc. 1037 * of the function. 1038 * 1039 * \sa ::hir 1040 */ 1041 class ir_function_signature *signature; 1042 1043 friend class ast_function_definition; 1044}; 1045 1046 1047class ast_expression_statement : public ast_node { 1048public: 1049 ast_expression_statement(ast_expression *); 1050 virtual void print(void) const; 1051 1052 virtual ir_rvalue *hir(exec_list *instructions, 1053 struct _mesa_glsl_parse_state *state); 1054 1055 ast_expression *expression; 1056}; 1057 1058 1059class ast_case_label : public ast_node { 1060public: 1061 ast_case_label(ast_expression *test_value); 1062 virtual void print(void) const; 1063 1064 virtual ir_rvalue *hir(exec_list *instructions, 1065 struct _mesa_glsl_parse_state *state); 1066 1067 /** 1068 * An test value of NULL means 'default'. 1069 */ 1070 ast_expression *test_value; 1071}; 1072 1073 1074class ast_case_label_list : public ast_node { 1075public: 1076 ast_case_label_list(void); 1077 virtual void print(void) const; 1078 1079 virtual ir_rvalue *hir(exec_list *instructions, 1080 struct _mesa_glsl_parse_state *state); 1081 1082 /** 1083 * A list of case labels. 1084 */ 1085 exec_list labels; 1086}; 1087 1088 1089class ast_case_statement : public ast_node { 1090public: 1091 ast_case_statement(ast_case_label_list *labels); 1092 virtual void print(void) const; 1093 1094 virtual ir_rvalue *hir(exec_list *instructions, 1095 struct _mesa_glsl_parse_state *state); 1096 1097 ast_case_label_list *labels; 1098 1099 /** 1100 * A list of statements. 1101 */ 1102 exec_list stmts; 1103}; 1104 1105 1106class ast_case_statement_list : public ast_node { 1107public: 1108 ast_case_statement_list(void); 1109 virtual void print(void) const; 1110 1111 virtual ir_rvalue *hir(exec_list *instructions, 1112 struct _mesa_glsl_parse_state *state); 1113 1114 /** 1115 * A list of cases. 1116 */ 1117 exec_list cases; 1118}; 1119 1120 1121class ast_switch_body : public ast_node { 1122public: 1123 ast_switch_body(ast_case_statement_list *stmts); 1124 virtual void print(void) const; 1125 1126 virtual ir_rvalue *hir(exec_list *instructions, 1127 struct _mesa_glsl_parse_state *state); 1128 1129 ast_case_statement_list *stmts; 1130}; 1131 1132 1133class ast_selection_statement : public ast_node { 1134public: 1135 ast_selection_statement(ast_expression *condition, 1136 ast_node *then_statement, 1137 ast_node *else_statement); 1138 virtual void print(void) const; 1139 1140 virtual ir_rvalue *hir(exec_list *instructions, 1141 struct _mesa_glsl_parse_state *state); 1142 1143 ast_expression *condition; 1144 ast_node *then_statement; 1145 ast_node *else_statement; 1146}; 1147 1148 1149class ast_switch_statement : public ast_node { 1150public: 1151 ast_switch_statement(ast_expression *test_expression, 1152 ast_node *body); 1153 virtual void print(void) const; 1154 1155 virtual ir_rvalue *hir(exec_list *instructions, 1156 struct _mesa_glsl_parse_state *state); 1157 1158 ast_expression *test_expression; 1159 ast_node *body; 1160 1161protected: 1162 void test_to_hir(exec_list *, struct _mesa_glsl_parse_state *); 1163}; 1164 1165class ast_iteration_statement : public ast_node { 1166public: 1167 ast_iteration_statement(int mode, ast_node *init, ast_node *condition, 1168 ast_expression *rest_expression, ast_node *body); 1169 1170 virtual void print(void) const; 1171 1172 virtual ir_rvalue *hir(exec_list *, struct _mesa_glsl_parse_state *); 1173 1174 enum ast_iteration_modes { 1175 ast_for, 1176 ast_while, 1177 ast_do_while 1178 } mode; 1179 1180 1181 ast_node *init_statement; 1182 ast_node *condition; 1183 ast_expression *rest_expression; 1184 1185 ast_node *body; 1186 1187 /** 1188 * Generate IR from the condition of a loop 1189 * 1190 * This is factored out of ::hir because some loops have the condition 1191 * test at the top (for and while), and others have it at the end (do-while). 1192 */ 1193 void condition_to_hir(exec_list *, struct _mesa_glsl_parse_state *); 1194}; 1195 1196 1197class ast_jump_statement : public ast_node { 1198public: 1199 ast_jump_statement(int mode, ast_expression *return_value); 1200 virtual void print(void) const; 1201 1202 virtual ir_rvalue *hir(exec_list *instructions, 1203 struct _mesa_glsl_parse_state *state); 1204 1205 enum ast_jump_modes { 1206 ast_continue, 1207 ast_break, 1208 ast_return, 1209 ast_discard 1210 } mode; 1211 1212 ast_expression *opt_return_value; 1213}; 1214 1215 1216class ast_function_definition : public ast_node { 1217public: 1218 ast_function_definition() : prototype(NULL), body(NULL) 1219 { 1220 } 1221 1222 virtual void print(void) const; 1223 1224 virtual ir_rvalue *hir(exec_list *instructions, 1225 struct _mesa_glsl_parse_state *state); 1226 1227 ast_function *prototype; 1228 ast_compound_statement *body; 1229}; 1230 1231class ast_interface_block : public ast_node { 1232public: 1233 ast_interface_block(const char *instance_name, 1234 ast_array_specifier *array_specifier) 1235 : block_name(NULL), instance_name(instance_name), 1236 array_specifier(array_specifier) 1237 { 1238 } 1239 1240 virtual ir_rvalue *hir(exec_list *instructions, 1241 struct _mesa_glsl_parse_state *state); 1242 1243 ast_type_qualifier default_layout; 1244 ast_type_qualifier layout; 1245 const char *block_name; 1246 1247 /** 1248 * Declared name of the block instance, if specified. 1249 * 1250 * If the block does not have an instance name, this field will be 1251 * \c NULL. 1252 */ 1253 const char *instance_name; 1254 1255 /** List of ast_declarator_list * */ 1256 exec_list declarations; 1257 1258 /** 1259 * Declared array size of the block instance 1260 * 1261 * If the block is not declared as an array or if the block instance array 1262 * is unsized, this field will be \c NULL. 1263 */ 1264 ast_array_specifier *array_specifier; 1265}; 1266 1267 1268/** 1269 * AST node representing a declaration of the output layout for tessellation 1270 * control shaders. 1271 */ 1272class ast_tcs_output_layout : public ast_node 1273{ 1274public: 1275 ast_tcs_output_layout(const struct YYLTYPE &locp) 1276 { 1277 set_location(locp); 1278 } 1279 1280 virtual ir_rvalue *hir(exec_list *instructions, 1281 struct _mesa_glsl_parse_state *state); 1282}; 1283 1284 1285/** 1286 * AST node representing a declaration of the input layout for geometry 1287 * shaders. 1288 */ 1289class ast_gs_input_layout : public ast_node 1290{ 1291public: 1292 ast_gs_input_layout(const struct YYLTYPE &locp, GLenum prim_type) 1293 : prim_type(prim_type) 1294 { 1295 set_location(locp); 1296 } 1297 1298 virtual ir_rvalue *hir(exec_list *instructions, 1299 struct _mesa_glsl_parse_state *state); 1300 1301private: 1302 const GLenum prim_type; 1303}; 1304 1305 1306/** 1307 * AST node representing a decalaration of the input layout for compute 1308 * shaders. 1309 */ 1310class ast_cs_input_layout : public ast_node 1311{ 1312public: 1313 ast_cs_input_layout(const struct YYLTYPE &locp, 1314 ast_layout_expression *const *local_size) 1315 { 1316 for (int i = 0; i < 3; i++) { 1317 this->local_size[i] = local_size[i]; 1318 } 1319 set_location(locp); 1320 } 1321 1322 virtual ir_rvalue *hir(exec_list *instructions, 1323 struct _mesa_glsl_parse_state *state); 1324 1325private: 1326 ast_layout_expression *local_size[3]; 1327}; 1328 1329class ast_warnings_toggle : public ast_node { 1330public: 1331 ast_warnings_toggle(bool _enable) 1332 : enable(_enable) 1333 { 1334 /* empty */ 1335 } 1336 1337 virtual ir_rvalue *hir(exec_list *instructions, 1338 struct _mesa_glsl_parse_state *state); 1339 1340private: 1341 bool enable; 1342}; 1343/*@}*/ 1344 1345extern void 1346_mesa_ast_to_hir(exec_list *instructions, struct _mesa_glsl_parse_state *state); 1347 1348extern ir_rvalue * 1349_mesa_ast_field_selection_to_hir(const ast_expression *expr, 1350 exec_list *instructions, 1351 struct _mesa_glsl_parse_state *state); 1352 1353extern ir_rvalue * 1354_mesa_ast_array_index_to_hir(void *mem_ctx, 1355 struct _mesa_glsl_parse_state *state, 1356 ir_rvalue *array, ir_rvalue *idx, 1357 YYLTYPE &loc, YYLTYPE &idx_loc); 1358 1359extern void 1360_mesa_ast_set_aggregate_type(const glsl_type *type, 1361 ast_expression *expr); 1362 1363void 1364emit_function(_mesa_glsl_parse_state *state, ir_function *f); 1365 1366extern void 1367check_builtin_array_max_size(const char *name, unsigned size, 1368 YYLTYPE loc, struct _mesa_glsl_parse_state *state); 1369 1370extern void _mesa_ast_process_interface_block(YYLTYPE *locp, 1371 _mesa_glsl_parse_state *state, 1372 ast_interface_block *const block, 1373 const struct ast_type_qualifier &q); 1374 1375extern bool 1376process_qualifier_constant(struct _mesa_glsl_parse_state *state, 1377 YYLTYPE *loc, 1378 const char *qual_indentifier, 1379 ast_expression *const_expression, 1380 unsigned *value); 1381#endif /* AST_H */ 1382