Fix bug #4681.
[mesa.git] / src / mesa / glapi / gl_x86_asm.py
index 346252b7b620cdc47f9ccd72801e1a33ef4581ff..977e0329cc56ea3b5b0c99aab92b3023a9466dc4 100644 (file)
@@ -1,6 +1,6 @@
-#!/usr/bin/python2
+#!/usr/bin/env python
 
-# (C) Copyright IBM Corporation 2004
+# (C) Copyright IBM Corporation 2004, 2005
 # All Rights Reserved.
 #
 # Permission is hereby granted, free of charge, to any person obtaining a
 # Authors:
 #    Ian Romanick <idr@us.ibm.com>
 
-from xml.sax import saxutils
-from xml.sax import make_parser
-from xml.sax.handler import feature_namespaces
-
-import gl_XML
 import license
+import gl_XML, glX_XML
 import sys, getopt
 
-class PrintGenericStubs(gl_XML.FilterGLAPISpecBase):
-       name = "gl_x86_asm.py (from Mesa)"
+class PrintGenericStubs(gl_XML.gl_print_base):
 
        def __init__(self):
-               gl_XML.FilterGLAPISpecBase.__init__(self)
+               gl_XML.gl_print_base.__init__(self)
+
+               self.name = "gl_x86_asm.py (from Mesa)"
                self.license = license.bsd_license_template % ( \
 """Copyright (C) 1999-2001  Brian Paul   All Rights Reserved.
-(C) Copyright IBM Corporation 2004""", "BRIAN PAUL, IBM")
+(C) Copyright IBM Corporation 2004, 2005""", "BRIAN PAUL, IBM")
+               return
 
 
        def get_stack_size(self, f):
                size = 0
-               for p in f:
-                       t = p.p_type
-
-                       if p.is_array() or t.size != 8:
-                               size += 4
-                       else:
-                               size += 8
+               for p in f.parameterIterator():
+                       size += p.get_stack_size()
 
                return size
 
+
        def printRealHeader(self):
                print '#include "assyntax.h"'
                print '#include "glapioffsets.h"'
                print ''
-               print '#ifndef __WIN32__'
-               print ''        
                print '#if defined(STDCALL_API)'
-               print '#define GL_PREFIX(n,n2) GLNAME(CONCAT(gl,n2))'
-               print '#elif defined(USE_MGL_NAMESPACE)'
-               print '#define GL_PREFIX(n,n2) GLNAME(CONCAT(mgl,n))'
+               print '# if defined(USE_MGL_NAMESPACE)'
+               print '#  define GL_PREFIX(n,n2) GLNAME(CONCAT(mgl,n2))'
+               print '# else'
+               print '#  define GL_PREFIX(n,n2) GLNAME(CONCAT(gl,n2))'
+               print '# endif'
                print '#else'
-               print '#define GL_PREFIX(n,n2) GLNAME(CONCAT(gl,n))'
+               print '# if defined(USE_MGL_NAMESPACE)'
+               print '#  define GL_PREFIX(n,n2) GLNAME(CONCAT(mgl,n))'
+               print '# else'
+               print '#  define GL_PREFIX(n,n2) GLNAME(CONCAT(gl,n))'
+               print '# endif'
                print '#endif'
                print ''
                print '#define GL_OFFSET(x) CODEPTR(REGOFF(4 * x, EAX))'
                print ''
                print '#if defined(GNU_ASSEMBLER) && !defined(__DJGPP__) && !defined(__MINGW32__)'
-               print '#define GLOBL_FN(x) GLOBL x ; .type x,@function'
+               print '#define GLOBL_FN(x) GLOBL x ; .type x, function'
                print '#else'
                print '#define GLOBL_FN(x) GLOBL x'
                print '#endif'
                print ''
-               print '#if defined(PTHREADS) || defined(XTHREADS) || defined(SOLARIS_THREADS) || defined(WIN32_THREADS) || defined(BEOS_THREADS)'
+               print '#if defined(PTHREADS) || defined(USE_XTHREADS) || defined(SOLARIS_THREADS) || defined(WIN32_THREADS) || defined(BEOS_THREADS)'
                print '#  define THREADS'
                print '#endif'
                print ''
-               print '#if defined(PTHREADS)'
+               print '#ifdef GLX_USE_TLS'
+               print ''
                print '#  define GL_STUB(fn,off,fn_alt)\t\t\t\\'
                print 'ALIGNTEXT16;\t\t\t\t\t\t\\'
                print 'GLOBL_FN(GL_PREFIX(fn, fn_alt));\t\t\t\\'
                print 'GL_PREFIX(fn, fn_alt):\t\t\t\t\t\\'
-               print '\tMOV_L(CONTENT(GLNAME(_glapi_DispatchTSD)), EAX) ;\t\\'
+               print '\tCALL(_x86_get_dispatch) ;\t\t\t\\'
+               print '\tNOP ;\t\t\t\t\t\t\\'
+               print '\tJMP(GL_OFFSET(off))'
+               print ''
+               print '#elif defined(PTHREADS)'
+               print '#  define GL_STUB(fn,off,fn_alt)\t\t\t\\'
+               print 'ALIGNTEXT16;\t\t\t\t\t\t\\'
+               print 'GLOBL_FN(GL_PREFIX(fn, fn_alt));\t\t\t\\'
+               print 'GL_PREFIX(fn, fn_alt):\t\t\t\t\t\\'
+               print '\tMOV_L(CONTENT(GLNAME(_glapi_Dispatch)), EAX) ;\t\\'
                print '\tTEST_L(EAX, EAX) ;\t\t\t\t\\'
                print '\tJE(1f) ;\t\t\t\t\t\\'
                print '\tJMP(GL_OFFSET(off)) ;\t\t\t\t\\'
-               print '1:\tCALL(get_dispatch) ;\t\t\t\t\\'
+               print '1:\tCALL(_x86_get_dispatch) ;\t\t\t\\'
                print '\tJMP(GL_OFFSET(off))'
                print '#elif defined(THREADS)'
                print '#  define GL_STUB(fn,off,fn_alt)\t\t\t\\'
                print 'ALIGNTEXT16;\t\t\t\t\t\t\\'
                print 'GLOBL_FN(GL_PREFIX(fn, fn_alt));\t\t\t\\'
                print 'GL_PREFIX(fn, fn_alt):\t\t\t\t\t\\'
-               print '\tMOV_L(CONTENT(GLNAME(_glapi_DispatchTSD)), EAX) ;\t\\'
+               print '\tMOV_L(CONTENT(GLNAME(_glapi_Dispatch)), EAX) ;\t\\'
                print '\tTEST_L(EAX, EAX) ;\t\t\t\t\\'
                print '\tJE(1f) ;\t\t\t\t\t\\'
                print '\tJMP(GL_OFFSET(off)) ;\t\t\t\t\\'
@@ -108,51 +116,116 @@ class PrintGenericStubs(gl_XML.FilterGLAPISpecBase):
                print 'ALIGNTEXT16;\t\t\t\t\t\t\\'
                print 'GLOBL_FN(GL_PREFIX(fn, fn_alt));\t\t\t\\'
                print 'GL_PREFIX(fn, fn_alt):\t\t\t\t\t\\'
-               print '\tMOV_L(CONTENT(GLNAME(_glapi_DispatchTSD)), EAX) ;\t\\'
+               print '\tMOV_L(CONTENT(GLNAME(_glapi_Dispatch)), EAX) ;\t\\'
                print '\tJMP(GL_OFFSET(off))'
                print '#endif'
                print ''
+               print '#ifdef HAVE_ALIAS'
+               print '#  define GL_STUB_ALIAS(fn,off,fn_alt,alias,alias_alt)\t\\'
+               print '\t.globl\tGL_PREFIX(fn, fn_alt) ;\t\t\t\\'
+               print '\t.set\tGL_PREFIX(fn, fn_alt), GL_PREFIX(alias, alias_alt)'
+               print '#else'
+               print '#  define GL_STUB_ALIAS(fn,off,fn_alt,alias,alias_alt)\t\\'
+               print '    GL_STUB(fn, off, fn_alt)'
+               print '#endif'
+               print ''
                print 'SEG_TEXT'
                print ''
-               print '#ifdef PTHREADS'
+               print '#ifdef GLX_USE_TLS'
+               print ''
+               print '\tGLOBL\tGLNAME(_x86_get_dispatch)'
+               print '\tHIDDEN(GLNAME(_x86_get_dispatch))'
+               print 'ALIGNTEXT16'
+               print 'GLNAME(_x86_get_dispatch):'
+               print '\tmovl\t%gs:_glapi_tls_Dispatch@NTPOFF, %eax'
+               print '\tret'
+               print ''
+               print '#elif defined(PTHREADS)'
                print 'EXTERN GLNAME(_glapi_Dispatch)'
                print 'EXTERN GLNAME(_gl_DispatchTSD)'
-               print '#ifdef __PIC__'
-               print 'EXTERN GLNAME(pthread_getspecific@PLT)'
-               print '#else'
                print 'EXTERN GLNAME(pthread_getspecific)'
-               print '#endif'
                print ''
                print 'ALIGNTEXT16'
-               print 'GLNAME(get_dispatch):'
+               print 'GLNAME(_x86_get_dispatch):'
                print '\tSUB_L(CONST(24), ESP)'
                print '\tPUSH_L(GLNAME(_gl_DispatchTSD))'
-               print '#ifdef __PIC__'
-               print '\tCALL(GLNAME(pthread_getspecific@PLT))'
-               print '#else'
                print '\tCALL(GLNAME(pthread_getspecific))'
-               print '#endif'
                print '\tADD_L(CONST(28), ESP)'
                print '\tRET'
                print '#elif defined(THREADS)'
                print 'EXTERN GLNAME(_glapi_get_dispatch)'
                print '#endif'
                print ''
-               print '\t\tALIGNTEXT16 ; GLOBL gl_dispatch_functions_start'
-               print 'gl_dispatch_functions_start:'
+
+               print '#if defined( GLX_USE_TLS )'
+               print '\t\t.section\twtext, "awx", @progbits'
+               print '#endif /* defined( GLX_USE_TLS ) */'
+
+               print ''
+               print '\t\tALIGNTEXT16'
+               print '\t\tGLOBL GLNAME(gl_dispatch_functions_start)'
+               print '\t\tHIDDEN(GLNAME(gl_dispatch_functions_start))'
+               print 'GLNAME(gl_dispatch_functions_start):'
                print ''
                return
 
+
        def printRealFooter(self):
                print ''
-               print '#endif  /* __WIN32__ */'
+               print '\t\tGLOBL\tGLNAME(gl_dispatch_functions_end)'
+               print '\t\tHIDDEN(GLNAME(gl_dispatch_functions_end))'
+               print '\t\tALIGNTEXT16'
+               print 'GLNAME(gl_dispatch_functions_end):'
+               print ''
+               print '#if defined(GLX_USE_TLS) && defined(__linux__)'
+               print ' .section ".note.ABI-tag", "a"'
+               print ' .p2align 2'
+               print ' .long   1f - 0f   /* name length */'
+               print ' .long   3f - 2f   /* data length */'
+               print ' .long   1         /* note length */'
+               print '0:       .asciz "GNU"      /* vendor name */'
+               print '1:       .p2align 2'
+               print '2:       .long   0         /* note data: the ABI tag */'
+               print ' .long   2,4,20    /* Minimum kernel version w/TLS */'
+               print '3:       .p2align 2        /* pad out section */'
+               print '#endif /* GLX_USE_TLS */'
+               print ''
+               print '#if defined (__ELF__) && defined (__linux__)'
+               print ' .section .note.GNU-stack,"",%progbits'
+               print '#endif'
                return
 
-       def printFunction(self, f):
-               stack = self.get_stack_size(f)
 
-               alt = "%s@%u" % (f.name, stack)
-               print '\tGL_STUB(%s, _gloffset_%s, %s)' % (f.name, f.real_name, alt)
+       def printBody(self, api):
+               for f in api.functionIterateByOffset():
+                       name = f.dispatch_name()
+                       stack = self.get_stack_size(f)
+                       alt = "%s@%u" % (name, stack)
+
+                       print '\tGL_STUB(%s, _gloffset_%s, %s)' % (name, f.name, alt)
+
+                       if not f.is_static_entry_point(f.name):
+                               print '\tHIDDEN(GL_PREFIX(%s, %s))' % (name, alt)
+
+
+               for f in api.functionIterateByOffset():
+                       name = f.dispatch_name()
+                       stack = self.get_stack_size(f)
+                       alt = "%s@%u" % (name, stack)
+
+                       if f.is_static_entry_point(f.name):
+                               for n in f.entry_points:
+                                       if n != f.name:
+                                               alt2 = "%s@%u" % (n, stack)
+                                               text = '\tGL_STUB_ALIAS(%s, _gloffset_%s, %s, %s, %s)' % (n, f.name, alt2, f.name, alt)
+
+                                               if f.has_different_protocol(n):
+                                                       print '#ifndef GLX_INDIRECT_RENDERING'
+                                                       print text
+                                                       print '#endif'
+                                               else:
+                                                       print text
+
                return
 
 def show_usage():
@@ -175,17 +248,10 @@ if __name__ == '__main__':
                        file_name = val
 
        if mode == "generic":
-               dh = PrintGenericStubs()
+               printer = PrintGenericStubs()
        else:
                print "ERROR: Invalid mode \"%s\" specified." % mode
                show_usage()
 
-       parser = make_parser()
-       parser.setFeature(feature_namespaces, 0)
-       parser.setContentHandler(dh)
-
-       f = open(file_name)
-
-       dh.printHeader()
-       parser.parse(f)
-       dh.printFooter()
+       api = gl_XML.parse_GL_API(file_name, glX_XML.glx_item_factory())
+       printer.Print(api)