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