1f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/* -*- c++ -*- */ 2f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/* 3f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Copyright © 2009 Intel Corporation 4f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * 5f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Permission is hereby granted, free of charge, to any person obtaining a 6f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * copy of this software and associated documentation files (the "Software"), 7f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * to deal in the Software without restriction, including without limitation 8f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * the rights to use, copy, modify, merge, publish, distribute, sublicense, 9f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * and/or sell copies of the Software, and to permit persons to whom the 10f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Software is furnished to do so, subject to the following conditions: 11f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * 12f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * The above copyright notice and this permission notice (including the next 13f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * paragraph) shall be included in all copies or substantial portions of the 14f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Software. 15f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * 16f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 17f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 18f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL 19f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 20f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING 21f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER 22f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * DEALINGS IN THE SOFTWARE. 23f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */ 24f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 25f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#pragma once 26f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#ifndef AST_H 27f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#define AST_H 28f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 29f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#include "list.h" 30f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#include "glsl_parser_extras.h" 31f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 32f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstruct _mesa_glsl_parse_state; 33f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 34f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstruct YYLTYPE; 35f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 36f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/** 37f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * \defgroup AST Abstract syntax tree node definitions 38f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * 39f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * An abstract syntax tree is generated by the parser. This is a fairly 40f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * direct representation of the gramma derivation for the source program. 41f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * No symantic checking is done during the generation of the AST. Only 42f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * syntactic checking is done. Symantic checking is performed by a later 43f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * stage that converts the AST to a more generic intermediate representation. 44f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * 45f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org *@{ 46f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */ 47f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/** 48f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Base class of all abstract syntax tree nodes 49f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */ 50f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgclass ast_node { 51f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgpublic: 52f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* Callers of this ralloc-based new need not call delete. It's 53f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * easier to just ralloc_free 'ctx' (or any of its ancestors). */ 54f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org static void* operator new(size_t size, void *ctx) 55f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org { 56f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org void *node; 57f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 58f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org node = rzalloc_size(ctx, size); 59f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org assert(node != NULL); 60f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 61f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return node; 62f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 63f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 64f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* If the user *does* call delete, that's OK, we will just 65f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * ralloc_free in that case. */ 66f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org static void operator delete(void *table) 67f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org { 68f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ralloc_free(table); 69f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 70f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 71f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /** 72f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Print an AST node in something approximating the original GLSL code 73f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */ 74f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org virtual void print(void) const; 75f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 76f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /** 77f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Convert the AST node to the high-level intermediate representation 78f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */ 79f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org virtual ir_rvalue *hir(exec_list *instructions, 80f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct _mesa_glsl_parse_state *state); 81f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 82f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /** 83f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Retrieve the source location of an AST node 84f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * 85f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * This function is primarily used to get the source position of an AST node 86f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * into a form that can be passed to \c _mesa_glsl_error. 87f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * 88f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * \sa _mesa_glsl_error, ast_node::set_location 89f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */ 90f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct YYLTYPE get_location(void) const 91f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org { 92f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct YYLTYPE locp; 93f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 94f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org locp.source = this->location.source; 95f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org locp.first_line = this->location.line; 96f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org locp.first_column = this->location.column; 97f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org locp.last_line = locp.first_line; 98f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org locp.last_column = locp.first_column; 99f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 100f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return locp; 101f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 102f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 103f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /** 104f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Set the source location of an AST node from a parser location 105f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * 106f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * \sa ast_node::get_location 107f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */ 108f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org void set_location(const struct YYLTYPE &locp) 109f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org { 110f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org this->location.source = locp.source; 111f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org this->location.line = locp.first_line; 112f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org this->location.column = locp.first_column; 113f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 114f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 115f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /** 116f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Source location of the AST node. 117f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */ 118f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct { 119f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org unsigned source; /**< GLSL source number. */ 120f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org unsigned line; /**< Line number within the source string. */ 121f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org unsigned column; /**< Column in the line. */ 122f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } location; 123f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 124f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org exec_node link; 125f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 126f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgprotected: 127f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /** 128f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * The only constructor is protected so that only derived class objects can 129f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * be created. 130f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */ 131f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ast_node(void); 132f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}; 133f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 134f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 135f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/** 136f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Operators for AST expression nodes. 137f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */ 138f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgenum ast_operators { 139f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ast_assign, 140f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ast_plus, /**< Unary + operator. */ 141f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ast_neg, 142f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ast_add, 143f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ast_sub, 144f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ast_mul, 145f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ast_div, 146f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ast_mod, 147f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ast_lshift, 148f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ast_rshift, 149f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ast_less, 150f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ast_greater, 151f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ast_lequal, 152f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ast_gequal, 153f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ast_equal, 154f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ast_nequal, 155f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ast_bit_and, 156f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ast_bit_xor, 157f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ast_bit_or, 158f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ast_bit_not, 159f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ast_logic_and, 160f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ast_logic_xor, 161f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ast_logic_or, 162f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ast_logic_not, 163f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 164f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ast_mul_assign, 165f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ast_div_assign, 166f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ast_mod_assign, 167f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ast_add_assign, 168f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ast_sub_assign, 169f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ast_ls_assign, 170f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ast_rs_assign, 171f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ast_and_assign, 172f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ast_xor_assign, 173f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ast_or_assign, 174f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 175f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ast_conditional, 176f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 177f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ast_pre_inc, 178f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ast_pre_dec, 179f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ast_post_inc, 180f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ast_post_dec, 181f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ast_field_selection, 182f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ast_array_index, 183f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 184f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ast_function_call, 185f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 186f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ast_identifier, 187f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ast_int_constant, 188f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ast_uint_constant, 189f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ast_float_constant, 190f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ast_bool_constant, 191f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 192f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ast_sequence 193f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}; 194f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 195f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/** 196f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Representation of any sort of expression. 197f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */ 198f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgclass ast_expression : public ast_node { 199f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgpublic: 200f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ast_expression(int oper, ast_expression *, 201f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ast_expression *, ast_expression *); 202f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 203f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ast_expression(const char *identifier) : 204f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org oper(ast_identifier) 205f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org { 206f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org subexpressions[0] = NULL; 207f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org subexpressions[1] = NULL; 208f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org subexpressions[2] = NULL; 209f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org primary_expression.identifier = identifier; 210f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org this->non_lvalue_description = NULL; 211f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 212f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 213f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org static const char *operator_string(enum ast_operators op); 214f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 215f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org virtual ir_rvalue *hir(exec_list *instructions, 216f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct _mesa_glsl_parse_state *state); 217f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 218f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org virtual void print(void) const; 219f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 220f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org enum ast_operators oper; 221f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 222f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ast_expression *subexpressions[3]; 223f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 224f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org union { 225f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org const char *identifier; 226f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org int int_constant; 227f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org float float_constant; 228f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org unsigned uint_constant; 229f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org int bool_constant; 230f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } primary_expression; 231f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 232f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 233f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /** 234f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * List of expressions for an \c ast_sequence or parameters for an 235f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * \c ast_function_call 236f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */ 237f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org exec_list expressions; 238f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 239f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /** 240f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * For things that can't be l-values, this describes what it is. 241f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * 242f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * This text is used by the code that generates IR for assignments to 243f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * detect and emit useful messages for assignments to some things that 244f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * can't be l-values. For example, pre- or post-incerement expressions. 245f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * 246f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * \note 247f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * This pointer may be \c NULL. 248f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */ 249f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org const char *non_lvalue_description; 250f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}; 251f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 252f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgclass ast_expression_bin : public ast_expression { 253f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgpublic: 254f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ast_expression_bin(int oper, ast_expression *, ast_expression *); 255f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 256f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org virtual void print(void) const; 257f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}; 258f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 259f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/** 260f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Subclass of expressions for function calls 261f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */ 262f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgclass ast_function_expression : public ast_expression { 263f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgpublic: 264f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ast_function_expression(ast_expression *callee) 265f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org : ast_expression(ast_function_call, callee, 266f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org NULL, NULL), 267f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org cons(false) 268f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org { 269f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* empty */ 270f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 271f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 272f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ast_function_expression(class ast_type_specifier *type) 273f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org : ast_expression(ast_function_call, (ast_expression *) type, 274f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org NULL, NULL), 275f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org cons(true) 276f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org { 277f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* empty */ 278f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 279f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 280f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org bool is_constructor() const 281f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org { 282f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return cons; 283f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 284f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 285f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org virtual ir_rvalue *hir(exec_list *instructions, 286f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct _mesa_glsl_parse_state *state); 287f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 288f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgprivate: 289f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /** 290f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Is this function call actually a constructor? 291f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */ 292f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org bool cons; 293f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}; 294f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 295f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 296f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/** 297f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Number of possible operators for an ast_expression 298f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * 299f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * This is done as a define instead of as an additional value in the enum so 300f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * that the compiler won't generate spurious messages like "warning: 301f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * enumeration value ‘ast_num_operators’ not handled in switch" 302f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */ 303f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#define AST_NUM_OPERATORS (ast_sequence + 1) 304f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 305f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 306f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgclass ast_compound_statement : public ast_node { 307f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgpublic: 308f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ast_compound_statement(int new_scope, ast_node *statements); 309f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org virtual void print(void) const; 310f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 311f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org virtual ir_rvalue *hir(exec_list *instructions, 312f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct _mesa_glsl_parse_state *state); 313f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 314f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org int new_scope; 315f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org exec_list statements; 316f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}; 317f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 318f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgclass ast_declaration : public ast_node { 319f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgpublic: 320f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ast_declaration(const char *identifier, int is_array, ast_expression *array_size, 321f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ast_expression *initializer); 322f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org virtual void print(void) const; 323f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 324f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org const char *identifier; 325f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 326f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org int is_array; 327f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ast_expression *array_size; 328f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 329f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ast_expression *initializer; 330f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}; 331f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 332f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 333f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgenum { 334f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ast_precision_none = 0, /**< Absence of precision qualifier. */ 335f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ast_precision_high, 336f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ast_precision_medium, 337f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ast_precision_low 338f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}; 339f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 340f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstruct ast_type_qualifier { 341f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* Callers of this ralloc-based new need not call delete. It's 342f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * easier to just ralloc_free 'ctx' (or any of its ancestors). */ 343f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org static void* operator new(size_t size, void *ctx) 344f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org { 345f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org void *node; 346f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 347f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org node = rzalloc_size(ctx, size); 348f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org assert(node != NULL); 349f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 350f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return node; 351f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 352f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 353f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* If the user *does* call delete, that's OK, we will just 354f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * ralloc_free in that case. */ 355f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org static void operator delete(void *table) 356f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org { 357f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ralloc_free(table); 358f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 359f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 360f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org union { 361f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct { 362f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org unsigned invariant:1; 363f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org unsigned constant:1; 364f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org unsigned attribute:1; 365f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org unsigned varying:1; 366f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org unsigned in:1; 367f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org unsigned out:1; 368f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org unsigned centroid:1; 369f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org unsigned uniform:1; 370f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org unsigned smooth:1; 371f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org unsigned flat:1; 372f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org unsigned noperspective:1; 373f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 374f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /** \name Layout qualifiers for GL_ARB_fragment_coord_conventions */ 375f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /*@{*/ 376f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org unsigned origin_upper_left:1; 377f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org unsigned pixel_center_integer:1; 378f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /*@}*/ 379f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 380f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /** 381f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Flag set if GL_ARB_explicit_attrib_location "location" layout 382f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * qualifier is used. 383f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */ 384f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org unsigned explicit_location:1; 385f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /** 386f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Flag set if GL_ARB_explicit_attrib_location "index" layout 387f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * qualifier is used. 388f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */ 389f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org unsigned explicit_index:1; 390f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 391f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /** \name Layout qualifiers for GL_AMD_conservative_depth */ 392f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /** \{ */ 393f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org unsigned depth_any:1; 394f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org unsigned depth_greater:1; 395f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org unsigned depth_less:1; 396f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org unsigned depth_unchanged:1; 397f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /** \} */ 398f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 399f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /** \name Layout qualifiers for GL_ARB_uniform_buffer_object */ 400f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /** \{ */ 401f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org unsigned std140:1; 402f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org unsigned shared:1; 403f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org unsigned packed:1; 404f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org unsigned column_major:1; 405f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org unsigned row_major:1; 406f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /** \} */ 407f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 408f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /** \brief Set of flags, accessed by name. */ 409f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org q; 410f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 411f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /** \brief Set of flags, accessed as a bitmask. */ 412f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org unsigned i; 413f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } flags; 414f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 415f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /** 416f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Location specified via GL_ARB_explicit_attrib_location layout 417f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * 418f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * \note 419f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * This field is only valid if \c explicit_location is set. 420f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */ 421f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org int location; 422f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /** 423f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Index specified via GL_ARB_explicit_attrib_location layout 424f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * 425f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * \note 426f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * This field is only valid if \c explicit_index is set. 427f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */ 428f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org int index; 429f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 430f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /** 431f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Return true if and only if an interpolation qualifier is present. 432f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */ 433f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org bool has_interpolation() const; 434f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 435f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /** 436f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * \brief Return string representation of interpolation qualifier. 437f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * 438f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * If an interpolation qualifier is present, then return that qualifier's 439f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * string representation. Otherwise, return null. For example, if the 440f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * noperspective bit is set, then this returns "noperspective". 441f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * 442f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * If multiple interpolation qualifiers are somehow present, then the 443f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * returned string is undefined but not null. 444f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */ 445f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org const char *interpolation_string() const; 446f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 447f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org bool merge_qualifier(YYLTYPE *loc, 448f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org _mesa_glsl_parse_state *state, 449f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ast_type_qualifier q); 450f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}; 451f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 452f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgclass ast_declarator_list; 453f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 454f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgclass ast_struct_specifier : public ast_node { 455f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgpublic: 456f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ast_struct_specifier(const char *identifier, 457f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ast_declarator_list *declarator_list); 458f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org virtual void print(void) const; 459f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 460f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org virtual ir_rvalue *hir(exec_list *instructions, 461f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct _mesa_glsl_parse_state *state); 462f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 463f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org const char *name; 464f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* List of ast_declarator_list * */ 465f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org exec_list declarations; 466f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}; 467f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 468f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 469f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 470f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgclass ast_type_specifier : public ast_node { 471f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgpublic: 472f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /** Construct a type specifier from a type name */ 473f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ast_type_specifier(const char *name) 474f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org : type_name(name), structure(NULL), 475f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org is_array(false), array_size(NULL), precision(ast_precision_none), 476f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org is_precision_statement(false) 477f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org { 478f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* empty */ 479f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 480f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 481f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /** Construct a type specifier from a structure definition */ 482f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ast_type_specifier(ast_struct_specifier *s) 483f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org : type_name(s->name), structure(s), 484f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org is_array(false), array_size(NULL), precision(ast_precision_none), 485f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org is_precision_statement(false) 486f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org { 487f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* empty */ 488f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 489f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 490f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org const struct glsl_type *glsl_type(const char **name, 491f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct _mesa_glsl_parse_state *state) 492f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org const; 493f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 494f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org virtual void print(void) const; 495f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 496f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ir_rvalue *hir(exec_list *, struct _mesa_glsl_parse_state *); 497f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 498f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org const char *type_name; 499f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ast_struct_specifier *structure; 500f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 501f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org int is_array; 502f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ast_expression *array_size; 503f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 504f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org unsigned precision:2; 505f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 506f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org bool is_precision_statement; 507f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}; 508f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 509f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 510f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgclass ast_fully_specified_type : public ast_node { 511f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgpublic: 512f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org virtual void print(void) const; 513f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org bool has_qualifiers() const; 514f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 515f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ast_type_qualifier qualifier; 516f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ast_type_specifier *specifier; 517f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}; 518f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 519f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 520f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgclass ast_declarator_list : public ast_node { 521f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgpublic: 522f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ast_declarator_list(ast_fully_specified_type *); 523f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org virtual void print(void) const; 524f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 525f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org virtual ir_rvalue *hir(exec_list *instructions, 526f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct _mesa_glsl_parse_state *state); 527f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 528f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ast_fully_specified_type *type; 529f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org exec_list declarations; 530f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 531f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /** 532f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Special flag for vertex shader "invariant" declarations. 533f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * 534f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Vertex shaders can contain "invariant" variable redeclarations that do 535f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * not include a type. For example, "invariant gl_Position;". This flag 536f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * is used to note these cases when no type is specified. 537f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */ 538f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org int invariant; 539f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 540f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /** 541f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Flag indicating that these declarators are in a uniform block, 542f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * allowing UBO type qualifiers. 543f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */ 544f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org bool ubo_qualifiers_valid; 545f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}; 546f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 547f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 548f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgclass ast_parameter_declarator : public ast_node { 549f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgpublic: 550f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ast_parameter_declarator() 551f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org { 552f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org this->identifier = NULL; 553f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org this->is_array = false; 554f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org this->array_size = 0; 555f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 556f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 557f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org virtual void print(void) const; 558f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 559f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org virtual ir_rvalue *hir(exec_list *instructions, 560f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct _mesa_glsl_parse_state *state); 561f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 562f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ast_fully_specified_type *type; 563f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org const char *identifier; 564f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org int is_array; 565f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ast_expression *array_size; 566f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 567f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org static void parameters_to_hir(exec_list *ast_parameters, 568f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org bool formal, exec_list *ir_parameters, 569f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct _mesa_glsl_parse_state *state); 570f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 571f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgprivate: 572f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /** Is this parameter declaration part of a formal parameter list? */ 573f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org bool formal_parameter; 574f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 575f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /** 576f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Is this parameter 'void' type? 577f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * 578f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * This field is set by \c ::hir. 579f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */ 580f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org bool is_void; 581f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}; 582f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 583f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 584f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgclass ast_function : public ast_node { 585f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgpublic: 586f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ast_function(void); 587f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 588f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org virtual void print(void) const; 589f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 590f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org virtual ir_rvalue *hir(exec_list *instructions, 591f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct _mesa_glsl_parse_state *state); 592f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 593f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ast_fully_specified_type *return_type; 594f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org const char *identifier; 595f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 596f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org exec_list parameters; 597f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 598f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgprivate: 599f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /** 600f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Is this prototype part of the function definition? 601f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * 602f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Used by ast_function_definition::hir to process the parameters, etc. 603f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * of the function. 604f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * 605f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * \sa ::hir 606f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */ 607f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org bool is_definition; 608f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 609f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /** 610f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Function signature corresponding to this function prototype instance 611f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * 612f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Used by ast_function_definition::hir to process the parameters, etc. 613f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * of the function. 614f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * 615f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * \sa ::hir 616f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */ 617f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org class ir_function_signature *signature; 618f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 619f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org friend class ast_function_definition; 620f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}; 621f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 622f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 623f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgclass ast_expression_statement : public ast_node { 624f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgpublic: 625f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ast_expression_statement(ast_expression *); 626f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org virtual void print(void) const; 627f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 628f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org virtual ir_rvalue *hir(exec_list *instructions, 629f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct _mesa_glsl_parse_state *state); 630f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 631f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ast_expression *expression; 632f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}; 633f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 634f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 635f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgclass ast_case_label : public ast_node { 636f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgpublic: 637f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ast_case_label(ast_expression *test_value); 638f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org virtual void print(void) const; 639f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 640f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org virtual ir_rvalue *hir(exec_list *instructions, 641f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct _mesa_glsl_parse_state *state); 642f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 643f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /** 644f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * An test value of NULL means 'default'. 645f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */ 646f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ast_expression *test_value; 647f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}; 648f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 649f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 650f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgclass ast_case_label_list : public ast_node { 651f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgpublic: 652f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ast_case_label_list(void); 653f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org virtual void print(void) const; 654f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 655f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org virtual ir_rvalue *hir(exec_list *instructions, 656f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct _mesa_glsl_parse_state *state); 657f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 658f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /** 659f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * A list of case labels. 660f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */ 661f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org exec_list labels; 662f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}; 663f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 664f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 665f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgclass ast_case_statement : public ast_node { 666f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgpublic: 667f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ast_case_statement(ast_case_label_list *labels); 668f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org virtual void print(void) const; 669f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 670f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org virtual ir_rvalue *hir(exec_list *instructions, 671f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct _mesa_glsl_parse_state *state); 672f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 673f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ast_case_label_list *labels; 674f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 675f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /** 676f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * A list of statements. 677f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */ 678f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org exec_list stmts; 679f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}; 680f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 681f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 682f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgclass ast_case_statement_list : public ast_node { 683f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgpublic: 684f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ast_case_statement_list(void); 685f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org virtual void print(void) const; 686f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 687f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org virtual ir_rvalue *hir(exec_list *instructions, 688f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct _mesa_glsl_parse_state *state); 689f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 690f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /** 691f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * A list of cases. 692f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */ 693f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org exec_list cases; 694f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}; 695f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 696f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 697f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgclass ast_switch_body : public ast_node { 698f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgpublic: 699f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ast_switch_body(ast_case_statement_list *stmts); 700f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org virtual void print(void) const; 701f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 702f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org virtual ir_rvalue *hir(exec_list *instructions, 703f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct _mesa_glsl_parse_state *state); 704f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 705f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ast_case_statement_list *stmts; 706f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}; 707f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 708f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 709f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgclass ast_selection_statement : public ast_node { 710f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgpublic: 711f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ast_selection_statement(ast_expression *condition, 712f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ast_node *then_statement, 713f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ast_node *else_statement); 714f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org virtual void print(void) const; 715f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 716f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org virtual ir_rvalue *hir(exec_list *instructions, 717f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct _mesa_glsl_parse_state *state); 718f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 719f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ast_expression *condition; 720f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ast_node *then_statement; 721f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ast_node *else_statement; 722f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}; 723f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 724f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 725f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgclass ast_switch_statement : public ast_node { 726f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgpublic: 727f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ast_switch_statement(ast_expression *test_expression, 728f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ast_node *body); 729f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org virtual void print(void) const; 730f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 731f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org virtual ir_rvalue *hir(exec_list *instructions, 732f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct _mesa_glsl_parse_state *state); 733f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 734f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ast_expression *test_expression; 735f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ast_node *body; 736f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 737f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgprotected: 738f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org void test_to_hir(exec_list *, struct _mesa_glsl_parse_state *); 739f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}; 740f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 741f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgclass ast_iteration_statement : public ast_node { 742f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgpublic: 743f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ast_iteration_statement(int mode, ast_node *init, ast_node *condition, 744f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ast_expression *rest_expression, ast_node *body); 745f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 746f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org virtual void print(void) const; 747f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 748f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org virtual ir_rvalue *hir(exec_list *, struct _mesa_glsl_parse_state *); 749f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 750f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org enum ast_iteration_modes { 751f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ast_for, 752f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ast_while, 753f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ast_do_while 754f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } mode; 755f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 756f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 757f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ast_node *init_statement; 758f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ast_node *condition; 759f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ast_expression *rest_expression; 760f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 761f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ast_node *body; 762f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 763f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgprivate: 764f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /** 765f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Generate IR from the condition of a loop 766f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * 767f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * This is factored out of ::hir because some loops have the condition 768f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * test at the top (for and while), and others have it at the end (do-while). 769f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */ 770f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org void condition_to_hir(class ir_loop *, struct _mesa_glsl_parse_state *); 771f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}; 772f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 773f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 774f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgclass ast_jump_statement : public ast_node { 775f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgpublic: 776f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ast_jump_statement(int mode, ast_expression *return_value); 777f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org virtual void print(void) const; 778f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 779f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org virtual ir_rvalue *hir(exec_list *instructions, 780f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct _mesa_glsl_parse_state *state); 781f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 782f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org enum ast_jump_modes { 783f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ast_continue, 784f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ast_break, 785f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ast_return, 786f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ast_discard 787f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } mode; 788f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 789f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ast_expression *opt_return_value; 790f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}; 791f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 792f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 793f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgclass ast_function_definition : public ast_node { 794f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgpublic: 795f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org virtual void print(void) const; 796f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 797f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org virtual ir_rvalue *hir(exec_list *instructions, 798f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct _mesa_glsl_parse_state *state); 799f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 800f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ast_function *prototype; 801f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ast_compound_statement *body; 802f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}; 803f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 804f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgclass ast_uniform_block : public ast_node { 805f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgpublic: 806f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ast_uniform_block(ast_type_qualifier layout, 807f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org const char *block_name, 808f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ast_declarator_list *member_list) 809f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org : layout(layout), block_name(block_name) 810f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org { 811f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org declarations.push_degenerate_list_at_head(&member_list->link); 812f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 813f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 814f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org virtual ir_rvalue *hir(exec_list *instructions, 815f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct _mesa_glsl_parse_state *state); 816f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 817f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ast_type_qualifier layout; 818f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org const char *block_name; 819f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /** List of ast_declarator_list * */ 820f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org exec_list declarations; 821f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}; 822f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/*@}*/ 823f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 824f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgextern void 825f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org_mesa_ast_to_hir(exec_list *instructions, struct _mesa_glsl_parse_state *state); 826f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 827f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgextern ir_rvalue * 828f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org_mesa_ast_field_selection_to_hir(const ast_expression *expr, 829f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org exec_list *instructions, 830f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct _mesa_glsl_parse_state *state); 831f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 832f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgvoid 833f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgemit_function(_mesa_glsl_parse_state *state, ir_function *f); 834f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 835f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#endif /* AST_H */ 836