Subversion Repositories Kolibri OS

Rev

Blame | Last modification | View Log | RSS feed

  1. #!/usr/bin/env python
  2.  
  3. # (C) Copyright IBM Corporation 2004, 2005
  4. # All Rights Reserved.
  5. #
  6. # Permission is hereby granted, free of charge, to any person obtaining a
  7. # copy of this software and associated documentation files (the "Software"),
  8. # to deal in the Software without restriction, including without limitation
  9. # on the rights to use, copy, modify, merge, publish, distribute, sub
  10. # license, and/or sell copies of the Software, and to permit persons to whom
  11. # the Software is furnished to do so, subject to the following conditions:
  12. #
  13. # The above copyright notice and this permission notice (including the next
  14. # paragraph) shall be included in all copies or substantial portions of the
  15. # Software.
  16. #
  17. # THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
  18. # IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
  19. # FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT.  IN NO EVENT SHALL
  20. # IBM AND/OR ITS SUPPLIERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
  21. # LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
  22. # FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS
  23. # IN THE SOFTWARE.
  24. #
  25. # Authors:
  26. #    Ian Romanick <idr@us.ibm.com>
  27.  
  28. import license
  29. import gl_XML, glX_XML
  30. import sys, getopt
  31.  
  32. class PrintGenericStubs(gl_XML.gl_print_base):
  33.  
  34.     def __init__(self):
  35.         gl_XML.gl_print_base.__init__(self)
  36.  
  37.         self.name = "gl_x86_asm.py (from Mesa)"
  38.         self.license = license.bsd_license_template % ( \
  39. """Copyright (C) 1999-2001  Brian Paul   All Rights Reserved.
  40. (C) Copyright IBM Corporation 2004, 2005""", "BRIAN PAUL, IBM")
  41.         return
  42.  
  43.  
  44.     def get_stack_size(self, f):
  45.         size = 0
  46.         for p in f.parameterIterator():
  47.             if p.is_padding:
  48.                 continue
  49.  
  50.             size += p.get_stack_size()
  51.  
  52.         return size
  53.  
  54.  
  55.     def printRealHeader(self):
  56.         print '#include "x86/assyntax.h"'
  57.         print ''
  58.         print '#if defined(STDCALL_API)'
  59.         print '# if defined(USE_MGL_NAMESPACE)'
  60.         print '#  define GL_PREFIX(n,n2) GLNAME(CONCAT(mgl,n2))'
  61.         print '# else'
  62.         print '#  define GL_PREFIX(n,n2) GLNAME(CONCAT(gl,n2))'
  63.         print '# endif'
  64.         print '#else'
  65.         print '# if defined(USE_MGL_NAMESPACE)'
  66.         print '#  define GL_PREFIX(n,n2) GLNAME(CONCAT(mgl,n))'
  67.         print '#  define _glapi_Dispatch _mglapi_Dispatch'
  68.         print '# else'
  69.         print '#  define GL_PREFIX(n,n2) GLNAME(CONCAT(gl,n))'
  70.         print '# endif'
  71.         print '#endif'
  72.         print ''
  73.         print '#define GL_OFFSET(x) CODEPTR(REGOFF(4 * x, EAX))'
  74.         print ''
  75.         print '#if defined(GNU_ASSEMBLER) && !defined(__MINGW32__) && !defined(__APPLE__)'
  76.         print '#define GLOBL_FN(x) GLOBL x ; .type x, @function'
  77.         print '#else'
  78.         print '#define GLOBL_FN(x) GLOBL x'
  79.         print '#endif'
  80.         print ''
  81.         print ''
  82.         print '#ifdef GLX_USE_TLS'
  83.         print ''
  84.         print '#ifdef GLX_X86_READONLY_TEXT'
  85.         print '# define CTX_INSNS MOV_L(GS:(EAX), EAX)'
  86.         print '#else'
  87.         print '# define CTX_INSNS NOP /* Pad for init_glapi_relocs() */'
  88.         print '#endif'
  89.         print ''
  90.         print '#  define GL_STUB(fn,off,fn_alt)\t\t\t\\'
  91.         print 'ALIGNTEXT16;\t\t\t\t\t\t\\'
  92.         print 'GLOBL_FN(GL_PREFIX(fn, fn_alt));\t\t\t\\'
  93.         print 'GL_PREFIX(fn, fn_alt):\t\t\t\t\t\\'
  94.         print '\tCALL(_x86_get_dispatch) ;\t\t\t\\'
  95.         print '\tCTX_INSNS ;                                    \\'
  96.         print '\tJMP(GL_OFFSET(off))'
  97.         print ''
  98.         print '#elif defined(HAVE_PTHREAD)'
  99.         print '#  define GL_STUB(fn,off,fn_alt)\t\t\t\\'
  100.         print 'ALIGNTEXT16;\t\t\t\t\t\t\\'
  101.         print 'GLOBL_FN(GL_PREFIX(fn, fn_alt));\t\t\t\\'
  102.         print 'GL_PREFIX(fn, fn_alt):\t\t\t\t\t\\'
  103.         print '\tMOV_L(CONTENT(GLNAME(_glapi_Dispatch)), EAX) ;\t\\'
  104.         print '\tTEST_L(EAX, EAX) ;\t\t\t\t\\'
  105.         print '\tJE(1f) ;\t\t\t\t\t\\'
  106.         print '\tJMP(GL_OFFSET(off)) ;\t\t\t\t\\'
  107.         print '1:\tCALL(_x86_get_dispatch) ;\t\t\t\\'
  108.         print '\tJMP(GL_OFFSET(off))'
  109.         print '#else'
  110.         print '#  define GL_STUB(fn,off,fn_alt)\t\t\t\\'
  111.         print 'ALIGNTEXT16;\t\t\t\t\t\t\\'
  112.         print 'GLOBL_FN(GL_PREFIX(fn, fn_alt));\t\t\t\\'
  113.         print 'GL_PREFIX(fn, fn_alt):\t\t\t\t\t\\'
  114.         print '\tMOV_L(CONTENT(GLNAME(_glapi_Dispatch)), EAX) ;\t\\'
  115.         print '\tTEST_L(EAX, EAX) ;\t\t\t\t\\'
  116.         print '\tJE(1f) ;\t\t\t\t\t\\'
  117.         print '\tJMP(GL_OFFSET(off)) ;\t\t\t\t\\'
  118.         print '1:\tCALL(_glapi_get_dispatch) ;\t\t\t\\'
  119.         print '\tJMP(GL_OFFSET(off))'
  120.         print '#endif'
  121.         print ''
  122.         print '#ifdef HAVE_ALIAS'
  123.         print '#  define GL_STUB_ALIAS(fn,off,fn_alt,alias,alias_alt)\t\\'
  124.         print '\t.globl\tGL_PREFIX(fn, fn_alt) ;\t\t\t\\'
  125.         print '\t.set\tGL_PREFIX(fn, fn_alt), GL_PREFIX(alias, alias_alt)'
  126.         print '#else'
  127.         print '#  define GL_STUB_ALIAS(fn,off,fn_alt,alias,alias_alt)\t\\'
  128.         print '    GL_STUB(fn, off, fn_alt)'
  129.         print '#endif'
  130.         print ''
  131.         print 'SEG_TEXT'
  132.         print ''
  133.         print '#ifdef GLX_USE_TLS'
  134.         print ''
  135.         print '\tGLOBL\tGLNAME(_x86_get_dispatch)'
  136.         print '\tHIDDEN(GLNAME(_x86_get_dispatch))'
  137.         print 'ALIGNTEXT16'
  138.         print 'GLNAME(_x86_get_dispatch):'
  139.         print '\tcall   1f'
  140.         print '1:\tpopl %eax'
  141.         print '\taddl   $_GLOBAL_OFFSET_TABLE_+[.-1b], %eax'
  142.         print '\tmovl   _glapi_tls_Dispatch@GOTNTPOFF(%eax), %eax'
  143.         print '\tret'
  144.         print ''
  145.         print '#elif defined(HAVE_PTHREAD)'
  146.         print 'EXTERN GLNAME(_glapi_Dispatch)'
  147.         print 'EXTERN GLNAME(_gl_DispatchTSD)'
  148.         print 'EXTERN GLNAME(pthread_getspecific)'
  149.         print ''
  150.         print 'ALIGNTEXT16'
  151.         print 'GLNAME(_x86_get_dispatch):'
  152.         print '\tSUB_L(CONST(24), ESP)'
  153.         print '\tPUSH_L(GLNAME(_gl_DispatchTSD))'
  154.         print '\tCALL(GLNAME(pthread_getspecific))'
  155.         print '\tADD_L(CONST(28), ESP)'
  156.         print '\tRET'
  157.         print '#else'
  158.         print 'EXTERN GLNAME(_glapi_get_dispatch)'
  159.         print '#endif'
  160.         print ''
  161.  
  162.         print '#if defined( GLX_USE_TLS ) && !defined( GLX_X86_READONLY_TEXT )'
  163.         print '\t\t.section\twtext, "awx", @progbits'
  164.         print '#endif /* defined( GLX_USE_TLS ) */'
  165.  
  166.         print ''
  167.         print '\t\tALIGNTEXT16'
  168.         print '\t\tGLOBL GLNAME(gl_dispatch_functions_start)'
  169.         print '\t\tHIDDEN(GLNAME(gl_dispatch_functions_start))'
  170.         print 'GLNAME(gl_dispatch_functions_start):'
  171.         print ''
  172.         return
  173.  
  174.  
  175.     def printRealFooter(self):
  176.         print ''
  177.         print '\t\tGLOBL\tGLNAME(gl_dispatch_functions_end)'
  178.         print '\t\tHIDDEN(GLNAME(gl_dispatch_functions_end))'
  179.         print '\t\tALIGNTEXT16'
  180.         print 'GLNAME(gl_dispatch_functions_end):'
  181.         print ''
  182.         print '#if defined (__ELF__) && defined (__linux__)'
  183.         print ' .section .note.GNU-stack,"",%progbits'
  184.         print '#endif'
  185.         return
  186.  
  187.  
  188.     def printBody(self, api):
  189.         for f in api.functionIterateByOffset():
  190.             name = f.dispatch_name()
  191.             stack = self.get_stack_size(f)
  192.             alt = "%s@%u" % (name, stack)
  193.  
  194.             print '\tGL_STUB(%s, %d, %s)' % (name, f.offset, alt)
  195.  
  196.             if not f.is_static_entry_point(f.name):
  197.                 print '\tHIDDEN(GL_PREFIX(%s, %s))' % (name, alt)
  198.  
  199.  
  200.         for f in api.functionIterateByOffset():
  201.             name = f.dispatch_name()
  202.             stack = self.get_stack_size(f)
  203.             alt = "%s@%u" % (name, stack)
  204.  
  205.             for n in f.entry_points:
  206.                 if f.is_static_entry_point(n):
  207.                     if n != f.name:
  208.                         alt2 = "%s@%u" % (n, stack)
  209.                         text = '\tGL_STUB_ALIAS(%s, %d, %s, %s, %s)' % (n, f.offset, alt2, name, alt)
  210.  
  211.                         if f.has_different_protocol(n):
  212.                             print '#ifndef GLX_INDIRECT_RENDERING'
  213.                             print text
  214.                             print '#endif'
  215.                         else:
  216.                             print text
  217.  
  218.         return
  219.  
  220. def show_usage():
  221.     print "Usage: %s [-f input_file_name] [-m output_mode]" % sys.argv[0]
  222.     sys.exit(1)
  223.  
  224. if __name__ == '__main__':
  225.     file_name = "gl_API.xml"
  226.     mode = "generic"
  227.  
  228.     try:
  229.         (args, trail) = getopt.getopt(sys.argv[1:], "m:f:")
  230.     except Exception,e:
  231.         show_usage()
  232.  
  233.     for (arg,val) in args:
  234.         if arg == '-m':
  235.             mode = val
  236.         elif arg == "-f":
  237.             file_name = val
  238.  
  239.     if mode == "generic":
  240.         printer = PrintGenericStubs()
  241.     else:
  242.         print "ERROR: Invalid mode \"%s\" specified." % mode
  243.         show_usage()
  244.  
  245.     api = gl_XML.parse_GL_API(file_name, glX_XML.glx_item_factory())
  246.     printer.Print(api)
  247.