ast.h revision 28527ed557923aecff5d3b88e5d7776f04389547
1986b8f798272d3ae2898617c8fb089156a5941c0Ian Romanick/* -*- c++ -*- */ 2a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick/* 3a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick * Copyright © 2009 Intel Corporation 4a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick * 5a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick * Permission is hereby granted, free of charge, to any person obtaining a 6a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick * copy of this software and associated documentation files (the "Software"), 7a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick * to deal in the Software without restriction, including without limitation 8a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick * the rights to use, copy, modify, merge, publish, distribute, sublicense, 9a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick * and/or sell copies of the Software, and to permit persons to whom the 10a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick * Software is furnished to do so, subject to the following conditions: 11a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick * 12a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick * The above copyright notice and this permission notice (including the next 13a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick * paragraph) shall be included in all copies or substantial portions of the 14a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick * Software. 15a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick * 16a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 17a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 18a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL 19a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 20a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING 21a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER 22a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick * DEALINGS IN THE SOFTWARE. 23a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick */ 24a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick 25a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick#pragma once 26a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick#ifndef AST_H 27a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick#define AST_H 28a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick 290044e7edcea22d2456c051a1c4b744a26960ad27Ian Romanick#include "list.h" 30a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick#include "glsl_parser_extras.h" 31a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick 32a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanickstruct ir_instruction; 33a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanickstruct _mesa_glsl_parse_state; 34a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick 35a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanickstruct YYLTYPE; 36a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick 37304ea90233baeac6801a98e981658cb7a2d2501cIan Romanickclass ast_node { 38a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanickpublic: 398f52c9b5fcbc73ed12b23253caa44c28fd4452e2Carl Worth /* Callers of this talloc-based new need not call delete. It's 408f52c9b5fcbc73ed12b23253caa44c28fd4452e2Carl Worth * easier to just talloc_free 'ctx' (or any of its ancestors). */ 418f52c9b5fcbc73ed12b23253caa44c28fd4452e2Carl Worth static void* operator new(size_t size, void *ctx) 428f52c9b5fcbc73ed12b23253caa44c28fd4452e2Carl Worth { 438f52c9b5fcbc73ed12b23253caa44c28fd4452e2Carl Worth void *node; 448f52c9b5fcbc73ed12b23253caa44c28fd4452e2Carl Worth 458f52c9b5fcbc73ed12b23253caa44c28fd4452e2Carl Worth node = talloc_size(ctx, size); 468f52c9b5fcbc73ed12b23253caa44c28fd4452e2Carl Worth assert(node != NULL); 478f52c9b5fcbc73ed12b23253caa44c28fd4452e2Carl Worth 488f52c9b5fcbc73ed12b23253caa44c28fd4452e2Carl Worth return node; 498f52c9b5fcbc73ed12b23253caa44c28fd4452e2Carl Worth } 508f52c9b5fcbc73ed12b23253caa44c28fd4452e2Carl Worth 518f52c9b5fcbc73ed12b23253caa44c28fd4452e2Carl Worth /* If the user *does* call delete, that's OK, we will just 528f52c9b5fcbc73ed12b23253caa44c28fd4452e2Carl Worth * talloc_free in that case. */ 538f52c9b5fcbc73ed12b23253caa44c28fd4452e2Carl Worth static void operator delete(void *table) 548f52c9b5fcbc73ed12b23253caa44c28fd4452e2Carl Worth { 558f52c9b5fcbc73ed12b23253caa44c28fd4452e2Carl Worth talloc_free(table); 568f52c9b5fcbc73ed12b23253caa44c28fd4452e2Carl Worth } 578f52c9b5fcbc73ed12b23253caa44c28fd4452e2Carl Worth 58a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick virtual void print(void) const; 59fb9fb5f51deca28ed1ec7b71759fb71fc26a0ab6Kenneth Graunke virtual ir_rvalue *hir(exec_list *instructions, 60fb9fb5f51deca28ed1ec7b71759fb71fc26a0ab6Kenneth Graunke struct _mesa_glsl_parse_state *state); 61a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick 62a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick /** 63a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick * Retrieve the source location of an AST node 64a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick * 65a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick * This function is primarily used to get the source position of an AST node 66a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick * into a form that can be passed to \c _mesa_glsl_error. 67a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick * 68a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick * \sa _mesa_glsl_error, ast_node::set_location 69a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick */ 70a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick struct YYLTYPE get_location(void) const 71a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick { 72a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick struct YYLTYPE locp; 73a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick 74a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick locp.source = this->location.source; 75a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick locp.first_line = this->location.line; 76a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick locp.first_column = this->location.column; 77a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick locp.last_line = locp.first_line; 78a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick locp.last_column = locp.first_column; 79a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick 80a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick return locp; 81a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick } 82a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick 83a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick /** 84a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick * Set the source location of an AST node from a parser location 85a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick * 86a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick * \sa ast_node::get_location 87a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick */ 88ebfdef7a83966341c27f44c83366419d4a2f7a60Kenneth Graunke void set_location(const struct YYLTYPE &locp) 89a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick { 90ebfdef7a83966341c27f44c83366419d4a2f7a60Kenneth Graunke this->location.source = locp.source; 91ebfdef7a83966341c27f44c83366419d4a2f7a60Kenneth Graunke this->location.line = locp.first_line; 92ebfdef7a83966341c27f44c83366419d4a2f7a60Kenneth Graunke this->location.column = locp.first_column; 93a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick } 94a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick 95a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick struct { 96a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick unsigned source; 97a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick unsigned line; 98a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick unsigned column; 99a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick } location; 100a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick 101304ea90233baeac6801a98e981658cb7a2d2501cIan Romanick exec_node link; 102304ea90233baeac6801a98e981658cb7a2d2501cIan Romanick 103a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanickprotected: 104a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick ast_node(void); 105a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick}; 106a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick 107a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick 108a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanickenum ast_operators { 109a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick ast_assign, 110a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick ast_plus, /**< Unary + operator. */ 111a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick ast_neg, 112a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick ast_add, 113a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick ast_sub, 114a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick ast_mul, 115a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick ast_div, 116a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick ast_mod, 117a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick ast_lshift, 118a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick ast_rshift, 119a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick ast_less, 120a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick ast_greater, 121a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick ast_lequal, 122a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick ast_gequal, 123a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick ast_equal, 124a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick ast_nequal, 125a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick ast_bit_and, 126a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick ast_bit_xor, 127a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick ast_bit_or, 128a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick ast_bit_not, 129a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick ast_logic_and, 130a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick ast_logic_xor, 131a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick ast_logic_or, 132a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick ast_logic_not, 133a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick 134a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick ast_mul_assign, 135a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick ast_div_assign, 136a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick ast_mod_assign, 137a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick ast_add_assign, 138a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick ast_sub_assign, 139a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick ast_ls_assign, 140a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick ast_rs_assign, 141a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick ast_and_assign, 142a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick ast_xor_assign, 143a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick ast_or_assign, 144a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick 145a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick ast_conditional, 146a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick 147a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick ast_pre_inc, 148a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick ast_pre_dec, 149a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick ast_post_inc, 150a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick ast_post_dec, 151a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick ast_field_selection, 152a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick ast_array_index, 153a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick 154a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick ast_function_call, 155a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick 156a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick ast_identifier, 157a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick ast_int_constant, 158a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick ast_uint_constant, 159a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick ast_float_constant, 160a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick ast_bool_constant, 161a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick 162a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick ast_sequence 163a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick}; 164a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick 165a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanickclass ast_expression : public ast_node { 166a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanickpublic: 167a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick ast_expression(int oper, ast_expression *, 168a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick ast_expression *, ast_expression *); 169a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick 170d10fe19495191072d39689337700b69e62252bf1Ian Romanick ast_expression(const char *identifier) : 171d10fe19495191072d39689337700b69e62252bf1Ian Romanick oper(ast_identifier) 172d10fe19495191072d39689337700b69e62252bf1Ian Romanick { 173d10fe19495191072d39689337700b69e62252bf1Ian Romanick subexpressions[0] = NULL; 174d10fe19495191072d39689337700b69e62252bf1Ian Romanick subexpressions[1] = NULL; 175d10fe19495191072d39689337700b69e62252bf1Ian Romanick subexpressions[2] = NULL; 176d10fe19495191072d39689337700b69e62252bf1Ian Romanick primary_expression.identifier = (char *) identifier; 177d10fe19495191072d39689337700b69e62252bf1Ian Romanick } 178d10fe19495191072d39689337700b69e62252bf1Ian Romanick 17988349b22caa0ab0b44188dbb9e002549aadb0590Ian Romanick static const char *operator_string(enum ast_operators op); 18088349b22caa0ab0b44188dbb9e002549aadb0590Ian Romanick 181fb9fb5f51deca28ed1ec7b71759fb71fc26a0ab6Kenneth Graunke virtual ir_rvalue *hir(exec_list *instructions, 182fb9fb5f51deca28ed1ec7b71759fb71fc26a0ab6Kenneth Graunke struct _mesa_glsl_parse_state *state); 18318238de6c34a1a32c452f1006ed13d8adc1bc9d7Ian Romanick 184a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick virtual void print(void) const; 185a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick 186a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick enum ast_operators oper; 187a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick 188a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick ast_expression *subexpressions[3]; 189a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick 190a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick union { 191a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick char *identifier; 192a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick int int_constant; 193a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick float float_constant; 194a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick unsigned uint_constant; 195a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick int bool_constant; 196a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick } primary_expression; 197a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick 198a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick 199a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick /** 2003521f0bdd52d226031a3b60e2cd89b4629147690Ian Romanick * List of expressions for an \c ast_sequence or parameters for an 2013521f0bdd52d226031a3b60e2cd89b4629147690Ian Romanick * \c ast_function_call 202a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick */ 203304ea90233baeac6801a98e981658cb7a2d2501cIan Romanick exec_list expressions; 204a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick}; 205a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick 20688349b22caa0ab0b44188dbb9e002549aadb0590Ian Romanickclass ast_expression_bin : public ast_expression { 20788349b22caa0ab0b44188dbb9e002549aadb0590Ian Romanickpublic: 20888349b22caa0ab0b44188dbb9e002549aadb0590Ian Romanick ast_expression_bin(int oper, ast_expression *, ast_expression *); 20988349b22caa0ab0b44188dbb9e002549aadb0590Ian Romanick 21088349b22caa0ab0b44188dbb9e002549aadb0590Ian Romanick virtual void print(void) const; 21188349b22caa0ab0b44188dbb9e002549aadb0590Ian Romanick}; 21288349b22caa0ab0b44188dbb9e002549aadb0590Ian Romanick 2137cfddf19413ef61fcf1450bd61e9ece4cf1735a4Ian Romanick/** 2147cfddf19413ef61fcf1450bd61e9ece4cf1735a4Ian Romanick * Subclass of expressions for function calls 2157cfddf19413ef61fcf1450bd61e9ece4cf1735a4Ian Romanick */ 2167cfddf19413ef61fcf1450bd61e9ece4cf1735a4Ian Romanickclass ast_function_expression : public ast_expression { 2177cfddf19413ef61fcf1450bd61e9ece4cf1735a4Ian Romanickpublic: 2183821761e45c455374c9fdb4cd02104f420373360Ian Romanick ast_function_expression(ast_expression *callee) 2193821761e45c455374c9fdb4cd02104f420373360Ian Romanick : ast_expression(ast_function_call, callee, 2203821761e45c455374c9fdb4cd02104f420373360Ian Romanick NULL, NULL), 2213821761e45c455374c9fdb4cd02104f420373360Ian Romanick cons(false) 2227cfddf19413ef61fcf1450bd61e9ece4cf1735a4Ian Romanick { 2237cfddf19413ef61fcf1450bd61e9ece4cf1735a4Ian Romanick /* empty */ 2247cfddf19413ef61fcf1450bd61e9ece4cf1735a4Ian Romanick } 2257cfddf19413ef61fcf1450bd61e9ece4cf1735a4Ian Romanick 2263821761e45c455374c9fdb4cd02104f420373360Ian Romanick ast_function_expression(class ast_type_specifier *type) 2273821761e45c455374c9fdb4cd02104f420373360Ian Romanick : ast_expression(ast_function_call, (ast_expression *) type, 2283821761e45c455374c9fdb4cd02104f420373360Ian Romanick NULL, NULL), 2293821761e45c455374c9fdb4cd02104f420373360Ian Romanick cons(true) 2303821761e45c455374c9fdb4cd02104f420373360Ian Romanick { 2313821761e45c455374c9fdb4cd02104f420373360Ian Romanick /* empty */ 2323821761e45c455374c9fdb4cd02104f420373360Ian Romanick } 2333821761e45c455374c9fdb4cd02104f420373360Ian Romanick 2343821761e45c455374c9fdb4cd02104f420373360Ian Romanick bool is_constructor() const 2353821761e45c455374c9fdb4cd02104f420373360Ian Romanick { 2363821761e45c455374c9fdb4cd02104f420373360Ian Romanick return cons; 2373821761e45c455374c9fdb4cd02104f420373360Ian Romanick } 2387cfddf19413ef61fcf1450bd61e9ece4cf1735a4Ian Romanick 239fb9fb5f51deca28ed1ec7b71759fb71fc26a0ab6Kenneth Graunke virtual ir_rvalue *hir(exec_list *instructions, 240fb9fb5f51deca28ed1ec7b71759fb71fc26a0ab6Kenneth Graunke struct _mesa_glsl_parse_state *state); 2413821761e45c455374c9fdb4cd02104f420373360Ian Romanick 2423821761e45c455374c9fdb4cd02104f420373360Ian Romanickprivate: 2433821761e45c455374c9fdb4cd02104f420373360Ian Romanick /** 2443821761e45c455374c9fdb4cd02104f420373360Ian Romanick * Is this function call actually a constructor? 2453821761e45c455374c9fdb4cd02104f420373360Ian Romanick */ 2463821761e45c455374c9fdb4cd02104f420373360Ian Romanick bool cons; 2477cfddf19413ef61fcf1450bd61e9ece4cf1735a4Ian Romanick}; 2487cfddf19413ef61fcf1450bd61e9ece4cf1735a4Ian Romanick 24988349b22caa0ab0b44188dbb9e002549aadb0590Ian Romanick 250a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick/** 251a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick * Number of possible operators for an ast_expression 252a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick * 253a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick * This is done as a define instead of as an additional value in the enum so 254a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick * that the compiler won't generate spurious messages like "warning: 255a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick * enumeration value ‘ast_num_operators’ not handled in switch" 256a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick */ 257a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick#define AST_NUM_OPERATORS (ast_sequence + 1) 258a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick 259a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick 260a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanickclass ast_compound_statement : public ast_node { 261a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanickpublic: 262a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick ast_compound_statement(int new_scope, ast_node *statements); 263a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick virtual void print(void) const; 264a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick 265fb9fb5f51deca28ed1ec7b71759fb71fc26a0ab6Kenneth Graunke virtual ir_rvalue *hir(exec_list *instructions, 266fb9fb5f51deca28ed1ec7b71759fb71fc26a0ab6Kenneth Graunke struct _mesa_glsl_parse_state *state); 26718238de6c34a1a32c452f1006ed13d8adc1bc9d7Ian Romanick 268a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick int new_scope; 269304ea90233baeac6801a98e981658cb7a2d2501cIan Romanick exec_list statements; 270a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick}; 271a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick 272a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanickclass ast_declaration : public ast_node { 273a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanickpublic: 274a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick ast_declaration(char *identifier, int is_array, ast_expression *array_size, 275a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick ast_expression *initializer); 276a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick virtual void print(void) const; 277a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick 278a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick char *identifier; 279a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick 280a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick int is_array; 281a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick ast_expression *array_size; 282a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick 283a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick ast_expression *initializer; 284a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick}; 285a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick 286a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick 287a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanickenum { 288a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick ast_precision_high = 0, /**< Default precision. */ 289a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick ast_precision_medium, 290a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick ast_precision_low 291a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick}; 292a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick 293a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanickstruct ast_type_qualifier { 294a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick unsigned invariant:1; 295a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick unsigned constant:1; 296a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick unsigned attribute:1; 297a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick unsigned varying:1; 298a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick unsigned in:1; 299a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick unsigned out:1; 300a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick unsigned centroid:1; 301a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick unsigned uniform:1; 302a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick unsigned smooth:1; 303a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick unsigned flat:1; 304a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick unsigned noperspective:1; 305a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick}; 306a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick 307a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanickclass ast_struct_specifier : public ast_node { 308a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanickpublic: 309a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick ast_struct_specifier(char *identifier, ast_node *declarator_list); 310a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick virtual void print(void) const; 311a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick 3123455ce614424a5a23a23037e23d0454e476bceeaIan Romanick virtual ir_rvalue *hir(exec_list *instructions, 3133455ce614424a5a23a23037e23d0454e476bceeaIan Romanick struct _mesa_glsl_parse_state *state); 3143455ce614424a5a23a23037e23d0454e476bceeaIan Romanick 315a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick char *name; 316304ea90233baeac6801a98e981658cb7a2d2501cIan Romanick exec_list declarations; 317a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick}; 318a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick 319a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick 320a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanickenum ast_types { 321a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick ast_void, 322a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick ast_float, 323a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick ast_int, 324a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick ast_uint, 325a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick ast_bool, 326a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick ast_vec2, 327a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick ast_vec3, 328a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick ast_vec4, 329a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick ast_bvec2, 330a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick ast_bvec3, 331a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick ast_bvec4, 332a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick ast_ivec2, 333a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick ast_ivec3, 334a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick ast_ivec4, 335a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick ast_uvec2, 336a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick ast_uvec3, 337a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick ast_uvec4, 338a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick ast_mat2, 339a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick ast_mat2x3, 340a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick ast_mat2x4, 341a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick ast_mat3x2, 342a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick ast_mat3, 343a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick ast_mat3x4, 344a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick ast_mat4x2, 345a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick ast_mat4x3, 346a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick ast_mat4, 347a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick ast_sampler1d, 348a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick ast_sampler2d, 34906e5308e29e42d22a72247abfdd260bc9ba145b8Ian Romanick ast_sampler2drect, 350a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick ast_sampler3d, 351a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick ast_samplercube, 352a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick ast_sampler1dshadow, 353a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick ast_sampler2dshadow, 35406e5308e29e42d22a72247abfdd260bc9ba145b8Ian Romanick ast_sampler2drectshadow, 355a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick ast_samplercubeshadow, 356a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick ast_sampler1darray, 357a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick ast_sampler2darray, 358a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick ast_sampler1darrayshadow, 359a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick ast_sampler2darrayshadow, 360a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick ast_isampler1d, 361a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick ast_isampler2d, 362a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick ast_isampler3d, 363a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick ast_isamplercube, 364a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick ast_isampler1darray, 365a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick ast_isampler2darray, 366a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick ast_usampler1d, 367a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick ast_usampler2d, 368a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick ast_usampler3d, 369a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick ast_usamplercube, 370a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick ast_usampler1darray, 371a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick ast_usampler2darray, 372a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick 373a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick ast_struct, 374a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick ast_type_name 375a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick}; 376a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick 377a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick 378a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanickclass ast_type_specifier : public ast_node { 379a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanickpublic: 380a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick ast_type_specifier(int specifier); 381a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick 382ed85a5dd4b36f4a583fc321b6d8d49a050d48678Ian Romanick /** Construct a type specifier from a type name */ 383ed85a5dd4b36f4a583fc321b6d8d49a050d48678Ian Romanick ast_type_specifier(const char *name) 384ed85a5dd4b36f4a583fc321b6d8d49a050d48678Ian Romanick : type_specifier(ast_type_name), type_name(name), structure(NULL), 385ed85a5dd4b36f4a583fc321b6d8d49a050d48678Ian Romanick is_array(false), array_size(NULL), precision(ast_precision_high) 386ed85a5dd4b36f4a583fc321b6d8d49a050d48678Ian Romanick { 387ed85a5dd4b36f4a583fc321b6d8d49a050d48678Ian Romanick /* empty */ 388ed85a5dd4b36f4a583fc321b6d8d49a050d48678Ian Romanick } 389ed85a5dd4b36f4a583fc321b6d8d49a050d48678Ian Romanick 390ed85a5dd4b36f4a583fc321b6d8d49a050d48678Ian Romanick /** Construct a type specifier from a structure definition */ 391ed85a5dd4b36f4a583fc321b6d8d49a050d48678Ian Romanick ast_type_specifier(ast_struct_specifier *s) 392ed85a5dd4b36f4a583fc321b6d8d49a050d48678Ian Romanick : type_specifier(ast_struct), type_name(s->name), structure(s), 393ed85a5dd4b36f4a583fc321b6d8d49a050d48678Ian Romanick is_array(false), array_size(NULL), precision(ast_precision_high) 394ed85a5dd4b36f4a583fc321b6d8d49a050d48678Ian Romanick { 395ed85a5dd4b36f4a583fc321b6d8d49a050d48678Ian Romanick /* empty */ 396ed85a5dd4b36f4a583fc321b6d8d49a050d48678Ian Romanick } 397ed85a5dd4b36f4a583fc321b6d8d49a050d48678Ian Romanick 398d612a127ccf12c11204f7f72a332de12f58f85a2Ian Romanick const struct glsl_type *glsl_type(const char **name, 399d612a127ccf12c11204f7f72a332de12f58f85a2Ian Romanick struct _mesa_glsl_parse_state *state) 400d612a127ccf12c11204f7f72a332de12f58f85a2Ian Romanick const; 401d612a127ccf12c11204f7f72a332de12f58f85a2Ian Romanick 402a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick virtual void print(void) const; 403a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick 4043455ce614424a5a23a23037e23d0454e476bceeaIan Romanick ir_rvalue *hir(exec_list *, struct _mesa_glsl_parse_state *); 4053455ce614424a5a23a23037e23d0454e476bceeaIan Romanick 406a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick enum ast_types type_specifier; 407a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick 4087f9d30974317a4050fb8990ce1a3eebbb190483aIan Romanick const char *type_name; 409a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick ast_struct_specifier *structure; 410a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick 411a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick int is_array; 412a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick ast_expression *array_size; 413a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick 414a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick unsigned precision:2; 415a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick}; 416a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick 417a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick 418a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanickclass ast_fully_specified_type : public ast_node { 419a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanickpublic: 420a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick virtual void print(void) const; 42128527ed557923aecff5d3b88e5d7776f04389547Kenneth Graunke bool has_qualifiers() const; 422a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick 423a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick ast_type_qualifier qualifier; 424a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick ast_type_specifier *specifier; 425a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick}; 426a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick 427a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick 428a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanickclass ast_declarator_list : public ast_node { 429a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanickpublic: 430a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick ast_declarator_list(ast_fully_specified_type *); 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; 437304ea90233baeac6801a98e981658cb7a2d2501cIan Romanick exec_list declarations; 438a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick 439a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick /** 440a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick * Special flag for vertex shader "invariant" declarations. 441a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick * 442a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick * Vertex shaders can contain "invariant" variable redeclarations that do 443a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick * not include a type. For example, "invariant gl_Position;". This flag 444a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick * is used to note these cases when no type is specified. 445a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick */ 446a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick int invariant; 447a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick}; 448a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick 449a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick 450a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanickclass ast_parameter_declarator : public ast_node { 451a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanickpublic: 452a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick virtual void print(void) const; 453a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick 454fb9fb5f51deca28ed1ec7b71759fb71fc26a0ab6Kenneth Graunke virtual ir_rvalue *hir(exec_list *instructions, 455fb9fb5f51deca28ed1ec7b71759fb71fc26a0ab6Kenneth Graunke struct _mesa_glsl_parse_state *state); 45618238de6c34a1a32c452f1006ed13d8adc1bc9d7Ian Romanick 457a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick ast_fully_specified_type *type; 458a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick char *identifier; 459a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick int is_array; 460a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick ast_expression *array_size; 46145d8a70c12ee6ea956baaf898324a828496382f6Ian Romanick 462304ea90233baeac6801a98e981658cb7a2d2501cIan Romanick static void parameters_to_hir(exec_list *ast_parameters, 46345d8a70c12ee6ea956baaf898324a828496382f6Ian Romanick bool formal, exec_list *ir_parameters, 46445d8a70c12ee6ea956baaf898324a828496382f6Ian Romanick struct _mesa_glsl_parse_state *state); 46545d8a70c12ee6ea956baaf898324a828496382f6Ian Romanick 46645d8a70c12ee6ea956baaf898324a828496382f6Ian Romanickprivate: 46745d8a70c12ee6ea956baaf898324a828496382f6Ian Romanick /** Is this parameter declaration part of a formal parameter list? */ 46845d8a70c12ee6ea956baaf898324a828496382f6Ian Romanick bool formal_parameter; 469cf37c9e8dad4349e45cb91d36957484fd76ce264Ian Romanick 470cf37c9e8dad4349e45cb91d36957484fd76ce264Ian Romanick /** 471cf37c9e8dad4349e45cb91d36957484fd76ce264Ian Romanick * Is this parameter 'void' type? 472cf37c9e8dad4349e45cb91d36957484fd76ce264Ian Romanick * 473cf37c9e8dad4349e45cb91d36957484fd76ce264Ian Romanick * This field is set by \c ::hir. 474cf37c9e8dad4349e45cb91d36957484fd76ce264Ian Romanick */ 475cf37c9e8dad4349e45cb91d36957484fd76ce264Ian Romanick bool is_void; 476a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick}; 477a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick 478a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick 479a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanickclass ast_function : public ast_node { 480a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanickpublic: 481a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick ast_function(void); 482a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick 483a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick virtual void print(void) const; 484a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick 48592318a947958892497722772b03c643ebc943294Ian Romanick virtual ir_rvalue *hir(exec_list *instructions, 48692318a947958892497722772b03c643ebc943294Ian Romanick struct _mesa_glsl_parse_state *state); 48792318a947958892497722772b03c643ebc943294Ian Romanick 488a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick ast_fully_specified_type *return_type; 489a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick char *identifier; 490a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick 491304ea90233baeac6801a98e981658cb7a2d2501cIan Romanick exec_list parameters; 49292318a947958892497722772b03c643ebc943294Ian Romanick 49392318a947958892497722772b03c643ebc943294Ian Romanickprivate: 49492318a947958892497722772b03c643ebc943294Ian Romanick /** 49592318a947958892497722772b03c643ebc943294Ian Romanick * Is this prototype part of the function definition? 49692318a947958892497722772b03c643ebc943294Ian Romanick * 49792318a947958892497722772b03c643ebc943294Ian Romanick * Used by ast_function_definition::hir to process the parameters, etc. 49892318a947958892497722772b03c643ebc943294Ian Romanick * of the function. 49992318a947958892497722772b03c643ebc943294Ian Romanick * 50092318a947958892497722772b03c643ebc943294Ian Romanick * \sa ::hir 50192318a947958892497722772b03c643ebc943294Ian Romanick */ 50292318a947958892497722772b03c643ebc943294Ian Romanick bool is_definition; 50392318a947958892497722772b03c643ebc943294Ian Romanick 50492318a947958892497722772b03c643ebc943294Ian Romanick /** 50592318a947958892497722772b03c643ebc943294Ian Romanick * Function signature corresponding to this function prototype instance 50692318a947958892497722772b03c643ebc943294Ian Romanick * 50792318a947958892497722772b03c643ebc943294Ian Romanick * Used by ast_function_definition::hir to process the parameters, etc. 50892318a947958892497722772b03c643ebc943294Ian Romanick * of the function. 50992318a947958892497722772b03c643ebc943294Ian Romanick * 51092318a947958892497722772b03c643ebc943294Ian Romanick * \sa ::hir 51192318a947958892497722772b03c643ebc943294Ian Romanick */ 51292318a947958892497722772b03c643ebc943294Ian Romanick class ir_function_signature *signature; 51392318a947958892497722772b03c643ebc943294Ian Romanick 51492318a947958892497722772b03c643ebc943294Ian Romanick friend class ast_function_definition; 515a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick}; 516a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick 517a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick 518a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanickclass ast_declaration_statement : public ast_node { 519a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanickpublic: 520a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick ast_declaration_statement(void); 521a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick 522a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick enum { 523a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick ast_function, 524a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick ast_declaration, 525a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick ast_precision 526a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick } mode; 527a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick 528a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick union { 529a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick class ast_function *function; 530a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick ast_declarator_list *declarator; 531a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick ast_type_specifier *type; 532a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick ast_node *node; 533a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick } declaration; 534a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick}; 535a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick 536a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick 537a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanickclass ast_expression_statement : public ast_node { 538a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanickpublic: 539a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick ast_expression_statement(ast_expression *); 540a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick virtual void print(void) const; 541a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick 542fb9fb5f51deca28ed1ec7b71759fb71fc26a0ab6Kenneth Graunke virtual ir_rvalue *hir(exec_list *instructions, 543fb9fb5f51deca28ed1ec7b71759fb71fc26a0ab6Kenneth Graunke struct _mesa_glsl_parse_state *state); 54418238de6c34a1a32c452f1006ed13d8adc1bc9d7Ian Romanick 545a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick ast_expression *expression; 546a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick}; 547a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick 548a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick 549a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanickclass ast_case_label : public ast_node { 550a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanickpublic: 551a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick 552a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick /** 553a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick * An expression of NULL means 'default'. 554a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick */ 555a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick ast_expression *expression; 556a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick}; 557a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick 558a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanickclass ast_selection_statement : public ast_node { 559a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanickpublic: 560a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick ast_selection_statement(ast_expression *condition, 561a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick ast_node *then_statement, 562a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick ast_node *else_statement); 563a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick virtual void print(void) const; 564a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick 5653c6fea3048a0d9add2fec621d30c32f3519d8868Ian Romanick virtual ir_rvalue *hir(exec_list *instructions, 5663c6fea3048a0d9add2fec621d30c32f3519d8868Ian Romanick struct _mesa_glsl_parse_state *state); 5673c6fea3048a0d9add2fec621d30c32f3519d8868Ian Romanick 568a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick ast_expression *condition; 569a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick ast_node *then_statement; 570a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick ast_node *else_statement; 571a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick}; 572a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick 573a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick 574a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanickclass ast_switch_statement : public ast_node { 575a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanickpublic: 576a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick ast_expression *expression; 577304ea90233baeac6801a98e981658cb7a2d2501cIan Romanick exec_list statements; 578a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick}; 579a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick 580a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanickclass ast_iteration_statement : public ast_node { 581a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanickpublic: 582a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick ast_iteration_statement(int mode, ast_node *init, ast_node *condition, 583a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick ast_expression *rest_expression, ast_node *body); 584a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick 585a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick virtual void print(void) const; 586a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick 5879e7d010ee0ed89f1fe07a06a9d9bb22e15106ae2Ian Romanick virtual ir_rvalue *hir(exec_list *, struct _mesa_glsl_parse_state *); 5889e7d010ee0ed89f1fe07a06a9d9bb22e15106ae2Ian Romanick 589a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick enum ast_iteration_modes { 590a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick ast_for, 591a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick ast_while, 592a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick ast_do_while 593a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick } mode; 594a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick 595a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick 596a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick ast_node *init_statement; 597a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick ast_node *condition; 598a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick ast_expression *rest_expression; 599a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick 600a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick ast_node *body; 6018c46ed24906ee10dd2f2cfaf4cf9803eca1ba523Ian Romanick 6028c46ed24906ee10dd2f2cfaf4cf9803eca1ba523Ian Romanickprivate: 6038c46ed24906ee10dd2f2cfaf4cf9803eca1ba523Ian Romanick /** 6048c46ed24906ee10dd2f2cfaf4cf9803eca1ba523Ian Romanick * Generate IR from the condition of a loop 6058c46ed24906ee10dd2f2cfaf4cf9803eca1ba523Ian Romanick * 6068c46ed24906ee10dd2f2cfaf4cf9803eca1ba523Ian Romanick * This is factored out of ::hir because some loops have the condition 6078c46ed24906ee10dd2f2cfaf4cf9803eca1ba523Ian Romanick * test at the top (for and while), and others have it at the end (do-while). 6088c46ed24906ee10dd2f2cfaf4cf9803eca1ba523Ian Romanick */ 6098c46ed24906ee10dd2f2cfaf4cf9803eca1ba523Ian Romanick void condition_to_hir(class ir_loop *, struct _mesa_glsl_parse_state *); 610a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick}; 611a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick 612a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick 613a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanickclass ast_jump_statement : public ast_node { 614a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanickpublic: 615a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick ast_jump_statement(int mode, ast_expression *return_value); 616a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick virtual void print(void) const; 617a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick 618fb9fb5f51deca28ed1ec7b71759fb71fc26a0ab6Kenneth Graunke virtual ir_rvalue *hir(exec_list *instructions, 619fb9fb5f51deca28ed1ec7b71759fb71fc26a0ab6Kenneth Graunke struct _mesa_glsl_parse_state *state); 62016a246c049fa3c8d7841f87c8defdd0f26f302eeIan Romanick 621a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick enum ast_jump_modes { 622a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick ast_continue, 623a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick ast_break, 624a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick ast_return, 625a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick ast_discard 626a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick } mode; 627a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick 628a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick ast_expression *opt_return_value; 629a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick}; 630a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick 631a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick 632a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanickclass ast_function_definition : public ast_node { 633a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanickpublic: 634a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick virtual void print(void) const; 635a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick 636fb9fb5f51deca28ed1ec7b71759fb71fc26a0ab6Kenneth Graunke virtual ir_rvalue *hir(exec_list *instructions, 637fb9fb5f51deca28ed1ec7b71759fb71fc26a0ab6Kenneth Graunke struct _mesa_glsl_parse_state *state); 63818238de6c34a1a32c452f1006ed13d8adc1bc9d7Ian Romanick 639a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick ast_function *prototype; 640a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick ast_compound_statement *body; 641a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick}; 642a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick 643a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick 644d949a9afb0a01e9678a4343f66b056b41a2e48a9Ian Romanickextern void 645d949a9afb0a01e9678a4343f66b056b41a2e48a9Ian Romanick_mesa_ast_to_hir(exec_list *instructions, struct _mesa_glsl_parse_state *state); 646d949a9afb0a01e9678a4343f66b056b41a2e48a9Ian Romanick 647fb9fb5f51deca28ed1ec7b71759fb71fc26a0ab6Kenneth Graunkeextern struct ir_rvalue * 648a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick_mesa_ast_field_selection_to_hir(const struct ast_expression *expr, 6490044e7edcea22d2456c051a1c4b744a26960ad27Ian Romanick exec_list *instructions, 650a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick struct _mesa_glsl_parse_state *state); 651a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick 652a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick#endif /* AST_H */ 653