ast.h revision 0d81b0e18494a80c4326fbc98837842959675869
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   unsigned 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_sampler1dshadow,
441   ast_sampler2dshadow,
442   ast_sampler2drectshadow,
443   ast_samplercubeshadow,
444   ast_sampler1darray,
445   ast_sampler2darray,
446   ast_sampler1darrayshadow,
447   ast_sampler2darrayshadow,
448   ast_isampler1d,
449   ast_isampler2d,
450   ast_isampler3d,
451   ast_isamplercube,
452   ast_isampler1darray,
453   ast_isampler2darray,
454   ast_usampler1d,
455   ast_usampler2d,
456   ast_usampler3d,
457   ast_usamplercube,
458   ast_usampler1darray,
459   ast_usampler2darray,
460
461   ast_struct,
462   ast_type_name
463};
464
465
466class ast_type_specifier : public ast_node {
467public:
468   ast_type_specifier(int specifier);
469
470   /** Construct a type specifier from a type name */
471   ast_type_specifier(const char *name)
472      : type_specifier(ast_type_name), type_name(name), structure(NULL),
473	is_array(false), array_size(NULL), precision(ast_precision_none),
474	is_precision_statement(false)
475   {
476      /* empty */
477   }
478
479   /** Construct a type specifier from a structure definition */
480   ast_type_specifier(ast_struct_specifier *s)
481      : type_specifier(ast_struct), type_name(s->name), structure(s),
482	is_array(false), array_size(NULL), precision(ast_precision_none),
483	is_precision_statement(false)
484   {
485      /* empty */
486   }
487
488   const struct glsl_type *glsl_type(const char **name,
489				     struct _mesa_glsl_parse_state *state)
490      const;
491
492   virtual void print(void) const;
493
494   ir_rvalue *hir(exec_list *, struct _mesa_glsl_parse_state *);
495
496   enum ast_types type_specifier;
497
498   const char *type_name;
499   ast_struct_specifier *structure;
500
501   int is_array;
502   ast_expression *array_size;
503
504   unsigned precision:2;
505
506   bool is_precision_statement;
507};
508
509
510class ast_fully_specified_type : public ast_node {
511public:
512   virtual void print(void) const;
513   bool has_qualifiers() const;
514
515   ast_type_qualifier qualifier;
516   ast_type_specifier *specifier;
517};
518
519
520class ast_declarator_list : public ast_node {
521public:
522   ast_declarator_list(ast_fully_specified_type *);
523   virtual void print(void) const;
524
525   virtual ir_rvalue *hir(exec_list *instructions,
526			  struct _mesa_glsl_parse_state *state);
527
528   ast_fully_specified_type *type;
529   exec_list declarations;
530
531   /**
532    * Special flag for vertex shader "invariant" declarations.
533    *
534    * Vertex shaders can contain "invariant" variable redeclarations that do
535    * not include a type.  For example, "invariant gl_Position;".  This flag
536    * is used to note these cases when no type is specified.
537    */
538   int invariant;
539};
540
541
542class ast_parameter_declarator : public ast_node {
543public:
544   ast_parameter_declarator()
545   {
546      this->identifier = NULL;
547      this->is_array = false;
548      this->array_size = 0;
549   }
550
551   virtual void print(void) const;
552
553   virtual ir_rvalue *hir(exec_list *instructions,
554			  struct _mesa_glsl_parse_state *state);
555
556   ast_fully_specified_type *type;
557   char *identifier;
558   int is_array;
559   ast_expression *array_size;
560
561   static void parameters_to_hir(exec_list *ast_parameters,
562				 bool formal, exec_list *ir_parameters,
563				 struct _mesa_glsl_parse_state *state);
564
565private:
566   /** Is this parameter declaration part of a formal parameter list? */
567   bool formal_parameter;
568
569   /**
570    * Is this parameter 'void' type?
571    *
572    * This field is set by \c ::hir.
573    */
574   bool is_void;
575};
576
577
578class ast_function : public ast_node {
579public:
580   ast_function(void);
581
582   virtual void print(void) const;
583
584   virtual ir_rvalue *hir(exec_list *instructions,
585			  struct _mesa_glsl_parse_state *state);
586
587   ast_fully_specified_type *return_type;
588   char *identifier;
589
590   exec_list parameters;
591
592private:
593   /**
594    * Is this prototype part of the function definition?
595    *
596    * Used by ast_function_definition::hir to process the parameters, etc.
597    * of the function.
598    *
599    * \sa ::hir
600    */
601   bool is_definition;
602
603   /**
604    * Function signature corresponding to this function prototype instance
605    *
606    * Used by ast_function_definition::hir to process the parameters, etc.
607    * of the function.
608    *
609    * \sa ::hir
610    */
611   class ir_function_signature *signature;
612
613   friend class ast_function_definition;
614};
615
616
617class ast_expression_statement : public ast_node {
618public:
619   ast_expression_statement(ast_expression *);
620   virtual void print(void) const;
621
622   virtual ir_rvalue *hir(exec_list *instructions,
623			  struct _mesa_glsl_parse_state *state);
624
625   ast_expression *expression;
626};
627
628
629class ast_case_label : public ast_node {
630public:
631
632   /**
633    * An expression of NULL means 'default'.
634    */
635   ast_expression *expression;
636};
637
638class ast_selection_statement : public ast_node {
639public:
640   ast_selection_statement(ast_expression *condition,
641			   ast_node *then_statement,
642			   ast_node *else_statement);
643   virtual void print(void) const;
644
645   virtual ir_rvalue *hir(exec_list *instructions,
646			  struct _mesa_glsl_parse_state *state);
647
648   ast_expression *condition;
649   ast_node *then_statement;
650   ast_node *else_statement;
651};
652
653
654class ast_switch_statement : public ast_node {
655public:
656   ast_expression *expression;
657   exec_list statements;
658};
659
660class ast_iteration_statement : public ast_node {
661public:
662   ast_iteration_statement(int mode, ast_node *init, ast_node *condition,
663			   ast_expression *rest_expression, ast_node *body);
664
665   virtual void print(void) const;
666
667   virtual ir_rvalue *hir(exec_list *, struct _mesa_glsl_parse_state *);
668
669   enum ast_iteration_modes {
670      ast_for,
671      ast_while,
672      ast_do_while
673   } mode;
674
675
676   ast_node *init_statement;
677   ast_node *condition;
678   ast_expression *rest_expression;
679
680   ast_node *body;
681
682private:
683   /**
684    * Generate IR from the condition of a loop
685    *
686    * This is factored out of ::hir because some loops have the condition
687    * test at the top (for and while), and others have it at the end (do-while).
688    */
689   void condition_to_hir(class ir_loop *, struct _mesa_glsl_parse_state *);
690};
691
692
693class ast_jump_statement : public ast_node {
694public:
695   ast_jump_statement(int mode, ast_expression *return_value);
696   virtual void print(void) const;
697
698   virtual ir_rvalue *hir(exec_list *instructions,
699			  struct _mesa_glsl_parse_state *state);
700
701   enum ast_jump_modes {
702      ast_continue,
703      ast_break,
704      ast_return,
705      ast_discard
706   } mode;
707
708   ast_expression *opt_return_value;
709};
710
711
712class ast_function_definition : public ast_node {
713public:
714   virtual void print(void) const;
715
716   virtual ir_rvalue *hir(exec_list *instructions,
717			  struct _mesa_glsl_parse_state *state);
718
719   ast_function *prototype;
720   ast_compound_statement *body;
721};
722/*@}*/
723
724extern void
725_mesa_ast_to_hir(exec_list *instructions, struct _mesa_glsl_parse_state *state);
726
727extern ir_rvalue *
728_mesa_ast_field_selection_to_hir(const ast_expression *expr,
729				 exec_list *instructions,
730				 struct _mesa_glsl_parse_state *state);
731
732void
733emit_function(_mesa_glsl_parse_state *state, ir_function *f);
734
735#endif /* AST_H */
736