ast.h revision 3c6fea3048a0d9add2fec621d30c32f3519d8868
1986b8f798272d3ae2898617c8fb089156a5941c0Ian Romanick/* -*- c++ -*- */
2a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick/*
3a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick * Copyright © 2009 Intel Corporation
4a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick *
5a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick * Permission is hereby granted, free of charge, to any person obtaining a
6a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick * copy of this software and associated documentation files (the "Software"),
7a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick * to deal in the Software without restriction, including without limitation
8a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick * the rights to use, copy, modify, merge, publish, distribute, sublicense,
9a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick * and/or sell copies of the Software, and to permit persons to whom the
10a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick * Software is furnished to do so, subject to the following conditions:
11a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick *
12a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick * The above copyright notice and this permission notice (including the next
13a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick * paragraph) shall be included in all copies or substantial portions of the
14a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick * Software.
15a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick *
16a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
17a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
18a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL
19a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
20a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
21a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
22a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick * DEALINGS IN THE SOFTWARE.
23a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick */
24a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick
25a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick#pragma once
26a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick#ifndef AST_H
27a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick#define AST_H
28a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick
29a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick#include "main/simple_list.h"
300044e7edcea22d2456c051a1c4b744a26960ad27Ian Romanick#include "list.h"
31a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick#include "glsl_parser_extras.h"
32a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick
33a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanickstruct ir_instruction;
34a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanickstruct _mesa_glsl_parse_state;
35a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick
36a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanickstruct YYLTYPE;
37a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick
38a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanickclass ast_node : public simple_node {
39a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanickpublic:
40a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   virtual ~ast_node();
41a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   virtual void print(void) const;
42fb9fb5f51deca28ed1ec7b71759fb71fc26a0ab6Kenneth Graunke   virtual ir_rvalue *hir(exec_list *instructions,
43fb9fb5f51deca28ed1ec7b71759fb71fc26a0ab6Kenneth Graunke			  struct _mesa_glsl_parse_state *state);
44a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick
45a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   /**
46a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick    * Retrieve the source location of an AST node
47a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick    *
48a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick    * This function is primarily used to get the source position of an AST node
49a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick    * into a form that can be passed to \c _mesa_glsl_error.
50a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick    *
51a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick    * \sa _mesa_glsl_error, ast_node::set_location
52a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick    */
53a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   struct YYLTYPE get_location(void) const
54a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   {
55a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick      struct YYLTYPE locp;
56a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick
57a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick      locp.source = this->location.source;
58a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick      locp.first_line = this->location.line;
59a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick      locp.first_column = this->location.column;
60a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick      locp.last_line = locp.first_line;
61a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick      locp.last_column = locp.first_column;
62a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick
63a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick      return locp;
64a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   }
65a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick
66a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   /**
67a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick    * Set the source location of an AST node from a parser location
68a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick    *
69a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick    * \sa ast_node::get_location
70a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick    */
71a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   void set_location(const struct YYLTYPE *locp)
72a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   {
73a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick      this->location.source = locp->source;
74a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick      this->location.line = locp->first_line;
75a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick      this->location.column = locp->first_column;
76a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   }
77a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick
78a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick
79a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   int  type;
80a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick
81a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   struct {
82a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick      unsigned source;
83a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick      unsigned line;
84a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick      unsigned column;
85a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   } location;
86a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick
87a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanickprotected:
88a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   ast_node(void);
89a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick};
90a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick
91a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick
92a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanickenum ast_operators {
93a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   ast_assign,
94a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   ast_plus,        /**< Unary + operator. */
95a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   ast_neg,
96a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   ast_add,
97a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   ast_sub,
98a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   ast_mul,
99a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   ast_div,
100a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   ast_mod,
101a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   ast_lshift,
102a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   ast_rshift,
103a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   ast_less,
104a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   ast_greater,
105a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   ast_lequal,
106a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   ast_gequal,
107a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   ast_equal,
108a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   ast_nequal,
109a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   ast_bit_and,
110a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   ast_bit_xor,
111a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   ast_bit_or,
112a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   ast_bit_not,
113a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   ast_logic_and,
114a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   ast_logic_xor,
115a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   ast_logic_or,
116a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   ast_logic_not,
117a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick
118a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   ast_mul_assign,
119a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   ast_div_assign,
120a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   ast_mod_assign,
121a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   ast_add_assign,
122a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   ast_sub_assign,
123a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   ast_ls_assign,
124a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   ast_rs_assign,
125a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   ast_and_assign,
126a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   ast_xor_assign,
127a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   ast_or_assign,
128a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick
129a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   ast_conditional,
130a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick
131a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   ast_pre_inc,
132a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   ast_pre_dec,
133a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   ast_post_inc,
134a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   ast_post_dec,
135a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   ast_field_selection,
136a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   ast_array_index,
137a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick
138a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   ast_function_call,
139a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick
140a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   ast_identifier,
141a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   ast_int_constant,
142a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   ast_uint_constant,
143a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   ast_float_constant,
144a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   ast_bool_constant,
145a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick
146a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   ast_sequence
147a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick};
148a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick
149a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanickclass ast_expression : public ast_node {
150a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanickpublic:
151a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   ast_expression(int oper, ast_expression *,
152a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick		  ast_expression *, ast_expression *);
153a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick
154d10fe19495191072d39689337700b69e62252bf1Ian Romanick   ast_expression(const char *identifier) :
155d10fe19495191072d39689337700b69e62252bf1Ian Romanick      oper(ast_identifier)
156d10fe19495191072d39689337700b69e62252bf1Ian Romanick   {
157d10fe19495191072d39689337700b69e62252bf1Ian Romanick      subexpressions[0] = NULL;
158d10fe19495191072d39689337700b69e62252bf1Ian Romanick      subexpressions[1] = NULL;
159d10fe19495191072d39689337700b69e62252bf1Ian Romanick      subexpressions[2] = NULL;
160d10fe19495191072d39689337700b69e62252bf1Ian Romanick      primary_expression.identifier = (char *) identifier;
161d10fe19495191072d39689337700b69e62252bf1Ian Romanick   }
162d10fe19495191072d39689337700b69e62252bf1Ian Romanick
16388349b22caa0ab0b44188dbb9e002549aadb0590Ian Romanick   static const char *operator_string(enum ast_operators op);
16488349b22caa0ab0b44188dbb9e002549aadb0590Ian Romanick
165fb9fb5f51deca28ed1ec7b71759fb71fc26a0ab6Kenneth Graunke   virtual ir_rvalue *hir(exec_list *instructions,
166fb9fb5f51deca28ed1ec7b71759fb71fc26a0ab6Kenneth Graunke			  struct _mesa_glsl_parse_state *state);
16718238de6c34a1a32c452f1006ed13d8adc1bc9d7Ian Romanick
168a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   virtual void print(void) const;
169a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick
170a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   enum ast_operators oper;
171a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick
172a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   ast_expression *subexpressions[3];
173a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick
174a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   union {
175a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick      char *identifier;
176a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick      int int_constant;
177a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick      float float_constant;
178a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick      unsigned uint_constant;
179a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick      int bool_constant;
180a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   } primary_expression;
181a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick
182a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick
183a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   /**
184a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick    * List of expressions for an \c ast_sequence.
185a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick    */
186a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   struct simple_node expressions;
187a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick};
188a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick
18988349b22caa0ab0b44188dbb9e002549aadb0590Ian Romanickclass ast_expression_bin : public ast_expression {
19088349b22caa0ab0b44188dbb9e002549aadb0590Ian Romanickpublic:
19188349b22caa0ab0b44188dbb9e002549aadb0590Ian Romanick   ast_expression_bin(int oper, ast_expression *, ast_expression *);
19288349b22caa0ab0b44188dbb9e002549aadb0590Ian Romanick
19388349b22caa0ab0b44188dbb9e002549aadb0590Ian Romanick   virtual void print(void) const;
19488349b22caa0ab0b44188dbb9e002549aadb0590Ian Romanick};
19588349b22caa0ab0b44188dbb9e002549aadb0590Ian Romanick
1967cfddf19413ef61fcf1450bd61e9ece4cf1735a4Ian Romanick/**
1977cfddf19413ef61fcf1450bd61e9ece4cf1735a4Ian Romanick * Subclass of expressions for function calls
1987cfddf19413ef61fcf1450bd61e9ece4cf1735a4Ian Romanick */
1997cfddf19413ef61fcf1450bd61e9ece4cf1735a4Ian Romanickclass ast_function_expression : public ast_expression {
2007cfddf19413ef61fcf1450bd61e9ece4cf1735a4Ian Romanickpublic:
2013821761e45c455374c9fdb4cd02104f420373360Ian Romanick   ast_function_expression(ast_expression *callee)
2023821761e45c455374c9fdb4cd02104f420373360Ian Romanick      : ast_expression(ast_function_call, callee,
2033821761e45c455374c9fdb4cd02104f420373360Ian Romanick		       NULL, NULL),
2043821761e45c455374c9fdb4cd02104f420373360Ian Romanick	cons(false)
2057cfddf19413ef61fcf1450bd61e9ece4cf1735a4Ian Romanick   {
2067cfddf19413ef61fcf1450bd61e9ece4cf1735a4Ian Romanick      /* empty */
2077cfddf19413ef61fcf1450bd61e9ece4cf1735a4Ian Romanick   }
2087cfddf19413ef61fcf1450bd61e9ece4cf1735a4Ian Romanick
2093821761e45c455374c9fdb4cd02104f420373360Ian Romanick   ast_function_expression(class ast_type_specifier *type)
2103821761e45c455374c9fdb4cd02104f420373360Ian Romanick      : ast_expression(ast_function_call, (ast_expression *) type,
2113821761e45c455374c9fdb4cd02104f420373360Ian Romanick		       NULL, NULL),
2123821761e45c455374c9fdb4cd02104f420373360Ian Romanick	cons(true)
2133821761e45c455374c9fdb4cd02104f420373360Ian Romanick   {
2143821761e45c455374c9fdb4cd02104f420373360Ian Romanick      /* empty */
2153821761e45c455374c9fdb4cd02104f420373360Ian Romanick   }
2163821761e45c455374c9fdb4cd02104f420373360Ian Romanick
2173821761e45c455374c9fdb4cd02104f420373360Ian Romanick   bool is_constructor() const
2183821761e45c455374c9fdb4cd02104f420373360Ian Romanick   {
2193821761e45c455374c9fdb4cd02104f420373360Ian Romanick      return cons;
2203821761e45c455374c9fdb4cd02104f420373360Ian Romanick   }
2217cfddf19413ef61fcf1450bd61e9ece4cf1735a4Ian Romanick
222fb9fb5f51deca28ed1ec7b71759fb71fc26a0ab6Kenneth Graunke   virtual ir_rvalue *hir(exec_list *instructions,
223fb9fb5f51deca28ed1ec7b71759fb71fc26a0ab6Kenneth Graunke			  struct _mesa_glsl_parse_state *state);
2243821761e45c455374c9fdb4cd02104f420373360Ian Romanick
2253821761e45c455374c9fdb4cd02104f420373360Ian Romanickprivate:
2263821761e45c455374c9fdb4cd02104f420373360Ian Romanick   /**
2273821761e45c455374c9fdb4cd02104f420373360Ian Romanick    * Is this function call actually a constructor?
2283821761e45c455374c9fdb4cd02104f420373360Ian Romanick    */
2293821761e45c455374c9fdb4cd02104f420373360Ian Romanick   bool cons;
2307cfddf19413ef61fcf1450bd61e9ece4cf1735a4Ian Romanick};
2317cfddf19413ef61fcf1450bd61e9ece4cf1735a4Ian Romanick
23288349b22caa0ab0b44188dbb9e002549aadb0590Ian Romanick
233a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick/**
234a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick * Number of possible operators for an ast_expression
235a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick *
236a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick * This is done as a define instead of as an additional value in the enum so
237a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick * that the compiler won't generate spurious messages like "warning:
238a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick * enumeration value ‘ast_num_operators’ not handled in switch"
239a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick */
240a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick#define AST_NUM_OPERATORS (ast_sequence + 1)
241a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick
242a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick
243a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanickclass ast_compound_statement : public ast_node {
244a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanickpublic:
245a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   ast_compound_statement(int new_scope, ast_node *statements);
246a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   virtual void print(void) const;
247a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick
248fb9fb5f51deca28ed1ec7b71759fb71fc26a0ab6Kenneth Graunke   virtual ir_rvalue *hir(exec_list *instructions,
249fb9fb5f51deca28ed1ec7b71759fb71fc26a0ab6Kenneth Graunke			  struct _mesa_glsl_parse_state *state);
25018238de6c34a1a32c452f1006ed13d8adc1bc9d7Ian Romanick
251a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   int new_scope;
252a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   struct simple_node statements;
253a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick};
254a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick
255a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanickclass ast_declaration : public ast_node {
256a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanickpublic:
257a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   ast_declaration(char *identifier, int is_array, ast_expression *array_size,
258a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick		   ast_expression *initializer);
259a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   virtual void print(void) const;
260a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick
261a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   char *identifier;
262a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick
263a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   int is_array;
264a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   ast_expression *array_size;
265a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick
266a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   ast_expression *initializer;
267a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick};
268a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick
269a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick
270a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanickenum {
271a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   ast_precision_high = 0, /**< Default precision. */
272a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   ast_precision_medium,
273a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   ast_precision_low
274a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick};
275a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick
276a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanickstruct ast_type_qualifier {
277a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   unsigned invariant:1;
278a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   unsigned constant:1;
279a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   unsigned attribute:1;
280a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   unsigned varying:1;
281a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   unsigned in:1;
282a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   unsigned out:1;
283a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   unsigned centroid:1;
284a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   unsigned uniform:1;
285a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   unsigned smooth:1;
286a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   unsigned flat:1;
287a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   unsigned noperspective:1;
288a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick};
289a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick
290a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanickclass ast_struct_specifier : public ast_node {
291a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanickpublic:
292a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   ast_struct_specifier(char *identifier, ast_node *declarator_list);
293a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   virtual void print(void) const;
294a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick
295a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   char *name;
296a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   struct simple_node declarations;
297a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick};
298a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick
299a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick
300a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanickenum ast_types {
301a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   ast_void,
302a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   ast_float,
303a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   ast_int,
304a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   ast_uint,
305a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   ast_bool,
306a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   ast_vec2,
307a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   ast_vec3,
308a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   ast_vec4,
309a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   ast_bvec2,
310a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   ast_bvec3,
311a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   ast_bvec4,
312a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   ast_ivec2,
313a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   ast_ivec3,
314a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   ast_ivec4,
315a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   ast_uvec2,
316a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   ast_uvec3,
317a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   ast_uvec4,
318a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   ast_mat2,
319a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   ast_mat2x3,
320a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   ast_mat2x4,
321a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   ast_mat3x2,
322a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   ast_mat3,
323a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   ast_mat3x4,
324a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   ast_mat4x2,
325a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   ast_mat4x3,
326a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   ast_mat4,
327a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   ast_sampler1d,
328a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   ast_sampler2d,
329a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   ast_sampler3d,
330a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   ast_samplercube,
331a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   ast_sampler1dshadow,
332a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   ast_sampler2dshadow,
333a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   ast_samplercubeshadow,
334a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   ast_sampler1darray,
335a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   ast_sampler2darray,
336a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   ast_sampler1darrayshadow,
337a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   ast_sampler2darrayshadow,
338a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   ast_isampler1d,
339a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   ast_isampler2d,
340a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   ast_isampler3d,
341a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   ast_isamplercube,
342a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   ast_isampler1darray,
343a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   ast_isampler2darray,
344a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   ast_usampler1d,
345a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   ast_usampler2d,
346a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   ast_usampler3d,
347a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   ast_usamplercube,
348a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   ast_usampler1darray,
349a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   ast_usampler2darray,
350a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick
351a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   ast_struct,
352a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   ast_type_name
353a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick};
354a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick
355a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick
356a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanickclass ast_type_specifier : public ast_node {
357a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanickpublic:
358a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   ast_type_specifier(int specifier);
359a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick
360ed85a5dd4b36f4a583fc321b6d8d49a050d48678Ian Romanick   /** Construct a type specifier from a type name */
361ed85a5dd4b36f4a583fc321b6d8d49a050d48678Ian Romanick   ast_type_specifier(const char *name)
362ed85a5dd4b36f4a583fc321b6d8d49a050d48678Ian Romanick      : type_specifier(ast_type_name), type_name(name), structure(NULL),
363ed85a5dd4b36f4a583fc321b6d8d49a050d48678Ian Romanick	is_array(false), array_size(NULL), precision(ast_precision_high)
364ed85a5dd4b36f4a583fc321b6d8d49a050d48678Ian Romanick   {
365ed85a5dd4b36f4a583fc321b6d8d49a050d48678Ian Romanick      /* empty */
366ed85a5dd4b36f4a583fc321b6d8d49a050d48678Ian Romanick   }
367ed85a5dd4b36f4a583fc321b6d8d49a050d48678Ian Romanick
368ed85a5dd4b36f4a583fc321b6d8d49a050d48678Ian Romanick   /** Construct a type specifier from a structure definition */
369ed85a5dd4b36f4a583fc321b6d8d49a050d48678Ian Romanick   ast_type_specifier(ast_struct_specifier *s)
370ed85a5dd4b36f4a583fc321b6d8d49a050d48678Ian Romanick      : type_specifier(ast_struct), type_name(s->name), structure(s),
371ed85a5dd4b36f4a583fc321b6d8d49a050d48678Ian Romanick	is_array(false), array_size(NULL), precision(ast_precision_high)
372ed85a5dd4b36f4a583fc321b6d8d49a050d48678Ian Romanick   {
373ed85a5dd4b36f4a583fc321b6d8d49a050d48678Ian Romanick      /* empty */
374ed85a5dd4b36f4a583fc321b6d8d49a050d48678Ian Romanick   }
375ed85a5dd4b36f4a583fc321b6d8d49a050d48678Ian Romanick
376a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   virtual void print(void) const;
377a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick
378a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   enum ast_types type_specifier;
379a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick
3807f9d30974317a4050fb8990ce1a3eebbb190483aIan Romanick   const char *type_name;
381a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   ast_struct_specifier *structure;
382a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick
383a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   int is_array;
384a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   ast_expression *array_size;
385a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick
386a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   unsigned precision:2;
387a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick};
388a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick
389a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick
390a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanickclass ast_fully_specified_type : public ast_node {
391a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanickpublic:
392a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   virtual void print(void) const;
393a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick
394a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   ast_type_qualifier qualifier;
395a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   ast_type_specifier *specifier;
396a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick};
397a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick
398a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick
399a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanickclass ast_declarator_list : public ast_node {
400a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanickpublic:
401a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   ast_declarator_list(ast_fully_specified_type *);
402a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   virtual void print(void) const;
403a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick
404fb9fb5f51deca28ed1ec7b71759fb71fc26a0ab6Kenneth Graunke   virtual ir_rvalue *hir(exec_list *instructions,
405fb9fb5f51deca28ed1ec7b71759fb71fc26a0ab6Kenneth Graunke			  struct _mesa_glsl_parse_state *state);
40618238de6c34a1a32c452f1006ed13d8adc1bc9d7Ian Romanick
407a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   ast_fully_specified_type *type;
408a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   struct simple_node declarations;
409a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick
410a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   /**
411a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick    * Special flag for vertex shader "invariant" declarations.
412a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick    *
413a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick    * Vertex shaders can contain "invariant" variable redeclarations that do
414a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick    * not include a type.  For example, "invariant gl_Position;".  This flag
415a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick    * is used to note these cases when no type is specified.
416a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick    */
417a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   int invariant;
418a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick};
419a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick
420a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick
421a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanickclass ast_parameter_declarator : public ast_node {
422a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanickpublic:
423a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   virtual void print(void) const;
424a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick
425fb9fb5f51deca28ed1ec7b71759fb71fc26a0ab6Kenneth Graunke   virtual ir_rvalue *hir(exec_list *instructions,
426fb9fb5f51deca28ed1ec7b71759fb71fc26a0ab6Kenneth Graunke			  struct _mesa_glsl_parse_state *state);
42718238de6c34a1a32c452f1006ed13d8adc1bc9d7Ian Romanick
428a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   ast_fully_specified_type *type;
429a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   char *identifier;
430a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   int is_array;
431a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   ast_expression *array_size;
432a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick};
433a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick
434a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick
435a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanickclass ast_function : public ast_node {
436a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanickpublic:
437a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   ast_function(void);
438a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick
439a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   virtual void print(void) const;
440a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick
441a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   ast_fully_specified_type *return_type;
442a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   char *identifier;
443a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick
444a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   struct simple_node parameters;
445a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick};
446a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick
447a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick
448a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanickclass ast_declaration_statement : public ast_node {
449a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanickpublic:
450a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   ast_declaration_statement(void);
451a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick
452a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   enum {
453a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick      ast_function,
454a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick      ast_declaration,
455a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick      ast_precision
456a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   } mode;
457a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick
458a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   union {
459a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick      class ast_function *function;
460a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick      ast_declarator_list *declarator;
461a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick      ast_type_specifier *type;
462a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick      ast_node *node;
463a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   } declaration;
464a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick};
465a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick
466a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick
467a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanickclass ast_expression_statement : public ast_node {
468a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanickpublic:
469a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   ast_expression_statement(ast_expression *);
470a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   virtual void print(void) const;
471a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick
472fb9fb5f51deca28ed1ec7b71759fb71fc26a0ab6Kenneth Graunke   virtual ir_rvalue *hir(exec_list *instructions,
473fb9fb5f51deca28ed1ec7b71759fb71fc26a0ab6Kenneth Graunke			  struct _mesa_glsl_parse_state *state);
47418238de6c34a1a32c452f1006ed13d8adc1bc9d7Ian Romanick
475a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   ast_expression *expression;
476a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick};
477a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick
478a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick
479a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanickclass ast_case_label : public ast_node {
480a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanickpublic:
481a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick
482a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   /**
483a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick    * An expression of NULL means 'default'.
484a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick    */
485a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   ast_expression *expression;
486a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick};
487a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick
488a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanickclass ast_selection_statement : public ast_node {
489a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanickpublic:
490a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   ast_selection_statement(ast_expression *condition,
491a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick			   ast_node *then_statement,
492a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick			   ast_node *else_statement);
493a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   virtual void print(void) const;
494a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick
4953c6fea3048a0d9add2fec621d30c32f3519d8868Ian Romanick   virtual ir_rvalue *hir(exec_list *instructions,
4963c6fea3048a0d9add2fec621d30c32f3519d8868Ian Romanick			  struct _mesa_glsl_parse_state *state);
4973c6fea3048a0d9add2fec621d30c32f3519d8868Ian Romanick
498a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   ast_expression *condition;
499a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   ast_node *then_statement;
500a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   ast_node *else_statement;
501a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick};
502a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick
503a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick
504a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanickclass ast_switch_statement : public ast_node {
505a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanickpublic:
506a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   ast_expression *expression;
507a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   struct simple_node statements;
508a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick};
509a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick
510a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanickclass ast_iteration_statement : public ast_node {
511a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanickpublic:
512a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   ast_iteration_statement(int mode, ast_node *init, ast_node *condition,
513a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick			   ast_expression *rest_expression, ast_node *body);
514a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick
515a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   virtual void print(void) const;
516a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick
517a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   enum ast_iteration_modes {
518a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick      ast_for,
519a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick      ast_while,
520a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick      ast_do_while
521a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   } mode;
522a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick
523a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick
524a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   ast_node *init_statement;
525a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   ast_node *condition;
526a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   ast_expression *rest_expression;
527a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick
528a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   ast_node *body;
529a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick};
530a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick
531a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick
532a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanickclass ast_jump_statement : public ast_node {
533a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanickpublic:
534a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   ast_jump_statement(int mode, ast_expression *return_value);
535a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   virtual void print(void) const;
536a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick
537fb9fb5f51deca28ed1ec7b71759fb71fc26a0ab6Kenneth Graunke   virtual ir_rvalue *hir(exec_list *instructions,
538fb9fb5f51deca28ed1ec7b71759fb71fc26a0ab6Kenneth Graunke			  struct _mesa_glsl_parse_state *state);
53916a246c049fa3c8d7841f87c8defdd0f26f302eeIan Romanick
540a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   enum ast_jump_modes {
541a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick      ast_continue,
542a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick      ast_break,
543a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick      ast_return,
544a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick      ast_discard
545a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   } mode;
546a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick
547a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   ast_expression *opt_return_value;
548a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick};
549a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick
550a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick
551a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanickclass ast_function_definition : public ast_node {
552a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanickpublic:
553a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   virtual void print(void) const;
554a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick
555fb9fb5f51deca28ed1ec7b71759fb71fc26a0ab6Kenneth Graunke   virtual ir_rvalue *hir(exec_list *instructions,
556fb9fb5f51deca28ed1ec7b71759fb71fc26a0ab6Kenneth Graunke			  struct _mesa_glsl_parse_state *state);
55718238de6c34a1a32c452f1006ed13d8adc1bc9d7Ian Romanick
558a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   ast_function *prototype;
559a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   ast_compound_statement *body;
560a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick};
561a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick
562a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick
563d949a9afb0a01e9678a4343f66b056b41a2e48a9Ian Romanickextern void
564d949a9afb0a01e9678a4343f66b056b41a2e48a9Ian Romanick_mesa_ast_to_hir(exec_list *instructions, struct _mesa_glsl_parse_state *state);
565d949a9afb0a01e9678a4343f66b056b41a2e48a9Ian Romanick
566fb9fb5f51deca28ed1ec7b71759fb71fc26a0ab6Kenneth Graunkeextern struct ir_rvalue *
567a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick_mesa_ast_field_selection_to_hir(const struct ast_expression *expr,
5680044e7edcea22d2456c051a1c4b744a26960ad27Ian Romanick				 exec_list *instructions,
569a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick				 struct _mesa_glsl_parse_state *state);
570a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick
571a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick#endif /* AST_H */
572