X-Git-Url: https://git.libre-soc.org/?a=blobdiff_plain;f=ast.h;h=a158910421d427ae1db1ed2ce86cb0f48d46694c;hb=78fe3c9150c0c5f77a20a790ee7441f8a9d1de5f;hp=ad614e98fe617b4ae699a0c111aa37dea642b18d;hpb=986b8f798272d3ae2898617c8fb089156a5941c0;p=mesa.git diff --git a/ast.h b/ast.h index ad614e98fe6..a158910421d 100644 --- a/ast.h +++ b/ast.h @@ -39,8 +39,8 @@ class ast_node : public simple_node { public: virtual ~ast_node(); virtual void print(void) const; - virtual ir_instruction *hir(exec_list *instructions, - struct _mesa_glsl_parse_state *state); + virtual ir_rvalue *hir(exec_list *instructions, + struct _mesa_glsl_parse_state *state); /** * Retrieve the source location of an AST node @@ -162,8 +162,8 @@ public: static const char *operator_string(enum ast_operators op); - virtual ir_instruction *hir(exec_list *instructions, - struct _mesa_glsl_parse_state *state); + virtual ir_rvalue *hir(exec_list *instructions, + struct _mesa_glsl_parse_state *state); virtual void print(void) const; @@ -198,16 +198,35 @@ public: */ class ast_function_expression : public ast_expression { public: - ast_function_expression(ast_node *callee) - : ast_expression(ast_function_call, (ast_expression *) callee, - NULL, NULL) + ast_function_expression(ast_expression *callee) + : ast_expression(ast_function_call, callee, + NULL, NULL), + cons(false) { /* empty */ } + ast_function_expression(class ast_type_specifier *type) + : ast_expression(ast_function_call, (ast_expression *) type, + NULL, NULL), + cons(true) + { + /* empty */ + } - virtual ir_instruction *hir(exec_list *instructions, - struct _mesa_glsl_parse_state *state); + bool is_constructor() const + { + return cons; + } + + virtual ir_rvalue *hir(exec_list *instructions, + struct _mesa_glsl_parse_state *state); + +private: + /** + * Is this function call actually a constructor? + */ + bool cons; }; @@ -226,8 +245,8 @@ public: ast_compound_statement(int new_scope, ast_node *statements); virtual void print(void) const; - virtual ir_instruction *hir(exec_list *instructions, - struct _mesa_glsl_parse_state *state); + virtual ir_rvalue *hir(exec_list *instructions, + struct _mesa_glsl_parse_state *state); int new_scope; struct simple_node statements; @@ -338,11 +357,27 @@ class ast_type_specifier : public ast_node { public: ast_type_specifier(int specifier); + /** Construct a type specifier from a type name */ + ast_type_specifier(const char *name) + : type_specifier(ast_type_name), type_name(name), structure(NULL), + is_array(false), array_size(NULL), precision(ast_precision_high) + { + /* empty */ + } + + /** Construct a type specifier from a structure definition */ + ast_type_specifier(ast_struct_specifier *s) + : type_specifier(ast_struct), type_name(s->name), structure(s), + is_array(false), array_size(NULL), precision(ast_precision_high) + { + /* empty */ + } + virtual void print(void) const; enum ast_types type_specifier; - char *type_name; + const char *type_name; ast_struct_specifier *structure; int is_array; @@ -366,8 +401,8 @@ public: ast_declarator_list(ast_fully_specified_type *); virtual void print(void) const; - virtual ir_instruction *hir(exec_list *instructions, - struct _mesa_glsl_parse_state *state); + virtual ir_rvalue *hir(exec_list *instructions, + struct _mesa_glsl_parse_state *state); ast_fully_specified_type *type; struct simple_node declarations; @@ -387,8 +422,8 @@ class ast_parameter_declarator : public ast_node { public: virtual void print(void) const; - virtual ir_instruction *hir(exec_list *instructions, - struct _mesa_glsl_parse_state *state); + virtual ir_rvalue *hir(exec_list *instructions, + struct _mesa_glsl_parse_state *state); ast_fully_specified_type *type; char *identifier; @@ -434,8 +469,8 @@ public: ast_expression_statement(ast_expression *); virtual void print(void) const; - virtual ir_instruction *hir(exec_list *instructions, - struct _mesa_glsl_parse_state *state); + virtual ir_rvalue *hir(exec_list *instructions, + struct _mesa_glsl_parse_state *state); ast_expression *expression; }; @@ -496,6 +531,9 @@ public: ast_jump_statement(int mode, ast_expression *return_value); virtual void print(void) const; + virtual ir_rvalue *hir(exec_list *instructions, + struct _mesa_glsl_parse_state *state); + enum ast_jump_modes { ast_continue, ast_break, @@ -511,8 +549,8 @@ class ast_function_definition : public ast_node { public: virtual void print(void) const; - virtual ir_instruction *hir(exec_list *instructions, - struct _mesa_glsl_parse_state *state); + virtual ir_rvalue *hir(exec_list *instructions, + struct _mesa_glsl_parse_state *state); ast_function *prototype; ast_compound_statement *body; @@ -522,7 +560,7 @@ public: extern void _mesa_ast_to_hir(exec_list *instructions, struct _mesa_glsl_parse_state *state); -extern struct ir_instruction * +extern struct ir_rvalue * _mesa_ast_field_selection_to_hir(const struct ast_expression *expr, exec_list *instructions, struct _mesa_glsl_parse_state *state);