ast.h revision 8c46ed24906ee10dd2f2cfaf4cf9803eca1ba523
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 292a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick char *name; 293a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick struct simple_node declarations; 294a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick}; 295a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick 296a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick 297a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanickenum ast_types { 298a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick ast_void, 299a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick ast_float, 300a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick ast_int, 301a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick ast_uint, 302a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick ast_bool, 303a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick ast_vec2, 304a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick ast_vec3, 305a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick ast_vec4, 306a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick ast_bvec2, 307a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick ast_bvec3, 308a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick ast_bvec4, 309a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick ast_ivec2, 310a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick ast_ivec3, 311a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick ast_ivec4, 312a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick ast_uvec2, 313a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick ast_uvec3, 314a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick ast_uvec4, 315a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick ast_mat2, 316a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick ast_mat2x3, 317a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick ast_mat2x4, 318a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick ast_mat3x2, 319a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick ast_mat3, 320a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick ast_mat3x4, 321a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick ast_mat4x2, 322a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick ast_mat4x3, 323a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick ast_mat4, 324a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick ast_sampler1d, 325a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick ast_sampler2d, 32606e5308e29e42d22a72247abfdd260bc9ba145b8Ian Romanick ast_sampler2drect, 327a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick ast_sampler3d, 328a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick ast_samplercube, 329a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick ast_sampler1dshadow, 330a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick ast_sampler2dshadow, 33106e5308e29e42d22a72247abfdd260bc9ba145b8Ian Romanick ast_sampler2drectshadow, 332a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick ast_samplercubeshadow, 333a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick ast_sampler1darray, 334a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick ast_sampler2darray, 335a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick ast_sampler1darrayshadow, 336a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick ast_sampler2darrayshadow, 337a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick ast_isampler1d, 338a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick ast_isampler2d, 339a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick ast_isampler3d, 340a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick ast_isamplercube, 341a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick ast_isampler1darray, 342a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick ast_isampler2darray, 343a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick ast_usampler1d, 344a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick ast_usampler2d, 345a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick ast_usampler3d, 346a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick ast_usamplercube, 347a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick ast_usampler1darray, 348a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick ast_usampler2darray, 349a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick 350a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick ast_struct, 351a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick ast_type_name 352a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick}; 353a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick 354a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick 355a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanickclass ast_type_specifier : public ast_node { 356a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanickpublic: 357a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick ast_type_specifier(int specifier); 358a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick 359ed85a5dd4b36f4a583fc321b6d8d49a050d48678Ian Romanick /** Construct a type specifier from a type name */ 360ed85a5dd4b36f4a583fc321b6d8d49a050d48678Ian Romanick ast_type_specifier(const char *name) 361ed85a5dd4b36f4a583fc321b6d8d49a050d48678Ian Romanick : type_specifier(ast_type_name), type_name(name), structure(NULL), 362ed85a5dd4b36f4a583fc321b6d8d49a050d48678Ian Romanick is_array(false), array_size(NULL), precision(ast_precision_high) 363ed85a5dd4b36f4a583fc321b6d8d49a050d48678Ian Romanick { 364ed85a5dd4b36f4a583fc321b6d8d49a050d48678Ian Romanick /* empty */ 365ed85a5dd4b36f4a583fc321b6d8d49a050d48678Ian Romanick } 366ed85a5dd4b36f4a583fc321b6d8d49a050d48678Ian Romanick 367ed85a5dd4b36f4a583fc321b6d8d49a050d48678Ian Romanick /** Construct a type specifier from a structure definition */ 368ed85a5dd4b36f4a583fc321b6d8d49a050d48678Ian Romanick ast_type_specifier(ast_struct_specifier *s) 369ed85a5dd4b36f4a583fc321b6d8d49a050d48678Ian Romanick : type_specifier(ast_struct), type_name(s->name), structure(s), 370ed85a5dd4b36f4a583fc321b6d8d49a050d48678Ian Romanick is_array(false), array_size(NULL), precision(ast_precision_high) 371ed85a5dd4b36f4a583fc321b6d8d49a050d48678Ian Romanick { 372ed85a5dd4b36f4a583fc321b6d8d49a050d48678Ian Romanick /* empty */ 373ed85a5dd4b36f4a583fc321b6d8d49a050d48678Ian Romanick } 374ed85a5dd4b36f4a583fc321b6d8d49a050d48678Ian Romanick 375d612a127ccf12c11204f7f72a332de12f58f85a2Ian Romanick const struct glsl_type *glsl_type(const char **name, 376d612a127ccf12c11204f7f72a332de12f58f85a2Ian Romanick struct _mesa_glsl_parse_state *state) 377d612a127ccf12c11204f7f72a332de12f58f85a2Ian Romanick const; 378d612a127ccf12c11204f7f72a332de12f58f85a2Ian Romanick 379a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick virtual void print(void) const; 380a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick 381a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick enum ast_types type_specifier; 382a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick 3837f9d30974317a4050fb8990ce1a3eebbb190483aIan Romanick const char *type_name; 384a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick ast_struct_specifier *structure; 385a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick 386a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick int is_array; 387a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick ast_expression *array_size; 388a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick 389a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick unsigned precision:2; 390a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick}; 391a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick 392a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick 393a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanickclass ast_fully_specified_type : public ast_node { 394a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanickpublic: 395a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick virtual void print(void) const; 396a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick 397a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick ast_type_qualifier qualifier; 398a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick ast_type_specifier *specifier; 399a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick}; 400a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick 401a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick 402a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanickclass ast_declarator_list : public ast_node { 403a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanickpublic: 404a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick ast_declarator_list(ast_fully_specified_type *); 405a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick virtual void print(void) const; 406a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick 407fb9fb5f51deca28ed1ec7b71759fb71fc26a0ab6Kenneth Graunke virtual ir_rvalue *hir(exec_list *instructions, 408fb9fb5f51deca28ed1ec7b71759fb71fc26a0ab6Kenneth Graunke struct _mesa_glsl_parse_state *state); 40918238de6c34a1a32c452f1006ed13d8adc1bc9d7Ian Romanick 410a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick ast_fully_specified_type *type; 411a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick struct simple_node declarations; 412a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick 413a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick /** 414a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick * Special flag for vertex shader "invariant" declarations. 415a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick * 416a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick * Vertex shaders can contain "invariant" variable redeclarations that do 417a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick * not include a type. For example, "invariant gl_Position;". This flag 418a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick * is used to note these cases when no type is specified. 419a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick */ 420a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick int invariant; 421a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick}; 422a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick 423a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick 424a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanickclass ast_parameter_declarator : public ast_node { 425a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanickpublic: 426a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick virtual void print(void) const; 427a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick 428fb9fb5f51deca28ed1ec7b71759fb71fc26a0ab6Kenneth Graunke virtual ir_rvalue *hir(exec_list *instructions, 429fb9fb5f51deca28ed1ec7b71759fb71fc26a0ab6Kenneth Graunke struct _mesa_glsl_parse_state *state); 43018238de6c34a1a32c452f1006ed13d8adc1bc9d7Ian Romanick 431a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick ast_fully_specified_type *type; 432a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick char *identifier; 433a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick int is_array; 434a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick ast_expression *array_size; 43545d8a70c12ee6ea956baaf898324a828496382f6Ian Romanick 43645d8a70c12ee6ea956baaf898324a828496382f6Ian Romanick static void parameters_to_hir(simple_node *ast_parameters, 43745d8a70c12ee6ea956baaf898324a828496382f6Ian Romanick bool formal, exec_list *ir_parameters, 43845d8a70c12ee6ea956baaf898324a828496382f6Ian Romanick struct _mesa_glsl_parse_state *state); 43945d8a70c12ee6ea956baaf898324a828496382f6Ian Romanick 44045d8a70c12ee6ea956baaf898324a828496382f6Ian Romanickprivate: 44145d8a70c12ee6ea956baaf898324a828496382f6Ian Romanick /** Is this parameter declaration part of a formal parameter list? */ 44245d8a70c12ee6ea956baaf898324a828496382f6Ian Romanick bool formal_parameter; 443cf37c9e8dad4349e45cb91d36957484fd76ce264Ian Romanick 444cf37c9e8dad4349e45cb91d36957484fd76ce264Ian Romanick /** 445cf37c9e8dad4349e45cb91d36957484fd76ce264Ian Romanick * Is this parameter 'void' type? 446cf37c9e8dad4349e45cb91d36957484fd76ce264Ian Romanick * 447cf37c9e8dad4349e45cb91d36957484fd76ce264Ian Romanick * This field is set by \c ::hir. 448cf37c9e8dad4349e45cb91d36957484fd76ce264Ian Romanick */ 449cf37c9e8dad4349e45cb91d36957484fd76ce264Ian Romanick bool is_void; 450a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick}; 451a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick 452a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick 453a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanickclass ast_function : public ast_node { 454a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanickpublic: 455a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick ast_function(void); 456a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick 457a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick virtual void print(void) const; 458a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick 45992318a947958892497722772b03c643ebc943294Ian Romanick virtual ir_rvalue *hir(exec_list *instructions, 46092318a947958892497722772b03c643ebc943294Ian Romanick struct _mesa_glsl_parse_state *state); 46192318a947958892497722772b03c643ebc943294Ian Romanick 462a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick ast_fully_specified_type *return_type; 463a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick char *identifier; 464a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick 465a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick struct simple_node parameters; 46692318a947958892497722772b03c643ebc943294Ian Romanick 46792318a947958892497722772b03c643ebc943294Ian Romanickprivate: 46892318a947958892497722772b03c643ebc943294Ian Romanick /** 46992318a947958892497722772b03c643ebc943294Ian Romanick * Is this prototype part of the function definition? 47092318a947958892497722772b03c643ebc943294Ian Romanick * 47192318a947958892497722772b03c643ebc943294Ian Romanick * Used by ast_function_definition::hir to process the parameters, etc. 47292318a947958892497722772b03c643ebc943294Ian Romanick * of the function. 47392318a947958892497722772b03c643ebc943294Ian Romanick * 47492318a947958892497722772b03c643ebc943294Ian Romanick * \sa ::hir 47592318a947958892497722772b03c643ebc943294Ian Romanick */ 47692318a947958892497722772b03c643ebc943294Ian Romanick bool is_definition; 47792318a947958892497722772b03c643ebc943294Ian Romanick 47892318a947958892497722772b03c643ebc943294Ian Romanick /** 47992318a947958892497722772b03c643ebc943294Ian Romanick * Function signature corresponding to this function prototype instance 48092318a947958892497722772b03c643ebc943294Ian Romanick * 48192318a947958892497722772b03c643ebc943294Ian Romanick * Used by ast_function_definition::hir to process the parameters, etc. 48292318a947958892497722772b03c643ebc943294Ian Romanick * of the function. 48392318a947958892497722772b03c643ebc943294Ian Romanick * 48492318a947958892497722772b03c643ebc943294Ian Romanick * \sa ::hir 48592318a947958892497722772b03c643ebc943294Ian Romanick */ 48692318a947958892497722772b03c643ebc943294Ian Romanick class ir_function_signature *signature; 48792318a947958892497722772b03c643ebc943294Ian Romanick 48892318a947958892497722772b03c643ebc943294Ian Romanick friend class ast_function_definition; 489a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick}; 490a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick 491a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick 492a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanickclass ast_declaration_statement : public ast_node { 493a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanickpublic: 494a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick ast_declaration_statement(void); 495a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick 496a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick enum { 497a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick ast_function, 498a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick ast_declaration, 499a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick ast_precision 500a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick } mode; 501a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick 502a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick union { 503a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick class ast_function *function; 504a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick ast_declarator_list *declarator; 505a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick ast_type_specifier *type; 506a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick ast_node *node; 507a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick } declaration; 508a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick}; 509a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick 510a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick 511a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanickclass ast_expression_statement : public ast_node { 512a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanickpublic: 513a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick ast_expression_statement(ast_expression *); 514a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick virtual void print(void) const; 515a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick 516fb9fb5f51deca28ed1ec7b71759fb71fc26a0ab6Kenneth Graunke virtual ir_rvalue *hir(exec_list *instructions, 517fb9fb5f51deca28ed1ec7b71759fb71fc26a0ab6Kenneth Graunke struct _mesa_glsl_parse_state *state); 51818238de6c34a1a32c452f1006ed13d8adc1bc9d7Ian Romanick 519a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick ast_expression *expression; 520a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick}; 521a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick 522a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick 523a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanickclass ast_case_label : public ast_node { 524a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanickpublic: 525a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick 526a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick /** 527a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick * An expression of NULL means 'default'. 528a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick */ 529a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick ast_expression *expression; 530a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick}; 531a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick 532a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanickclass ast_selection_statement : public ast_node { 533a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanickpublic: 534a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick ast_selection_statement(ast_expression *condition, 535a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick ast_node *then_statement, 536a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick ast_node *else_statement); 537a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick virtual void print(void) const; 538a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick 5393c6fea3048a0d9add2fec621d30c32f3519d8868Ian Romanick virtual ir_rvalue *hir(exec_list *instructions, 5403c6fea3048a0d9add2fec621d30c32f3519d8868Ian Romanick struct _mesa_glsl_parse_state *state); 5413c6fea3048a0d9add2fec621d30c32f3519d8868Ian Romanick 542a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick ast_expression *condition; 543a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick ast_node *then_statement; 544a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick ast_node *else_statement; 545a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick}; 546a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick 547a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick 548a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanickclass ast_switch_statement : public ast_node { 549a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanickpublic: 550a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick ast_expression *expression; 551a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick struct simple_node statements; 552a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick}; 553a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick 554a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanickclass ast_iteration_statement : public ast_node { 555a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanickpublic: 556a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick ast_iteration_statement(int mode, ast_node *init, ast_node *condition, 557a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick ast_expression *rest_expression, ast_node *body); 558a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick 559a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick virtual void print(void) const; 560a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick 5619e7d010ee0ed89f1fe07a06a9d9bb22e15106ae2Ian Romanick virtual ir_rvalue *hir(exec_list *, struct _mesa_glsl_parse_state *); 5629e7d010ee0ed89f1fe07a06a9d9bb22e15106ae2Ian Romanick 563a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick enum ast_iteration_modes { 564a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick ast_for, 565a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick ast_while, 566a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick ast_do_while 567a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick } mode; 568a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick 569a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick 570a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick ast_node *init_statement; 571a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick ast_node *condition; 572a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick ast_expression *rest_expression; 573a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick 574a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick ast_node *body; 5758c46ed24906ee10dd2f2cfaf4cf9803eca1ba523Ian Romanick 5768c46ed24906ee10dd2f2cfaf4cf9803eca1ba523Ian Romanickprivate: 5778c46ed24906ee10dd2f2cfaf4cf9803eca1ba523Ian Romanick /** 5788c46ed24906ee10dd2f2cfaf4cf9803eca1ba523Ian Romanick * Generate IR from the condition of a loop 5798c46ed24906ee10dd2f2cfaf4cf9803eca1ba523Ian Romanick * 5808c46ed24906ee10dd2f2cfaf4cf9803eca1ba523Ian Romanick * This is factored out of ::hir because some loops have the condition 5818c46ed24906ee10dd2f2cfaf4cf9803eca1ba523Ian Romanick * test at the top (for and while), and others have it at the end (do-while). 5828c46ed24906ee10dd2f2cfaf4cf9803eca1ba523Ian Romanick */ 5838c46ed24906ee10dd2f2cfaf4cf9803eca1ba523Ian Romanick void condition_to_hir(class ir_loop *, struct _mesa_glsl_parse_state *); 584a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick}; 585a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick 586a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick 587a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanickclass ast_jump_statement : public ast_node { 588a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanickpublic: 589a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick ast_jump_statement(int mode, ast_expression *return_value); 590a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick virtual void print(void) const; 591a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick 592fb9fb5f51deca28ed1ec7b71759fb71fc26a0ab6Kenneth Graunke virtual ir_rvalue *hir(exec_list *instructions, 593fb9fb5f51deca28ed1ec7b71759fb71fc26a0ab6Kenneth Graunke struct _mesa_glsl_parse_state *state); 59416a246c049fa3c8d7841f87c8defdd0f26f302eeIan Romanick 595a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick enum ast_jump_modes { 596a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick ast_continue, 597a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick ast_break, 598a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick ast_return, 599a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick ast_discard 600a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick } mode; 601a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick 602a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick ast_expression *opt_return_value; 603a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick}; 604a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick 605a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick 606a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanickclass ast_function_definition : public ast_node { 607a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanickpublic: 608a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick virtual void print(void) const; 609a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick 610fb9fb5f51deca28ed1ec7b71759fb71fc26a0ab6Kenneth Graunke virtual ir_rvalue *hir(exec_list *instructions, 611fb9fb5f51deca28ed1ec7b71759fb71fc26a0ab6Kenneth Graunke struct _mesa_glsl_parse_state *state); 61218238de6c34a1a32c452f1006ed13d8adc1bc9d7Ian Romanick 613a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick ast_function *prototype; 614a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick ast_compound_statement *body; 615a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick}; 616a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick 617a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick 618d949a9afb0a01e9678a4343f66b056b41a2e48a9Ian Romanickextern void 619d949a9afb0a01e9678a4343f66b056b41a2e48a9Ian Romanick_mesa_ast_to_hir(exec_list *instructions, struct _mesa_glsl_parse_state *state); 620d949a9afb0a01e9678a4343f66b056b41a2e48a9Ian Romanick 621fb9fb5f51deca28ed1ec7b71759fb71fc26a0ab6Kenneth Graunkeextern struct ir_rvalue * 622a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick_mesa_ast_field_selection_to_hir(const struct ast_expression *expr, 6230044e7edcea22d2456c051a1c4b744a26960ad27Ian Romanick exec_list *instructions, 624a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick struct _mesa_glsl_parse_state *state); 625a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick 626a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick#endif /* AST_H */ 627