1986b8f798272d3ae2898617c8fb089156a5941c0Ian Romanick/* -*- c++ -*- */ 2a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick/* 3a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick * Copyright © 2009 Intel Corporation 4a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick * 5a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick * Permission is hereby granted, free of charge, to any person obtaining a 6a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick * copy of this software and associated documentation files (the "Software"), 7a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick * to deal in the Software without restriction, including without limitation 8a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick * the rights to use, copy, modify, merge, publish, distribute, sublicense, 9a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick * and/or sell copies of the Software, and to permit persons to whom the 10a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick * Software is furnished to do so, subject to the following conditions: 11a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick * 12a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick * The above copyright notice and this permission notice (including the next 13a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick * paragraph) shall be included in all copies or substantial portions of the 14a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick * Software. 15a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick * 16a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 17a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 18a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL 19a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 20a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING 21a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER 22a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick * DEALINGS IN THE SOFTWARE. 23a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick */ 24a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick 25a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick#pragma once 26a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick#ifndef AST_H 27a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick#define AST_H 28a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick 290044e7edcea22d2456c051a1c4b744a26960ad27Ian Romanick#include "list.h" 30a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick#include "glsl_parser_extras.h" 31a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick 32a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanickstruct _mesa_glsl_parse_state; 33a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick 34a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanickstruct YYLTYPE; 35a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick 36e053d62aa573651abdd78666d299272c8219a3aaIan Romanick/** 37e053d62aa573651abdd78666d299272c8219a3aaIan Romanick * \defgroup AST Abstract syntax tree node definitions 38e053d62aa573651abdd78666d299272c8219a3aaIan Romanick * 39e053d62aa573651abdd78666d299272c8219a3aaIan Romanick * An abstract syntax tree is generated by the parser. This is a fairly 40e053d62aa573651abdd78666d299272c8219a3aaIan Romanick * direct representation of the gramma derivation for the source program. 41e053d62aa573651abdd78666d299272c8219a3aaIan Romanick * No symantic checking is done during the generation of the AST. Only 42e053d62aa573651abdd78666d299272c8219a3aaIan Romanick * syntactic checking is done. Symantic checking is performed by a later 43e053d62aa573651abdd78666d299272c8219a3aaIan Romanick * stage that converts the AST to a more generic intermediate representation. 44e053d62aa573651abdd78666d299272c8219a3aaIan Romanick * 45e053d62aa573651abdd78666d299272c8219a3aaIan Romanick *@{ 46e053d62aa573651abdd78666d299272c8219a3aaIan Romanick */ 47e053d62aa573651abdd78666d299272c8219a3aaIan Romanick/** 48e053d62aa573651abdd78666d299272c8219a3aaIan Romanick * Base class of all abstract syntax tree nodes 49e053d62aa573651abdd78666d299272c8219a3aaIan Romanick */ 50304ea90233baeac6801a98e981658cb7a2d2501cIan Romanickclass ast_node { 51a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanickpublic: 52d3073f58c17d8675a2ecdd5dfa83e5520c78e1a8Kenneth Graunke /* Callers of this ralloc-based new need not call delete. It's 53d3073f58c17d8675a2ecdd5dfa83e5520c78e1a8Kenneth Graunke * easier to just ralloc_free 'ctx' (or any of its ancestors). */ 548f52c9b5fcbc73ed12b23253caa44c28fd4452e2Carl Worth static void* operator new(size_t size, void *ctx) 558f52c9b5fcbc73ed12b23253caa44c28fd4452e2Carl Worth { 568f52c9b5fcbc73ed12b23253caa44c28fd4452e2Carl Worth void *node; 578f52c9b5fcbc73ed12b23253caa44c28fd4452e2Carl Worth 58d3073f58c17d8675a2ecdd5dfa83e5520c78e1a8Kenneth Graunke node = rzalloc_size(ctx, size); 598f52c9b5fcbc73ed12b23253caa44c28fd4452e2Carl Worth assert(node != NULL); 608f52c9b5fcbc73ed12b23253caa44c28fd4452e2Carl Worth 618f52c9b5fcbc73ed12b23253caa44c28fd4452e2Carl Worth return node; 628f52c9b5fcbc73ed12b23253caa44c28fd4452e2Carl Worth } 638f52c9b5fcbc73ed12b23253caa44c28fd4452e2Carl Worth 648f52c9b5fcbc73ed12b23253caa44c28fd4452e2Carl Worth /* If the user *does* call delete, that's OK, we will just 65d3073f58c17d8675a2ecdd5dfa83e5520c78e1a8Kenneth Graunke * ralloc_free in that case. */ 668f52c9b5fcbc73ed12b23253caa44c28fd4452e2Carl Worth static void operator delete(void *table) 678f52c9b5fcbc73ed12b23253caa44c28fd4452e2Carl Worth { 68d3073f58c17d8675a2ecdd5dfa83e5520c78e1a8Kenneth Graunke ralloc_free(table); 698f52c9b5fcbc73ed12b23253caa44c28fd4452e2Carl Worth } 708f52c9b5fcbc73ed12b23253caa44c28fd4452e2Carl Worth 71e053d62aa573651abdd78666d299272c8219a3aaIan Romanick /** 72e053d62aa573651abdd78666d299272c8219a3aaIan Romanick * Print an AST node in something approximating the original GLSL code 73e053d62aa573651abdd78666d299272c8219a3aaIan Romanick */ 74a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick virtual void print(void) const; 75e053d62aa573651abdd78666d299272c8219a3aaIan Romanick 76e053d62aa573651abdd78666d299272c8219a3aaIan Romanick /** 77e053d62aa573651abdd78666d299272c8219a3aaIan Romanick * Convert the AST node to the high-level intermediate representation 78e053d62aa573651abdd78666d299272c8219a3aaIan Romanick */ 79fb9fb5f51deca28ed1ec7b71759fb71fc26a0ab6Kenneth Graunke virtual ir_rvalue *hir(exec_list *instructions, 80fb9fb5f51deca28ed1ec7b71759fb71fc26a0ab6Kenneth Graunke struct _mesa_glsl_parse_state *state); 81a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick 82a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick /** 83a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick * Retrieve the source location of an AST node 84a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick * 85a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick * This function is primarily used to get the source position of an AST node 86a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick * into a form that can be passed to \c _mesa_glsl_error. 87a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick * 88a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick * \sa _mesa_glsl_error, ast_node::set_location 89a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick */ 90a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick struct YYLTYPE get_location(void) const 91a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick { 92a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick struct YYLTYPE locp; 93a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick 94a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick locp.source = this->location.source; 95a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick locp.first_line = this->location.line; 96a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick locp.first_column = this->location.column; 97a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick locp.last_line = locp.first_line; 98a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick locp.last_column = locp.first_column; 99a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick 100a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick return locp; 101a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick } 102a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick 103a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick /** 104a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick * Set the source location of an AST node from a parser location 105a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick * 106a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick * \sa ast_node::get_location 107a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick */ 108ebfdef7a83966341c27f44c83366419d4a2f7a60Kenneth Graunke void set_location(const struct YYLTYPE &locp) 109a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick { 110ebfdef7a83966341c27f44c83366419d4a2f7a60Kenneth Graunke this->location.source = locp.source; 111ebfdef7a83966341c27f44c83366419d4a2f7a60Kenneth Graunke this->location.line = locp.first_line; 112ebfdef7a83966341c27f44c83366419d4a2f7a60Kenneth Graunke this->location.column = locp.first_column; 113a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick } 114a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick 115e053d62aa573651abdd78666d299272c8219a3aaIan Romanick /** 116e053d62aa573651abdd78666d299272c8219a3aaIan Romanick * Source location of the AST node. 117e053d62aa573651abdd78666d299272c8219a3aaIan Romanick */ 118a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick struct { 119e053d62aa573651abdd78666d299272c8219a3aaIan Romanick unsigned source; /**< GLSL source number. */ 120e053d62aa573651abdd78666d299272c8219a3aaIan Romanick unsigned line; /**< Line number within the source string. */ 121e053d62aa573651abdd78666d299272c8219a3aaIan Romanick unsigned column; /**< Column in the line. */ 122a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick } location; 123a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick 124304ea90233baeac6801a98e981658cb7a2d2501cIan Romanick exec_node link; 125304ea90233baeac6801a98e981658cb7a2d2501cIan Romanick 126a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanickprotected: 127e053d62aa573651abdd78666d299272c8219a3aaIan Romanick /** 128e053d62aa573651abdd78666d299272c8219a3aaIan Romanick * The only constructor is protected so that only derived class objects can 129e053d62aa573651abdd78666d299272c8219a3aaIan Romanick * be created. 130e053d62aa573651abdd78666d299272c8219a3aaIan Romanick */ 131a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick ast_node(void); 132a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick}; 133a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick 134a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick 135e053d62aa573651abdd78666d299272c8219a3aaIan Romanick/** 136e053d62aa573651abdd78666d299272c8219a3aaIan Romanick * Operators for AST expression nodes. 137e053d62aa573651abdd78666d299272c8219a3aaIan Romanick */ 138a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanickenum ast_operators { 139a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick ast_assign, 140a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick ast_plus, /**< Unary + operator. */ 141a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick ast_neg, 142a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick ast_add, 143a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick ast_sub, 144a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick ast_mul, 145a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick ast_div, 146a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick ast_mod, 147a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick ast_lshift, 148a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick ast_rshift, 149a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick ast_less, 150a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick ast_greater, 151a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick ast_lequal, 152a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick ast_gequal, 153a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick ast_equal, 154a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick ast_nequal, 155a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick ast_bit_and, 156a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick ast_bit_xor, 157a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick ast_bit_or, 158a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick ast_bit_not, 159a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick ast_logic_and, 160a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick ast_logic_xor, 161a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick ast_logic_or, 162a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick ast_logic_not, 163a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick 164a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick ast_mul_assign, 165a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick ast_div_assign, 166a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick ast_mod_assign, 167a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick ast_add_assign, 168a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick ast_sub_assign, 169a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick ast_ls_assign, 170a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick ast_rs_assign, 171a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick ast_and_assign, 172a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick ast_xor_assign, 173a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick ast_or_assign, 174a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick 175a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick ast_conditional, 176a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick 177a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick ast_pre_inc, 178a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick ast_pre_dec, 179a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick ast_post_inc, 180a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick ast_post_dec, 181a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick ast_field_selection, 182a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick ast_array_index, 183a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick 184a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick ast_function_call, 185a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick 186a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick ast_identifier, 187a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick ast_int_constant, 188a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick ast_uint_constant, 189a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick ast_float_constant, 190a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick ast_bool_constant, 191a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick 192a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick ast_sequence 193a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick}; 194a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick 195e053d62aa573651abdd78666d299272c8219a3aaIan Romanick/** 196e053d62aa573651abdd78666d299272c8219a3aaIan Romanick * Representation of any sort of expression. 197e053d62aa573651abdd78666d299272c8219a3aaIan Romanick */ 198a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanickclass ast_expression : public ast_node { 199a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanickpublic: 200a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick ast_expression(int oper, ast_expression *, 201a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick ast_expression *, ast_expression *); 202a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick 203d10fe19495191072d39689337700b69e62252bf1Ian Romanick ast_expression(const char *identifier) : 204d10fe19495191072d39689337700b69e62252bf1Ian Romanick oper(ast_identifier) 205d10fe19495191072d39689337700b69e62252bf1Ian Romanick { 206d10fe19495191072d39689337700b69e62252bf1Ian Romanick subexpressions[0] = NULL; 207d10fe19495191072d39689337700b69e62252bf1Ian Romanick subexpressions[1] = NULL; 208d10fe19495191072d39689337700b69e62252bf1Ian Romanick subexpressions[2] = NULL; 209b2c0df2b60a77b043d461f265c85d8b5b066a008Kenneth Graunke primary_expression.identifier = identifier; 210fa0a9ac5cdf49865cfc289c4326c73c9dd4a61c5Ian Romanick this->non_lvalue_description = NULL; 211d10fe19495191072d39689337700b69e62252bf1Ian Romanick } 212d10fe19495191072d39689337700b69e62252bf1Ian Romanick 21388349b22caa0ab0b44188dbb9e002549aadb0590Ian Romanick static const char *operator_string(enum ast_operators op); 21488349b22caa0ab0b44188dbb9e002549aadb0590Ian Romanick 215fb9fb5f51deca28ed1ec7b71759fb71fc26a0ab6Kenneth Graunke virtual ir_rvalue *hir(exec_list *instructions, 216fb9fb5f51deca28ed1ec7b71759fb71fc26a0ab6Kenneth Graunke struct _mesa_glsl_parse_state *state); 21718238de6c34a1a32c452f1006ed13d8adc1bc9d7Ian Romanick 218a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick virtual void print(void) const; 219a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick 220a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick enum ast_operators oper; 221a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick 222a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick ast_expression *subexpressions[3]; 223a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick 224a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick union { 225b2c0df2b60a77b043d461f265c85d8b5b066a008Kenneth Graunke const char *identifier; 226a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick int int_constant; 227a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick float float_constant; 228a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick unsigned uint_constant; 229a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick int bool_constant; 230a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick } primary_expression; 231a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick 232a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick 233a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick /** 2343521f0bdd52d226031a3b60e2cd89b4629147690Ian Romanick * List of expressions for an \c ast_sequence or parameters for an 2353521f0bdd52d226031a3b60e2cd89b4629147690Ian Romanick * \c ast_function_call 236a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick */ 237304ea90233baeac6801a98e981658cb7a2d2501cIan Romanick exec_list expressions; 238fa0a9ac5cdf49865cfc289c4326c73c9dd4a61c5Ian Romanick 239fa0a9ac5cdf49865cfc289c4326c73c9dd4a61c5Ian Romanick /** 240fa0a9ac5cdf49865cfc289c4326c73c9dd4a61c5Ian Romanick * For things that can't be l-values, this describes what it is. 241fa0a9ac5cdf49865cfc289c4326c73c9dd4a61c5Ian Romanick * 242fa0a9ac5cdf49865cfc289c4326c73c9dd4a61c5Ian Romanick * This text is used by the code that generates IR for assignments to 243fa0a9ac5cdf49865cfc289c4326c73c9dd4a61c5Ian Romanick * detect and emit useful messages for assignments to some things that 244fa0a9ac5cdf49865cfc289c4326c73c9dd4a61c5Ian Romanick * can't be l-values. For example, pre- or post-incerement expressions. 245fa0a9ac5cdf49865cfc289c4326c73c9dd4a61c5Ian Romanick * 246fa0a9ac5cdf49865cfc289c4326c73c9dd4a61c5Ian Romanick * \note 247fa0a9ac5cdf49865cfc289c4326c73c9dd4a61c5Ian Romanick * This pointer may be \c NULL. 248fa0a9ac5cdf49865cfc289c4326c73c9dd4a61c5Ian Romanick */ 249fa0a9ac5cdf49865cfc289c4326c73c9dd4a61c5Ian Romanick const char *non_lvalue_description; 250a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick}; 251a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick 25288349b22caa0ab0b44188dbb9e002549aadb0590Ian Romanickclass ast_expression_bin : public ast_expression { 25388349b22caa0ab0b44188dbb9e002549aadb0590Ian Romanickpublic: 25488349b22caa0ab0b44188dbb9e002549aadb0590Ian Romanick ast_expression_bin(int oper, ast_expression *, ast_expression *); 25588349b22caa0ab0b44188dbb9e002549aadb0590Ian Romanick 25688349b22caa0ab0b44188dbb9e002549aadb0590Ian Romanick virtual void print(void) const; 25788349b22caa0ab0b44188dbb9e002549aadb0590Ian Romanick}; 25888349b22caa0ab0b44188dbb9e002549aadb0590Ian Romanick 2597cfddf19413ef61fcf1450bd61e9ece4cf1735a4Ian Romanick/** 2607cfddf19413ef61fcf1450bd61e9ece4cf1735a4Ian Romanick * Subclass of expressions for function calls 2617cfddf19413ef61fcf1450bd61e9ece4cf1735a4Ian Romanick */ 2627cfddf19413ef61fcf1450bd61e9ece4cf1735a4Ian Romanickclass ast_function_expression : public ast_expression { 2637cfddf19413ef61fcf1450bd61e9ece4cf1735a4Ian Romanickpublic: 2643821761e45c455374c9fdb4cd02104f420373360Ian Romanick ast_function_expression(ast_expression *callee) 2653821761e45c455374c9fdb4cd02104f420373360Ian Romanick : ast_expression(ast_function_call, callee, 2663821761e45c455374c9fdb4cd02104f420373360Ian Romanick NULL, NULL), 2673821761e45c455374c9fdb4cd02104f420373360Ian Romanick cons(false) 2687cfddf19413ef61fcf1450bd61e9ece4cf1735a4Ian Romanick { 2697cfddf19413ef61fcf1450bd61e9ece4cf1735a4Ian Romanick /* empty */ 2707cfddf19413ef61fcf1450bd61e9ece4cf1735a4Ian Romanick } 2717cfddf19413ef61fcf1450bd61e9ece4cf1735a4Ian Romanick 2723821761e45c455374c9fdb4cd02104f420373360Ian Romanick ast_function_expression(class ast_type_specifier *type) 2733821761e45c455374c9fdb4cd02104f420373360Ian Romanick : ast_expression(ast_function_call, (ast_expression *) type, 2743821761e45c455374c9fdb4cd02104f420373360Ian Romanick NULL, NULL), 2753821761e45c455374c9fdb4cd02104f420373360Ian Romanick cons(true) 2763821761e45c455374c9fdb4cd02104f420373360Ian Romanick { 2773821761e45c455374c9fdb4cd02104f420373360Ian Romanick /* empty */ 2783821761e45c455374c9fdb4cd02104f420373360Ian Romanick } 2793821761e45c455374c9fdb4cd02104f420373360Ian Romanick 2803821761e45c455374c9fdb4cd02104f420373360Ian Romanick bool is_constructor() const 2813821761e45c455374c9fdb4cd02104f420373360Ian Romanick { 2823821761e45c455374c9fdb4cd02104f420373360Ian Romanick return cons; 2833821761e45c455374c9fdb4cd02104f420373360Ian Romanick } 2847cfddf19413ef61fcf1450bd61e9ece4cf1735a4Ian Romanick 285fb9fb5f51deca28ed1ec7b71759fb71fc26a0ab6Kenneth Graunke virtual ir_rvalue *hir(exec_list *instructions, 286fb9fb5f51deca28ed1ec7b71759fb71fc26a0ab6Kenneth Graunke struct _mesa_glsl_parse_state *state); 2873821761e45c455374c9fdb4cd02104f420373360Ian Romanick 2883821761e45c455374c9fdb4cd02104f420373360Ian Romanickprivate: 2893821761e45c455374c9fdb4cd02104f420373360Ian Romanick /** 2903821761e45c455374c9fdb4cd02104f420373360Ian Romanick * Is this function call actually a constructor? 2913821761e45c455374c9fdb4cd02104f420373360Ian Romanick */ 2923821761e45c455374c9fdb4cd02104f420373360Ian Romanick bool cons; 2937cfddf19413ef61fcf1450bd61e9ece4cf1735a4Ian Romanick}; 2947cfddf19413ef61fcf1450bd61e9ece4cf1735a4Ian Romanick 29588349b22caa0ab0b44188dbb9e002549aadb0590Ian Romanick 296a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick/** 297a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick * Number of possible operators for an ast_expression 298a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick * 299a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick * This is done as a define instead of as an additional value in the enum so 300a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick * that the compiler won't generate spurious messages like "warning: 301a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick * enumeration value ‘ast_num_operators’ not handled in switch" 302a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick */ 303a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick#define AST_NUM_OPERATORS (ast_sequence + 1) 304a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick 305a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick 306a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanickclass ast_compound_statement : public ast_node { 307a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanickpublic: 308a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick ast_compound_statement(int new_scope, ast_node *statements); 309a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick virtual void print(void) const; 310a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick 311fb9fb5f51deca28ed1ec7b71759fb71fc26a0ab6Kenneth Graunke virtual ir_rvalue *hir(exec_list *instructions, 312fb9fb5f51deca28ed1ec7b71759fb71fc26a0ab6Kenneth Graunke struct _mesa_glsl_parse_state *state); 31318238de6c34a1a32c452f1006ed13d8adc1bc9d7Ian Romanick 314a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick int new_scope; 315304ea90233baeac6801a98e981658cb7a2d2501cIan Romanick exec_list statements; 316a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick}; 317a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick 318a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanickclass ast_declaration : public ast_node { 319a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanickpublic: 320b2c0df2b60a77b043d461f265c85d8b5b066a008Kenneth Graunke ast_declaration(const char *identifier, int is_array, ast_expression *array_size, 321a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick ast_expression *initializer); 322a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick virtual void print(void) const; 323a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick 324b2c0df2b60a77b043d461f265c85d8b5b066a008Kenneth Graunke const char *identifier; 325a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick 326a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick int is_array; 327a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick ast_expression *array_size; 328a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick 329a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick ast_expression *initializer; 330a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick}; 331a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick 332a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick 333a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanickenum { 334aaa31bf8f44e1aab0e87160661196b0a16e1d015Chad Versace ast_precision_none = 0, /**< Absence of precision qualifier. */ 335aaa31bf8f44e1aab0e87160661196b0a16e1d015Chad Versace ast_precision_high, 336a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick ast_precision_medium, 337a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick ast_precision_low 338a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick}; 339a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick 340a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanickstruct ast_type_qualifier { 341551bdf25bc4e57bea51c54da7e31c44c507e6c9fEric Anholt /* Callers of this ralloc-based new need not call delete. It's 342551bdf25bc4e57bea51c54da7e31c44c507e6c9fEric Anholt * easier to just ralloc_free 'ctx' (or any of its ancestors). */ 343551bdf25bc4e57bea51c54da7e31c44c507e6c9fEric Anholt static void* operator new(size_t size, void *ctx) 344551bdf25bc4e57bea51c54da7e31c44c507e6c9fEric Anholt { 345551bdf25bc4e57bea51c54da7e31c44c507e6c9fEric Anholt void *node; 346551bdf25bc4e57bea51c54da7e31c44c507e6c9fEric Anholt 347551bdf25bc4e57bea51c54da7e31c44c507e6c9fEric Anholt node = rzalloc_size(ctx, size); 348551bdf25bc4e57bea51c54da7e31c44c507e6c9fEric Anholt assert(node != NULL); 349551bdf25bc4e57bea51c54da7e31c44c507e6c9fEric Anholt 350551bdf25bc4e57bea51c54da7e31c44c507e6c9fEric Anholt return node; 351551bdf25bc4e57bea51c54da7e31c44c507e6c9fEric Anholt } 352551bdf25bc4e57bea51c54da7e31c44c507e6c9fEric Anholt 353551bdf25bc4e57bea51c54da7e31c44c507e6c9fEric Anholt /* If the user *does* call delete, that's OK, we will just 354551bdf25bc4e57bea51c54da7e31c44c507e6c9fEric Anholt * ralloc_free in that case. */ 355551bdf25bc4e57bea51c54da7e31c44c507e6c9fEric Anholt static void operator delete(void *table) 356551bdf25bc4e57bea51c54da7e31c44c507e6c9fEric Anholt { 357551bdf25bc4e57bea51c54da7e31c44c507e6c9fEric Anholt ralloc_free(table); 358551bdf25bc4e57bea51c54da7e31c44c507e6c9fEric Anholt } 359551bdf25bc4e57bea51c54da7e31c44c507e6c9fEric Anholt 360e24d35a5b59ca1e75b69a32db6294787378a963fIan Romanick union { 361e24d35a5b59ca1e75b69a32db6294787378a963fIan Romanick struct { 362e24d35a5b59ca1e75b69a32db6294787378a963fIan Romanick unsigned invariant:1; 363e24d35a5b59ca1e75b69a32db6294787378a963fIan Romanick unsigned constant:1; 364e24d35a5b59ca1e75b69a32db6294787378a963fIan Romanick unsigned attribute:1; 365e24d35a5b59ca1e75b69a32db6294787378a963fIan Romanick unsigned varying:1; 366e24d35a5b59ca1e75b69a32db6294787378a963fIan Romanick unsigned in:1; 367e24d35a5b59ca1e75b69a32db6294787378a963fIan Romanick unsigned out:1; 368e24d35a5b59ca1e75b69a32db6294787378a963fIan Romanick unsigned centroid:1; 369e24d35a5b59ca1e75b69a32db6294787378a963fIan Romanick unsigned uniform:1; 370e24d35a5b59ca1e75b69a32db6294787378a963fIan Romanick unsigned smooth:1; 371e24d35a5b59ca1e75b69a32db6294787378a963fIan Romanick unsigned flat:1; 372e24d35a5b59ca1e75b69a32db6294787378a963fIan Romanick unsigned noperspective:1; 373e24d35a5b59ca1e75b69a32db6294787378a963fIan Romanick 374e24d35a5b59ca1e75b69a32db6294787378a963fIan Romanick /** \name Layout qualifiers for GL_ARB_fragment_coord_conventions */ 375e24d35a5b59ca1e75b69a32db6294787378a963fIan Romanick /*@{*/ 376e24d35a5b59ca1e75b69a32db6294787378a963fIan Romanick unsigned origin_upper_left:1; 377e24d35a5b59ca1e75b69a32db6294787378a963fIan Romanick unsigned pixel_center_integer:1; 378e24d35a5b59ca1e75b69a32db6294787378a963fIan Romanick /*@}*/ 3797f68cbdc4d9f602dc2619ac4a90283a4f057a8cbIan Romanick 3807f68cbdc4d9f602dc2619ac4a90283a4f057a8cbIan Romanick /** 3817f68cbdc4d9f602dc2619ac4a90283a4f057a8cbIan Romanick * Flag set if GL_ARB_explicit_attrib_location "location" layout 3827f68cbdc4d9f602dc2619ac4a90283a4f057a8cbIan Romanick * qualifier is used. 3837f68cbdc4d9f602dc2619ac4a90283a4f057a8cbIan Romanick */ 3847f68cbdc4d9f602dc2619ac4a90283a4f057a8cbIan Romanick unsigned explicit_location:1; 3851256a5dcc86014d48bdc6fd10ea5a2fa11241667Dave Airlie /** 3861256a5dcc86014d48bdc6fd10ea5a2fa11241667Dave Airlie * Flag set if GL_ARB_explicit_attrib_location "index" layout 3871256a5dcc86014d48bdc6fd10ea5a2fa11241667Dave Airlie * qualifier is used. 3881256a5dcc86014d48bdc6fd10ea5a2fa11241667Dave Airlie */ 3891256a5dcc86014d48bdc6fd10ea5a2fa11241667Dave Airlie unsigned explicit_index:1; 390565a22090c3f143a343c19249a92be6a84b291b0Chad Versace 391565a22090c3f143a343c19249a92be6a84b291b0Chad Versace /** \name Layout qualifiers for GL_AMD_conservative_depth */ 392565a22090c3f143a343c19249a92be6a84b291b0Chad Versace /** \{ */ 393565a22090c3f143a343c19249a92be6a84b291b0Chad Versace unsigned depth_any:1; 394565a22090c3f143a343c19249a92be6a84b291b0Chad Versace unsigned depth_greater:1; 395565a22090c3f143a343c19249a92be6a84b291b0Chad Versace unsigned depth_less:1; 396565a22090c3f143a343c19249a92be6a84b291b0Chad Versace unsigned depth_unchanged:1; 397565a22090c3f143a343c19249a92be6a84b291b0Chad Versace /** \} */ 3982d03f48a65a666ecdcfaffa3d39ad1b77f2b25b6Eric Anholt 3992d03f48a65a666ecdcfaffa3d39ad1b77f2b25b6Eric Anholt /** \name Layout qualifiers for GL_ARB_uniform_buffer_object */ 4002d03f48a65a666ecdcfaffa3d39ad1b77f2b25b6Eric Anholt /** \{ */ 4012d03f48a65a666ecdcfaffa3d39ad1b77f2b25b6Eric Anholt unsigned std140:1; 4022d03f48a65a666ecdcfaffa3d39ad1b77f2b25b6Eric Anholt unsigned shared:1; 4032d03f48a65a666ecdcfaffa3d39ad1b77f2b25b6Eric Anholt unsigned packed:1; 4042d03f48a65a666ecdcfaffa3d39ad1b77f2b25b6Eric Anholt unsigned column_major:1; 4052d03f48a65a666ecdcfaffa3d39ad1b77f2b25b6Eric Anholt unsigned row_major:1; 4062d03f48a65a666ecdcfaffa3d39ad1b77f2b25b6Eric Anholt /** \} */ 4074a62a1c366703c5df10fd1d96f46ecb03ce45138Chad Versace } 4084a62a1c366703c5df10fd1d96f46ecb03ce45138Chad Versace /** \brief Set of flags, accessed by name. */ 4094a62a1c366703c5df10fd1d96f46ecb03ce45138Chad Versace q; 4104a62a1c366703c5df10fd1d96f46ecb03ce45138Chad Versace 4114a62a1c366703c5df10fd1d96f46ecb03ce45138Chad Versace /** \brief Set of flags, accessed as a bitmask. */ 412e24d35a5b59ca1e75b69a32db6294787378a963fIan Romanick unsigned i; 413e24d35a5b59ca1e75b69a32db6294787378a963fIan Romanick } flags; 4147f68cbdc4d9f602dc2619ac4a90283a4f057a8cbIan Romanick 4157f68cbdc4d9f602dc2619ac4a90283a4f057a8cbIan Romanick /** 4167f68cbdc4d9f602dc2619ac4a90283a4f057a8cbIan Romanick * Location specified via GL_ARB_explicit_attrib_location layout 4177f68cbdc4d9f602dc2619ac4a90283a4f057a8cbIan Romanick * 4187f68cbdc4d9f602dc2619ac4a90283a4f057a8cbIan Romanick * \note 4197f68cbdc4d9f602dc2619ac4a90283a4f057a8cbIan Romanick * This field is only valid if \c explicit_location is set. 4207f68cbdc4d9f602dc2619ac4a90283a4f057a8cbIan Romanick */ 421f0dd21ac88c0ee0a7dd96012881deeb3172974b6Ian Romanick int location; 4221256a5dcc86014d48bdc6fd10ea5a2fa11241667Dave Airlie /** 4231256a5dcc86014d48bdc6fd10ea5a2fa11241667Dave Airlie * Index specified via GL_ARB_explicit_attrib_location layout 4241256a5dcc86014d48bdc6fd10ea5a2fa11241667Dave Airlie * 4251256a5dcc86014d48bdc6fd10ea5a2fa11241667Dave Airlie * \note 4261256a5dcc86014d48bdc6fd10ea5a2fa11241667Dave Airlie * This field is only valid if \c explicit_index is set. 4271256a5dcc86014d48bdc6fd10ea5a2fa11241667Dave Airlie */ 4281256a5dcc86014d48bdc6fd10ea5a2fa11241667Dave Airlie int index; 4290e2f8936c8ef872cb464e54a9f09ae0324487147Chad Versace 4300e2f8936c8ef872cb464e54a9f09ae0324487147Chad Versace /** 431605aacc67d73db0926e0046a90a07fcd93a2d613Chad Versace * Return true if and only if an interpolation qualifier is present. 432605aacc67d73db0926e0046a90a07fcd93a2d613Chad Versace */ 433605aacc67d73db0926e0046a90a07fcd93a2d613Chad Versace bool has_interpolation() const; 434605aacc67d73db0926e0046a90a07fcd93a2d613Chad Versace 435605aacc67d73db0926e0046a90a07fcd93a2d613Chad Versace /** 4360e2f8936c8ef872cb464e54a9f09ae0324487147Chad Versace * \brief Return string representation of interpolation qualifier. 4370e2f8936c8ef872cb464e54a9f09ae0324487147Chad Versace * 4380e2f8936c8ef872cb464e54a9f09ae0324487147Chad Versace * If an interpolation qualifier is present, then return that qualifier's 4390e2f8936c8ef872cb464e54a9f09ae0324487147Chad Versace * string representation. Otherwise, return null. For example, if the 4400e2f8936c8ef872cb464e54a9f09ae0324487147Chad Versace * noperspective bit is set, then this returns "noperspective". 4410e2f8936c8ef872cb464e54a9f09ae0324487147Chad Versace * 4420e2f8936c8ef872cb464e54a9f09ae0324487147Chad Versace * If multiple interpolation qualifiers are somehow present, then the 4430e2f8936c8ef872cb464e54a9f09ae0324487147Chad Versace * returned string is undefined but not null. 4440e2f8936c8ef872cb464e54a9f09ae0324487147Chad Versace */ 4450e2f8936c8ef872cb464e54a9f09ae0324487147Chad Versace const char *interpolation_string() const; 446551bdf25bc4e57bea51c54da7e31c44c507e6c9fEric Anholt 447551bdf25bc4e57bea51c54da7e31c44c507e6c9fEric Anholt bool merge_qualifier(YYLTYPE *loc, 448551bdf25bc4e57bea51c54da7e31c44c507e6c9fEric Anholt _mesa_glsl_parse_state *state, 449551bdf25bc4e57bea51c54da7e31c44c507e6c9fEric Anholt ast_type_qualifier q); 450a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick}; 451a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick 452912a429bc529a017a426f06631b31da1c0eaa3aeEric Anholtclass ast_declarator_list; 453912a429bc529a017a426f06631b31da1c0eaa3aeEric Anholt 454a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanickclass ast_struct_specifier : public ast_node { 455a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanickpublic: 456912a429bc529a017a426f06631b31da1c0eaa3aeEric Anholt ast_struct_specifier(const char *identifier, 457912a429bc529a017a426f06631b31da1c0eaa3aeEric Anholt ast_declarator_list *declarator_list); 458a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick virtual void print(void) const; 459a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick 4603455ce614424a5a23a23037e23d0454e476bceeaIan Romanick virtual ir_rvalue *hir(exec_list *instructions, 4613455ce614424a5a23a23037e23d0454e476bceeaIan Romanick struct _mesa_glsl_parse_state *state); 4623455ce614424a5a23a23037e23d0454e476bceeaIan Romanick 463b2c0df2b60a77b043d461f265c85d8b5b066a008Kenneth Graunke const char *name; 464912a429bc529a017a426f06631b31da1c0eaa3aeEric Anholt /* List of ast_declarator_list * */ 465304ea90233baeac6801a98e981658cb7a2d2501cIan Romanick exec_list declarations; 466a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick}; 467a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick 468a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick 469a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick 470a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanickclass ast_type_specifier : public ast_node { 471a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanickpublic: 472ed85a5dd4b36f4a583fc321b6d8d49a050d48678Ian Romanick /** Construct a type specifier from a type name */ 473ed85a5dd4b36f4a583fc321b6d8d49a050d48678Ian Romanick ast_type_specifier(const char *name) 474eb7a71dea78152142b456f29e4881c4d3aeb56b6Eric Anholt : type_name(name), structure(NULL), 47508a286c9cc8fecb081057e0f551c88a446c47b6fChad Versace is_array(false), array_size(NULL), precision(ast_precision_none), 47608a286c9cc8fecb081057e0f551c88a446c47b6fChad Versace is_precision_statement(false) 477ed85a5dd4b36f4a583fc321b6d8d49a050d48678Ian Romanick { 478ed85a5dd4b36f4a583fc321b6d8d49a050d48678Ian Romanick /* empty */ 479ed85a5dd4b36f4a583fc321b6d8d49a050d48678Ian Romanick } 480ed85a5dd4b36f4a583fc321b6d8d49a050d48678Ian Romanick 481ed85a5dd4b36f4a583fc321b6d8d49a050d48678Ian Romanick /** Construct a type specifier from a structure definition */ 482ed85a5dd4b36f4a583fc321b6d8d49a050d48678Ian Romanick ast_type_specifier(ast_struct_specifier *s) 483eb7a71dea78152142b456f29e4881c4d3aeb56b6Eric Anholt : type_name(s->name), structure(s), 48408a286c9cc8fecb081057e0f551c88a446c47b6fChad Versace is_array(false), array_size(NULL), precision(ast_precision_none), 48508a286c9cc8fecb081057e0f551c88a446c47b6fChad Versace is_precision_statement(false) 486ed85a5dd4b36f4a583fc321b6d8d49a050d48678Ian Romanick { 487ed85a5dd4b36f4a583fc321b6d8d49a050d48678Ian Romanick /* empty */ 488ed85a5dd4b36f4a583fc321b6d8d49a050d48678Ian Romanick } 489ed85a5dd4b36f4a583fc321b6d8d49a050d48678Ian Romanick 490d612a127ccf12c11204f7f72a332de12f58f85a2Ian Romanick const struct glsl_type *glsl_type(const char **name, 491d612a127ccf12c11204f7f72a332de12f58f85a2Ian Romanick struct _mesa_glsl_parse_state *state) 492d612a127ccf12c11204f7f72a332de12f58f85a2Ian Romanick const; 493d612a127ccf12c11204f7f72a332de12f58f85a2Ian Romanick 494a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick virtual void print(void) const; 495a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick 4963455ce614424a5a23a23037e23d0454e476bceeaIan Romanick ir_rvalue *hir(exec_list *, struct _mesa_glsl_parse_state *); 4973455ce614424a5a23a23037e23d0454e476bceeaIan Romanick 4987f9d30974317a4050fb8990ce1a3eebbb190483aIan Romanick const char *type_name; 499a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick ast_struct_specifier *structure; 500a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick 501a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick int is_array; 502a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick ast_expression *array_size; 503a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick 504a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick unsigned precision:2; 50508a286c9cc8fecb081057e0f551c88a446c47b6fChad Versace 50608a286c9cc8fecb081057e0f551c88a446c47b6fChad Versace bool is_precision_statement; 507a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick}; 508a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick 509a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick 510a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanickclass ast_fully_specified_type : public ast_node { 511a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanickpublic: 512a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick virtual void print(void) const; 51328527ed557923aecff5d3b88e5d7776f04389547Kenneth Graunke bool has_qualifiers() const; 514a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick 515a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick ast_type_qualifier qualifier; 516a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick ast_type_specifier *specifier; 517a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick}; 518a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick 519a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick 520a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanickclass ast_declarator_list : public ast_node { 521a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanickpublic: 522a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick ast_declarator_list(ast_fully_specified_type *); 523a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick virtual void print(void) const; 524a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick 525fb9fb5f51deca28ed1ec7b71759fb71fc26a0ab6Kenneth Graunke virtual ir_rvalue *hir(exec_list *instructions, 526fb9fb5f51deca28ed1ec7b71759fb71fc26a0ab6Kenneth Graunke struct _mesa_glsl_parse_state *state); 52718238de6c34a1a32c452f1006ed13d8adc1bc9d7Ian Romanick 528a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick ast_fully_specified_type *type; 529304ea90233baeac6801a98e981658cb7a2d2501cIan Romanick exec_list declarations; 530a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick 531a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick /** 532a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick * Special flag for vertex shader "invariant" declarations. 533a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick * 534a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick * Vertex shaders can contain "invariant" variable redeclarations that do 535a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick * not include a type. For example, "invariant gl_Position;". This flag 536a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick * is used to note these cases when no type is specified. 537a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick */ 538a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick int invariant; 539f7561e8ecd80e915150ca63c0c79a5f9839c8e12Eric Anholt 540f7561e8ecd80e915150ca63c0c79a5f9839c8e12Eric Anholt /** 541f7561e8ecd80e915150ca63c0c79a5f9839c8e12Eric Anholt * Flag indicating that these declarators are in a uniform block, 542f7561e8ecd80e915150ca63c0c79a5f9839c8e12Eric Anholt * allowing UBO type qualifiers. 543f7561e8ecd80e915150ca63c0c79a5f9839c8e12Eric Anholt */ 544f7561e8ecd80e915150ca63c0c79a5f9839c8e12Eric Anholt bool ubo_qualifiers_valid; 545a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick}; 546a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick 547a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick 548a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanickclass ast_parameter_declarator : public ast_node { 549a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanickpublic: 550b35703df107b50b2c3f5cd4d56790921e8106324Aras Pranckevicius ast_parameter_declarator() 551b35703df107b50b2c3f5cd4d56790921e8106324Aras Pranckevicius { 552b8db38e1c4f639cb0a063250d43f5a0ef6afd50fEric Anholt this->identifier = NULL; 553b35703df107b50b2c3f5cd4d56790921e8106324Aras Pranckevicius this->is_array = false; 554b35703df107b50b2c3f5cd4d56790921e8106324Aras Pranckevicius this->array_size = 0; 555b35703df107b50b2c3f5cd4d56790921e8106324Aras Pranckevicius } 556b35703df107b50b2c3f5cd4d56790921e8106324Aras Pranckevicius 557a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick virtual void print(void) const; 558a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick 559fb9fb5f51deca28ed1ec7b71759fb71fc26a0ab6Kenneth Graunke virtual ir_rvalue *hir(exec_list *instructions, 560fb9fb5f51deca28ed1ec7b71759fb71fc26a0ab6Kenneth Graunke struct _mesa_glsl_parse_state *state); 56118238de6c34a1a32c452f1006ed13d8adc1bc9d7Ian Romanick 562a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick ast_fully_specified_type *type; 563b2c0df2b60a77b043d461f265c85d8b5b066a008Kenneth Graunke const char *identifier; 564a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick int is_array; 565a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick ast_expression *array_size; 56645d8a70c12ee6ea956baaf898324a828496382f6Ian Romanick 567304ea90233baeac6801a98e981658cb7a2d2501cIan Romanick static void parameters_to_hir(exec_list *ast_parameters, 56845d8a70c12ee6ea956baaf898324a828496382f6Ian Romanick bool formal, exec_list *ir_parameters, 56945d8a70c12ee6ea956baaf898324a828496382f6Ian Romanick struct _mesa_glsl_parse_state *state); 57045d8a70c12ee6ea956baaf898324a828496382f6Ian Romanick 57145d8a70c12ee6ea956baaf898324a828496382f6Ian Romanickprivate: 57245d8a70c12ee6ea956baaf898324a828496382f6Ian Romanick /** Is this parameter declaration part of a formal parameter list? */ 57345d8a70c12ee6ea956baaf898324a828496382f6Ian Romanick bool formal_parameter; 574cf37c9e8dad4349e45cb91d36957484fd76ce264Ian Romanick 575cf37c9e8dad4349e45cb91d36957484fd76ce264Ian Romanick /** 576cf37c9e8dad4349e45cb91d36957484fd76ce264Ian Romanick * Is this parameter 'void' type? 577cf37c9e8dad4349e45cb91d36957484fd76ce264Ian Romanick * 578cf37c9e8dad4349e45cb91d36957484fd76ce264Ian Romanick * This field is set by \c ::hir. 579cf37c9e8dad4349e45cb91d36957484fd76ce264Ian Romanick */ 580cf37c9e8dad4349e45cb91d36957484fd76ce264Ian Romanick bool is_void; 581a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick}; 582a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick 583a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick 584a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanickclass ast_function : public ast_node { 585a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanickpublic: 586a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick ast_function(void); 587a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick 588a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick virtual void print(void) const; 589a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick 59092318a947958892497722772b03c643ebc943294Ian Romanick virtual ir_rvalue *hir(exec_list *instructions, 59192318a947958892497722772b03c643ebc943294Ian Romanick struct _mesa_glsl_parse_state *state); 59292318a947958892497722772b03c643ebc943294Ian Romanick 593a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick ast_fully_specified_type *return_type; 594b2c0df2b60a77b043d461f265c85d8b5b066a008Kenneth Graunke const char *identifier; 595a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick 596304ea90233baeac6801a98e981658cb7a2d2501cIan Romanick exec_list parameters; 59792318a947958892497722772b03c643ebc943294Ian Romanick 59892318a947958892497722772b03c643ebc943294Ian Romanickprivate: 59992318a947958892497722772b03c643ebc943294Ian Romanick /** 60092318a947958892497722772b03c643ebc943294Ian Romanick * Is this prototype part of the function definition? 60192318a947958892497722772b03c643ebc943294Ian Romanick * 60292318a947958892497722772b03c643ebc943294Ian Romanick * Used by ast_function_definition::hir to process the parameters, etc. 60392318a947958892497722772b03c643ebc943294Ian Romanick * of the function. 60492318a947958892497722772b03c643ebc943294Ian Romanick * 60592318a947958892497722772b03c643ebc943294Ian Romanick * \sa ::hir 60692318a947958892497722772b03c643ebc943294Ian Romanick */ 60792318a947958892497722772b03c643ebc943294Ian Romanick bool is_definition; 60892318a947958892497722772b03c643ebc943294Ian Romanick 60992318a947958892497722772b03c643ebc943294Ian Romanick /** 61092318a947958892497722772b03c643ebc943294Ian Romanick * Function signature corresponding to this function prototype instance 61192318a947958892497722772b03c643ebc943294Ian Romanick * 61292318a947958892497722772b03c643ebc943294Ian Romanick * Used by ast_function_definition::hir to process the parameters, etc. 61392318a947958892497722772b03c643ebc943294Ian Romanick * of the function. 61492318a947958892497722772b03c643ebc943294Ian Romanick * 61592318a947958892497722772b03c643ebc943294Ian Romanick * \sa ::hir 61692318a947958892497722772b03c643ebc943294Ian Romanick */ 61792318a947958892497722772b03c643ebc943294Ian Romanick class ir_function_signature *signature; 61892318a947958892497722772b03c643ebc943294Ian Romanick 61992318a947958892497722772b03c643ebc943294Ian Romanick friend class ast_function_definition; 620a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick}; 621a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick 622a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick 623a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanickclass ast_expression_statement : public ast_node { 624a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanickpublic: 625a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick ast_expression_statement(ast_expression *); 626a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick virtual void print(void) const; 627a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick 628fb9fb5f51deca28ed1ec7b71759fb71fc26a0ab6Kenneth Graunke virtual ir_rvalue *hir(exec_list *instructions, 629fb9fb5f51deca28ed1ec7b71759fb71fc26a0ab6Kenneth Graunke struct _mesa_glsl_parse_state *state); 63018238de6c34a1a32c452f1006ed13d8adc1bc9d7Ian Romanick 631a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick ast_expression *expression; 632a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick}; 633a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick 634a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick 635a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanickclass ast_case_label : public ast_node { 636a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanickpublic: 63719daba54707b4ff90159850ce97faceba9c336c0Dan McCabe ast_case_label(ast_expression *test_value); 63819daba54707b4ff90159850ce97faceba9c336c0Dan McCabe virtual void print(void) const; 63919daba54707b4ff90159850ce97faceba9c336c0Dan McCabe 64019daba54707b4ff90159850ce97faceba9c336c0Dan McCabe virtual ir_rvalue *hir(exec_list *instructions, 64119daba54707b4ff90159850ce97faceba9c336c0Dan McCabe struct _mesa_glsl_parse_state *state); 642a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick 643a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick /** 64419daba54707b4ff90159850ce97faceba9c336c0Dan McCabe * An test value of NULL means 'default'. 645a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick */ 64619daba54707b4ff90159850ce97faceba9c336c0Dan McCabe ast_expression *test_value; 647a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick}; 648a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick 64919daba54707b4ff90159850ce97faceba9c336c0Dan McCabe 650a0afcc67196baa588ec0ac246be6c4996a328f0bDan McCabeclass ast_case_label_list : public ast_node { 651a0afcc67196baa588ec0ac246be6c4996a328f0bDan McCabepublic: 652a0afcc67196baa588ec0ac246be6c4996a328f0bDan McCabe ast_case_label_list(void); 653a0afcc67196baa588ec0ac246be6c4996a328f0bDan McCabe virtual void print(void) const; 654a0afcc67196baa588ec0ac246be6c4996a328f0bDan McCabe 655a0afcc67196baa588ec0ac246be6c4996a328f0bDan McCabe virtual ir_rvalue *hir(exec_list *instructions, 656a0afcc67196baa588ec0ac246be6c4996a328f0bDan McCabe struct _mesa_glsl_parse_state *state); 657a0afcc67196baa588ec0ac246be6c4996a328f0bDan McCabe 658a0afcc67196baa588ec0ac246be6c4996a328f0bDan McCabe /** 659a0afcc67196baa588ec0ac246be6c4996a328f0bDan McCabe * A list of case labels. 660a0afcc67196baa588ec0ac246be6c4996a328f0bDan McCabe */ 661a0afcc67196baa588ec0ac246be6c4996a328f0bDan McCabe exec_list labels; 662a0afcc67196baa588ec0ac246be6c4996a328f0bDan McCabe}; 663a0afcc67196baa588ec0ac246be6c4996a328f0bDan McCabe 664a0afcc67196baa588ec0ac246be6c4996a328f0bDan McCabe 665a0afcc67196baa588ec0ac246be6c4996a328f0bDan McCabeclass ast_case_statement : public ast_node { 666a0afcc67196baa588ec0ac246be6c4996a328f0bDan McCabepublic: 667a0afcc67196baa588ec0ac246be6c4996a328f0bDan McCabe ast_case_statement(ast_case_label_list *labels); 668a0afcc67196baa588ec0ac246be6c4996a328f0bDan McCabe virtual void print(void) const; 669a0afcc67196baa588ec0ac246be6c4996a328f0bDan McCabe 670a0afcc67196baa588ec0ac246be6c4996a328f0bDan McCabe virtual ir_rvalue *hir(exec_list *instructions, 671a0afcc67196baa588ec0ac246be6c4996a328f0bDan McCabe struct _mesa_glsl_parse_state *state); 672a0afcc67196baa588ec0ac246be6c4996a328f0bDan McCabe 673a0afcc67196baa588ec0ac246be6c4996a328f0bDan McCabe ast_case_label_list *labels; 674a0afcc67196baa588ec0ac246be6c4996a328f0bDan McCabe 675a0afcc67196baa588ec0ac246be6c4996a328f0bDan McCabe /** 676a0afcc67196baa588ec0ac246be6c4996a328f0bDan McCabe * A list of statements. 677a0afcc67196baa588ec0ac246be6c4996a328f0bDan McCabe */ 678a0afcc67196baa588ec0ac246be6c4996a328f0bDan McCabe exec_list stmts; 679a0afcc67196baa588ec0ac246be6c4996a328f0bDan McCabe}; 680a0afcc67196baa588ec0ac246be6c4996a328f0bDan McCabe 681a0afcc67196baa588ec0ac246be6c4996a328f0bDan McCabe 682a0afcc67196baa588ec0ac246be6c4996a328f0bDan McCabeclass ast_case_statement_list : public ast_node { 683a0afcc67196baa588ec0ac246be6c4996a328f0bDan McCabepublic: 684a0afcc67196baa588ec0ac246be6c4996a328f0bDan McCabe ast_case_statement_list(void); 685a0afcc67196baa588ec0ac246be6c4996a328f0bDan McCabe virtual void print(void) const; 686a0afcc67196baa588ec0ac246be6c4996a328f0bDan McCabe 687a0afcc67196baa588ec0ac246be6c4996a328f0bDan McCabe virtual ir_rvalue *hir(exec_list *instructions, 688a0afcc67196baa588ec0ac246be6c4996a328f0bDan McCabe struct _mesa_glsl_parse_state *state); 689a0afcc67196baa588ec0ac246be6c4996a328f0bDan McCabe 690a0afcc67196baa588ec0ac246be6c4996a328f0bDan McCabe /** 691a0afcc67196baa588ec0ac246be6c4996a328f0bDan McCabe * A list of cases. 692a0afcc67196baa588ec0ac246be6c4996a328f0bDan McCabe */ 693a0afcc67196baa588ec0ac246be6c4996a328f0bDan McCabe exec_list cases; 694a0afcc67196baa588ec0ac246be6c4996a328f0bDan McCabe}; 695a0afcc67196baa588ec0ac246be6c4996a328f0bDan McCabe 696a0afcc67196baa588ec0ac246be6c4996a328f0bDan McCabe 697a0afcc67196baa588ec0ac246be6c4996a328f0bDan McCabeclass ast_switch_body : public ast_node { 698a0afcc67196baa588ec0ac246be6c4996a328f0bDan McCabepublic: 699a0afcc67196baa588ec0ac246be6c4996a328f0bDan McCabe ast_switch_body(ast_case_statement_list *stmts); 700a0afcc67196baa588ec0ac246be6c4996a328f0bDan McCabe virtual void print(void) const; 701a0afcc67196baa588ec0ac246be6c4996a328f0bDan McCabe 702a0afcc67196baa588ec0ac246be6c4996a328f0bDan McCabe virtual ir_rvalue *hir(exec_list *instructions, 703a0afcc67196baa588ec0ac246be6c4996a328f0bDan McCabe struct _mesa_glsl_parse_state *state); 704a0afcc67196baa588ec0ac246be6c4996a328f0bDan McCabe 705a0afcc67196baa588ec0ac246be6c4996a328f0bDan McCabe ast_case_statement_list *stmts; 706a0afcc67196baa588ec0ac246be6c4996a328f0bDan McCabe}; 707a0afcc67196baa588ec0ac246be6c4996a328f0bDan McCabe 708a0afcc67196baa588ec0ac246be6c4996a328f0bDan McCabe 709a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanickclass ast_selection_statement : public ast_node { 710a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanickpublic: 711a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick ast_selection_statement(ast_expression *condition, 712a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick ast_node *then_statement, 713a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick ast_node *else_statement); 714a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick virtual void print(void) const; 715a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick 7163c6fea3048a0d9add2fec621d30c32f3519d8868Ian Romanick virtual ir_rvalue *hir(exec_list *instructions, 7173c6fea3048a0d9add2fec621d30c32f3519d8868Ian Romanick struct _mesa_glsl_parse_state *state); 7183c6fea3048a0d9add2fec621d30c32f3519d8868Ian Romanick 719a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick ast_expression *condition; 720a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick ast_node *then_statement; 721a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick ast_node *else_statement; 722a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick}; 723a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick 724a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick 725a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanickclass ast_switch_statement : public ast_node { 726a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanickpublic: 72719daba54707b4ff90159850ce97faceba9c336c0Dan McCabe ast_switch_statement(ast_expression *test_expression, 72819daba54707b4ff90159850ce97faceba9c336c0Dan McCabe ast_node *body); 72919daba54707b4ff90159850ce97faceba9c336c0Dan McCabe virtual void print(void) const; 73019daba54707b4ff90159850ce97faceba9c336c0Dan McCabe 73119daba54707b4ff90159850ce97faceba9c336c0Dan McCabe virtual ir_rvalue *hir(exec_list *instructions, 73219daba54707b4ff90159850ce97faceba9c336c0Dan McCabe struct _mesa_glsl_parse_state *state); 73319daba54707b4ff90159850ce97faceba9c336c0Dan McCabe 73419daba54707b4ff90159850ce97faceba9c336c0Dan McCabe ast_expression *test_expression; 73519daba54707b4ff90159850ce97faceba9c336c0Dan McCabe ast_node *body; 73619daba54707b4ff90159850ce97faceba9c336c0Dan McCabe 73719daba54707b4ff90159850ce97faceba9c336c0Dan McCabeprotected: 73819daba54707b4ff90159850ce97faceba9c336c0Dan McCabe void test_to_hir(exec_list *, struct _mesa_glsl_parse_state *); 739a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick}; 740a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick 741a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanickclass ast_iteration_statement : public ast_node { 742a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanickpublic: 743a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick ast_iteration_statement(int mode, ast_node *init, ast_node *condition, 744a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick ast_expression *rest_expression, ast_node *body); 745a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick 746a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick virtual void print(void) const; 747a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick 7489e7d010ee0ed89f1fe07a06a9d9bb22e15106ae2Ian Romanick virtual ir_rvalue *hir(exec_list *, struct _mesa_glsl_parse_state *); 7499e7d010ee0ed89f1fe07a06a9d9bb22e15106ae2Ian Romanick 750a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick enum ast_iteration_modes { 751a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick ast_for, 752a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick ast_while, 753a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick ast_do_while 754a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick } mode; 755a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick 756a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick 757a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick ast_node *init_statement; 758a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick ast_node *condition; 759a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick ast_expression *rest_expression; 760a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick 761a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick ast_node *body; 7628c46ed24906ee10dd2f2cfaf4cf9803eca1ba523Ian Romanick 7638c46ed24906ee10dd2f2cfaf4cf9803eca1ba523Ian Romanickprivate: 7648c46ed24906ee10dd2f2cfaf4cf9803eca1ba523Ian Romanick /** 7658c46ed24906ee10dd2f2cfaf4cf9803eca1ba523Ian Romanick * Generate IR from the condition of a loop 7668c46ed24906ee10dd2f2cfaf4cf9803eca1ba523Ian Romanick * 7678c46ed24906ee10dd2f2cfaf4cf9803eca1ba523Ian Romanick * This is factored out of ::hir because some loops have the condition 7688c46ed24906ee10dd2f2cfaf4cf9803eca1ba523Ian Romanick * test at the top (for and while), and others have it at the end (do-while). 7698c46ed24906ee10dd2f2cfaf4cf9803eca1ba523Ian Romanick */ 7708c46ed24906ee10dd2f2cfaf4cf9803eca1ba523Ian Romanick void condition_to_hir(class ir_loop *, struct _mesa_glsl_parse_state *); 771a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick}; 772a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick 773a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick 774a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanickclass ast_jump_statement : public ast_node { 775a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanickpublic: 776a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick ast_jump_statement(int mode, ast_expression *return_value); 777a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick virtual void print(void) const; 778a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick 779fb9fb5f51deca28ed1ec7b71759fb71fc26a0ab6Kenneth Graunke virtual ir_rvalue *hir(exec_list *instructions, 780fb9fb5f51deca28ed1ec7b71759fb71fc26a0ab6Kenneth Graunke struct _mesa_glsl_parse_state *state); 78116a246c049fa3c8d7841f87c8defdd0f26f302eeIan Romanick 782a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick enum ast_jump_modes { 783a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick ast_continue, 784a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick ast_break, 785a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick ast_return, 786a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick ast_discard 787a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick } mode; 788a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick 789a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick ast_expression *opt_return_value; 790a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick}; 791a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick 792a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick 793a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanickclass ast_function_definition : public ast_node { 794a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanickpublic: 795a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick virtual void print(void) const; 796a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick 797fb9fb5f51deca28ed1ec7b71759fb71fc26a0ab6Kenneth Graunke virtual ir_rvalue *hir(exec_list *instructions, 798fb9fb5f51deca28ed1ec7b71759fb71fc26a0ab6Kenneth Graunke struct _mesa_glsl_parse_state *state); 79918238de6c34a1a32c452f1006ed13d8adc1bc9d7Ian Romanick 800a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick ast_function *prototype; 801a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick ast_compound_statement *body; 802a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick}; 8032d03f48a65a666ecdcfaffa3d39ad1b77f2b25b6Eric Anholt 8042d03f48a65a666ecdcfaffa3d39ad1b77f2b25b6Eric Anholtclass ast_uniform_block : public ast_node { 8052d03f48a65a666ecdcfaffa3d39ad1b77f2b25b6Eric Anholtpublic: 8062d03f48a65a666ecdcfaffa3d39ad1b77f2b25b6Eric Anholt ast_uniform_block(ast_type_qualifier layout, 8072d03f48a65a666ecdcfaffa3d39ad1b77f2b25b6Eric Anholt const char *block_name, 8082d03f48a65a666ecdcfaffa3d39ad1b77f2b25b6Eric Anholt ast_declarator_list *member_list) 8092d03f48a65a666ecdcfaffa3d39ad1b77f2b25b6Eric Anholt : layout(layout), block_name(block_name) 8102d03f48a65a666ecdcfaffa3d39ad1b77f2b25b6Eric Anholt { 8112d03f48a65a666ecdcfaffa3d39ad1b77f2b25b6Eric Anholt declarations.push_degenerate_list_at_head(&member_list->link); 8122d03f48a65a666ecdcfaffa3d39ad1b77f2b25b6Eric Anholt } 8132d03f48a65a666ecdcfaffa3d39ad1b77f2b25b6Eric Anholt 8142d03f48a65a666ecdcfaffa3d39ad1b77f2b25b6Eric Anholt virtual ir_rvalue *hir(exec_list *instructions, 8152d03f48a65a666ecdcfaffa3d39ad1b77f2b25b6Eric Anholt struct _mesa_glsl_parse_state *state); 8162d03f48a65a666ecdcfaffa3d39ad1b77f2b25b6Eric Anholt 8172d03f48a65a666ecdcfaffa3d39ad1b77f2b25b6Eric Anholt ast_type_qualifier layout; 8182d03f48a65a666ecdcfaffa3d39ad1b77f2b25b6Eric Anholt const char *block_name; 8192d03f48a65a666ecdcfaffa3d39ad1b77f2b25b6Eric Anholt /** List of ast_declarator_list * */ 8202d03f48a65a666ecdcfaffa3d39ad1b77f2b25b6Eric Anholt exec_list declarations; 8212d03f48a65a666ecdcfaffa3d39ad1b77f2b25b6Eric Anholt}; 822e053d62aa573651abdd78666d299272c8219a3aaIan Romanick/*@}*/ 823a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick 824d949a9afb0a01e9678a4343f66b056b41a2e48a9Ian Romanickextern void 825d949a9afb0a01e9678a4343f66b056b41a2e48a9Ian Romanick_mesa_ast_to_hir(exec_list *instructions, struct _mesa_glsl_parse_state *state); 826d949a9afb0a01e9678a4343f66b056b41a2e48a9Ian Romanick 827768b55a5268572ff9fd03e57e92775882eb0a821Ian Romanickextern ir_rvalue * 828768b55a5268572ff9fd03e57e92775882eb0a821Ian Romanick_mesa_ast_field_selection_to_hir(const ast_expression *expr, 8290044e7edcea22d2456c051a1c4b744a26960ad27Ian Romanick exec_list *instructions, 830a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick struct _mesa_glsl_parse_state *state); 831a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick 8326fae1e4c4d33769e2f255d50907b5aa0ab80edd4Kenneth Graunkevoid 8330d81b0e18494a80c4326fbc98837842959675869Paul Berryemit_function(_mesa_glsl_parse_state *state, ir_function *f); 8346fae1e4c4d33769e2f255d50907b5aa0ab80edd4Kenneth Graunke 835a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick#endif /* AST_H */ 836