glsl: When linking, emit functions at the tail of the final linked program.
authorPaul Berry <stereotype441@gmail.com>
Wed, 3 Aug 2011 23:16:59 +0000 (16:16 -0700)
committerPaul Berry <stereotype441@gmail.com>
Mon, 8 Aug 2011 19:43:57 +0000 (12:43 -0700)
When link_functions.cpp adds a new function to the final linked
program, it needs to add it after any global variable declarations
that the function refers to, otherwise the IR will be invalid (because
variable declarations must occur before variable accesses).  The
easiest way to do that is to have the linker emit functions to the
tail of the final linked program.

The linker used to emit functions to the head of the final linked
program, in an effort to keep callees sorted before their callers.
However, this was not reliable: it didn't work for functions declared
or defined in the same compilation unit as main, for diamond-shaped
patterns in the call graph, or for some obscure cases involving
overloaded functions.  And no code currently relies on this sort
order.

No Piglit regressions with i965 Ironlake.

Reviewed-by: Kenneth Graunke <kenneth@whitecape.org>
src/glsl/link_functions.cpp

index d40f771e3420d24c7f0a2be1550a1c2e95ce1715..acee327124980eda25912ef7cd720a83d0009ba3 100644 (file)
@@ -104,10 +104,12 @@ public:
       if (f == NULL) {
         f = new(linked) ir_function(name);
 
-        /* Add the new function to the linked IR.
+        /* Add the new function to the linked IR.  Put it at the end
+          * so that it comes after any global variable declarations
+          * that it refers to.
          */
         linked->symbols->add_function(f);
-        linked->ir->push_head(f);
+        linked->ir->push_tail(f);
       }
 
       ir_function_signature *linked_sig =