From f214a848abb7cefb3d2c0bb7d172d54deeb05308 Mon Sep 17 00:00:00 2001
From: Brian Paul <brian.paul@tungstengraphics.com>
Date: Mon, 14 Jul 2008 15:59:44 -0600
Subject: mesa: assemble main() after all other functions

Before, main() had to come after any functions it called.
---
 src/mesa/shader/slang/slang_compile.c | 36 +++++++++++++++++++++--------------
 1 file changed, 22 insertions(+), 14 deletions(-)

diff --git a/src/mesa/shader/slang/slang_compile.c b/src/mesa/shader/slang/slang_compile.c
index e02331b973a..20bca01c46b 100644
--- a/src/mesa/shader/slang/slang_compile.c
+++ b/src/mesa/shader/slang/slang_compile.c
@@ -1788,20 +1788,6 @@ parse_function(slang_parse_ctx * C, slang_output_ctx * O, int definition,
       *parsed_func_ret = found_func;
    }
 
-   /* assemble the parsed function */
-   {
-      slang_assemble_ctx A;
-
-      A.atoms = C->atoms;
-      A.space.funcs = O->funs;
-      A.space.structs = O->structs;
-      A.space.vars = O->vars;
-      A.program = O->program;
-      A.vartable = O->vartable;
-      A.log = C->L;
-
-      _slang_codegen_function(&A, *parsed_func_ret);
-   }
    return GL_TRUE;
 }
 
@@ -1844,6 +1830,7 @@ parse_code_unit(slang_parse_ctx * C, slang_code_unit * unit,
    slang_output_ctx o;
    GLboolean success;
    GLuint maxRegs;
+   slang_function *mainFunc = NULL;
 
    if (unit->type == SLANG_UNIT_FRAGMENT_BUILTIN ||
        unit->type == SLANG_UNIT_FRAGMENT_SHADER) {
@@ -1871,6 +1858,11 @@ parse_code_unit(slang_parse_ctx * C, slang_code_unit * unit,
          {
             slang_function *func;
             success = parse_function(C, &o, 1, &func);
+            if (success &&
+                _mesa_strcmp((char *) func->header.a_name, "main") == 0) {
+               /* found main() */
+               mainFunc = func;
+            }
          }
          break;
       case EXTERNAL_DECLARATION:
@@ -1888,6 +1880,22 @@ parse_code_unit(slang_parse_ctx * C, slang_code_unit * unit,
    }
    C->I++;
 
+   if (mainFunc) {
+      /* assemble (generate code) for main() */
+      slang_assemble_ctx A;
+
+      A.atoms = C->atoms;
+      A.space.funcs = o.funs;
+      A.space.structs = o.structs;
+      A.space.vars = o.vars;
+      A.program = o.program;
+      A.vartable = o.vartable;
+      A.log = C->L;
+
+      _slang_codegen_function(&A, mainFunc);
+
+   }
+
    _slang_pop_var_table(o.vartable);
    _slang_delete_var_table(o.vartable);
 
-- 
cgit v1.2.3