ast.h revision 3c6fea3048a0d9add2fec621d30c32f3519d8868
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 29a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick#include "main/simple_list.h" 300044e7edcea22d2456c051a1c4b744a26960ad27Ian Romanick#include "list.h" 31a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick#include "glsl_parser_extras.h" 32a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick 33a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanickstruct ir_instruction; 34a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanickstruct _mesa_glsl_parse_state; 35a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick 36a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanickstruct YYLTYPE; 37a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick 38a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanickclass ast_node : public simple_node { 39a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanickpublic: 40a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick virtual ~ast_node(); 41a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick virtual void print(void) const; 42fb9fb5f51deca28ed1ec7b71759fb71fc26a0ab6Kenneth Graunke virtual ir_rvalue *hir(exec_list *instructions, 43fb9fb5f51deca28ed1ec7b71759fb71fc26a0ab6Kenneth Graunke struct _mesa_glsl_parse_state *state); 44a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick 45a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick /** 46a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick * Retrieve the source location of an AST node 47a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick * 48a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick * This function is primarily used to get the source position of an AST node 49a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick * into a form that can be passed to \c _mesa_glsl_error. 50a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick * 51a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick * \sa _mesa_glsl_error, ast_node::set_location 52a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick */ 53a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick struct YYLTYPE get_location(void) const 54a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick { 55a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick struct YYLTYPE locp; 56a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick 57a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick locp.source = this->location.source; 58a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick locp.first_line = this->location.line; 59a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick locp.first_column = this->location.column; 60a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick locp.last_line = locp.first_line; 61a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick locp.last_column = locp.first_column; 62a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick 63a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick return locp; 64a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick } 65a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick 66a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick /** 67a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick * Set the source location of an AST node from a parser location 68a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick * 69a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick * \sa ast_node::get_location 70a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick */ 71a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick void set_location(const struct YYLTYPE *locp) 72a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick { 73a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick this->location.source = locp->source; 74a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick this->location.line = locp->first_line; 75a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick this->location.column = locp->first_column; 76a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick } 77a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick 78a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick 79a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick int type; 80a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick 81a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick struct { 82a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick unsigned source; 83a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick unsigned line; 84a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick unsigned column; 85a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick } location; 86a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick 87a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanickprotected: 88a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick ast_node(void); 89a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick}; 90a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick 91a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick 92a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanickenum ast_operators { 93a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick ast_assign, 94a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick ast_plus, /**< Unary + operator. */ 95a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick ast_neg, 96a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick ast_add, 97a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick ast_sub, 98a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick ast_mul, 99a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick ast_div, 100a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick ast_mod, 101a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick ast_lshift, 102a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick ast_rshift, 103a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick ast_less, 104a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick ast_greater, 105a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick ast_lequal, 106a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick ast_gequal, 107a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick ast_equal, 108a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick ast_nequal, 109a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick ast_bit_and, 110a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick ast_bit_xor, 111a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick ast_bit_or, 112a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick ast_bit_not, 113a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick ast_logic_and, 114a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick ast_logic_xor, 115a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick ast_logic_or, 116a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick ast_logic_not, 117a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick 118a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick ast_mul_assign, 119a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick ast_div_assign, 120a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick ast_mod_assign, 121a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick ast_add_assign, 122a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick ast_sub_assign, 123a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick ast_ls_assign, 124a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick ast_rs_assign, 125a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick ast_and_assign, 126a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick ast_xor_assign, 127a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick ast_or_assign, 128a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick 129a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick ast_conditional, 130a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick 131a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick ast_pre_inc, 132a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick ast_pre_dec, 133a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick ast_post_inc, 134a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick ast_post_dec, 135a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick ast_field_selection, 136a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick ast_array_index, 137a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick 138a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick ast_function_call, 139a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick 140a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick ast_identifier, 141a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick ast_int_constant, 142a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick ast_uint_constant, 143a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick ast_float_constant, 144a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick ast_bool_constant, 145a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick 146a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick ast_sequence 147a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick}; 148a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick 149a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanickclass ast_expression : public ast_node { 150a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanickpublic: 151a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick ast_expression(int oper, ast_expression *, 152a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick ast_expression *, ast_expression *); 153a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick 154d10fe19495191072d39689337700b69e62252bf1Ian Romanick ast_expression(const char *identifier) : 155d10fe19495191072d39689337700b69e62252bf1Ian Romanick oper(ast_identifier) 156d10fe19495191072d39689337700b69e62252bf1Ian Romanick { 157d10fe19495191072d39689337700b69e62252bf1Ian Romanick subexpressions[0] = NULL; 158d10fe19495191072d39689337700b69e62252bf1Ian Romanick subexpressions[1] = NULL; 159d10fe19495191072d39689337700b69e62252bf1Ian Romanick subexpressions[2] = NULL; 160d10fe19495191072d39689337700b69e62252bf1Ian Romanick primary_expression.identifier = (char *) identifier; 161d10fe19495191072d39689337700b69e62252bf1Ian Romanick } 162d10fe19495191072d39689337700b69e62252bf1Ian Romanick 16388349b22caa0ab0b44188dbb9e002549aadb0590Ian Romanick static const char *operator_string(enum ast_operators op); 16488349b22caa0ab0b44188dbb9e002549aadb0590Ian Romanick 165fb9fb5f51deca28ed1ec7b71759fb71fc26a0ab6Kenneth Graunke virtual ir_rvalue *hir(exec_list *instructions, 166fb9fb5f51deca28ed1ec7b71759fb71fc26a0ab6Kenneth Graunke struct _mesa_glsl_parse_state *state); 16718238de6c34a1a32c452f1006ed13d8adc1bc9d7Ian Romanick 168a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick virtual void print(void) const; 169a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick 170a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick enum ast_operators oper; 171a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick 172a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick ast_expression *subexpressions[3]; 173a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick 174a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick union { 175a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick char *identifier; 176a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick int int_constant; 177a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick float float_constant; 178a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick unsigned uint_constant; 179a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick int bool_constant; 180a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick } primary_expression; 181a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick 182a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick 183a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick /** 184a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick * List of expressions for an \c ast_sequence. 185a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick */ 186a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick struct simple_node expressions; 187a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick}; 188a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick 18988349b22caa0ab0b44188dbb9e002549aadb0590Ian Romanickclass ast_expression_bin : public ast_expression { 19088349b22caa0ab0b44188dbb9e002549aadb0590Ian Romanickpublic: 19188349b22caa0ab0b44188dbb9e002549aadb0590Ian Romanick ast_expression_bin(int oper, ast_expression *, ast_expression *); 19288349b22caa0ab0b44188dbb9e002549aadb0590Ian Romanick 19388349b22caa0ab0b44188dbb9e002549aadb0590Ian Romanick virtual void print(void) const; 19488349b22caa0ab0b44188dbb9e002549aadb0590Ian Romanick}; 19588349b22caa0ab0b44188dbb9e002549aadb0590Ian Romanick 1967cfddf19413ef61fcf1450bd61e9ece4cf1735a4Ian Romanick/** 1977cfddf19413ef61fcf1450bd61e9ece4cf1735a4Ian Romanick * Subclass of expressions for function calls 1987cfddf19413ef61fcf1450bd61e9ece4cf1735a4Ian Romanick */ 1997cfddf19413ef61fcf1450bd61e9ece4cf1735a4Ian Romanickclass ast_function_expression : public ast_expression { 2007cfddf19413ef61fcf1450bd61e9ece4cf1735a4Ian Romanickpublic: 2013821761e45c455374c9fdb4cd02104f420373360Ian Romanick ast_function_expression(ast_expression *callee) 2023821761e45c455374c9fdb4cd02104f420373360Ian Romanick : ast_expression(ast_function_call, callee, 2033821761e45c455374c9fdb4cd02104f420373360Ian Romanick NULL, NULL), 2043821761e45c455374c9fdb4cd02104f420373360Ian Romanick cons(false) 2057cfddf19413ef61fcf1450bd61e9ece4cf1735a4Ian Romanick { 2067cfddf19413ef61fcf1450bd61e9ece4cf1735a4Ian Romanick /* empty */ 2077cfddf19413ef61fcf1450bd61e9ece4cf1735a4Ian Romanick } 2087cfddf19413ef61fcf1450bd61e9ece4cf1735a4Ian Romanick 2093821761e45c455374c9fdb4cd02104f420373360Ian Romanick ast_function_expression(class ast_type_specifier *type) 2103821761e45c455374c9fdb4cd02104f420373360Ian Romanick : ast_expression(ast_function_call, (ast_expression *) type, 2113821761e45c455374c9fdb4cd02104f420373360Ian Romanick NULL, NULL), 2123821761e45c455374c9fdb4cd02104f420373360Ian Romanick cons(true) 2133821761e45c455374c9fdb4cd02104f420373360Ian Romanick { 2143821761e45c455374c9fdb4cd02104f420373360Ian Romanick /* empty */ 2153821761e45c455374c9fdb4cd02104f420373360Ian Romanick } 2163821761e45c455374c9fdb4cd02104f420373360Ian Romanick 2173821761e45c455374c9fdb4cd02104f420373360Ian Romanick bool is_constructor() const 2183821761e45c455374c9fdb4cd02104f420373360Ian Romanick { 2193821761e45c455374c9fdb4cd02104f420373360Ian Romanick return cons; 2203821761e45c455374c9fdb4cd02104f420373360Ian Romanick } 2217cfddf19413ef61fcf1450bd61e9ece4cf1735a4Ian Romanick 222fb9fb5f51deca28ed1ec7b71759fb71fc26a0ab6Kenneth Graunke virtual ir_rvalue *hir(exec_list *instructions, 223fb9fb5f51deca28ed1ec7b71759fb71fc26a0ab6Kenneth Graunke struct _mesa_glsl_parse_state *state); 2243821761e45c455374c9fdb4cd02104f420373360Ian Romanick 2253821761e45c455374c9fdb4cd02104f420373360Ian Romanickprivate: 2263821761e45c455374c9fdb4cd02104f420373360Ian Romanick /** 2273821761e45c455374c9fdb4cd02104f420373360Ian Romanick * Is this function call actually a constructor? 2283821761e45c455374c9fdb4cd02104f420373360Ian Romanick */ 2293821761e45c455374c9fdb4cd02104f420373360Ian Romanick bool cons; 2307cfddf19413ef61fcf1450bd61e9ece4cf1735a4Ian Romanick}; 2317cfddf19413ef61fcf1450bd61e9ece4cf1735a4Ian Romanick 23288349b22caa0ab0b44188dbb9e002549aadb0590Ian Romanick 233a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick/** 234a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick * Number of possible operators for an ast_expression 235a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick * 236a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick * This is done as a define instead of as an additional value in the enum so 237a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick * that the compiler won't generate spurious messages like "warning: 238a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick * enumeration value ‘ast_num_operators’ not handled in switch" 239a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick */ 240a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick#define AST_NUM_OPERATORS (ast_sequence + 1) 241a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick 242a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick 243a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanickclass ast_compound_statement : public ast_node { 244a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanickpublic: 245a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick ast_compound_statement(int new_scope, ast_node *statements); 246a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick virtual void print(void) const; 247a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick 248fb9fb5f51deca28ed1ec7b71759fb71fc26a0ab6Kenneth Graunke virtual ir_rvalue *hir(exec_list *instructions, 249fb9fb5f51deca28ed1ec7b71759fb71fc26a0ab6Kenneth Graunke struct _mesa_glsl_parse_state *state); 25018238de6c34a1a32c452f1006ed13d8adc1bc9d7Ian Romanick 251a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick int new_scope; 252a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick struct simple_node statements; 253a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick}; 254a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick 255a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanickclass ast_declaration : public ast_node { 256a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanickpublic: 257a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick ast_declaration(char *identifier, int is_array, ast_expression *array_size, 258a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick ast_expression *initializer); 259a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick virtual void print(void) const; 260a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick 261a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick char *identifier; 262a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick 263a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick int is_array; 264a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick ast_expression *array_size; 265a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick 266a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick ast_expression *initializer; 267a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick}; 268a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick 269a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick 270a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanickenum { 271a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick ast_precision_high = 0, /**< Default precision. */ 272a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick ast_precision_medium, 273a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick ast_precision_low 274a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick}; 275a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick 276a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanickstruct ast_type_qualifier { 277a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick unsigned invariant:1; 278a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick unsigned constant:1; 279a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick unsigned attribute:1; 280a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick unsigned varying:1; 281a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick unsigned in:1; 282a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick unsigned out:1; 283a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick unsigned centroid:1; 284a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick unsigned uniform:1; 285a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick unsigned smooth:1; 286a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick unsigned flat:1; 287a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick unsigned noperspective:1; 288a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick}; 289a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick 290a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanickclass ast_struct_specifier : public ast_node { 291a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanickpublic: 292a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick ast_struct_specifier(char *identifier, ast_node *declarator_list); 293a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick virtual void print(void) const; 294a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick 295a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick char *name; 296a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick struct simple_node declarations; 297a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick}; 298a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick 299a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick 300a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanickenum ast_types { 301a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick ast_void, 302a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick ast_float, 303a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick ast_int, 304a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick ast_uint, 305a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick ast_bool, 306a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick ast_vec2, 307a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick ast_vec3, 308a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick ast_vec4, 309a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick ast_bvec2, 310a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick ast_bvec3, 311a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick ast_bvec4, 312a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick ast_ivec2, 313a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick ast_ivec3, 314a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick ast_ivec4, 315a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick ast_uvec2, 316a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick ast_uvec3, 317a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick ast_uvec4, 318a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick ast_mat2, 319a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick ast_mat2x3, 320a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick ast_mat2x4, 321a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick ast_mat3x2, 322a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick ast_mat3, 323a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick ast_mat3x4, 324a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick ast_mat4x2, 325a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick ast_mat4x3, 326a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick ast_mat4, 327a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick ast_sampler1d, 328a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick ast_sampler2d, 329a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick ast_sampler3d, 330a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick ast_samplercube, 331a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick ast_sampler1dshadow, 332a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick ast_sampler2dshadow, 333a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick ast_samplercubeshadow, 334a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick ast_sampler1darray, 335a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick ast_sampler2darray, 336a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick ast_sampler1darrayshadow, 337a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick ast_sampler2darrayshadow, 338a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick ast_isampler1d, 339a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick ast_isampler2d, 340a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick ast_isampler3d, 341a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick ast_isamplercube, 342a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick ast_isampler1darray, 343a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick ast_isampler2darray, 344a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick ast_usampler1d, 345a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick ast_usampler2d, 346a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick ast_usampler3d, 347a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick ast_usamplercube, 348a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick ast_usampler1darray, 349a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick ast_usampler2darray, 350a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick 351a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick ast_struct, 352a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick ast_type_name 353a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick}; 354a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick 355a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick 356a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanickclass ast_type_specifier : public ast_node { 357a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanickpublic: 358a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick ast_type_specifier(int specifier); 359a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick 360ed85a5dd4b36f4a583fc321b6d8d49a050d48678Ian Romanick /** Construct a type specifier from a type name */ 361ed85a5dd4b36f4a583fc321b6d8d49a050d48678Ian Romanick ast_type_specifier(const char *name) 362ed85a5dd4b36f4a583fc321b6d8d49a050d48678Ian Romanick : type_specifier(ast_type_name), type_name(name), structure(NULL), 363ed85a5dd4b36f4a583fc321b6d8d49a050d48678Ian Romanick is_array(false), array_size(NULL), precision(ast_precision_high) 364ed85a5dd4b36f4a583fc321b6d8d49a050d48678Ian Romanick { 365ed85a5dd4b36f4a583fc321b6d8d49a050d48678Ian Romanick /* empty */ 366ed85a5dd4b36f4a583fc321b6d8d49a050d48678Ian Romanick } 367ed85a5dd4b36f4a583fc321b6d8d49a050d48678Ian Romanick 368ed85a5dd4b36f4a583fc321b6d8d49a050d48678Ian Romanick /** Construct a type specifier from a structure definition */ 369ed85a5dd4b36f4a583fc321b6d8d49a050d48678Ian Romanick ast_type_specifier(ast_struct_specifier *s) 370ed85a5dd4b36f4a583fc321b6d8d49a050d48678Ian Romanick : type_specifier(ast_struct), type_name(s->name), structure(s), 371ed85a5dd4b36f4a583fc321b6d8d49a050d48678Ian Romanick is_array(false), array_size(NULL), precision(ast_precision_high) 372ed85a5dd4b36f4a583fc321b6d8d49a050d48678Ian Romanick { 373ed85a5dd4b36f4a583fc321b6d8d49a050d48678Ian Romanick /* empty */ 374ed85a5dd4b36f4a583fc321b6d8d49a050d48678Ian Romanick } 375ed85a5dd4b36f4a583fc321b6d8d49a050d48678Ian Romanick 376a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick virtual void print(void) const; 377a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick 378a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick enum ast_types type_specifier; 379a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick 3807f9d30974317a4050fb8990ce1a3eebbb190483aIan Romanick const char *type_name; 381a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick ast_struct_specifier *structure; 382a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick 383a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick int is_array; 384a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick ast_expression *array_size; 385a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick 386a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick unsigned precision:2; 387a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick}; 388a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick 389a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick 390a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanickclass ast_fully_specified_type : public ast_node { 391a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanickpublic: 392a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick virtual void print(void) const; 393a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick 394a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick ast_type_qualifier qualifier; 395a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick ast_type_specifier *specifier; 396a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick}; 397a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick 398a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick 399a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanickclass ast_declarator_list : public ast_node { 400a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanickpublic: 401a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick ast_declarator_list(ast_fully_specified_type *); 402a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick virtual void print(void) const; 403a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick 404fb9fb5f51deca28ed1ec7b71759fb71fc26a0ab6Kenneth Graunke virtual ir_rvalue *hir(exec_list *instructions, 405fb9fb5f51deca28ed1ec7b71759fb71fc26a0ab6Kenneth Graunke struct _mesa_glsl_parse_state *state); 40618238de6c34a1a32c452f1006ed13d8adc1bc9d7Ian Romanick 407a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick ast_fully_specified_type *type; 408a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick struct simple_node declarations; 409a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick 410a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick /** 411a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick * Special flag for vertex shader "invariant" declarations. 412a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick * 413a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick * Vertex shaders can contain "invariant" variable redeclarations that do 414a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick * not include a type. For example, "invariant gl_Position;". This flag 415a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick * is used to note these cases when no type is specified. 416a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick */ 417a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick int invariant; 418a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick}; 419a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick 420a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick 421a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanickclass ast_parameter_declarator : public ast_node { 422a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanickpublic: 423a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick virtual void print(void) const; 424a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick 425fb9fb5f51deca28ed1ec7b71759fb71fc26a0ab6Kenneth Graunke virtual ir_rvalue *hir(exec_list *instructions, 426fb9fb5f51deca28ed1ec7b71759fb71fc26a0ab6Kenneth Graunke struct _mesa_glsl_parse_state *state); 42718238de6c34a1a32c452f1006ed13d8adc1bc9d7Ian Romanick 428a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick ast_fully_specified_type *type; 429a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick char *identifier; 430a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick int is_array; 431a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick ast_expression *array_size; 432a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick}; 433a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick 434a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick 435a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanickclass ast_function : public ast_node { 436a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanickpublic: 437a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick ast_function(void); 438a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick 439a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick virtual void print(void) const; 440a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick 441a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick ast_fully_specified_type *return_type; 442a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick char *identifier; 443a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick 444a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick struct simple_node parameters; 445a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick}; 446a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick 447a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick 448a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanickclass ast_declaration_statement : public ast_node { 449a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanickpublic: 450a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick ast_declaration_statement(void); 451a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick 452a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick enum { 453a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick ast_function, 454a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick ast_declaration, 455a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick ast_precision 456a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick } mode; 457a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick 458a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick union { 459a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick class ast_function *function; 460a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick ast_declarator_list *declarator; 461a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick ast_type_specifier *type; 462a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick ast_node *node; 463a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick } declaration; 464a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick}; 465a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick 466a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick 467a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanickclass ast_expression_statement : public ast_node { 468a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanickpublic: 469a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick ast_expression_statement(ast_expression *); 470a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick virtual void print(void) const; 471a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick 472fb9fb5f51deca28ed1ec7b71759fb71fc26a0ab6Kenneth Graunke virtual ir_rvalue *hir(exec_list *instructions, 473fb9fb5f51deca28ed1ec7b71759fb71fc26a0ab6Kenneth Graunke struct _mesa_glsl_parse_state *state); 47418238de6c34a1a32c452f1006ed13d8adc1bc9d7Ian Romanick 475a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick ast_expression *expression; 476a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick}; 477a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick 478a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick 479a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanickclass ast_case_label : public ast_node { 480a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanickpublic: 481a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick 482a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick /** 483a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick * An expression of NULL means 'default'. 484a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick */ 485a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick ast_expression *expression; 486a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick}; 487a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick 488a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanickclass ast_selection_statement : public ast_node { 489a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanickpublic: 490a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick ast_selection_statement(ast_expression *condition, 491a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick ast_node *then_statement, 492a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick ast_node *else_statement); 493a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick virtual void print(void) const; 494a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick 4953c6fea3048a0d9add2fec621d30c32f3519d8868Ian Romanick virtual ir_rvalue *hir(exec_list *instructions, 4963c6fea3048a0d9add2fec621d30c32f3519d8868Ian Romanick struct _mesa_glsl_parse_state *state); 4973c6fea3048a0d9add2fec621d30c32f3519d8868Ian Romanick 498a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick ast_expression *condition; 499a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick ast_node *then_statement; 500a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick ast_node *else_statement; 501a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick}; 502a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick 503a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick 504a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanickclass ast_switch_statement : public ast_node { 505a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanickpublic: 506a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick ast_expression *expression; 507a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick struct simple_node statements; 508a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick}; 509a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick 510a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanickclass ast_iteration_statement : public ast_node { 511a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanickpublic: 512a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick ast_iteration_statement(int mode, ast_node *init, ast_node *condition, 513a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick ast_expression *rest_expression, ast_node *body); 514a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick 515a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick virtual void print(void) const; 516a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick 517a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick enum ast_iteration_modes { 518a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick ast_for, 519a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick ast_while, 520a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick ast_do_while 521a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick } mode; 522a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick 523a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick 524a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick ast_node *init_statement; 525a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick ast_node *condition; 526a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick ast_expression *rest_expression; 527a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick 528a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick ast_node *body; 529a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick}; 530a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick 531a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick 532a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanickclass ast_jump_statement : public ast_node { 533a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanickpublic: 534a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick ast_jump_statement(int mode, ast_expression *return_value); 535a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick virtual void print(void) const; 536a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick 537fb9fb5f51deca28ed1ec7b71759fb71fc26a0ab6Kenneth Graunke virtual ir_rvalue *hir(exec_list *instructions, 538fb9fb5f51deca28ed1ec7b71759fb71fc26a0ab6Kenneth Graunke struct _mesa_glsl_parse_state *state); 53916a246c049fa3c8d7841f87c8defdd0f26f302eeIan Romanick 540a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick enum ast_jump_modes { 541a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick ast_continue, 542a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick ast_break, 543a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick ast_return, 544a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick ast_discard 545a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick } mode; 546a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick 547a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick ast_expression *opt_return_value; 548a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick}; 549a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick 550a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick 551a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanickclass ast_function_definition : public ast_node { 552a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanickpublic: 553a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick virtual void print(void) const; 554a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick 555fb9fb5f51deca28ed1ec7b71759fb71fc26a0ab6Kenneth Graunke virtual ir_rvalue *hir(exec_list *instructions, 556fb9fb5f51deca28ed1ec7b71759fb71fc26a0ab6Kenneth Graunke struct _mesa_glsl_parse_state *state); 55718238de6c34a1a32c452f1006ed13d8adc1bc9d7Ian Romanick 558a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick ast_function *prototype; 559a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick ast_compound_statement *body; 560a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick}; 561a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick 562a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick 563d949a9afb0a01e9678a4343f66b056b41a2e48a9Ian Romanickextern void 564d949a9afb0a01e9678a4343f66b056b41a2e48a9Ian Romanick_mesa_ast_to_hir(exec_list *instructions, struct _mesa_glsl_parse_state *state); 565d949a9afb0a01e9678a4343f66b056b41a2e48a9Ian Romanick 566fb9fb5f51deca28ed1ec7b71759fb71fc26a0ab6Kenneth Graunkeextern struct ir_rvalue * 567a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick_mesa_ast_field_selection_to_hir(const struct ast_expression *expr, 5680044e7edcea22d2456c051a1c4b744a26960ad27Ian Romanick exec_list *instructions, 569a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick struct _mesa_glsl_parse_state *state); 570a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick 571a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick#endif /* AST_H */ 572