ast.h revision 3455ce614424a5a23a23037e23d0454e476bceea
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 */ 71ebfdef7a83966341c27f44c83366419d4a2f7a60Kenneth Graunke void set_location(const struct YYLTYPE &locp) 72a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick { 73ebfdef7a83966341c27f44c83366419d4a2f7a60Kenneth Graunke this->location.source = locp.source; 74ebfdef7a83966341c27f44c83366419d4a2f7a60Kenneth Graunke this->location.line = locp.first_line; 75ebfdef7a83966341c27f44c83366419d4a2f7a60Kenneth Graunke this->location.column = locp.first_column; 76a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick } 77a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick 78a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick struct { 79a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick unsigned source; 80a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick unsigned line; 81a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick unsigned column; 82a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick } location; 83a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick 84a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanickprotected: 85a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick ast_node(void); 86a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick}; 87a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick 88a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick 89a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanickenum ast_operators { 90a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick ast_assign, 91a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick ast_plus, /**< Unary + operator. */ 92a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick ast_neg, 93a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick ast_add, 94a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick ast_sub, 95a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick ast_mul, 96a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick ast_div, 97a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick ast_mod, 98a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick ast_lshift, 99a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick ast_rshift, 100a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick ast_less, 101a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick ast_greater, 102a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick ast_lequal, 103a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick ast_gequal, 104a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick ast_equal, 105a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick ast_nequal, 106a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick ast_bit_and, 107a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick ast_bit_xor, 108a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick ast_bit_or, 109a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick ast_bit_not, 110a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick ast_logic_and, 111a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick ast_logic_xor, 112a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick ast_logic_or, 113a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick ast_logic_not, 114a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick 115a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick ast_mul_assign, 116a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick ast_div_assign, 117a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick ast_mod_assign, 118a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick ast_add_assign, 119a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick ast_sub_assign, 120a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick ast_ls_assign, 121a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick ast_rs_assign, 122a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick ast_and_assign, 123a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick ast_xor_assign, 124a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick ast_or_assign, 125a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick 126a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick ast_conditional, 127a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick 128a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick ast_pre_inc, 129a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick ast_pre_dec, 130a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick ast_post_inc, 131a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick ast_post_dec, 132a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick ast_field_selection, 133a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick ast_array_index, 134a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick 135a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick ast_function_call, 136a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick 137a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick ast_identifier, 138a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick ast_int_constant, 139a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick ast_uint_constant, 140a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick ast_float_constant, 141a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick ast_bool_constant, 142a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick 143a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick ast_sequence 144a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick}; 145a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick 146a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanickclass ast_expression : public ast_node { 147a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanickpublic: 148a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick ast_expression(int oper, ast_expression *, 149a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick ast_expression *, ast_expression *); 150a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick 151d10fe19495191072d39689337700b69e62252bf1Ian Romanick ast_expression(const char *identifier) : 152d10fe19495191072d39689337700b69e62252bf1Ian Romanick oper(ast_identifier) 153d10fe19495191072d39689337700b69e62252bf1Ian Romanick { 154d10fe19495191072d39689337700b69e62252bf1Ian Romanick subexpressions[0] = NULL; 155d10fe19495191072d39689337700b69e62252bf1Ian Romanick subexpressions[1] = NULL; 156d10fe19495191072d39689337700b69e62252bf1Ian Romanick subexpressions[2] = NULL; 157d10fe19495191072d39689337700b69e62252bf1Ian Romanick primary_expression.identifier = (char *) identifier; 158d10fe19495191072d39689337700b69e62252bf1Ian Romanick } 159d10fe19495191072d39689337700b69e62252bf1Ian Romanick 16088349b22caa0ab0b44188dbb9e002549aadb0590Ian Romanick static const char *operator_string(enum ast_operators op); 16188349b22caa0ab0b44188dbb9e002549aadb0590Ian Romanick 162fb9fb5f51deca28ed1ec7b71759fb71fc26a0ab6Kenneth Graunke virtual ir_rvalue *hir(exec_list *instructions, 163fb9fb5f51deca28ed1ec7b71759fb71fc26a0ab6Kenneth Graunke struct _mesa_glsl_parse_state *state); 16418238de6c34a1a32c452f1006ed13d8adc1bc9d7Ian Romanick 165a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick virtual void print(void) const; 166a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick 167a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick enum ast_operators oper; 168a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick 169a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick ast_expression *subexpressions[3]; 170a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick 171a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick union { 172a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick char *identifier; 173a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick int int_constant; 174a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick float float_constant; 175a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick unsigned uint_constant; 176a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick int bool_constant; 177a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick } primary_expression; 178a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick 179a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick 180a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick /** 181a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick * List of expressions for an \c ast_sequence. 182a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick */ 183a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick struct simple_node expressions; 184a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick}; 185a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick 18688349b22caa0ab0b44188dbb9e002549aadb0590Ian Romanickclass ast_expression_bin : public ast_expression { 18788349b22caa0ab0b44188dbb9e002549aadb0590Ian Romanickpublic: 18888349b22caa0ab0b44188dbb9e002549aadb0590Ian Romanick ast_expression_bin(int oper, ast_expression *, ast_expression *); 18988349b22caa0ab0b44188dbb9e002549aadb0590Ian Romanick 19088349b22caa0ab0b44188dbb9e002549aadb0590Ian Romanick virtual void print(void) const; 19188349b22caa0ab0b44188dbb9e002549aadb0590Ian Romanick}; 19288349b22caa0ab0b44188dbb9e002549aadb0590Ian Romanick 1937cfddf19413ef61fcf1450bd61e9ece4cf1735a4Ian Romanick/** 1947cfddf19413ef61fcf1450bd61e9ece4cf1735a4Ian Romanick * Subclass of expressions for function calls 1957cfddf19413ef61fcf1450bd61e9ece4cf1735a4Ian Romanick */ 1967cfddf19413ef61fcf1450bd61e9ece4cf1735a4Ian Romanickclass ast_function_expression : public ast_expression { 1977cfddf19413ef61fcf1450bd61e9ece4cf1735a4Ian Romanickpublic: 1983821761e45c455374c9fdb4cd02104f420373360Ian Romanick ast_function_expression(ast_expression *callee) 1993821761e45c455374c9fdb4cd02104f420373360Ian Romanick : ast_expression(ast_function_call, callee, 2003821761e45c455374c9fdb4cd02104f420373360Ian Romanick NULL, NULL), 2013821761e45c455374c9fdb4cd02104f420373360Ian Romanick cons(false) 2027cfddf19413ef61fcf1450bd61e9ece4cf1735a4Ian Romanick { 2037cfddf19413ef61fcf1450bd61e9ece4cf1735a4Ian Romanick /* empty */ 2047cfddf19413ef61fcf1450bd61e9ece4cf1735a4Ian Romanick } 2057cfddf19413ef61fcf1450bd61e9ece4cf1735a4Ian Romanick 2063821761e45c455374c9fdb4cd02104f420373360Ian Romanick ast_function_expression(class ast_type_specifier *type) 2073821761e45c455374c9fdb4cd02104f420373360Ian Romanick : ast_expression(ast_function_call, (ast_expression *) type, 2083821761e45c455374c9fdb4cd02104f420373360Ian Romanick NULL, NULL), 2093821761e45c455374c9fdb4cd02104f420373360Ian Romanick cons(true) 2103821761e45c455374c9fdb4cd02104f420373360Ian Romanick { 2113821761e45c455374c9fdb4cd02104f420373360Ian Romanick /* empty */ 2123821761e45c455374c9fdb4cd02104f420373360Ian Romanick } 2133821761e45c455374c9fdb4cd02104f420373360Ian Romanick 2143821761e45c455374c9fdb4cd02104f420373360Ian Romanick bool is_constructor() const 2153821761e45c455374c9fdb4cd02104f420373360Ian Romanick { 2163821761e45c455374c9fdb4cd02104f420373360Ian Romanick return cons; 2173821761e45c455374c9fdb4cd02104f420373360Ian Romanick } 2187cfddf19413ef61fcf1450bd61e9ece4cf1735a4Ian Romanick 219fb9fb5f51deca28ed1ec7b71759fb71fc26a0ab6Kenneth Graunke virtual ir_rvalue *hir(exec_list *instructions, 220fb9fb5f51deca28ed1ec7b71759fb71fc26a0ab6Kenneth Graunke struct _mesa_glsl_parse_state *state); 2213821761e45c455374c9fdb4cd02104f420373360Ian Romanick 2223821761e45c455374c9fdb4cd02104f420373360Ian Romanickprivate: 2233821761e45c455374c9fdb4cd02104f420373360Ian Romanick /** 2243821761e45c455374c9fdb4cd02104f420373360Ian Romanick * Is this function call actually a constructor? 2253821761e45c455374c9fdb4cd02104f420373360Ian Romanick */ 2263821761e45c455374c9fdb4cd02104f420373360Ian Romanick bool cons; 2277cfddf19413ef61fcf1450bd61e9ece4cf1735a4Ian Romanick}; 2287cfddf19413ef61fcf1450bd61e9ece4cf1735a4Ian Romanick 22988349b22caa0ab0b44188dbb9e002549aadb0590Ian Romanick 230a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick/** 231a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick * Number of possible operators for an ast_expression 232a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick * 233a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick * This is done as a define instead of as an additional value in the enum so 234a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick * that the compiler won't generate spurious messages like "warning: 235a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick * enumeration value ‘ast_num_operators’ not handled in switch" 236a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick */ 237a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick#define AST_NUM_OPERATORS (ast_sequence + 1) 238a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick 239a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick 240a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanickclass ast_compound_statement : public ast_node { 241a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanickpublic: 242a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick ast_compound_statement(int new_scope, ast_node *statements); 243a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick virtual void print(void) const; 244a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick 245fb9fb5f51deca28ed1ec7b71759fb71fc26a0ab6Kenneth Graunke virtual ir_rvalue *hir(exec_list *instructions, 246fb9fb5f51deca28ed1ec7b71759fb71fc26a0ab6Kenneth Graunke struct _mesa_glsl_parse_state *state); 24718238de6c34a1a32c452f1006ed13d8adc1bc9d7Ian Romanick 248a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick int new_scope; 249a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick struct simple_node statements; 250a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick}; 251a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick 252a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanickclass ast_declaration : public ast_node { 253a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanickpublic: 254a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick ast_declaration(char *identifier, int is_array, ast_expression *array_size, 255a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick ast_expression *initializer); 256a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick virtual void print(void) const; 257a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick 258a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick char *identifier; 259a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick 260a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick int is_array; 261a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick ast_expression *array_size; 262a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick 263a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick ast_expression *initializer; 264a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick}; 265a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick 266a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick 267a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanickenum { 268a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick ast_precision_high = 0, /**< Default precision. */ 269a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick ast_precision_medium, 270a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick ast_precision_low 271a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick}; 272a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick 273a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanickstruct ast_type_qualifier { 274a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick unsigned invariant:1; 275a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick unsigned constant:1; 276a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick unsigned attribute:1; 277a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick unsigned varying:1; 278a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick unsigned in:1; 279a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick unsigned out:1; 280a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick unsigned centroid:1; 281a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick unsigned uniform:1; 282a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick unsigned smooth:1; 283a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick unsigned flat:1; 284a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick unsigned noperspective:1; 285a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick}; 286a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick 287a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanickclass ast_struct_specifier : public ast_node { 288a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanickpublic: 289a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick ast_struct_specifier(char *identifier, ast_node *declarator_list); 290a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick virtual void print(void) const; 291a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick 2923455ce614424a5a23a23037e23d0454e476bceeaIan Romanick virtual ir_rvalue *hir(exec_list *instructions, 2933455ce614424a5a23a23037e23d0454e476bceeaIan Romanick struct _mesa_glsl_parse_state *state); 2943455ce614424a5a23a23037e23d0454e476bceeaIan 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, 32906e5308e29e42d22a72247abfdd260bc9ba145b8Ian Romanick ast_sampler2drect, 330a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick ast_sampler3d, 331a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick ast_samplercube, 332a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick ast_sampler1dshadow, 333a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick ast_sampler2dshadow, 33406e5308e29e42d22a72247abfdd260bc9ba145b8Ian Romanick ast_sampler2drectshadow, 335a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick ast_samplercubeshadow, 336a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick ast_sampler1darray, 337a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick ast_sampler2darray, 338a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick ast_sampler1darrayshadow, 339a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick ast_sampler2darrayshadow, 340a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick ast_isampler1d, 341a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick ast_isampler2d, 342a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick ast_isampler3d, 343a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick ast_isamplercube, 344a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick ast_isampler1darray, 345a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick ast_isampler2darray, 346a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick ast_usampler1d, 347a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick ast_usampler2d, 348a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick ast_usampler3d, 349a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick ast_usamplercube, 350a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick ast_usampler1darray, 351a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick ast_usampler2darray, 352a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick 353a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick ast_struct, 354a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick ast_type_name 355a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick}; 356a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick 357a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick 358a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanickclass ast_type_specifier : public ast_node { 359a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanickpublic: 360a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick ast_type_specifier(int specifier); 361a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick 362ed85a5dd4b36f4a583fc321b6d8d49a050d48678Ian Romanick /** Construct a type specifier from a type name */ 363ed85a5dd4b36f4a583fc321b6d8d49a050d48678Ian Romanick ast_type_specifier(const char *name) 364ed85a5dd4b36f4a583fc321b6d8d49a050d48678Ian Romanick : type_specifier(ast_type_name), type_name(name), structure(NULL), 365ed85a5dd4b36f4a583fc321b6d8d49a050d48678Ian Romanick is_array(false), array_size(NULL), precision(ast_precision_high) 366ed85a5dd4b36f4a583fc321b6d8d49a050d48678Ian Romanick { 367ed85a5dd4b36f4a583fc321b6d8d49a050d48678Ian Romanick /* empty */ 368ed85a5dd4b36f4a583fc321b6d8d49a050d48678Ian Romanick } 369ed85a5dd4b36f4a583fc321b6d8d49a050d48678Ian Romanick 370ed85a5dd4b36f4a583fc321b6d8d49a050d48678Ian Romanick /** Construct a type specifier from a structure definition */ 371ed85a5dd4b36f4a583fc321b6d8d49a050d48678Ian Romanick ast_type_specifier(ast_struct_specifier *s) 372ed85a5dd4b36f4a583fc321b6d8d49a050d48678Ian Romanick : type_specifier(ast_struct), type_name(s->name), structure(s), 373ed85a5dd4b36f4a583fc321b6d8d49a050d48678Ian Romanick is_array(false), array_size(NULL), precision(ast_precision_high) 374ed85a5dd4b36f4a583fc321b6d8d49a050d48678Ian Romanick { 375ed85a5dd4b36f4a583fc321b6d8d49a050d48678Ian Romanick /* empty */ 376ed85a5dd4b36f4a583fc321b6d8d49a050d48678Ian Romanick } 377ed85a5dd4b36f4a583fc321b6d8d49a050d48678Ian Romanick 378d612a127ccf12c11204f7f72a332de12f58f85a2Ian Romanick const struct glsl_type *glsl_type(const char **name, 379d612a127ccf12c11204f7f72a332de12f58f85a2Ian Romanick struct _mesa_glsl_parse_state *state) 380d612a127ccf12c11204f7f72a332de12f58f85a2Ian Romanick const; 381d612a127ccf12c11204f7f72a332de12f58f85a2Ian Romanick 382a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick virtual void print(void) const; 383a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick 3843455ce614424a5a23a23037e23d0454e476bceeaIan Romanick ir_rvalue *hir(exec_list *, struct _mesa_glsl_parse_state *); 3853455ce614424a5a23a23037e23d0454e476bceeaIan Romanick 386a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick enum ast_types type_specifier; 387a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick 3887f9d30974317a4050fb8990ce1a3eebbb190483aIan Romanick const char *type_name; 389a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick ast_struct_specifier *structure; 390a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick 391a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick int is_array; 392a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick ast_expression *array_size; 393a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick 394a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick unsigned precision:2; 395a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick}; 396a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick 397a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick 398a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanickclass ast_fully_specified_type : public ast_node { 399a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanickpublic: 400a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick virtual void print(void) const; 401a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick 402a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick ast_type_qualifier qualifier; 403a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick ast_type_specifier *specifier; 404a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick}; 405a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick 406a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick 407a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanickclass ast_declarator_list : public ast_node { 408a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanickpublic: 409a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick ast_declarator_list(ast_fully_specified_type *); 410a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick virtual void print(void) const; 411a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick 412fb9fb5f51deca28ed1ec7b71759fb71fc26a0ab6Kenneth Graunke virtual ir_rvalue *hir(exec_list *instructions, 413fb9fb5f51deca28ed1ec7b71759fb71fc26a0ab6Kenneth Graunke struct _mesa_glsl_parse_state *state); 41418238de6c34a1a32c452f1006ed13d8adc1bc9d7Ian Romanick 415a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick ast_fully_specified_type *type; 416a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick struct simple_node declarations; 417a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick 418a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick /** 419a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick * Special flag for vertex shader "invariant" declarations. 420a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick * 421a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick * Vertex shaders can contain "invariant" variable redeclarations that do 422a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick * not include a type. For example, "invariant gl_Position;". This flag 423a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick * is used to note these cases when no type is specified. 424a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick */ 425a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick int invariant; 426a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick}; 427a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick 428a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick 429a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanickclass ast_parameter_declarator : public ast_node { 430a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanickpublic: 431a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick virtual void print(void) const; 432a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick 433fb9fb5f51deca28ed1ec7b71759fb71fc26a0ab6Kenneth Graunke virtual ir_rvalue *hir(exec_list *instructions, 434fb9fb5f51deca28ed1ec7b71759fb71fc26a0ab6Kenneth Graunke struct _mesa_glsl_parse_state *state); 43518238de6c34a1a32c452f1006ed13d8adc1bc9d7Ian Romanick 436a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick ast_fully_specified_type *type; 437a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick char *identifier; 438a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick int is_array; 439a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick ast_expression *array_size; 44045d8a70c12ee6ea956baaf898324a828496382f6Ian Romanick 44145d8a70c12ee6ea956baaf898324a828496382f6Ian Romanick static void parameters_to_hir(simple_node *ast_parameters, 44245d8a70c12ee6ea956baaf898324a828496382f6Ian Romanick bool formal, exec_list *ir_parameters, 44345d8a70c12ee6ea956baaf898324a828496382f6Ian Romanick struct _mesa_glsl_parse_state *state); 44445d8a70c12ee6ea956baaf898324a828496382f6Ian Romanick 44545d8a70c12ee6ea956baaf898324a828496382f6Ian Romanickprivate: 44645d8a70c12ee6ea956baaf898324a828496382f6Ian Romanick /** Is this parameter declaration part of a formal parameter list? */ 44745d8a70c12ee6ea956baaf898324a828496382f6Ian Romanick bool formal_parameter; 448cf37c9e8dad4349e45cb91d36957484fd76ce264Ian Romanick 449cf37c9e8dad4349e45cb91d36957484fd76ce264Ian Romanick /** 450cf37c9e8dad4349e45cb91d36957484fd76ce264Ian Romanick * Is this parameter 'void' type? 451cf37c9e8dad4349e45cb91d36957484fd76ce264Ian Romanick * 452cf37c9e8dad4349e45cb91d36957484fd76ce264Ian Romanick * This field is set by \c ::hir. 453cf37c9e8dad4349e45cb91d36957484fd76ce264Ian Romanick */ 454cf37c9e8dad4349e45cb91d36957484fd76ce264Ian Romanick bool is_void; 455a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick}; 456a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick 457a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick 458a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanickclass ast_function : public ast_node { 459a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanickpublic: 460a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick ast_function(void); 461a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick 462a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick virtual void print(void) const; 463a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick 46492318a947958892497722772b03c643ebc943294Ian Romanick virtual ir_rvalue *hir(exec_list *instructions, 46592318a947958892497722772b03c643ebc943294Ian Romanick struct _mesa_glsl_parse_state *state); 46692318a947958892497722772b03c643ebc943294Ian Romanick 467a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick ast_fully_specified_type *return_type; 468a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick char *identifier; 469a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick 470a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick struct simple_node parameters; 47192318a947958892497722772b03c643ebc943294Ian Romanick 47292318a947958892497722772b03c643ebc943294Ian Romanickprivate: 47392318a947958892497722772b03c643ebc943294Ian Romanick /** 47492318a947958892497722772b03c643ebc943294Ian Romanick * Is this prototype part of the function definition? 47592318a947958892497722772b03c643ebc943294Ian Romanick * 47692318a947958892497722772b03c643ebc943294Ian Romanick * Used by ast_function_definition::hir to process the parameters, etc. 47792318a947958892497722772b03c643ebc943294Ian Romanick * of the function. 47892318a947958892497722772b03c643ebc943294Ian Romanick * 47992318a947958892497722772b03c643ebc943294Ian Romanick * \sa ::hir 48092318a947958892497722772b03c643ebc943294Ian Romanick */ 48192318a947958892497722772b03c643ebc943294Ian Romanick bool is_definition; 48292318a947958892497722772b03c643ebc943294Ian Romanick 48392318a947958892497722772b03c643ebc943294Ian Romanick /** 48492318a947958892497722772b03c643ebc943294Ian Romanick * Function signature corresponding to this function prototype instance 48592318a947958892497722772b03c643ebc943294Ian Romanick * 48692318a947958892497722772b03c643ebc943294Ian Romanick * Used by ast_function_definition::hir to process the parameters, etc. 48792318a947958892497722772b03c643ebc943294Ian Romanick * of the function. 48892318a947958892497722772b03c643ebc943294Ian Romanick * 48992318a947958892497722772b03c643ebc943294Ian Romanick * \sa ::hir 49092318a947958892497722772b03c643ebc943294Ian Romanick */ 49192318a947958892497722772b03c643ebc943294Ian Romanick class ir_function_signature *signature; 49292318a947958892497722772b03c643ebc943294Ian Romanick 49392318a947958892497722772b03c643ebc943294Ian Romanick friend class ast_function_definition; 494a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick}; 495a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick 496a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick 497a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanickclass ast_declaration_statement : public ast_node { 498a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanickpublic: 499a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick ast_declaration_statement(void); 500a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick 501a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick enum { 502a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick ast_function, 503a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick ast_declaration, 504a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick ast_precision 505a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick } mode; 506a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick 507a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick union { 508a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick class ast_function *function; 509a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick ast_declarator_list *declarator; 510a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick ast_type_specifier *type; 511a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick ast_node *node; 512a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick } declaration; 513a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick}; 514a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick 515a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick 516a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanickclass ast_expression_statement : public ast_node { 517a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanickpublic: 518a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick ast_expression_statement(ast_expression *); 519a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick virtual void print(void) const; 520a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick 521fb9fb5f51deca28ed1ec7b71759fb71fc26a0ab6Kenneth Graunke virtual ir_rvalue *hir(exec_list *instructions, 522fb9fb5f51deca28ed1ec7b71759fb71fc26a0ab6Kenneth Graunke struct _mesa_glsl_parse_state *state); 52318238de6c34a1a32c452f1006ed13d8adc1bc9d7Ian Romanick 524a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick ast_expression *expression; 525a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick}; 526a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick 527a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick 528a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanickclass ast_case_label : public ast_node { 529a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanickpublic: 530a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick 531a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick /** 532a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick * An expression of NULL means 'default'. 533a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick */ 534a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick ast_expression *expression; 535a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick}; 536a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick 537a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanickclass ast_selection_statement : public ast_node { 538a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanickpublic: 539a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick ast_selection_statement(ast_expression *condition, 540a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick ast_node *then_statement, 541a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick ast_node *else_statement); 542a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick virtual void print(void) const; 543a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick 5443c6fea3048a0d9add2fec621d30c32f3519d8868Ian Romanick virtual ir_rvalue *hir(exec_list *instructions, 5453c6fea3048a0d9add2fec621d30c32f3519d8868Ian Romanick struct _mesa_glsl_parse_state *state); 5463c6fea3048a0d9add2fec621d30c32f3519d8868Ian Romanick 547a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick ast_expression *condition; 548a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick ast_node *then_statement; 549a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick ast_node *else_statement; 550a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick}; 551a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick 552a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick 553a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanickclass ast_switch_statement : public ast_node { 554a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanickpublic: 555a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick ast_expression *expression; 556a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick struct simple_node statements; 557a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick}; 558a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick 559a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanickclass ast_iteration_statement : public ast_node { 560a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanickpublic: 561a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick ast_iteration_statement(int mode, ast_node *init, ast_node *condition, 562a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick ast_expression *rest_expression, ast_node *body); 563a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick 564a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick virtual void print(void) const; 565a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick 5669e7d010ee0ed89f1fe07a06a9d9bb22e15106ae2Ian Romanick virtual ir_rvalue *hir(exec_list *, struct _mesa_glsl_parse_state *); 5679e7d010ee0ed89f1fe07a06a9d9bb22e15106ae2Ian Romanick 568a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick enum ast_iteration_modes { 569a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick ast_for, 570a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick ast_while, 571a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick ast_do_while 572a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick } mode; 573a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick 574a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick 575a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick ast_node *init_statement; 576a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick ast_node *condition; 577a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick ast_expression *rest_expression; 578a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick 579a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick ast_node *body; 5808c46ed24906ee10dd2f2cfaf4cf9803eca1ba523Ian Romanick 5818c46ed24906ee10dd2f2cfaf4cf9803eca1ba523Ian Romanickprivate: 5828c46ed24906ee10dd2f2cfaf4cf9803eca1ba523Ian Romanick /** 5838c46ed24906ee10dd2f2cfaf4cf9803eca1ba523Ian Romanick * Generate IR from the condition of a loop 5848c46ed24906ee10dd2f2cfaf4cf9803eca1ba523Ian Romanick * 5858c46ed24906ee10dd2f2cfaf4cf9803eca1ba523Ian Romanick * This is factored out of ::hir because some loops have the condition 5868c46ed24906ee10dd2f2cfaf4cf9803eca1ba523Ian Romanick * test at the top (for and while), and others have it at the end (do-while). 5878c46ed24906ee10dd2f2cfaf4cf9803eca1ba523Ian Romanick */ 5888c46ed24906ee10dd2f2cfaf4cf9803eca1ba523Ian Romanick void condition_to_hir(class ir_loop *, struct _mesa_glsl_parse_state *); 589a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick}; 590a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick 591a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick 592a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanickclass ast_jump_statement : public ast_node { 593a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanickpublic: 594a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick ast_jump_statement(int mode, ast_expression *return_value); 595a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick virtual void print(void) const; 596a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick 597fb9fb5f51deca28ed1ec7b71759fb71fc26a0ab6Kenneth Graunke virtual ir_rvalue *hir(exec_list *instructions, 598fb9fb5f51deca28ed1ec7b71759fb71fc26a0ab6Kenneth Graunke struct _mesa_glsl_parse_state *state); 59916a246c049fa3c8d7841f87c8defdd0f26f302eeIan Romanick 600a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick enum ast_jump_modes { 601a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick ast_continue, 602a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick ast_break, 603a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick ast_return, 604a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick ast_discard 605a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick } mode; 606a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick 607a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick ast_expression *opt_return_value; 608a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick}; 609a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick 610a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick 611a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanickclass ast_function_definition : public ast_node { 612a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanickpublic: 613a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick virtual void print(void) const; 614a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick 615fb9fb5f51deca28ed1ec7b71759fb71fc26a0ab6Kenneth Graunke virtual ir_rvalue *hir(exec_list *instructions, 616fb9fb5f51deca28ed1ec7b71759fb71fc26a0ab6Kenneth Graunke struct _mesa_glsl_parse_state *state); 61718238de6c34a1a32c452f1006ed13d8adc1bc9d7Ian Romanick 618a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick ast_function *prototype; 619a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick ast_compound_statement *body; 620a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick}; 621a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick 622a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick 623d949a9afb0a01e9678a4343f66b056b41a2e48a9Ian Romanickextern void 624d949a9afb0a01e9678a4343f66b056b41a2e48a9Ian Romanick_mesa_ast_to_hir(exec_list *instructions, struct _mesa_glsl_parse_state *state); 625d949a9afb0a01e9678a4343f66b056b41a2e48a9Ian Romanick 626fb9fb5f51deca28ed1ec7b71759fb71fc26a0ab6Kenneth Graunkeextern struct ir_rvalue * 627a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick_mesa_ast_field_selection_to_hir(const struct ast_expression *expr, 6280044e7edcea22d2456c051a1c4b744a26960ad27Ian Romanick exec_list *instructions, 629a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick struct _mesa_glsl_parse_state *state); 630a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick 631a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick#endif /* AST_H */ 632