ast.h revision 2d03f48a65a666ecdcfaffa3d39ad1b77f2b25b6
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 {
341e24d35a5b59ca1e75b69a32db6294787378a963fIan Romanick   union {
342e24d35a5b59ca1e75b69a32db6294787378a963fIan Romanick      struct {
343e24d35a5b59ca1e75b69a32db6294787378a963fIan Romanick	 unsigned invariant:1;
344e24d35a5b59ca1e75b69a32db6294787378a963fIan Romanick	 unsigned constant:1;
345e24d35a5b59ca1e75b69a32db6294787378a963fIan Romanick	 unsigned attribute:1;
346e24d35a5b59ca1e75b69a32db6294787378a963fIan Romanick	 unsigned varying:1;
347e24d35a5b59ca1e75b69a32db6294787378a963fIan Romanick	 unsigned in:1;
348e24d35a5b59ca1e75b69a32db6294787378a963fIan Romanick	 unsigned out:1;
349e24d35a5b59ca1e75b69a32db6294787378a963fIan Romanick	 unsigned centroid:1;
350e24d35a5b59ca1e75b69a32db6294787378a963fIan Romanick	 unsigned uniform:1;
351e24d35a5b59ca1e75b69a32db6294787378a963fIan Romanick	 unsigned smooth:1;
352e24d35a5b59ca1e75b69a32db6294787378a963fIan Romanick	 unsigned flat:1;
353e24d35a5b59ca1e75b69a32db6294787378a963fIan Romanick	 unsigned noperspective:1;
354e24d35a5b59ca1e75b69a32db6294787378a963fIan Romanick
355e24d35a5b59ca1e75b69a32db6294787378a963fIan Romanick	 /** \name Layout qualifiers for GL_ARB_fragment_coord_conventions */
356e24d35a5b59ca1e75b69a32db6294787378a963fIan Romanick	 /*@{*/
357e24d35a5b59ca1e75b69a32db6294787378a963fIan Romanick	 unsigned origin_upper_left:1;
358e24d35a5b59ca1e75b69a32db6294787378a963fIan Romanick	 unsigned pixel_center_integer:1;
359e24d35a5b59ca1e75b69a32db6294787378a963fIan Romanick	 /*@}*/
3607f68cbdc4d9f602dc2619ac4a90283a4f057a8cbIan Romanick
3617f68cbdc4d9f602dc2619ac4a90283a4f057a8cbIan Romanick	 /**
3627f68cbdc4d9f602dc2619ac4a90283a4f057a8cbIan Romanick	  * Flag set if GL_ARB_explicit_attrib_location "location" layout
3637f68cbdc4d9f602dc2619ac4a90283a4f057a8cbIan Romanick	  * qualifier is used.
3647f68cbdc4d9f602dc2619ac4a90283a4f057a8cbIan Romanick	  */
3657f68cbdc4d9f602dc2619ac4a90283a4f057a8cbIan Romanick	 unsigned explicit_location:1;
3661256a5dcc86014d48bdc6fd10ea5a2fa11241667Dave Airlie	 /**
3671256a5dcc86014d48bdc6fd10ea5a2fa11241667Dave Airlie	  * Flag set if GL_ARB_explicit_attrib_location "index" layout
3681256a5dcc86014d48bdc6fd10ea5a2fa11241667Dave Airlie	  * qualifier is used.
3691256a5dcc86014d48bdc6fd10ea5a2fa11241667Dave Airlie	  */
3701256a5dcc86014d48bdc6fd10ea5a2fa11241667Dave Airlie	 unsigned explicit_index:1;
371565a22090c3f143a343c19249a92be6a84b291b0Chad Versace
372565a22090c3f143a343c19249a92be6a84b291b0Chad Versace         /** \name Layout qualifiers for GL_AMD_conservative_depth */
373565a22090c3f143a343c19249a92be6a84b291b0Chad Versace         /** \{ */
374565a22090c3f143a343c19249a92be6a84b291b0Chad Versace         unsigned depth_any:1;
375565a22090c3f143a343c19249a92be6a84b291b0Chad Versace         unsigned depth_greater:1;
376565a22090c3f143a343c19249a92be6a84b291b0Chad Versace         unsigned depth_less:1;
377565a22090c3f143a343c19249a92be6a84b291b0Chad Versace         unsigned depth_unchanged:1;
378565a22090c3f143a343c19249a92be6a84b291b0Chad Versace         /** \} */
3792d03f48a65a666ecdcfaffa3d39ad1b77f2b25b6Eric Anholt
3802d03f48a65a666ecdcfaffa3d39ad1b77f2b25b6Eric Anholt	 /** \name Layout qualifiers for GL_ARB_uniform_buffer_object */
3812d03f48a65a666ecdcfaffa3d39ad1b77f2b25b6Eric Anholt	 /** \{ */
3822d03f48a65a666ecdcfaffa3d39ad1b77f2b25b6Eric Anholt         unsigned std140:1;
3832d03f48a65a666ecdcfaffa3d39ad1b77f2b25b6Eric Anholt         unsigned shared:1;
3842d03f48a65a666ecdcfaffa3d39ad1b77f2b25b6Eric Anholt         unsigned packed:1;
3852d03f48a65a666ecdcfaffa3d39ad1b77f2b25b6Eric Anholt         unsigned column_major:1;
3862d03f48a65a666ecdcfaffa3d39ad1b77f2b25b6Eric Anholt         unsigned row_major:1;
3872d03f48a65a666ecdcfaffa3d39ad1b77f2b25b6Eric Anholt	 /** \} */
3884a62a1c366703c5df10fd1d96f46ecb03ce45138Chad Versace      }
3894a62a1c366703c5df10fd1d96f46ecb03ce45138Chad Versace      /** \brief Set of flags, accessed by name. */
3904a62a1c366703c5df10fd1d96f46ecb03ce45138Chad Versace      q;
3914a62a1c366703c5df10fd1d96f46ecb03ce45138Chad Versace
3924a62a1c366703c5df10fd1d96f46ecb03ce45138Chad Versace      /** \brief Set of flags, accessed as a bitmask. */
393e24d35a5b59ca1e75b69a32db6294787378a963fIan Romanick      unsigned i;
394e24d35a5b59ca1e75b69a32db6294787378a963fIan Romanick   } flags;
3957f68cbdc4d9f602dc2619ac4a90283a4f057a8cbIan Romanick
3967f68cbdc4d9f602dc2619ac4a90283a4f057a8cbIan Romanick   /**
3977f68cbdc4d9f602dc2619ac4a90283a4f057a8cbIan Romanick    * Location specified via GL_ARB_explicit_attrib_location layout
3987f68cbdc4d9f602dc2619ac4a90283a4f057a8cbIan Romanick    *
3997f68cbdc4d9f602dc2619ac4a90283a4f057a8cbIan Romanick    * \note
4007f68cbdc4d9f602dc2619ac4a90283a4f057a8cbIan Romanick    * This field is only valid if \c explicit_location is set.
4017f68cbdc4d9f602dc2619ac4a90283a4f057a8cbIan Romanick    */
402f0dd21ac88c0ee0a7dd96012881deeb3172974b6Ian Romanick   int location;
4031256a5dcc86014d48bdc6fd10ea5a2fa11241667Dave Airlie   /**
4041256a5dcc86014d48bdc6fd10ea5a2fa11241667Dave Airlie    * Index specified via GL_ARB_explicit_attrib_location layout
4051256a5dcc86014d48bdc6fd10ea5a2fa11241667Dave Airlie    *
4061256a5dcc86014d48bdc6fd10ea5a2fa11241667Dave Airlie    * \note
4071256a5dcc86014d48bdc6fd10ea5a2fa11241667Dave Airlie    * This field is only valid if \c explicit_index is set.
4081256a5dcc86014d48bdc6fd10ea5a2fa11241667Dave Airlie    */
4091256a5dcc86014d48bdc6fd10ea5a2fa11241667Dave Airlie   int index;
4100e2f8936c8ef872cb464e54a9f09ae0324487147Chad Versace
4110e2f8936c8ef872cb464e54a9f09ae0324487147Chad Versace   /**
412605aacc67d73db0926e0046a90a07fcd93a2d613Chad Versace    * Return true if and only if an interpolation qualifier is present.
413605aacc67d73db0926e0046a90a07fcd93a2d613Chad Versace    */
414605aacc67d73db0926e0046a90a07fcd93a2d613Chad Versace   bool has_interpolation() const;
415605aacc67d73db0926e0046a90a07fcd93a2d613Chad Versace
416605aacc67d73db0926e0046a90a07fcd93a2d613Chad Versace   /**
4170e2f8936c8ef872cb464e54a9f09ae0324487147Chad Versace    * \brief Return string representation of interpolation qualifier.
4180e2f8936c8ef872cb464e54a9f09ae0324487147Chad Versace    *
4190e2f8936c8ef872cb464e54a9f09ae0324487147Chad Versace    * If an interpolation qualifier is present, then return that qualifier's
4200e2f8936c8ef872cb464e54a9f09ae0324487147Chad Versace    * string representation. Otherwise, return null. For example, if the
4210e2f8936c8ef872cb464e54a9f09ae0324487147Chad Versace    * noperspective bit is set, then this returns "noperspective".
4220e2f8936c8ef872cb464e54a9f09ae0324487147Chad Versace    *
4230e2f8936c8ef872cb464e54a9f09ae0324487147Chad Versace    * If multiple interpolation qualifiers are somehow present, then the
4240e2f8936c8ef872cb464e54a9f09ae0324487147Chad Versace    * returned string is undefined but not null.
4250e2f8936c8ef872cb464e54a9f09ae0324487147Chad Versace    */
4260e2f8936c8ef872cb464e54a9f09ae0324487147Chad Versace   const char *interpolation_string() const;
427a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick};
428a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick
429912a429bc529a017a426f06631b31da1c0eaa3aeEric Anholtclass ast_declarator_list;
430912a429bc529a017a426f06631b31da1c0eaa3aeEric Anholt
431a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanickclass ast_struct_specifier : public ast_node {
432a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanickpublic:
433912a429bc529a017a426f06631b31da1c0eaa3aeEric Anholt   ast_struct_specifier(const char *identifier,
434912a429bc529a017a426f06631b31da1c0eaa3aeEric Anholt			ast_declarator_list *declarator_list);
435a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   virtual void print(void) const;
436a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick
4373455ce614424a5a23a23037e23d0454e476bceeaIan Romanick   virtual ir_rvalue *hir(exec_list *instructions,
4383455ce614424a5a23a23037e23d0454e476bceeaIan Romanick			  struct _mesa_glsl_parse_state *state);
4393455ce614424a5a23a23037e23d0454e476bceeaIan Romanick
440b2c0df2b60a77b043d461f265c85d8b5b066a008Kenneth Graunke   const char *name;
441912a429bc529a017a426f06631b31da1c0eaa3aeEric Anholt   /* List of ast_declarator_list * */
442304ea90233baeac6801a98e981658cb7a2d2501cIan Romanick   exec_list declarations;
443a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick};
444a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick
445a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick
446a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick
447a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanickclass ast_type_specifier : public ast_node {
448a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanickpublic:
449ed85a5dd4b36f4a583fc321b6d8d49a050d48678Ian Romanick   /** Construct a type specifier from a type name */
450ed85a5dd4b36f4a583fc321b6d8d49a050d48678Ian Romanick   ast_type_specifier(const char *name)
451eb7a71dea78152142b456f29e4881c4d3aeb56b6Eric Anholt      : type_name(name), structure(NULL),
45208a286c9cc8fecb081057e0f551c88a446c47b6fChad Versace	is_array(false), array_size(NULL), precision(ast_precision_none),
45308a286c9cc8fecb081057e0f551c88a446c47b6fChad Versace	is_precision_statement(false)
454ed85a5dd4b36f4a583fc321b6d8d49a050d48678Ian Romanick   {
455ed85a5dd4b36f4a583fc321b6d8d49a050d48678Ian Romanick      /* empty */
456ed85a5dd4b36f4a583fc321b6d8d49a050d48678Ian Romanick   }
457ed85a5dd4b36f4a583fc321b6d8d49a050d48678Ian Romanick
458ed85a5dd4b36f4a583fc321b6d8d49a050d48678Ian Romanick   /** Construct a type specifier from a structure definition */
459ed85a5dd4b36f4a583fc321b6d8d49a050d48678Ian Romanick   ast_type_specifier(ast_struct_specifier *s)
460eb7a71dea78152142b456f29e4881c4d3aeb56b6Eric Anholt      : type_name(s->name), structure(s),
46108a286c9cc8fecb081057e0f551c88a446c47b6fChad Versace	is_array(false), array_size(NULL), precision(ast_precision_none),
46208a286c9cc8fecb081057e0f551c88a446c47b6fChad Versace	is_precision_statement(false)
463ed85a5dd4b36f4a583fc321b6d8d49a050d48678Ian Romanick   {
464ed85a5dd4b36f4a583fc321b6d8d49a050d48678Ian Romanick      /* empty */
465ed85a5dd4b36f4a583fc321b6d8d49a050d48678Ian Romanick   }
466ed85a5dd4b36f4a583fc321b6d8d49a050d48678Ian Romanick
467d612a127ccf12c11204f7f72a332de12f58f85a2Ian Romanick   const struct glsl_type *glsl_type(const char **name,
468d612a127ccf12c11204f7f72a332de12f58f85a2Ian Romanick				     struct _mesa_glsl_parse_state *state)
469d612a127ccf12c11204f7f72a332de12f58f85a2Ian Romanick      const;
470d612a127ccf12c11204f7f72a332de12f58f85a2Ian Romanick
471a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   virtual void print(void) const;
472a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick
4733455ce614424a5a23a23037e23d0454e476bceeaIan Romanick   ir_rvalue *hir(exec_list *, struct _mesa_glsl_parse_state *);
4743455ce614424a5a23a23037e23d0454e476bceeaIan Romanick
4757f9d30974317a4050fb8990ce1a3eebbb190483aIan Romanick   const char *type_name;
476a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   ast_struct_specifier *structure;
477a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick
478a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   int is_array;
479a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   ast_expression *array_size;
480a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick
481a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   unsigned precision:2;
48208a286c9cc8fecb081057e0f551c88a446c47b6fChad Versace
48308a286c9cc8fecb081057e0f551c88a446c47b6fChad Versace   bool is_precision_statement;
484a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick};
485a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick
486a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick
487a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanickclass ast_fully_specified_type : public ast_node {
488a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanickpublic:
489a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   virtual void print(void) const;
49028527ed557923aecff5d3b88e5d7776f04389547Kenneth Graunke   bool has_qualifiers() const;
491a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick
492a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   ast_type_qualifier qualifier;
493a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   ast_type_specifier *specifier;
494a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick};
495a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick
496a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick
497a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanickclass ast_declarator_list : public ast_node {
498a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanickpublic:
499a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   ast_declarator_list(ast_fully_specified_type *);
500a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   virtual void print(void) const;
501a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick
502fb9fb5f51deca28ed1ec7b71759fb71fc26a0ab6Kenneth Graunke   virtual ir_rvalue *hir(exec_list *instructions,
503fb9fb5f51deca28ed1ec7b71759fb71fc26a0ab6Kenneth Graunke			  struct _mesa_glsl_parse_state *state);
50418238de6c34a1a32c452f1006ed13d8adc1bc9d7Ian Romanick
505a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   ast_fully_specified_type *type;
506304ea90233baeac6801a98e981658cb7a2d2501cIan Romanick   exec_list declarations;
507a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick
508a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   /**
509a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick    * Special flag for vertex shader "invariant" declarations.
510a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick    *
511a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick    * Vertex shaders can contain "invariant" variable redeclarations that do
512a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick    * not include a type.  For example, "invariant gl_Position;".  This flag
513a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick    * is used to note these cases when no type is specified.
514a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick    */
515a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   int invariant;
516a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick};
517a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick
518a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick
519a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanickclass ast_parameter_declarator : public ast_node {
520a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanickpublic:
521b35703df107b50b2c3f5cd4d56790921e8106324Aras Pranckevicius   ast_parameter_declarator()
522b35703df107b50b2c3f5cd4d56790921e8106324Aras Pranckevicius   {
523b8db38e1c4f639cb0a063250d43f5a0ef6afd50fEric Anholt      this->identifier = NULL;
524b35703df107b50b2c3f5cd4d56790921e8106324Aras Pranckevicius      this->is_array = false;
525b35703df107b50b2c3f5cd4d56790921e8106324Aras Pranckevicius      this->array_size = 0;
526b35703df107b50b2c3f5cd4d56790921e8106324Aras Pranckevicius   }
527b35703df107b50b2c3f5cd4d56790921e8106324Aras Pranckevicius
528a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   virtual void print(void) const;
529a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick
530fb9fb5f51deca28ed1ec7b71759fb71fc26a0ab6Kenneth Graunke   virtual ir_rvalue *hir(exec_list *instructions,
531fb9fb5f51deca28ed1ec7b71759fb71fc26a0ab6Kenneth Graunke			  struct _mesa_glsl_parse_state *state);
53218238de6c34a1a32c452f1006ed13d8adc1bc9d7Ian Romanick
533a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   ast_fully_specified_type *type;
534b2c0df2b60a77b043d461f265c85d8b5b066a008Kenneth Graunke   const char *identifier;
535a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   int is_array;
536a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   ast_expression *array_size;
53745d8a70c12ee6ea956baaf898324a828496382f6Ian Romanick
538304ea90233baeac6801a98e981658cb7a2d2501cIan Romanick   static void parameters_to_hir(exec_list *ast_parameters,
53945d8a70c12ee6ea956baaf898324a828496382f6Ian Romanick				 bool formal, exec_list *ir_parameters,
54045d8a70c12ee6ea956baaf898324a828496382f6Ian Romanick				 struct _mesa_glsl_parse_state *state);
54145d8a70c12ee6ea956baaf898324a828496382f6Ian Romanick
54245d8a70c12ee6ea956baaf898324a828496382f6Ian Romanickprivate:
54345d8a70c12ee6ea956baaf898324a828496382f6Ian Romanick   /** Is this parameter declaration part of a formal parameter list? */
54445d8a70c12ee6ea956baaf898324a828496382f6Ian Romanick   bool formal_parameter;
545cf37c9e8dad4349e45cb91d36957484fd76ce264Ian Romanick
546cf37c9e8dad4349e45cb91d36957484fd76ce264Ian Romanick   /**
547cf37c9e8dad4349e45cb91d36957484fd76ce264Ian Romanick    * Is this parameter 'void' type?
548cf37c9e8dad4349e45cb91d36957484fd76ce264Ian Romanick    *
549cf37c9e8dad4349e45cb91d36957484fd76ce264Ian Romanick    * This field is set by \c ::hir.
550cf37c9e8dad4349e45cb91d36957484fd76ce264Ian Romanick    */
551cf37c9e8dad4349e45cb91d36957484fd76ce264Ian Romanick   bool is_void;
552a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick};
553a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick
554a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick
555a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanickclass ast_function : public ast_node {
556a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanickpublic:
557a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   ast_function(void);
558a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick
559a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   virtual void print(void) const;
560a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick
56192318a947958892497722772b03c643ebc943294Ian Romanick   virtual ir_rvalue *hir(exec_list *instructions,
56292318a947958892497722772b03c643ebc943294Ian Romanick			  struct _mesa_glsl_parse_state *state);
56392318a947958892497722772b03c643ebc943294Ian Romanick
564a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   ast_fully_specified_type *return_type;
565b2c0df2b60a77b043d461f265c85d8b5b066a008Kenneth Graunke   const char *identifier;
566a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick
567304ea90233baeac6801a98e981658cb7a2d2501cIan Romanick   exec_list parameters;
56892318a947958892497722772b03c643ebc943294Ian Romanick
56992318a947958892497722772b03c643ebc943294Ian Romanickprivate:
57092318a947958892497722772b03c643ebc943294Ian Romanick   /**
57192318a947958892497722772b03c643ebc943294Ian Romanick    * Is this prototype part of the function definition?
57292318a947958892497722772b03c643ebc943294Ian Romanick    *
57392318a947958892497722772b03c643ebc943294Ian Romanick    * Used by ast_function_definition::hir to process the parameters, etc.
57492318a947958892497722772b03c643ebc943294Ian Romanick    * of the function.
57592318a947958892497722772b03c643ebc943294Ian Romanick    *
57692318a947958892497722772b03c643ebc943294Ian Romanick    * \sa ::hir
57792318a947958892497722772b03c643ebc943294Ian Romanick    */
57892318a947958892497722772b03c643ebc943294Ian Romanick   bool is_definition;
57992318a947958892497722772b03c643ebc943294Ian Romanick
58092318a947958892497722772b03c643ebc943294Ian Romanick   /**
58192318a947958892497722772b03c643ebc943294Ian Romanick    * Function signature corresponding to this function prototype instance
58292318a947958892497722772b03c643ebc943294Ian Romanick    *
58392318a947958892497722772b03c643ebc943294Ian Romanick    * Used by ast_function_definition::hir to process the parameters, etc.
58492318a947958892497722772b03c643ebc943294Ian Romanick    * of the function.
58592318a947958892497722772b03c643ebc943294Ian Romanick    *
58692318a947958892497722772b03c643ebc943294Ian Romanick    * \sa ::hir
58792318a947958892497722772b03c643ebc943294Ian Romanick    */
58892318a947958892497722772b03c643ebc943294Ian Romanick   class ir_function_signature *signature;
58992318a947958892497722772b03c643ebc943294Ian Romanick
59092318a947958892497722772b03c643ebc943294Ian Romanick   friend class ast_function_definition;
591a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick};
592a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick
593a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick
594a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanickclass ast_expression_statement : public ast_node {
595a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanickpublic:
596a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   ast_expression_statement(ast_expression *);
597a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   virtual void print(void) const;
598a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick
599fb9fb5f51deca28ed1ec7b71759fb71fc26a0ab6Kenneth Graunke   virtual ir_rvalue *hir(exec_list *instructions,
600fb9fb5f51deca28ed1ec7b71759fb71fc26a0ab6Kenneth Graunke			  struct _mesa_glsl_parse_state *state);
60118238de6c34a1a32c452f1006ed13d8adc1bc9d7Ian Romanick
602a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   ast_expression *expression;
603a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick};
604a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick
605a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick
606a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanickclass ast_case_label : public ast_node {
607a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanickpublic:
60819daba54707b4ff90159850ce97faceba9c336c0Dan McCabe   ast_case_label(ast_expression *test_value);
60919daba54707b4ff90159850ce97faceba9c336c0Dan McCabe   virtual void print(void) const;
61019daba54707b4ff90159850ce97faceba9c336c0Dan McCabe
61119daba54707b4ff90159850ce97faceba9c336c0Dan McCabe   virtual ir_rvalue *hir(exec_list *instructions,
61219daba54707b4ff90159850ce97faceba9c336c0Dan McCabe			  struct _mesa_glsl_parse_state *state);
613a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick
614a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   /**
61519daba54707b4ff90159850ce97faceba9c336c0Dan McCabe    * An test value of NULL means 'default'.
616a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick    */
61719daba54707b4ff90159850ce97faceba9c336c0Dan McCabe   ast_expression *test_value;
618a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick};
619a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick
62019daba54707b4ff90159850ce97faceba9c336c0Dan McCabe
621a0afcc67196baa588ec0ac246be6c4996a328f0bDan McCabeclass ast_case_label_list : public ast_node {
622a0afcc67196baa588ec0ac246be6c4996a328f0bDan McCabepublic:
623a0afcc67196baa588ec0ac246be6c4996a328f0bDan McCabe   ast_case_label_list(void);
624a0afcc67196baa588ec0ac246be6c4996a328f0bDan McCabe   virtual void print(void) const;
625a0afcc67196baa588ec0ac246be6c4996a328f0bDan McCabe
626a0afcc67196baa588ec0ac246be6c4996a328f0bDan McCabe   virtual ir_rvalue *hir(exec_list *instructions,
627a0afcc67196baa588ec0ac246be6c4996a328f0bDan McCabe			  struct _mesa_glsl_parse_state *state);
628a0afcc67196baa588ec0ac246be6c4996a328f0bDan McCabe
629a0afcc67196baa588ec0ac246be6c4996a328f0bDan McCabe   /**
630a0afcc67196baa588ec0ac246be6c4996a328f0bDan McCabe    * A list of case labels.
631a0afcc67196baa588ec0ac246be6c4996a328f0bDan McCabe    */
632a0afcc67196baa588ec0ac246be6c4996a328f0bDan McCabe   exec_list labels;
633a0afcc67196baa588ec0ac246be6c4996a328f0bDan McCabe};
634a0afcc67196baa588ec0ac246be6c4996a328f0bDan McCabe
635a0afcc67196baa588ec0ac246be6c4996a328f0bDan McCabe
636a0afcc67196baa588ec0ac246be6c4996a328f0bDan McCabeclass ast_case_statement : public ast_node {
637a0afcc67196baa588ec0ac246be6c4996a328f0bDan McCabepublic:
638a0afcc67196baa588ec0ac246be6c4996a328f0bDan McCabe   ast_case_statement(ast_case_label_list *labels);
639a0afcc67196baa588ec0ac246be6c4996a328f0bDan McCabe   virtual void print(void) const;
640a0afcc67196baa588ec0ac246be6c4996a328f0bDan McCabe
641a0afcc67196baa588ec0ac246be6c4996a328f0bDan McCabe   virtual ir_rvalue *hir(exec_list *instructions,
642a0afcc67196baa588ec0ac246be6c4996a328f0bDan McCabe			  struct _mesa_glsl_parse_state *state);
643a0afcc67196baa588ec0ac246be6c4996a328f0bDan McCabe
644a0afcc67196baa588ec0ac246be6c4996a328f0bDan McCabe   ast_case_label_list *labels;
645a0afcc67196baa588ec0ac246be6c4996a328f0bDan McCabe
646a0afcc67196baa588ec0ac246be6c4996a328f0bDan McCabe   /**
647a0afcc67196baa588ec0ac246be6c4996a328f0bDan McCabe    * A list of statements.
648a0afcc67196baa588ec0ac246be6c4996a328f0bDan McCabe    */
649a0afcc67196baa588ec0ac246be6c4996a328f0bDan McCabe   exec_list stmts;
650a0afcc67196baa588ec0ac246be6c4996a328f0bDan McCabe};
651a0afcc67196baa588ec0ac246be6c4996a328f0bDan McCabe
652a0afcc67196baa588ec0ac246be6c4996a328f0bDan McCabe
653a0afcc67196baa588ec0ac246be6c4996a328f0bDan McCabeclass ast_case_statement_list : public ast_node {
654a0afcc67196baa588ec0ac246be6c4996a328f0bDan McCabepublic:
655a0afcc67196baa588ec0ac246be6c4996a328f0bDan McCabe   ast_case_statement_list(void);
656a0afcc67196baa588ec0ac246be6c4996a328f0bDan McCabe   virtual void print(void) const;
657a0afcc67196baa588ec0ac246be6c4996a328f0bDan McCabe
658a0afcc67196baa588ec0ac246be6c4996a328f0bDan McCabe   virtual ir_rvalue *hir(exec_list *instructions,
659a0afcc67196baa588ec0ac246be6c4996a328f0bDan McCabe			  struct _mesa_glsl_parse_state *state);
660a0afcc67196baa588ec0ac246be6c4996a328f0bDan McCabe
661a0afcc67196baa588ec0ac246be6c4996a328f0bDan McCabe   /**
662a0afcc67196baa588ec0ac246be6c4996a328f0bDan McCabe    * A list of cases.
663a0afcc67196baa588ec0ac246be6c4996a328f0bDan McCabe    */
664a0afcc67196baa588ec0ac246be6c4996a328f0bDan McCabe   exec_list cases;
665a0afcc67196baa588ec0ac246be6c4996a328f0bDan McCabe};
666a0afcc67196baa588ec0ac246be6c4996a328f0bDan McCabe
667a0afcc67196baa588ec0ac246be6c4996a328f0bDan McCabe
668a0afcc67196baa588ec0ac246be6c4996a328f0bDan McCabeclass ast_switch_body : public ast_node {
669a0afcc67196baa588ec0ac246be6c4996a328f0bDan McCabepublic:
670a0afcc67196baa588ec0ac246be6c4996a328f0bDan McCabe   ast_switch_body(ast_case_statement_list *stmts);
671a0afcc67196baa588ec0ac246be6c4996a328f0bDan McCabe   virtual void print(void) const;
672a0afcc67196baa588ec0ac246be6c4996a328f0bDan McCabe
673a0afcc67196baa588ec0ac246be6c4996a328f0bDan McCabe   virtual ir_rvalue *hir(exec_list *instructions,
674a0afcc67196baa588ec0ac246be6c4996a328f0bDan McCabe			  struct _mesa_glsl_parse_state *state);
675a0afcc67196baa588ec0ac246be6c4996a328f0bDan McCabe
676a0afcc67196baa588ec0ac246be6c4996a328f0bDan McCabe   ast_case_statement_list *stmts;
677a0afcc67196baa588ec0ac246be6c4996a328f0bDan McCabe};
678a0afcc67196baa588ec0ac246be6c4996a328f0bDan McCabe
679a0afcc67196baa588ec0ac246be6c4996a328f0bDan McCabe
680a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanickclass ast_selection_statement : public ast_node {
681a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanickpublic:
682a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   ast_selection_statement(ast_expression *condition,
683a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick			   ast_node *then_statement,
684a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick			   ast_node *else_statement);
685a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   virtual void print(void) const;
686a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick
6873c6fea3048a0d9add2fec621d30c32f3519d8868Ian Romanick   virtual ir_rvalue *hir(exec_list *instructions,
6883c6fea3048a0d9add2fec621d30c32f3519d8868Ian Romanick			  struct _mesa_glsl_parse_state *state);
6893c6fea3048a0d9add2fec621d30c32f3519d8868Ian Romanick
690a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   ast_expression *condition;
691a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   ast_node *then_statement;
692a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   ast_node *else_statement;
693a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick};
694a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick
695a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick
696a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanickclass ast_switch_statement : public ast_node {
697a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanickpublic:
69819daba54707b4ff90159850ce97faceba9c336c0Dan McCabe   ast_switch_statement(ast_expression *test_expression,
69919daba54707b4ff90159850ce97faceba9c336c0Dan McCabe			ast_node *body);
70019daba54707b4ff90159850ce97faceba9c336c0Dan McCabe   virtual void print(void) const;
70119daba54707b4ff90159850ce97faceba9c336c0Dan McCabe
70219daba54707b4ff90159850ce97faceba9c336c0Dan McCabe   virtual ir_rvalue *hir(exec_list *instructions,
70319daba54707b4ff90159850ce97faceba9c336c0Dan McCabe			  struct _mesa_glsl_parse_state *state);
70419daba54707b4ff90159850ce97faceba9c336c0Dan McCabe
70519daba54707b4ff90159850ce97faceba9c336c0Dan McCabe   ast_expression *test_expression;
70619daba54707b4ff90159850ce97faceba9c336c0Dan McCabe   ast_node *body;
70719daba54707b4ff90159850ce97faceba9c336c0Dan McCabe
70819daba54707b4ff90159850ce97faceba9c336c0Dan McCabeprotected:
70919daba54707b4ff90159850ce97faceba9c336c0Dan McCabe   void test_to_hir(exec_list *, struct _mesa_glsl_parse_state *);
710a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick};
711a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick
712a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanickclass ast_iteration_statement : public ast_node {
713a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanickpublic:
714a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   ast_iteration_statement(int mode, ast_node *init, ast_node *condition,
715a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick			   ast_expression *rest_expression, ast_node *body);
716a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick
717a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   virtual void print(void) const;
718a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick
7199e7d010ee0ed89f1fe07a06a9d9bb22e15106ae2Ian Romanick   virtual ir_rvalue *hir(exec_list *, struct _mesa_glsl_parse_state *);
7209e7d010ee0ed89f1fe07a06a9d9bb22e15106ae2Ian Romanick
721a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   enum ast_iteration_modes {
722a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick      ast_for,
723a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick      ast_while,
724a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick      ast_do_while
725a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   } mode;
726a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick
727a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick
728a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   ast_node *init_statement;
729a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   ast_node *condition;
730a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   ast_expression *rest_expression;
731a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick
732a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   ast_node *body;
7338c46ed24906ee10dd2f2cfaf4cf9803eca1ba523Ian Romanick
7348c46ed24906ee10dd2f2cfaf4cf9803eca1ba523Ian Romanickprivate:
7358c46ed24906ee10dd2f2cfaf4cf9803eca1ba523Ian Romanick   /**
7368c46ed24906ee10dd2f2cfaf4cf9803eca1ba523Ian Romanick    * Generate IR from the condition of a loop
7378c46ed24906ee10dd2f2cfaf4cf9803eca1ba523Ian Romanick    *
7388c46ed24906ee10dd2f2cfaf4cf9803eca1ba523Ian Romanick    * This is factored out of ::hir because some loops have the condition
7398c46ed24906ee10dd2f2cfaf4cf9803eca1ba523Ian Romanick    * test at the top (for and while), and others have it at the end (do-while).
7408c46ed24906ee10dd2f2cfaf4cf9803eca1ba523Ian Romanick    */
7418c46ed24906ee10dd2f2cfaf4cf9803eca1ba523Ian Romanick   void condition_to_hir(class ir_loop *, struct _mesa_glsl_parse_state *);
742a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick};
743a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick
744a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick
745a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanickclass ast_jump_statement : public ast_node {
746a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanickpublic:
747a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   ast_jump_statement(int mode, ast_expression *return_value);
748a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   virtual void print(void) const;
749a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick
750fb9fb5f51deca28ed1ec7b71759fb71fc26a0ab6Kenneth Graunke   virtual ir_rvalue *hir(exec_list *instructions,
751fb9fb5f51deca28ed1ec7b71759fb71fc26a0ab6Kenneth Graunke			  struct _mesa_glsl_parse_state *state);
75216a246c049fa3c8d7841f87c8defdd0f26f302eeIan Romanick
753a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   enum ast_jump_modes {
754a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick      ast_continue,
755a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick      ast_break,
756a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick      ast_return,
757a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick      ast_discard
758a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   } mode;
759a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick
760a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   ast_expression *opt_return_value;
761a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick};
762a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick
763a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick
764a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanickclass ast_function_definition : public ast_node {
765a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanickpublic:
766a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   virtual void print(void) const;
767a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick
768fb9fb5f51deca28ed1ec7b71759fb71fc26a0ab6Kenneth Graunke   virtual ir_rvalue *hir(exec_list *instructions,
769fb9fb5f51deca28ed1ec7b71759fb71fc26a0ab6Kenneth Graunke			  struct _mesa_glsl_parse_state *state);
77018238de6c34a1a32c452f1006ed13d8adc1bc9d7Ian Romanick
771a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   ast_function *prototype;
772a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   ast_compound_statement *body;
773a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick};
7742d03f48a65a666ecdcfaffa3d39ad1b77f2b25b6Eric Anholt
7752d03f48a65a666ecdcfaffa3d39ad1b77f2b25b6Eric Anholtclass ast_uniform_block : public ast_node {
7762d03f48a65a666ecdcfaffa3d39ad1b77f2b25b6Eric Anholtpublic:
7772d03f48a65a666ecdcfaffa3d39ad1b77f2b25b6Eric Anholt   ast_uniform_block(ast_type_qualifier layout,
7782d03f48a65a666ecdcfaffa3d39ad1b77f2b25b6Eric Anholt		     const char *block_name,
7792d03f48a65a666ecdcfaffa3d39ad1b77f2b25b6Eric Anholt		     ast_declarator_list *member_list)
7802d03f48a65a666ecdcfaffa3d39ad1b77f2b25b6Eric Anholt   : layout(layout), block_name(block_name)
7812d03f48a65a666ecdcfaffa3d39ad1b77f2b25b6Eric Anholt   {
7822d03f48a65a666ecdcfaffa3d39ad1b77f2b25b6Eric Anholt      declarations.push_degenerate_list_at_head(&member_list->link);
7832d03f48a65a666ecdcfaffa3d39ad1b77f2b25b6Eric Anholt   }
7842d03f48a65a666ecdcfaffa3d39ad1b77f2b25b6Eric Anholt
7852d03f48a65a666ecdcfaffa3d39ad1b77f2b25b6Eric Anholt   virtual ir_rvalue *hir(exec_list *instructions,
7862d03f48a65a666ecdcfaffa3d39ad1b77f2b25b6Eric Anholt			  struct _mesa_glsl_parse_state *state);
7872d03f48a65a666ecdcfaffa3d39ad1b77f2b25b6Eric Anholt
7882d03f48a65a666ecdcfaffa3d39ad1b77f2b25b6Eric Anholt   ast_type_qualifier layout;
7892d03f48a65a666ecdcfaffa3d39ad1b77f2b25b6Eric Anholt   const char *block_name;
7902d03f48a65a666ecdcfaffa3d39ad1b77f2b25b6Eric Anholt   /** List of ast_declarator_list * */
7912d03f48a65a666ecdcfaffa3d39ad1b77f2b25b6Eric Anholt   exec_list declarations;
7922d03f48a65a666ecdcfaffa3d39ad1b77f2b25b6Eric Anholt};
793e053d62aa573651abdd78666d299272c8219a3aaIan Romanick/*@}*/
794a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick
795d949a9afb0a01e9678a4343f66b056b41a2e48a9Ian Romanickextern void
796d949a9afb0a01e9678a4343f66b056b41a2e48a9Ian Romanick_mesa_ast_to_hir(exec_list *instructions, struct _mesa_glsl_parse_state *state);
797d949a9afb0a01e9678a4343f66b056b41a2e48a9Ian Romanick
798768b55a5268572ff9fd03e57e92775882eb0a821Ian Romanickextern ir_rvalue *
799768b55a5268572ff9fd03e57e92775882eb0a821Ian Romanick_mesa_ast_field_selection_to_hir(const ast_expression *expr,
8000044e7edcea22d2456c051a1c4b744a26960ad27Ian Romanick				 exec_list *instructions,
801a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick				 struct _mesa_glsl_parse_state *state);
802a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick
8036fae1e4c4d33769e2f255d50907b5aa0ab80edd4Kenneth Graunkevoid
8040d81b0e18494a80c4326fbc98837842959675869Paul Berryemit_function(_mesa_glsl_parse_state *state, ir_function *f);
8056fae1e4c4d33769e2f255d50907b5aa0ab80edd4Kenneth Graunke
806a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick#endif /* AST_H */
807