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