ast.h revision a0afcc67196baa588ec0ac246be6c4996a328f0b
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 ralloc-based new need not call delete. It's
53    * easier to just ralloc_free 'ctx' (or any of its ancestors). */
54   static void* operator new(size_t size, void *ctx)
55   {
56      void *node;
57
58      node = rzalloc_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    * ralloc_free in that case. */
66   static void operator delete(void *table)
67   {
68      ralloc_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         /** \name Layout qualifiers for GL_AMD_conservative_depth */
355         /** \{ */
356         unsigned depth_any:1;
357         unsigned depth_greater:1;
358         unsigned depth_less:1;
359         unsigned depth_unchanged:1;
360         /** \} */
361      }
362      /** \brief Set of flags, accessed by name. */
363      q;
364
365      /** \brief Set of flags, accessed as a bitmask. */
366      unsigned i;
367   } flags;
368
369   /**
370    * Location specified via GL_ARB_explicit_attrib_location layout
371    *
372    * \note
373    * This field is only valid if \c explicit_location is set.
374    */
375   int location;
376
377   /**
378    * Return true if and only if an interpolation qualifier is present.
379    */
380   bool has_interpolation() const;
381
382   /**
383    * \brief Return string representation of interpolation qualifier.
384    *
385    * If an interpolation qualifier is present, then return that qualifier's
386    * string representation. Otherwise, return null. For example, if the
387    * noperspective bit is set, then this returns "noperspective".
388    *
389    * If multiple interpolation qualifiers are somehow present, then the
390    * returned string is undefined but not null.
391    */
392   const char *interpolation_string() const;
393};
394
395class ast_struct_specifier : public ast_node {
396public:
397   ast_struct_specifier(char *identifier, ast_node *declarator_list);
398   virtual void print(void) const;
399
400   virtual ir_rvalue *hir(exec_list *instructions,
401			  struct _mesa_glsl_parse_state *state);
402
403   char *name;
404   exec_list declarations;
405};
406
407
408enum ast_types {
409   ast_void,
410   ast_float,
411   ast_int,
412   ast_uint,
413   ast_bool,
414   ast_vec2,
415   ast_vec3,
416   ast_vec4,
417   ast_bvec2,
418   ast_bvec3,
419   ast_bvec4,
420   ast_ivec2,
421   ast_ivec3,
422   ast_ivec4,
423   ast_uvec2,
424   ast_uvec3,
425   ast_uvec4,
426   ast_mat2,
427   ast_mat2x3,
428   ast_mat2x4,
429   ast_mat3x2,
430   ast_mat3,
431   ast_mat3x4,
432   ast_mat4x2,
433   ast_mat4x3,
434   ast_mat4,
435   ast_sampler1d,
436   ast_sampler2d,
437   ast_sampler2drect,
438   ast_sampler3d,
439   ast_samplercube,
440   ast_samplerexternaloes,
441   ast_sampler1dshadow,
442   ast_sampler2dshadow,
443   ast_sampler2drectshadow,
444   ast_samplercubeshadow,
445   ast_sampler1darray,
446   ast_sampler2darray,
447   ast_sampler1darrayshadow,
448   ast_sampler2darrayshadow,
449   ast_isampler1d,
450   ast_isampler2d,
451   ast_isampler3d,
452   ast_isamplercube,
453   ast_isampler1darray,
454   ast_isampler2darray,
455   ast_usampler1d,
456   ast_usampler2d,
457   ast_usampler3d,
458   ast_usamplercube,
459   ast_usampler1darray,
460   ast_usampler2darray,
461
462   ast_struct,
463   ast_type_name
464};
465
466
467class ast_type_specifier : public ast_node {
468public:
469   ast_type_specifier(int specifier);
470
471   /** Construct a type specifier from a type name */
472   ast_type_specifier(const char *name)
473      : type_specifier(ast_type_name), type_name(name), structure(NULL),
474	is_array(false), array_size(NULL), precision(ast_precision_none),
475	is_precision_statement(false)
476   {
477      /* empty */
478   }
479
480   /** Construct a type specifier from a structure definition */
481   ast_type_specifier(ast_struct_specifier *s)
482      : type_specifier(ast_struct), type_name(s->name), structure(s),
483	is_array(false), array_size(NULL), precision(ast_precision_none),
484	is_precision_statement(false)
485   {
486      /* empty */
487   }
488
489   const struct glsl_type *glsl_type(const char **name,
490				     struct _mesa_glsl_parse_state *state)
491      const;
492
493   virtual void print(void) const;
494
495   ir_rvalue *hir(exec_list *, struct _mesa_glsl_parse_state *);
496
497   enum ast_types type_specifier;
498
499   const char *type_name;
500   ast_struct_specifier *structure;
501
502   int is_array;
503   ast_expression *array_size;
504
505   unsigned precision:2;
506
507   bool is_precision_statement;
508};
509
510
511class ast_fully_specified_type : public ast_node {
512public:
513   virtual void print(void) const;
514   bool has_qualifiers() const;
515
516   ast_type_qualifier qualifier;
517   ast_type_specifier *specifier;
518};
519
520
521class ast_declarator_list : public ast_node {
522public:
523   ast_declarator_list(ast_fully_specified_type *);
524   virtual void print(void) const;
525
526   virtual ir_rvalue *hir(exec_list *instructions,
527			  struct _mesa_glsl_parse_state *state);
528
529   ast_fully_specified_type *type;
530   exec_list declarations;
531
532   /**
533    * Special flag for vertex shader "invariant" declarations.
534    *
535    * Vertex shaders can contain "invariant" variable redeclarations that do
536    * not include a type.  For example, "invariant gl_Position;".  This flag
537    * is used to note these cases when no type is specified.
538    */
539   int invariant;
540};
541
542
543class ast_parameter_declarator : public ast_node {
544public:
545   ast_parameter_declarator()
546   {
547      this->identifier = NULL;
548      this->is_array = false;
549      this->array_size = 0;
550   }
551
552   virtual void print(void) const;
553
554   virtual ir_rvalue *hir(exec_list *instructions,
555			  struct _mesa_glsl_parse_state *state);
556
557   ast_fully_specified_type *type;
558   char *identifier;
559   int is_array;
560   ast_expression *array_size;
561
562   static void parameters_to_hir(exec_list *ast_parameters,
563				 bool formal, exec_list *ir_parameters,
564				 struct _mesa_glsl_parse_state *state);
565
566private:
567   /** Is this parameter declaration part of a formal parameter list? */
568   bool formal_parameter;
569
570   /**
571    * Is this parameter 'void' type?
572    *
573    * This field is set by \c ::hir.
574    */
575   bool is_void;
576};
577
578
579class ast_function : public ast_node {
580public:
581   ast_function(void);
582
583   virtual void print(void) const;
584
585   virtual ir_rvalue *hir(exec_list *instructions,
586			  struct _mesa_glsl_parse_state *state);
587
588   ast_fully_specified_type *return_type;
589   char *identifier;
590
591   exec_list parameters;
592
593private:
594   /**
595    * Is this prototype part of the function definition?
596    *
597    * Used by ast_function_definition::hir to process the parameters, etc.
598    * of the function.
599    *
600    * \sa ::hir
601    */
602   bool is_definition;
603
604   /**
605    * Function signature corresponding to this function prototype instance
606    *
607    * Used by ast_function_definition::hir to process the parameters, etc.
608    * of the function.
609    *
610    * \sa ::hir
611    */
612   class ir_function_signature *signature;
613
614   friend class ast_function_definition;
615};
616
617
618class ast_expression_statement : public ast_node {
619public:
620   ast_expression_statement(ast_expression *);
621   virtual void print(void) const;
622
623   virtual ir_rvalue *hir(exec_list *instructions,
624			  struct _mesa_glsl_parse_state *state);
625
626   ast_expression *expression;
627};
628
629
630class ast_case_label : public ast_node {
631public:
632   ast_case_label(ast_expression *test_value);
633   virtual void print(void) const;
634
635   virtual ir_rvalue *hir(exec_list *instructions,
636			  struct _mesa_glsl_parse_state *state);
637
638   /**
639    * An test value of NULL means 'default'.
640    */
641   ast_expression *test_value;
642};
643
644
645class ast_case_label_list : public ast_node {
646public:
647   ast_case_label_list(void);
648   virtual void print(void) const;
649
650   virtual ir_rvalue *hir(exec_list *instructions,
651			  struct _mesa_glsl_parse_state *state);
652
653   /**
654    * A list of case labels.
655    */
656   exec_list labels;
657};
658
659
660class ast_case_statement : public ast_node {
661public:
662   ast_case_statement(ast_case_label_list *labels);
663   virtual void print(void) const;
664
665   virtual ir_rvalue *hir(exec_list *instructions,
666			  struct _mesa_glsl_parse_state *state);
667
668   ast_case_label_list *labels;
669
670   /**
671    * A list of statements.
672    */
673   exec_list stmts;
674};
675
676
677class ast_case_statement_list : public ast_node {
678public:
679   ast_case_statement_list(void);
680   virtual void print(void) const;
681
682   virtual ir_rvalue *hir(exec_list *instructions,
683			  struct _mesa_glsl_parse_state *state);
684
685   /**
686    * A list of cases.
687    */
688   exec_list cases;
689};
690
691
692class ast_switch_body : public ast_node {
693public:
694   ast_switch_body(ast_case_statement_list *stmts);
695   virtual void print(void) const;
696
697   virtual ir_rvalue *hir(exec_list *instructions,
698			  struct _mesa_glsl_parse_state *state);
699
700   ast_case_statement_list *stmts;
701};
702
703
704class ast_selection_statement : public ast_node {
705public:
706   ast_selection_statement(ast_expression *condition,
707			   ast_node *then_statement,
708			   ast_node *else_statement);
709   virtual void print(void) const;
710
711   virtual ir_rvalue *hir(exec_list *instructions,
712			  struct _mesa_glsl_parse_state *state);
713
714   ast_expression *condition;
715   ast_node *then_statement;
716   ast_node *else_statement;
717};
718
719
720class ast_switch_statement : public ast_node {
721public:
722   ast_switch_statement(ast_expression *test_expression,
723			ast_node *body);
724   virtual void print(void) const;
725
726   virtual ir_rvalue *hir(exec_list *instructions,
727			  struct _mesa_glsl_parse_state *state);
728
729   ast_expression *test_expression;
730   ast_node *body;
731
732protected:
733   void test_to_hir(exec_list *, struct _mesa_glsl_parse_state *);
734};
735
736class ast_iteration_statement : public ast_node {
737public:
738   ast_iteration_statement(int mode, ast_node *init, ast_node *condition,
739			   ast_expression *rest_expression, ast_node *body);
740
741   virtual void print(void) const;
742
743   virtual ir_rvalue *hir(exec_list *, struct _mesa_glsl_parse_state *);
744
745   enum ast_iteration_modes {
746      ast_for,
747      ast_while,
748      ast_do_while
749   } mode;
750
751
752   ast_node *init_statement;
753   ast_node *condition;
754   ast_expression *rest_expression;
755
756   ast_node *body;
757
758private:
759   /**
760    * Generate IR from the condition of a loop
761    *
762    * This is factored out of ::hir because some loops have the condition
763    * test at the top (for and while), and others have it at the end (do-while).
764    */
765   void condition_to_hir(class ir_loop *, struct _mesa_glsl_parse_state *);
766};
767
768
769class ast_jump_statement : public ast_node {
770public:
771   ast_jump_statement(int mode, ast_expression *return_value);
772   virtual void print(void) const;
773
774   virtual ir_rvalue *hir(exec_list *instructions,
775			  struct _mesa_glsl_parse_state *state);
776
777   enum ast_jump_modes {
778      ast_continue,
779      ast_break,
780      ast_return,
781      ast_discard
782   } mode;
783
784   ast_expression *opt_return_value;
785};
786
787
788class ast_function_definition : public ast_node {
789public:
790   virtual void print(void) const;
791
792   virtual ir_rvalue *hir(exec_list *instructions,
793			  struct _mesa_glsl_parse_state *state);
794
795   ast_function *prototype;
796   ast_compound_statement *body;
797};
798/*@}*/
799
800extern void
801_mesa_ast_to_hir(exec_list *instructions, struct _mesa_glsl_parse_state *state);
802
803extern ir_rvalue *
804_mesa_ast_field_selection_to_hir(const ast_expression *expr,
805				 exec_list *instructions,
806				 struct _mesa_glsl_parse_state *state);
807
808void
809emit_function(_mesa_glsl_parse_state *state, ir_function *f);
810
811#endif /* AST_H */
812