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