ast.h revision f633b993b0d11cbc2880707405cf38201a5df61d
1/* -*- c++ -*- */
2/*
3 * Copyright © 2009 Intel Corporation
4 *
5 * Permission is hereby granted, free of charge, to any person obtaining a
6 * copy of this software and associated documentation files (the "Software"),
7 * to deal in the Software without restriction, including without limitation
8 * the rights to use, copy, modify, merge, publish, distribute, sublicense,
9 * and/or sell copies of the Software, and to permit persons to whom the
10 * Software is furnished to do so, subject to the following conditions:
11 *
12 * The above copyright notice and this permission notice (including the next
13 * paragraph) shall be included in all copies or substantial portions of the
14 * Software.
15 *
16 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
17 * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
18 * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL
19 * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
20 * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
21 * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
22 * DEALINGS IN THE SOFTWARE.
23 */
24
25#pragma once
26#ifndef AST_H
27#define AST_H
28
29#include "list.h"
30#include "glsl_parser_extras.h"
31
32struct _mesa_glsl_parse_state;
33
34struct YYLTYPE;
35
36/**
37 * \defgroup AST Abstract syntax tree node definitions
38 *
39 * An abstract syntax tree is generated by the parser.  This is a fairly
40 * direct representation of the gramma derivation for the source program.
41 * No symantic checking is done during the generation of the AST.  Only
42 * syntactic checking is done.  Symantic checking is performed by a later
43 * stage that converts the AST to a more generic intermediate representation.
44 *
45 *@{
46 */
47/**
48 * Base class of all abstract syntax tree nodes
49 */
50class ast_node {
51public:
52   /* Callers of this talloc-based new need not call delete. It's
53    * easier to just talloc_free 'ctx' (or any of its ancestors). */
54   static void* operator new(size_t size, void *ctx)
55   {
56      void *node;
57
58      node = talloc_zero_size(ctx, size);
59      assert(node != NULL);
60
61      return node;
62   }
63
64   /* If the user *does* call delete, that's OK, we will just
65    * talloc_free in that case. */
66   static void operator delete(void *table)
67   {
68      talloc_free(table);
69   }
70
71   /**
72    * Print an AST node in something approximating the original GLSL code
73    */
74   virtual void print(void) const;
75
76   /**
77    * Convert the AST node to the high-level intermediate representation
78    */
79   virtual ir_rvalue *hir(exec_list *instructions,
80			  struct _mesa_glsl_parse_state *state);
81
82   /**
83    * Retrieve the source location of an AST node
84    *
85    * This function is primarily used to get the source position of an AST node
86    * into a form that can be passed to \c _mesa_glsl_error.
87    *
88    * \sa _mesa_glsl_error, ast_node::set_location
89    */
90   struct YYLTYPE get_location(void) const
91   {
92      struct YYLTYPE locp;
93
94      locp.source = this->location.source;
95      locp.first_line = this->location.line;
96      locp.first_column = this->location.column;
97      locp.last_line = locp.first_line;
98      locp.last_column = locp.first_column;
99
100      return locp;
101   }
102
103   /**
104    * Set the source location of an AST node from a parser location
105    *
106    * \sa ast_node::get_location
107    */
108   void set_location(const struct YYLTYPE &locp)
109   {
110      this->location.source = locp.source;
111      this->location.line = locp.first_line;
112      this->location.column = locp.first_column;
113   }
114
115   /**
116    * Source location of the AST node.
117    */
118   struct {
119      unsigned source;    /**< GLSL source number. */
120      unsigned line;      /**< Line number within the source string. */
121      unsigned column;    /**< Column in the line. */
122   } location;
123
124   exec_node link;
125
126protected:
127   /**
128    * The only constructor is protected so that only derived class objects can
129    * be created.
130    */
131   ast_node(void);
132};
133
134
135/**
136 * Operators for AST expression nodes.
137 */
138enum ast_operators {
139   ast_assign,
140   ast_plus,        /**< Unary + operator. */
141   ast_neg,
142   ast_add,
143   ast_sub,
144   ast_mul,
145   ast_div,
146   ast_mod,
147   ast_lshift,
148   ast_rshift,
149   ast_less,
150   ast_greater,
151   ast_lequal,
152   ast_gequal,
153   ast_equal,
154   ast_nequal,
155   ast_bit_and,
156   ast_bit_xor,
157   ast_bit_or,
158   ast_bit_not,
159   ast_logic_and,
160   ast_logic_xor,
161   ast_logic_or,
162   ast_logic_not,
163
164   ast_mul_assign,
165   ast_div_assign,
166   ast_mod_assign,
167   ast_add_assign,
168   ast_sub_assign,
169   ast_ls_assign,
170   ast_rs_assign,
171   ast_and_assign,
172   ast_xor_assign,
173   ast_or_assign,
174
175   ast_conditional,
176
177   ast_pre_inc,
178   ast_pre_dec,
179   ast_post_inc,
180   ast_post_dec,
181   ast_field_selection,
182   ast_array_index,
183
184   ast_function_call,
185
186   ast_identifier,
187   ast_int_constant,
188   ast_uint_constant,
189   ast_float_constant,
190   ast_bool_constant,
191
192   ast_sequence
193};
194
195/**
196 * Representation of any sort of expression.
197 */
198class ast_expression : public ast_node {
199public:
200   ast_expression(int oper, ast_expression *,
201		  ast_expression *, ast_expression *);
202
203   ast_expression(const char *identifier) :
204      oper(ast_identifier)
205   {
206      subexpressions[0] = NULL;
207      subexpressions[1] = NULL;
208      subexpressions[2] = NULL;
209      primary_expression.identifier = (char *) identifier;
210   }
211
212   static const char *operator_string(enum ast_operators op);
213
214   virtual ir_rvalue *hir(exec_list *instructions,
215			  struct _mesa_glsl_parse_state *state);
216
217   virtual void print(void) const;
218
219   enum ast_operators oper;
220
221   ast_expression *subexpressions[3];
222
223   union {
224      char *identifier;
225      int int_constant;
226      float float_constant;
227      unsigned uint_constant;
228      int bool_constant;
229   } primary_expression;
230
231
232   /**
233    * List of expressions for an \c ast_sequence or parameters for an
234    * \c ast_function_call
235    */
236   exec_list expressions;
237};
238
239class ast_expression_bin : public ast_expression {
240public:
241   ast_expression_bin(int oper, ast_expression *, ast_expression *);
242
243   virtual void print(void) const;
244};
245
246/**
247 * Subclass of expressions for function calls
248 */
249class ast_function_expression : public ast_expression {
250public:
251   ast_function_expression(ast_expression *callee)
252      : ast_expression(ast_function_call, callee,
253		       NULL, NULL),
254	cons(false)
255   {
256      /* empty */
257   }
258
259   ast_function_expression(class ast_type_specifier *type)
260      : ast_expression(ast_function_call, (ast_expression *) type,
261		       NULL, NULL),
262	cons(true)
263   {
264      /* empty */
265   }
266
267   bool is_constructor() const
268   {
269      return cons;
270   }
271
272   virtual ir_rvalue *hir(exec_list *instructions,
273			  struct _mesa_glsl_parse_state *state);
274
275private:
276   /**
277    * Is this function call actually a constructor?
278    */
279   bool cons;
280};
281
282
283/**
284 * Number of possible operators for an ast_expression
285 *
286 * This is done as a define instead of as an additional value in the enum so
287 * that the compiler won't generate spurious messages like "warning:
288 * enumeration value ‘ast_num_operators’ not handled in switch"
289 */
290#define AST_NUM_OPERATORS (ast_sequence + 1)
291
292
293class ast_compound_statement : public ast_node {
294public:
295   ast_compound_statement(int new_scope, ast_node *statements);
296   virtual void print(void) const;
297
298   virtual ir_rvalue *hir(exec_list *instructions,
299			  struct _mesa_glsl_parse_state *state);
300
301   int new_scope;
302   exec_list statements;
303};
304
305class ast_declaration : public ast_node {
306public:
307   ast_declaration(char *identifier, int is_array, ast_expression *array_size,
308		   ast_expression *initializer);
309   virtual void print(void) const;
310
311   char *identifier;
312
313   int is_array;
314   ast_expression *array_size;
315
316   ast_expression *initializer;
317};
318
319
320enum {
321   ast_precision_none = 0, /**< Absence of precision qualifier. */
322   ast_precision_high,
323   ast_precision_medium,
324   ast_precision_low
325};
326
327struct ast_type_qualifier {
328   union {
329      struct {
330	 unsigned invariant:1;
331	 unsigned constant:1;
332	 unsigned attribute:1;
333	 unsigned varying:1;
334	 unsigned in:1;
335	 unsigned out:1;
336	 unsigned centroid:1;
337	 unsigned uniform:1;
338	 unsigned smooth:1;
339	 unsigned flat:1;
340	 unsigned noperspective:1;
341
342	 /** \name Layout qualifiers for GL_ARB_fragment_coord_conventions */
343	 /*@{*/
344	 unsigned origin_upper_left:1;
345	 unsigned pixel_center_integer:1;
346	 /*@}*/
347
348	 /**
349	  * Flag set if GL_ARB_explicit_attrib_location "location" layout
350	  * qualifier is used.
351	  */
352	 unsigned explicit_location:1;
353      }
354      /** \brief Set of flags, accessed by name. */
355      q;
356
357      /** \brief Set of flags, accessed as a bitmask. */
358      unsigned i;
359   } flags;
360
361   /**
362    * Location specified via GL_ARB_explicit_attrib_location layout
363    *
364    * \note
365    * This field is only valid if \c explicit_location is set.
366    */
367   unsigned location;
368
369   /**
370    * Return true if and only if an interpolation qualifier is present.
371    */
372   bool has_interpolation() const;
373
374   /**
375    * \brief Return string representation of interpolation qualifier.
376    *
377    * If an interpolation qualifier is present, then return that qualifier's
378    * string representation. Otherwise, return null. For example, if the
379    * noperspective bit is set, then this returns "noperspective".
380    *
381    * If multiple interpolation qualifiers are somehow present, then the
382    * returned string is undefined but not null.
383    */
384   const char *interpolation_string() const;
385};
386
387class ast_struct_specifier : public ast_node {
388public:
389   ast_struct_specifier(char *identifier, ast_node *declarator_list);
390   virtual void print(void) const;
391
392   virtual ir_rvalue *hir(exec_list *instructions,
393			  struct _mesa_glsl_parse_state *state);
394
395   char *name;
396   exec_list declarations;
397};
398
399
400enum ast_types {
401   ast_void,
402   ast_float,
403   ast_int,
404   ast_uint,
405   ast_bool,
406   ast_vec2,
407   ast_vec3,
408   ast_vec4,
409   ast_bvec2,
410   ast_bvec3,
411   ast_bvec4,
412   ast_ivec2,
413   ast_ivec3,
414   ast_ivec4,
415   ast_uvec2,
416   ast_uvec3,
417   ast_uvec4,
418   ast_mat2,
419   ast_mat2x3,
420   ast_mat2x4,
421   ast_mat3x2,
422   ast_mat3,
423   ast_mat3x4,
424   ast_mat4x2,
425   ast_mat4x3,
426   ast_mat4,
427   ast_sampler1d,
428   ast_sampler2d,
429   ast_sampler2drect,
430   ast_sampler3d,
431   ast_samplercube,
432   ast_sampler1dshadow,
433   ast_sampler2dshadow,
434   ast_sampler2drectshadow,
435   ast_samplercubeshadow,
436   ast_sampler1darray,
437   ast_sampler2darray,
438   ast_sampler1darrayshadow,
439   ast_sampler2darrayshadow,
440   ast_isampler1d,
441   ast_isampler2d,
442   ast_isampler3d,
443   ast_isamplercube,
444   ast_isampler1darray,
445   ast_isampler2darray,
446   ast_usampler1d,
447   ast_usampler2d,
448   ast_usampler3d,
449   ast_usamplercube,
450   ast_usampler1darray,
451   ast_usampler2darray,
452
453   ast_struct,
454   ast_type_name
455};
456
457
458class ast_type_specifier : public ast_node {
459public:
460   ast_type_specifier(int specifier);
461
462   /** Construct a type specifier from a type name */
463   ast_type_specifier(const char *name)
464      : type_specifier(ast_type_name), type_name(name), structure(NULL),
465	is_array(false), array_size(NULL), precision(ast_precision_none),
466	is_precision_statement(false)
467   {
468      /* empty */
469   }
470
471   /** Construct a type specifier from a structure definition */
472   ast_type_specifier(ast_struct_specifier *s)
473      : type_specifier(ast_struct), type_name(s->name), structure(s),
474	is_array(false), array_size(NULL), precision(ast_precision_none),
475	is_precision_statement(false)
476   {
477      /* empty */
478   }
479
480   const struct glsl_type *glsl_type(const char **name,
481				     struct _mesa_glsl_parse_state *state)
482      const;
483
484   virtual void print(void) const;
485
486   ir_rvalue *hir(exec_list *, struct _mesa_glsl_parse_state *);
487
488   enum ast_types type_specifier;
489
490   const char *type_name;
491   ast_struct_specifier *structure;
492
493   int is_array;
494   ast_expression *array_size;
495
496   unsigned precision:2;
497
498   bool is_precision_statement;
499};
500
501
502class ast_fully_specified_type : public ast_node {
503public:
504   virtual void print(void) const;
505   bool has_qualifiers() const;
506
507   ast_type_qualifier qualifier;
508   ast_type_specifier *specifier;
509};
510
511
512class ast_declarator_list : public ast_node {
513public:
514   ast_declarator_list(ast_fully_specified_type *);
515   virtual void print(void) const;
516
517   virtual ir_rvalue *hir(exec_list *instructions,
518			  struct _mesa_glsl_parse_state *state);
519
520   ast_fully_specified_type *type;
521   exec_list declarations;
522
523   /**
524    * Special flag for vertex shader "invariant" declarations.
525    *
526    * Vertex shaders can contain "invariant" variable redeclarations that do
527    * not include a type.  For example, "invariant gl_Position;".  This flag
528    * is used to note these cases when no type is specified.
529    */
530   int invariant;
531};
532
533
534class ast_parameter_declarator : public ast_node {
535public:
536   ast_parameter_declarator()
537   {
538      this->identifier = NULL;
539      this->is_array = false;
540      this->array_size = 0;
541   }
542
543   virtual void print(void) const;
544
545   virtual ir_rvalue *hir(exec_list *instructions,
546			  struct _mesa_glsl_parse_state *state);
547
548   ast_fully_specified_type *type;
549   char *identifier;
550   int is_array;
551   ast_expression *array_size;
552
553   static void parameters_to_hir(exec_list *ast_parameters,
554				 bool formal, exec_list *ir_parameters,
555				 struct _mesa_glsl_parse_state *state);
556
557private:
558   /** Is this parameter declaration part of a formal parameter list? */
559   bool formal_parameter;
560
561   /**
562    * Is this parameter 'void' type?
563    *
564    * This field is set by \c ::hir.
565    */
566   bool is_void;
567};
568
569
570class ast_function : public ast_node {
571public:
572   ast_function(void);
573
574   virtual void print(void) const;
575
576   virtual ir_rvalue *hir(exec_list *instructions,
577			  struct _mesa_glsl_parse_state *state);
578
579   ast_fully_specified_type *return_type;
580   char *identifier;
581
582   exec_list parameters;
583
584private:
585   /**
586    * Is this prototype part of the function definition?
587    *
588    * Used by ast_function_definition::hir to process the parameters, etc.
589    * of the function.
590    *
591    * \sa ::hir
592    */
593   bool is_definition;
594
595   /**
596    * Function signature corresponding to this function prototype instance
597    *
598    * Used by ast_function_definition::hir to process the parameters, etc.
599    * of the function.
600    *
601    * \sa ::hir
602    */
603   class ir_function_signature *signature;
604
605   friend class ast_function_definition;
606};
607
608
609class ast_expression_statement : public ast_node {
610public:
611   ast_expression_statement(ast_expression *);
612   virtual void print(void) const;
613
614   virtual ir_rvalue *hir(exec_list *instructions,
615			  struct _mesa_glsl_parse_state *state);
616
617   ast_expression *expression;
618};
619
620
621class ast_case_label : public ast_node {
622public:
623
624   /**
625    * An expression of NULL means 'default'.
626    */
627   ast_expression *expression;
628};
629
630class ast_selection_statement : public ast_node {
631public:
632   ast_selection_statement(ast_expression *condition,
633			   ast_node *then_statement,
634			   ast_node *else_statement);
635   virtual void print(void) const;
636
637   virtual ir_rvalue *hir(exec_list *instructions,
638			  struct _mesa_glsl_parse_state *state);
639
640   ast_expression *condition;
641   ast_node *then_statement;
642   ast_node *else_statement;
643};
644
645
646class ast_switch_statement : public ast_node {
647public:
648   ast_expression *expression;
649   exec_list statements;
650};
651
652class ast_iteration_statement : public ast_node {
653public:
654   ast_iteration_statement(int mode, ast_node *init, ast_node *condition,
655			   ast_expression *rest_expression, ast_node *body);
656
657   virtual void print(void) const;
658
659   virtual ir_rvalue *hir(exec_list *, struct _mesa_glsl_parse_state *);
660
661   enum ast_iteration_modes {
662      ast_for,
663      ast_while,
664      ast_do_while
665   } mode;
666
667
668   ast_node *init_statement;
669   ast_node *condition;
670   ast_expression *rest_expression;
671
672   ast_node *body;
673
674private:
675   /**
676    * Generate IR from the condition of a loop
677    *
678    * This is factored out of ::hir because some loops have the condition
679    * test at the top (for and while), and others have it at the end (do-while).
680    */
681   void condition_to_hir(class ir_loop *, struct _mesa_glsl_parse_state *);
682};
683
684
685class ast_jump_statement : public ast_node {
686public:
687   ast_jump_statement(int mode, ast_expression *return_value);
688   virtual void print(void) const;
689
690   virtual ir_rvalue *hir(exec_list *instructions,
691			  struct _mesa_glsl_parse_state *state);
692
693   enum ast_jump_modes {
694      ast_continue,
695      ast_break,
696      ast_return,
697      ast_discard
698   } mode;
699
700   ast_expression *opt_return_value;
701};
702
703
704class ast_function_definition : public ast_node {
705public:
706   virtual void print(void) const;
707
708   virtual ir_rvalue *hir(exec_list *instructions,
709			  struct _mesa_glsl_parse_state *state);
710
711   ast_function *prototype;
712   ast_compound_statement *body;
713};
714/*@}*/
715
716extern void
717_mesa_ast_to_hir(exec_list *instructions, struct _mesa_glsl_parse_state *state);
718
719extern ir_rvalue *
720_mesa_ast_field_selection_to_hir(const ast_expression *expr,
721				 exec_list *instructions,
722				 struct _mesa_glsl_parse_state *state);
723
724void
725emit_function(_mesa_glsl_parse_state *state, exec_list *instructions,
726	      ir_function *f);
727
728#endif /* AST_H */
729