* DEALINGS IN THE SOFTWARE.
*/
-#include <cstdlib>
-#include <cstdio>
-#include <cstdarg>
-
-extern "C" {
-#include <talloc.h>
-}
-
-#include "main/mtypes.h"
+#include "main/core.h"
#include "glsl_symbol_table.h"
#include "glsl_parser_extras.h"
#include "ir.h"
#include "program.h"
-#include "hash_table.h"
+#include "program/hash_table.h"
#include "linker.h"
static ir_function_signature *
* details that may be missing.
*/
ir_function *f = linked->symbols->get_function(name);
- if (f == NULL)
+ if (f == NULL) {
f = new(linked) ir_function(name);
+ /* Add the new function to the linked IR.
+ */
+ linked->symbols->add_function(f);
+ linked->ir->push_head(f);
+ }
+
ir_function_signature *linked_sig =
- f->matching_signature(&callee->parameters);
+ f->exact_matching_signature(&callee->parameters);
if (linked_sig == NULL) {
linked_sig = new(linked) ir_function_signature(callee->return_type);
f->add_signature(linked_sig);
const ir_instruction *const original = (ir_instruction *) node;
assert(const_cast<ir_instruction *>(original)->as_variable());
- ir_instruction *copy = original->clone(ht);
+ ir_instruction *copy = original->clone(linked, ht);
formal_parameters.push_tail(copy);
}
foreach_list_const(node, &sig->body) {
const ir_instruction *const original = (ir_instruction *) node;
- ir_instruction *copy = original->clone(ht);
+ ir_instruction *copy = original->clone(linked, ht);
linked_sig->body.push_tail(copy);
}
*/
linked_sig->accept(this);
+ ir->set_callee(linked_sig);
+
return visit_continue;
}
/* Clone the ir_variable that the dereference already has and add
* it to the linked shader.
*/
- var = ir->var->clone(NULL);
- linked->symbols->add_variable(var->name, var);
+ var = ir->var->clone(linked, NULL);
+ linked->symbols->add_variable(var);
linked->ir->push_head(var);
+ } else if (var->type->is_array()) {
+ /* It is possible to have a global array declared in multiple
+ * shaders without a size. The array is implicitly sized by the
+ * maximal access to it in *any* shader. Because of this, we
+ * need to track the maximal access to the array as linking pulls
+ * more functions in that access the array.
+ */
+ var->max_array_access =
+ MAX2(var->max_array_access, ir->var->max_array_access);
+
+ if (var->type->length == 0 && ir->var->type->length != 0)
+ var->type = ir->var->type;
}
ir->var = var;