ast_function.cpp revision f4749610ed800c2a93f0a21f94c0f8b4212c38de
1548fa293a37db8f01bd35d2dc878720e75886aa4Ian Romanick/*
2548fa293a37db8f01bd35d2dc878720e75886aa4Ian Romanick * Copyright © 2010 Intel Corporation
3548fa293a37db8f01bd35d2dc878720e75886aa4Ian Romanick *
4548fa293a37db8f01bd35d2dc878720e75886aa4Ian Romanick * Permission is hereby granted, free of charge, to any person obtaining a
5548fa293a37db8f01bd35d2dc878720e75886aa4Ian Romanick * copy of this software and associated documentation files (the "Software"),
6548fa293a37db8f01bd35d2dc878720e75886aa4Ian Romanick * to deal in the Software without restriction, including without limitation
7548fa293a37db8f01bd35d2dc878720e75886aa4Ian Romanick * the rights to use, copy, modify, merge, publish, distribute, sublicense,
8548fa293a37db8f01bd35d2dc878720e75886aa4Ian Romanick * and/or sell copies of the Software, and to permit persons to whom the
9548fa293a37db8f01bd35d2dc878720e75886aa4Ian Romanick * Software is furnished to do so, subject to the following conditions:
10548fa293a37db8f01bd35d2dc878720e75886aa4Ian Romanick *
11548fa293a37db8f01bd35d2dc878720e75886aa4Ian Romanick * The above copyright notice and this permission notice (including the next
12548fa293a37db8f01bd35d2dc878720e75886aa4Ian Romanick * paragraph) shall be included in all copies or substantial portions of the
13548fa293a37db8f01bd35d2dc878720e75886aa4Ian Romanick * Software.
14548fa293a37db8f01bd35d2dc878720e75886aa4Ian Romanick *
15548fa293a37db8f01bd35d2dc878720e75886aa4Ian Romanick * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16548fa293a37db8f01bd35d2dc878720e75886aa4Ian Romanick * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17548fa293a37db8f01bd35d2dc878720e75886aa4Ian Romanick * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL
18548fa293a37db8f01bd35d2dc878720e75886aa4Ian Romanick * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19548fa293a37db8f01bd35d2dc878720e75886aa4Ian Romanick * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
20548fa293a37db8f01bd35d2dc878720e75886aa4Ian Romanick * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
21548fa293a37db8f01bd35d2dc878720e75886aa4Ian Romanick * DEALINGS IN THE SOFTWARE.
22548fa293a37db8f01bd35d2dc878720e75886aa4Ian Romanick */
23548fa293a37db8f01bd35d2dc878720e75886aa4Ian Romanick
24548fa293a37db8f01bd35d2dc878720e75886aa4Ian Romanick#include <cstdio>
25548fa293a37db8f01bd35d2dc878720e75886aa4Ian Romanick#include "symbol_table.h"
26548fa293a37db8f01bd35d2dc878720e75886aa4Ian Romanick#include "ast.h"
27548fa293a37db8f01bd35d2dc878720e75886aa4Ian Romanick#include "glsl_types.h"
28548fa293a37db8f01bd35d2dc878720e75886aa4Ian Romanick#include "ir.h"
29548fa293a37db8f01bd35d2dc878720e75886aa4Ian Romanick
30f4749610ed800c2a93f0a21f94c0f8b4212c38deIan Romanickstatic ir_instruction *
31f4749610ed800c2a93f0a21f94c0f8b4212c38deIan Romanickmatch_function_by_name(exec_list *instructions, const char *name,
32f4749610ed800c2a93f0a21f94c0f8b4212c38deIan Romanick		       YYLTYPE *loc, simple_node *parameters,
33f4749610ed800c2a93f0a21f94c0f8b4212c38deIan Romanick		       struct _mesa_glsl_parse_state *state)
34f4749610ed800c2a93f0a21f94c0f8b4212c38deIan Romanick{
35f4749610ed800c2a93f0a21f94c0f8b4212c38deIan Romanick   ir_function *f = (ir_function *)
36f4749610ed800c2a93f0a21f94c0f8b4212c38deIan Romanick      _mesa_symbol_table_find_symbol(state->symbols, 0, name);
37f4749610ed800c2a93f0a21f94c0f8b4212c38deIan Romanick
38f4749610ed800c2a93f0a21f94c0f8b4212c38deIan Romanick   if (f == NULL) {
39f4749610ed800c2a93f0a21f94c0f8b4212c38deIan Romanick      _mesa_glsl_error(loc, state, "function `%s' undeclared", name);
40f4749610ed800c2a93f0a21f94c0f8b4212c38deIan Romanick      return ir_call::get_error_instruction();
41f4749610ed800c2a93f0a21f94c0f8b4212c38deIan Romanick   }
42f4749610ed800c2a93f0a21f94c0f8b4212c38deIan Romanick
43f4749610ed800c2a93f0a21f94c0f8b4212c38deIan Romanick   /* Once we've determined that the function being called might exist,
44f4749610ed800c2a93f0a21f94c0f8b4212c38deIan Romanick    * process the parameters.
45f4749610ed800c2a93f0a21f94c0f8b4212c38deIan Romanick    */
46f4749610ed800c2a93f0a21f94c0f8b4212c38deIan Romanick   exec_list actual_parameters;
47f4749610ed800c2a93f0a21f94c0f8b4212c38deIan Romanick   simple_node *const first = parameters;
48f4749610ed800c2a93f0a21f94c0f8b4212c38deIan Romanick   if (first != NULL) {
49f4749610ed800c2a93f0a21f94c0f8b4212c38deIan Romanick      simple_node *ptr = first;
50f4749610ed800c2a93f0a21f94c0f8b4212c38deIan Romanick      do {
51f4749610ed800c2a93f0a21f94c0f8b4212c38deIan Romanick	 ir_instruction *const result =
52f4749610ed800c2a93f0a21f94c0f8b4212c38deIan Romanick	    ((ast_node *) ptr)->hir(instructions, state);
53f4749610ed800c2a93f0a21f94c0f8b4212c38deIan Romanick	 ptr = ptr->next;
54f4749610ed800c2a93f0a21f94c0f8b4212c38deIan Romanick
55f4749610ed800c2a93f0a21f94c0f8b4212c38deIan Romanick	 actual_parameters.push_tail(result);
56f4749610ed800c2a93f0a21f94c0f8b4212c38deIan Romanick      } while (ptr != first);
57f4749610ed800c2a93f0a21f94c0f8b4212c38deIan Romanick   }
58f4749610ed800c2a93f0a21f94c0f8b4212c38deIan Romanick
59f4749610ed800c2a93f0a21f94c0f8b4212c38deIan Romanick   /* After processing the function's actual parameters, try to find an
60f4749610ed800c2a93f0a21f94c0f8b4212c38deIan Romanick    * overload of the function that matches.
61f4749610ed800c2a93f0a21f94c0f8b4212c38deIan Romanick    */
62f4749610ed800c2a93f0a21f94c0f8b4212c38deIan Romanick   const ir_function_signature *sig =
63f4749610ed800c2a93f0a21f94c0f8b4212c38deIan Romanick      f->matching_signature(& actual_parameters);
64f4749610ed800c2a93f0a21f94c0f8b4212c38deIan Romanick   if (sig != NULL) {
65f4749610ed800c2a93f0a21f94c0f8b4212c38deIan Romanick      /* FINISHME: The list of actual parameters needs to be modified to
66f4749610ed800c2a93f0a21f94c0f8b4212c38deIan Romanick       * FINISHME: include any necessary conversions.
67f4749610ed800c2a93f0a21f94c0f8b4212c38deIan Romanick       */
68f4749610ed800c2a93f0a21f94c0f8b4212c38deIan Romanick      return new ir_call(sig, & actual_parameters);
69f4749610ed800c2a93f0a21f94c0f8b4212c38deIan Romanick   } else {
70f4749610ed800c2a93f0a21f94c0f8b4212c38deIan Romanick      /* FINISHME: Log a better error message here.  G++ will show the types
71f4749610ed800c2a93f0a21f94c0f8b4212c38deIan Romanick       * FINISHME: of the actual parameters and the set of candidate
72f4749610ed800c2a93f0a21f94c0f8b4212c38deIan Romanick       * FINISHME: functions.  A different error should also be logged when
73f4749610ed800c2a93f0a21f94c0f8b4212c38deIan Romanick       * FINISHME: multiple functions match.
74f4749610ed800c2a93f0a21f94c0f8b4212c38deIan Romanick       */
75f4749610ed800c2a93f0a21f94c0f8b4212c38deIan Romanick      _mesa_glsl_error(loc, state, "no matching function for call to `%s'",
76f4749610ed800c2a93f0a21f94c0f8b4212c38deIan Romanick		       name);
77f4749610ed800c2a93f0a21f94c0f8b4212c38deIan Romanick      return ir_call::get_error_instruction();
78f4749610ed800c2a93f0a21f94c0f8b4212c38deIan Romanick   }
79f4749610ed800c2a93f0a21f94c0f8b4212c38deIan Romanick}
80f4749610ed800c2a93f0a21f94c0f8b4212c38deIan Romanick
81f4749610ed800c2a93f0a21f94c0f8b4212c38deIan Romanick
82548fa293a37db8f01bd35d2dc878720e75886aa4Ian Romanickir_instruction *
83548fa293a37db8f01bd35d2dc878720e75886aa4Ian Romanickast_function_expression::hir(exec_list *instructions,
84548fa293a37db8f01bd35d2dc878720e75886aa4Ian Romanick			     struct _mesa_glsl_parse_state *state)
85548fa293a37db8f01bd35d2dc878720e75886aa4Ian Romanick{
86548fa293a37db8f01bd35d2dc878720e75886aa4Ian Romanick   /* There are three sorts of function calls.
87548fa293a37db8f01bd35d2dc878720e75886aa4Ian Romanick    *
88548fa293a37db8f01bd35d2dc878720e75886aa4Ian Romanick    * 1. contstructors - The first subexpression is an ast_type_specifier.
89548fa293a37db8f01bd35d2dc878720e75886aa4Ian Romanick    * 2. methods - Only the .length() method of array types.
90548fa293a37db8f01bd35d2dc878720e75886aa4Ian Romanick    * 3. functions - Calls to regular old functions.
91548fa293a37db8f01bd35d2dc878720e75886aa4Ian Romanick    *
92548fa293a37db8f01bd35d2dc878720e75886aa4Ian Romanick    * There are two kinds of constructor call.  Constructors for built-in
93548fa293a37db8f01bd35d2dc878720e75886aa4Ian Romanick    * language types, such as mat4 and vec2, are free form.  The only
94548fa293a37db8f01bd35d2dc878720e75886aa4Ian Romanick    * requirement is that the parameters must provide enough values of the
95548fa293a37db8f01bd35d2dc878720e75886aa4Ian Romanick    * correct scalar type.  Constructors for arrays and structures must have
96548fa293a37db8f01bd35d2dc878720e75886aa4Ian Romanick    * the exact number of parameters with matching types in the correct order.
97548fa293a37db8f01bd35d2dc878720e75886aa4Ian Romanick    * These constructors follow essentially the same type matching rules as
98548fa293a37db8f01bd35d2dc878720e75886aa4Ian Romanick    * functions.
99548fa293a37db8f01bd35d2dc878720e75886aa4Ian Romanick    *
100548fa293a37db8f01bd35d2dc878720e75886aa4Ian Romanick    * Method calls are actually detected when the ast_field_selection
101548fa293a37db8f01bd35d2dc878720e75886aa4Ian Romanick    * expression is handled.
102548fa293a37db8f01bd35d2dc878720e75886aa4Ian Romanick    */
103548fa293a37db8f01bd35d2dc878720e75886aa4Ian Romanick   if (is_constructor()) {
104548fa293a37db8f01bd35d2dc878720e75886aa4Ian Romanick      return ir_call::get_error_instruction();
105548fa293a37db8f01bd35d2dc878720e75886aa4Ian Romanick   } else {
106548fa293a37db8f01bd35d2dc878720e75886aa4Ian Romanick      const ast_expression *id = subexpressions[0];
107f4749610ed800c2a93f0a21f94c0f8b4212c38deIan Romanick      YYLTYPE loc = id->get_location();
108548fa293a37db8f01bd35d2dc878720e75886aa4Ian Romanick
109f4749610ed800c2a93f0a21f94c0f8b4212c38deIan Romanick      return match_function_by_name(instructions,
110f4749610ed800c2a93f0a21f94c0f8b4212c38deIan Romanick				    id->primary_expression.identifier, & loc,
111f4749610ed800c2a93f0a21f94c0f8b4212c38deIan Romanick				    subexpressions[1], state);
112548fa293a37db8f01bd35d2dc878720e75886aa4Ian Romanick   }
113548fa293a37db8f01bd35d2dc878720e75886aa4Ian Romanick
114548fa293a37db8f01bd35d2dc878720e75886aa4Ian Romanick   return ir_call::get_error_instruction();
115548fa293a37db8f01bd35d2dc878720e75886aa4Ian Romanick}
116