linker: Only over-ride built-ins when a prototype has been seen
authorIan Romanick <ian.d.romanick@intel.com>
Wed, 29 Jun 2011 21:52:10 +0000 (14:52 -0700)
committerIan Romanick <ian.d.romanick@intel.com>
Sun, 17 Jul 2011 20:02:49 +0000 (13:02 -0700)
commit66f4ac988d5053c9782d1390541b04f4d9c50078
tree14a41c35ab1b769de289328b9c815fce294f9cc0
parent7eed3d4808097606bf2854e687589a8503db435d
linker: Only over-ride built-ins when a prototype has been seen

The GLSL spec says:

    "If a built-in function is redeclared in a shader (i.e., a
    prototype is visible) before a call to it, then the linker will
    only attempt to resolve that call within the set of shaders that
    are linked with it."

This patch enforces this behavior.  When a function call is processed
a flag is set in the ir_call to indicate whether the previously seen
prototype is the built-in or not.  At link time a call will only bind
to an instance of a function that matches the "want built-in" setting
in the ir_call.

This has the odd side effect that first call to abs() in the shader
below will call the built-in and the second will not:

float foo(float x) { return abs(x); }
float abs(float x) { return -x; }
float bar(float x) { return abs(x); }

This seems insane, but it matches what the spec says.

Bugzilla: https://bugs.freedesktop.org/show_bug.cgi?id=31744
src/glsl/ir.h
src/glsl/link_functions.cpp