ast.h revision 8c46ed24906ee10dd2f2cfaf4cf9803eca1ba523
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    */
71ebfdef7a83966341c27f44c83366419d4a2f7a60Kenneth Graunke   void set_location(const struct YYLTYPE &locp)
72a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   {
73ebfdef7a83966341c27f44c83366419d4a2f7a60Kenneth Graunke      this->location.source = locp.source;
74ebfdef7a83966341c27f44c83366419d4a2f7a60Kenneth Graunke      this->location.line = locp.first_line;
75ebfdef7a83966341c27f44c83366419d4a2f7a60Kenneth Graunke      this->location.column = locp.first_column;
76a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   }
77a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick
78a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   struct {
79a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick      unsigned source;
80a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick      unsigned line;
81a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick      unsigned column;
82a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   } location;
83a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick
84a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanickprotected:
85a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   ast_node(void);
86a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick};
87a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick
88a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick
89a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanickenum ast_operators {
90a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   ast_assign,
91a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   ast_plus,        /**< Unary + operator. */
92a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   ast_neg,
93a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   ast_add,
94a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   ast_sub,
95a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   ast_mul,
96a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   ast_div,
97a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   ast_mod,
98a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   ast_lshift,
99a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   ast_rshift,
100a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   ast_less,
101a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   ast_greater,
102a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   ast_lequal,
103a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   ast_gequal,
104a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   ast_equal,
105a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   ast_nequal,
106a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   ast_bit_and,
107a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   ast_bit_xor,
108a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   ast_bit_or,
109a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   ast_bit_not,
110a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   ast_logic_and,
111a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   ast_logic_xor,
112a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   ast_logic_or,
113a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   ast_logic_not,
114a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick
115a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   ast_mul_assign,
116a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   ast_div_assign,
117a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   ast_mod_assign,
118a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   ast_add_assign,
119a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   ast_sub_assign,
120a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   ast_ls_assign,
121a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   ast_rs_assign,
122a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   ast_and_assign,
123a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   ast_xor_assign,
124a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   ast_or_assign,
125a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick
126a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   ast_conditional,
127a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick
128a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   ast_pre_inc,
129a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   ast_pre_dec,
130a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   ast_post_inc,
131a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   ast_post_dec,
132a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   ast_field_selection,
133a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   ast_array_index,
134a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick
135a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   ast_function_call,
136a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick
137a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   ast_identifier,
138a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   ast_int_constant,
139a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   ast_uint_constant,
140a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   ast_float_constant,
141a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   ast_bool_constant,
142a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick
143a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   ast_sequence
144a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick};
145a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick
146a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanickclass ast_expression : public ast_node {
147a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanickpublic:
148a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   ast_expression(int oper, ast_expression *,
149a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick		  ast_expression *, ast_expression *);
150a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick
151d10fe19495191072d39689337700b69e62252bf1Ian Romanick   ast_expression(const char *identifier) :
152d10fe19495191072d39689337700b69e62252bf1Ian Romanick      oper(ast_identifier)
153d10fe19495191072d39689337700b69e62252bf1Ian Romanick   {
154d10fe19495191072d39689337700b69e62252bf1Ian Romanick      subexpressions[0] = NULL;
155d10fe19495191072d39689337700b69e62252bf1Ian Romanick      subexpressions[1] = NULL;
156d10fe19495191072d39689337700b69e62252bf1Ian Romanick      subexpressions[2] = NULL;
157d10fe19495191072d39689337700b69e62252bf1Ian Romanick      primary_expression.identifier = (char *) identifier;
158d10fe19495191072d39689337700b69e62252bf1Ian Romanick   }
159d10fe19495191072d39689337700b69e62252bf1Ian Romanick
16088349b22caa0ab0b44188dbb9e002549aadb0590Ian Romanick   static const char *operator_string(enum ast_operators op);
16188349b22caa0ab0b44188dbb9e002549aadb0590Ian Romanick
162fb9fb5f51deca28ed1ec7b71759fb71fc26a0ab6Kenneth Graunke   virtual ir_rvalue *hir(exec_list *instructions,
163fb9fb5f51deca28ed1ec7b71759fb71fc26a0ab6Kenneth Graunke			  struct _mesa_glsl_parse_state *state);
16418238de6c34a1a32c452f1006ed13d8adc1bc9d7Ian Romanick
165a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   virtual void print(void) const;
166a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick
167a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   enum ast_operators oper;
168a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick
169a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   ast_expression *subexpressions[3];
170a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick
171a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   union {
172a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick      char *identifier;
173a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick      int int_constant;
174a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick      float float_constant;
175a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick      unsigned uint_constant;
176a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick      int bool_constant;
177a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   } primary_expression;
178a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick
179a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick
180a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   /**
181a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick    * List of expressions for an \c ast_sequence.
182a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick    */
183a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   struct simple_node expressions;
184a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick};
185a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick
18688349b22caa0ab0b44188dbb9e002549aadb0590Ian Romanickclass ast_expression_bin : public ast_expression {
18788349b22caa0ab0b44188dbb9e002549aadb0590Ian Romanickpublic:
18888349b22caa0ab0b44188dbb9e002549aadb0590Ian Romanick   ast_expression_bin(int oper, ast_expression *, ast_expression *);
18988349b22caa0ab0b44188dbb9e002549aadb0590Ian Romanick
19088349b22caa0ab0b44188dbb9e002549aadb0590Ian Romanick   virtual void print(void) const;
19188349b22caa0ab0b44188dbb9e002549aadb0590Ian Romanick};
19288349b22caa0ab0b44188dbb9e002549aadb0590Ian Romanick
1937cfddf19413ef61fcf1450bd61e9ece4cf1735a4Ian Romanick/**
1947cfddf19413ef61fcf1450bd61e9ece4cf1735a4Ian Romanick * Subclass of expressions for function calls
1957cfddf19413ef61fcf1450bd61e9ece4cf1735a4Ian Romanick */
1967cfddf19413ef61fcf1450bd61e9ece4cf1735a4Ian Romanickclass ast_function_expression : public ast_expression {
1977cfddf19413ef61fcf1450bd61e9ece4cf1735a4Ian Romanickpublic:
1983821761e45c455374c9fdb4cd02104f420373360Ian Romanick   ast_function_expression(ast_expression *callee)
1993821761e45c455374c9fdb4cd02104f420373360Ian Romanick      : ast_expression(ast_function_call, callee,
2003821761e45c455374c9fdb4cd02104f420373360Ian Romanick		       NULL, NULL),
2013821761e45c455374c9fdb4cd02104f420373360Ian Romanick	cons(false)
2027cfddf19413ef61fcf1450bd61e9ece4cf1735a4Ian Romanick   {
2037cfddf19413ef61fcf1450bd61e9ece4cf1735a4Ian Romanick      /* empty */
2047cfddf19413ef61fcf1450bd61e9ece4cf1735a4Ian Romanick   }
2057cfddf19413ef61fcf1450bd61e9ece4cf1735a4Ian Romanick
2063821761e45c455374c9fdb4cd02104f420373360Ian Romanick   ast_function_expression(class ast_type_specifier *type)
2073821761e45c455374c9fdb4cd02104f420373360Ian Romanick      : ast_expression(ast_function_call, (ast_expression *) type,
2083821761e45c455374c9fdb4cd02104f420373360Ian Romanick		       NULL, NULL),
2093821761e45c455374c9fdb4cd02104f420373360Ian Romanick	cons(true)
2103821761e45c455374c9fdb4cd02104f420373360Ian Romanick   {
2113821761e45c455374c9fdb4cd02104f420373360Ian Romanick      /* empty */
2123821761e45c455374c9fdb4cd02104f420373360Ian Romanick   }
2133821761e45c455374c9fdb4cd02104f420373360Ian Romanick
2143821761e45c455374c9fdb4cd02104f420373360Ian Romanick   bool is_constructor() const
2153821761e45c455374c9fdb4cd02104f420373360Ian Romanick   {
2163821761e45c455374c9fdb4cd02104f420373360Ian Romanick      return cons;
2173821761e45c455374c9fdb4cd02104f420373360Ian Romanick   }
2187cfddf19413ef61fcf1450bd61e9ece4cf1735a4Ian Romanick
219fb9fb5f51deca28ed1ec7b71759fb71fc26a0ab6Kenneth Graunke   virtual ir_rvalue *hir(exec_list *instructions,
220fb9fb5f51deca28ed1ec7b71759fb71fc26a0ab6Kenneth Graunke			  struct _mesa_glsl_parse_state *state);
2213821761e45c455374c9fdb4cd02104f420373360Ian Romanick
2223821761e45c455374c9fdb4cd02104f420373360Ian Romanickprivate:
2233821761e45c455374c9fdb4cd02104f420373360Ian Romanick   /**
2243821761e45c455374c9fdb4cd02104f420373360Ian Romanick    * Is this function call actually a constructor?
2253821761e45c455374c9fdb4cd02104f420373360Ian Romanick    */
2263821761e45c455374c9fdb4cd02104f420373360Ian Romanick   bool cons;
2277cfddf19413ef61fcf1450bd61e9ece4cf1735a4Ian Romanick};
2287cfddf19413ef61fcf1450bd61e9ece4cf1735a4Ian Romanick
22988349b22caa0ab0b44188dbb9e002549aadb0590Ian Romanick
230a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick/**
231a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick * Number of possible operators for an ast_expression
232a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick *
233a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick * This is done as a define instead of as an additional value in the enum so
234a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick * that the compiler won't generate spurious messages like "warning:
235a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick * enumeration value ‘ast_num_operators’ not handled in switch"
236a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick */
237a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick#define AST_NUM_OPERATORS (ast_sequence + 1)
238a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick
239a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick
240a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanickclass ast_compound_statement : public ast_node {
241a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanickpublic:
242a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   ast_compound_statement(int new_scope, ast_node *statements);
243a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   virtual void print(void) const;
244a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick
245fb9fb5f51deca28ed1ec7b71759fb71fc26a0ab6Kenneth Graunke   virtual ir_rvalue *hir(exec_list *instructions,
246fb9fb5f51deca28ed1ec7b71759fb71fc26a0ab6Kenneth Graunke			  struct _mesa_glsl_parse_state *state);
24718238de6c34a1a32c452f1006ed13d8adc1bc9d7Ian Romanick
248a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   int new_scope;
249a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   struct simple_node statements;
250a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick};
251a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick
252a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanickclass ast_declaration : public ast_node {
253a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanickpublic:
254a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   ast_declaration(char *identifier, int is_array, ast_expression *array_size,
255a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick		   ast_expression *initializer);
256a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   virtual void print(void) const;
257a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick
258a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   char *identifier;
259a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick
260a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   int is_array;
261a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   ast_expression *array_size;
262a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick
263a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   ast_expression *initializer;
264a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick};
265a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick
266a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick
267a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanickenum {
268a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   ast_precision_high = 0, /**< Default precision. */
269a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   ast_precision_medium,
270a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   ast_precision_low
271a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick};
272a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick
273a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanickstruct ast_type_qualifier {
274a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   unsigned invariant:1;
275a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   unsigned constant:1;
276a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   unsigned attribute:1;
277a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   unsigned varying:1;
278a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   unsigned in:1;
279a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   unsigned out:1;
280a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   unsigned centroid:1;
281a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   unsigned uniform:1;
282a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   unsigned smooth:1;
283a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   unsigned flat:1;
284a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   unsigned noperspective:1;
285a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick};
286a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick
287a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanickclass ast_struct_specifier : public ast_node {
288a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanickpublic:
289a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   ast_struct_specifier(char *identifier, ast_node *declarator_list);
290a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   virtual void print(void) const;
291a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick
292a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   char *name;
293a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   struct simple_node declarations;
294a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick};
295a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick
296a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick
297a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanickenum ast_types {
298a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   ast_void,
299a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   ast_float,
300a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   ast_int,
301a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   ast_uint,
302a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   ast_bool,
303a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   ast_vec2,
304a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   ast_vec3,
305a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   ast_vec4,
306a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   ast_bvec2,
307a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   ast_bvec3,
308a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   ast_bvec4,
309a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   ast_ivec2,
310a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   ast_ivec3,
311a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   ast_ivec4,
312a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   ast_uvec2,
313a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   ast_uvec3,
314a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   ast_uvec4,
315a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   ast_mat2,
316a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   ast_mat2x3,
317a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   ast_mat2x4,
318a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   ast_mat3x2,
319a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   ast_mat3,
320a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   ast_mat3x4,
321a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   ast_mat4x2,
322a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   ast_mat4x3,
323a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   ast_mat4,
324a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   ast_sampler1d,
325a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   ast_sampler2d,
32606e5308e29e42d22a72247abfdd260bc9ba145b8Ian Romanick   ast_sampler2drect,
327a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   ast_sampler3d,
328a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   ast_samplercube,
329a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   ast_sampler1dshadow,
330a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   ast_sampler2dshadow,
33106e5308e29e42d22a72247abfdd260bc9ba145b8Ian Romanick   ast_sampler2drectshadow,
332a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   ast_samplercubeshadow,
333a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   ast_sampler1darray,
334a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   ast_sampler2darray,
335a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   ast_sampler1darrayshadow,
336a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   ast_sampler2darrayshadow,
337a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   ast_isampler1d,
338a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   ast_isampler2d,
339a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   ast_isampler3d,
340a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   ast_isamplercube,
341a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   ast_isampler1darray,
342a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   ast_isampler2darray,
343a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   ast_usampler1d,
344a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   ast_usampler2d,
345a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   ast_usampler3d,
346a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   ast_usamplercube,
347a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   ast_usampler1darray,
348a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   ast_usampler2darray,
349a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick
350a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   ast_struct,
351a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   ast_type_name
352a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick};
353a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick
354a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick
355a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanickclass ast_type_specifier : public ast_node {
356a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanickpublic:
357a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   ast_type_specifier(int specifier);
358a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick
359ed85a5dd4b36f4a583fc321b6d8d49a050d48678Ian Romanick   /** Construct a type specifier from a type name */
360ed85a5dd4b36f4a583fc321b6d8d49a050d48678Ian Romanick   ast_type_specifier(const char *name)
361ed85a5dd4b36f4a583fc321b6d8d49a050d48678Ian Romanick      : type_specifier(ast_type_name), type_name(name), structure(NULL),
362ed85a5dd4b36f4a583fc321b6d8d49a050d48678Ian Romanick	is_array(false), array_size(NULL), precision(ast_precision_high)
363ed85a5dd4b36f4a583fc321b6d8d49a050d48678Ian Romanick   {
364ed85a5dd4b36f4a583fc321b6d8d49a050d48678Ian Romanick      /* empty */
365ed85a5dd4b36f4a583fc321b6d8d49a050d48678Ian Romanick   }
366ed85a5dd4b36f4a583fc321b6d8d49a050d48678Ian Romanick
367ed85a5dd4b36f4a583fc321b6d8d49a050d48678Ian Romanick   /** Construct a type specifier from a structure definition */
368ed85a5dd4b36f4a583fc321b6d8d49a050d48678Ian Romanick   ast_type_specifier(ast_struct_specifier *s)
369ed85a5dd4b36f4a583fc321b6d8d49a050d48678Ian Romanick      : type_specifier(ast_struct), type_name(s->name), structure(s),
370ed85a5dd4b36f4a583fc321b6d8d49a050d48678Ian Romanick	is_array(false), array_size(NULL), precision(ast_precision_high)
371ed85a5dd4b36f4a583fc321b6d8d49a050d48678Ian Romanick   {
372ed85a5dd4b36f4a583fc321b6d8d49a050d48678Ian Romanick      /* empty */
373ed85a5dd4b36f4a583fc321b6d8d49a050d48678Ian Romanick   }
374ed85a5dd4b36f4a583fc321b6d8d49a050d48678Ian Romanick
375d612a127ccf12c11204f7f72a332de12f58f85a2Ian Romanick   const struct glsl_type *glsl_type(const char **name,
376d612a127ccf12c11204f7f72a332de12f58f85a2Ian Romanick				     struct _mesa_glsl_parse_state *state)
377d612a127ccf12c11204f7f72a332de12f58f85a2Ian Romanick      const;
378d612a127ccf12c11204f7f72a332de12f58f85a2Ian Romanick
379a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   virtual void print(void) const;
380a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick
381a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   enum ast_types type_specifier;
382a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick
3837f9d30974317a4050fb8990ce1a3eebbb190483aIan Romanick   const char *type_name;
384a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   ast_struct_specifier *structure;
385a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick
386a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   int is_array;
387a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   ast_expression *array_size;
388a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick
389a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   unsigned precision:2;
390a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick};
391a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick
392a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick
393a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanickclass ast_fully_specified_type : public ast_node {
394a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanickpublic:
395a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   virtual void print(void) const;
396a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick
397a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   ast_type_qualifier qualifier;
398a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   ast_type_specifier *specifier;
399a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick};
400a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick
401a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick
402a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanickclass ast_declarator_list : public ast_node {
403a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanickpublic:
404a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   ast_declarator_list(ast_fully_specified_type *);
405a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   virtual void print(void) const;
406a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick
407fb9fb5f51deca28ed1ec7b71759fb71fc26a0ab6Kenneth Graunke   virtual ir_rvalue *hir(exec_list *instructions,
408fb9fb5f51deca28ed1ec7b71759fb71fc26a0ab6Kenneth Graunke			  struct _mesa_glsl_parse_state *state);
40918238de6c34a1a32c452f1006ed13d8adc1bc9d7Ian Romanick
410a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   ast_fully_specified_type *type;
411a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   struct simple_node declarations;
412a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick
413a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   /**
414a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick    * Special flag for vertex shader "invariant" declarations.
415a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick    *
416a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick    * Vertex shaders can contain "invariant" variable redeclarations that do
417a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick    * not include a type.  For example, "invariant gl_Position;".  This flag
418a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick    * is used to note these cases when no type is specified.
419a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick    */
420a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   int invariant;
421a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick};
422a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick
423a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick
424a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanickclass ast_parameter_declarator : public ast_node {
425a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanickpublic:
426a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   virtual void print(void) const;
427a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick
428fb9fb5f51deca28ed1ec7b71759fb71fc26a0ab6Kenneth Graunke   virtual ir_rvalue *hir(exec_list *instructions,
429fb9fb5f51deca28ed1ec7b71759fb71fc26a0ab6Kenneth Graunke			  struct _mesa_glsl_parse_state *state);
43018238de6c34a1a32c452f1006ed13d8adc1bc9d7Ian Romanick
431a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   ast_fully_specified_type *type;
432a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   char *identifier;
433a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   int is_array;
434a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   ast_expression *array_size;
43545d8a70c12ee6ea956baaf898324a828496382f6Ian Romanick
43645d8a70c12ee6ea956baaf898324a828496382f6Ian Romanick   static void parameters_to_hir(simple_node *ast_parameters,
43745d8a70c12ee6ea956baaf898324a828496382f6Ian Romanick				 bool formal, exec_list *ir_parameters,
43845d8a70c12ee6ea956baaf898324a828496382f6Ian Romanick				 struct _mesa_glsl_parse_state *state);
43945d8a70c12ee6ea956baaf898324a828496382f6Ian Romanick
44045d8a70c12ee6ea956baaf898324a828496382f6Ian Romanickprivate:
44145d8a70c12ee6ea956baaf898324a828496382f6Ian Romanick   /** Is this parameter declaration part of a formal parameter list? */
44245d8a70c12ee6ea956baaf898324a828496382f6Ian Romanick   bool formal_parameter;
443cf37c9e8dad4349e45cb91d36957484fd76ce264Ian Romanick
444cf37c9e8dad4349e45cb91d36957484fd76ce264Ian Romanick   /**
445cf37c9e8dad4349e45cb91d36957484fd76ce264Ian Romanick    * Is this parameter 'void' type?
446cf37c9e8dad4349e45cb91d36957484fd76ce264Ian Romanick    *
447cf37c9e8dad4349e45cb91d36957484fd76ce264Ian Romanick    * This field is set by \c ::hir.
448cf37c9e8dad4349e45cb91d36957484fd76ce264Ian Romanick    */
449cf37c9e8dad4349e45cb91d36957484fd76ce264Ian Romanick   bool is_void;
450a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick};
451a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick
452a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick
453a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanickclass ast_function : public ast_node {
454a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanickpublic:
455a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   ast_function(void);
456a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick
457a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   virtual void print(void) const;
458a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick
45992318a947958892497722772b03c643ebc943294Ian Romanick   virtual ir_rvalue *hir(exec_list *instructions,
46092318a947958892497722772b03c643ebc943294Ian Romanick			  struct _mesa_glsl_parse_state *state);
46192318a947958892497722772b03c643ebc943294Ian Romanick
462a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   ast_fully_specified_type *return_type;
463a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   char *identifier;
464a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick
465a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   struct simple_node parameters;
46692318a947958892497722772b03c643ebc943294Ian Romanick
46792318a947958892497722772b03c643ebc943294Ian Romanickprivate:
46892318a947958892497722772b03c643ebc943294Ian Romanick   /**
46992318a947958892497722772b03c643ebc943294Ian Romanick    * Is this prototype part of the function definition?
47092318a947958892497722772b03c643ebc943294Ian Romanick    *
47192318a947958892497722772b03c643ebc943294Ian Romanick    * Used by ast_function_definition::hir to process the parameters, etc.
47292318a947958892497722772b03c643ebc943294Ian Romanick    * of the function.
47392318a947958892497722772b03c643ebc943294Ian Romanick    *
47492318a947958892497722772b03c643ebc943294Ian Romanick    * \sa ::hir
47592318a947958892497722772b03c643ebc943294Ian Romanick    */
47692318a947958892497722772b03c643ebc943294Ian Romanick   bool is_definition;
47792318a947958892497722772b03c643ebc943294Ian Romanick
47892318a947958892497722772b03c643ebc943294Ian Romanick   /**
47992318a947958892497722772b03c643ebc943294Ian Romanick    * Function signature corresponding to this function prototype instance
48092318a947958892497722772b03c643ebc943294Ian Romanick    *
48192318a947958892497722772b03c643ebc943294Ian Romanick    * Used by ast_function_definition::hir to process the parameters, etc.
48292318a947958892497722772b03c643ebc943294Ian Romanick    * of the function.
48392318a947958892497722772b03c643ebc943294Ian Romanick    *
48492318a947958892497722772b03c643ebc943294Ian Romanick    * \sa ::hir
48592318a947958892497722772b03c643ebc943294Ian Romanick    */
48692318a947958892497722772b03c643ebc943294Ian Romanick   class ir_function_signature *signature;
48792318a947958892497722772b03c643ebc943294Ian Romanick
48892318a947958892497722772b03c643ebc943294Ian Romanick   friend class ast_function_definition;
489a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick};
490a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick
491a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick
492a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanickclass ast_declaration_statement : public ast_node {
493a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanickpublic:
494a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   ast_declaration_statement(void);
495a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick
496a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   enum {
497a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick      ast_function,
498a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick      ast_declaration,
499a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick      ast_precision
500a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   } mode;
501a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick
502a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   union {
503a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick      class ast_function *function;
504a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick      ast_declarator_list *declarator;
505a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick      ast_type_specifier *type;
506a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick      ast_node *node;
507a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   } declaration;
508a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick};
509a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick
510a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick
511a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanickclass ast_expression_statement : public ast_node {
512a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanickpublic:
513a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   ast_expression_statement(ast_expression *);
514a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   virtual void print(void) const;
515a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick
516fb9fb5f51deca28ed1ec7b71759fb71fc26a0ab6Kenneth Graunke   virtual ir_rvalue *hir(exec_list *instructions,
517fb9fb5f51deca28ed1ec7b71759fb71fc26a0ab6Kenneth Graunke			  struct _mesa_glsl_parse_state *state);
51818238de6c34a1a32c452f1006ed13d8adc1bc9d7Ian Romanick
519a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   ast_expression *expression;
520a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick};
521a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick
522a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick
523a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanickclass ast_case_label : public ast_node {
524a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanickpublic:
525a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick
526a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   /**
527a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick    * An expression of NULL means 'default'.
528a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick    */
529a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   ast_expression *expression;
530a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick};
531a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick
532a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanickclass ast_selection_statement : public ast_node {
533a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanickpublic:
534a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   ast_selection_statement(ast_expression *condition,
535a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick			   ast_node *then_statement,
536a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick			   ast_node *else_statement);
537a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   virtual void print(void) const;
538a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick
5393c6fea3048a0d9add2fec621d30c32f3519d8868Ian Romanick   virtual ir_rvalue *hir(exec_list *instructions,
5403c6fea3048a0d9add2fec621d30c32f3519d8868Ian Romanick			  struct _mesa_glsl_parse_state *state);
5413c6fea3048a0d9add2fec621d30c32f3519d8868Ian Romanick
542a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   ast_expression *condition;
543a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   ast_node *then_statement;
544a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   ast_node *else_statement;
545a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick};
546a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick
547a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick
548a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanickclass ast_switch_statement : public ast_node {
549a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanickpublic:
550a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   ast_expression *expression;
551a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   struct simple_node statements;
552a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick};
553a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick
554a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanickclass ast_iteration_statement : public ast_node {
555a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanickpublic:
556a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   ast_iteration_statement(int mode, ast_node *init, ast_node *condition,
557a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick			   ast_expression *rest_expression, ast_node *body);
558a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick
559a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   virtual void print(void) const;
560a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick
5619e7d010ee0ed89f1fe07a06a9d9bb22e15106ae2Ian Romanick   virtual ir_rvalue *hir(exec_list *, struct _mesa_glsl_parse_state *);
5629e7d010ee0ed89f1fe07a06a9d9bb22e15106ae2Ian Romanick
563a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   enum ast_iteration_modes {
564a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick      ast_for,
565a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick      ast_while,
566a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick      ast_do_while
567a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   } mode;
568a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick
569a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick
570a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   ast_node *init_statement;
571a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   ast_node *condition;
572a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   ast_expression *rest_expression;
573a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick
574a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   ast_node *body;
5758c46ed24906ee10dd2f2cfaf4cf9803eca1ba523Ian Romanick
5768c46ed24906ee10dd2f2cfaf4cf9803eca1ba523Ian Romanickprivate:
5778c46ed24906ee10dd2f2cfaf4cf9803eca1ba523Ian Romanick   /**
5788c46ed24906ee10dd2f2cfaf4cf9803eca1ba523Ian Romanick    * Generate IR from the condition of a loop
5798c46ed24906ee10dd2f2cfaf4cf9803eca1ba523Ian Romanick    *
5808c46ed24906ee10dd2f2cfaf4cf9803eca1ba523Ian Romanick    * This is factored out of ::hir because some loops have the condition
5818c46ed24906ee10dd2f2cfaf4cf9803eca1ba523Ian Romanick    * test at the top (for and while), and others have it at the end (do-while).
5828c46ed24906ee10dd2f2cfaf4cf9803eca1ba523Ian Romanick    */
5838c46ed24906ee10dd2f2cfaf4cf9803eca1ba523Ian Romanick   void condition_to_hir(class ir_loop *, struct _mesa_glsl_parse_state *);
584a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick};
585a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick
586a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick
587a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanickclass ast_jump_statement : public ast_node {
588a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanickpublic:
589a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   ast_jump_statement(int mode, ast_expression *return_value);
590a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   virtual void print(void) const;
591a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick
592fb9fb5f51deca28ed1ec7b71759fb71fc26a0ab6Kenneth Graunke   virtual ir_rvalue *hir(exec_list *instructions,
593fb9fb5f51deca28ed1ec7b71759fb71fc26a0ab6Kenneth Graunke			  struct _mesa_glsl_parse_state *state);
59416a246c049fa3c8d7841f87c8defdd0f26f302eeIan Romanick
595a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   enum ast_jump_modes {
596a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick      ast_continue,
597a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick      ast_break,
598a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick      ast_return,
599a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick      ast_discard
600a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   } mode;
601a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick
602a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   ast_expression *opt_return_value;
603a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick};
604a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick
605a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick
606a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanickclass ast_function_definition : public ast_node {
607a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanickpublic:
608a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   virtual void print(void) const;
609a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick
610fb9fb5f51deca28ed1ec7b71759fb71fc26a0ab6Kenneth Graunke   virtual ir_rvalue *hir(exec_list *instructions,
611fb9fb5f51deca28ed1ec7b71759fb71fc26a0ab6Kenneth Graunke			  struct _mesa_glsl_parse_state *state);
61218238de6c34a1a32c452f1006ed13d8adc1bc9d7Ian Romanick
613a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   ast_function *prototype;
614a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   ast_compound_statement *body;
615a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick};
616a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick
617a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick
618d949a9afb0a01e9678a4343f66b056b41a2e48a9Ian Romanickextern void
619d949a9afb0a01e9678a4343f66b056b41a2e48a9Ian Romanick_mesa_ast_to_hir(exec_list *instructions, struct _mesa_glsl_parse_state *state);
620d949a9afb0a01e9678a4343f66b056b41a2e48a9Ian Romanick
621fb9fb5f51deca28ed1ec7b71759fb71fc26a0ab6Kenneth Graunkeextern struct ir_rvalue *
622a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick_mesa_ast_field_selection_to_hir(const struct ast_expression *expr,
6230044e7edcea22d2456c051a1c4b744a26960ad27Ian Romanick				 exec_list *instructions,
624a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick				 struct _mesa_glsl_parse_state *state);
625a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick
626a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick#endif /* AST_H */
627