1 2# (C) Copyright IBM Corporation 2004, 2005 3# All Rights Reserved. 4# 5# Permission is hereby granted, free of charge, to any person obtaining a 6# copy of this software and associated documentation files (the "Software"), 7# to deal in the Software without restriction, including without limitation 8# on the rights to use, copy, modify, merge, publish, distribute, sub 9# license, and/or sell copies of the Software, and to permit persons to whom 10# the Software is furnished to do so, subject to the following conditions: 11# 12# The above copyright notice and this permission notice (including the next 13# paragraph) shall be included in all copies or substantial portions of the 14# Software. 15# 16# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 17# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 18# FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT. IN NO EVENT SHALL 19# IBM AND/OR ITS SUPPLIERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 20# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING 21# FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS 22# IN THE SOFTWARE. 23# 24# Authors: 25# Ian Romanick <[email protected]> 26 27import argparse 28 29import license 30import gl_XML, glX_XML 31 32class 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('# define GL_PREFIX(n,n2) GLNAME(CONCAT(gl,n2))') 60 print('#else') 61 print('# define GL_PREFIX(n,n2) GLNAME(CONCAT(gl,n))') 62 print('#endif') 63 print('') 64 print('#define GL_OFFSET(x) CODEPTR(REGOFF(4 * x, EAX))') 65 print('') 66 print('#if defined(GNU_ASSEMBLER) && !defined(__MINGW32__) && !defined(__APPLE__)') 67 print('#define GLOBL_FN(x) GLOBL x ; .type x, @function') 68 print('#else') 69 print('#define GLOBL_FN(x) GLOBL x') 70 print('#endif') 71 print('') 72 print('') 73 print('#ifdef REALLY_INITIAL_EXEC') 74 print('') 75 print('#ifdef GLX_X86_READONLY_TEXT') 76 print('# define CTX_INSNS MOV_L(GS:(EAX), EAX)') 77 print('#else') 78 print('# define CTX_INSNS NOP /* Pad for init_glapi_relocs() */') 79 print('#endif') 80 print('') 81 print('# define GL_STUB(fn,off,fn_alt)\t\t\t\\') 82 print('ALIGNTEXT16;\t\t\t\t\t\t\\') 83 print('GLOBL_FN(GL_PREFIX(fn, fn_alt));\t\t\t\\') 84 print('GL_PREFIX(fn, fn_alt):\t\t\t\t\t\\') 85 print('\tCALL(_x86_get_dispatch) ;\t\t\t\\') 86 print('\tCTX_INSNS ; \\') 87 print('\tJMP(GL_OFFSET(off))') 88 print('') 89 print('#else') 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('\tMOV_L(CONTENT(GLNAME(_glapi_Dispatch)), EAX) ;\t\\') 95 print('\tTEST_L(EAX, EAX) ;\t\t\t\t\\') 96 print('\tJE(1f) ;\t\t\t\t\t\\') 97 print('\tJMP(GL_OFFSET(off)) ;\t\t\t\t\\') 98 print('1:\tCALL(_glapi_get_dispatch) ;\t\t\t\\') 99 print('\tJMP(GL_OFFSET(off))') 100 print('#endif') 101 print('') 102 print('#ifdef HAVE_FUNC_ATTRIBUTE_ALIAS') 103 print('# define GL_STUB_ALIAS(fn,off,fn_alt,alias,alias_alt)\t\\') 104 print('\t.globl\tGL_PREFIX(fn, fn_alt) ;\t\t\t\\') 105 print('\t.set\tGL_PREFIX(fn, fn_alt), GL_PREFIX(alias, alias_alt)') 106 print('#else') 107 print('# define GL_STUB_ALIAS(fn,off,fn_alt,alias,alias_alt)\t\\') 108 print(' GL_STUB(fn, off, fn_alt)') 109 print('#endif') 110 print('') 111 print('SEG_TEXT') 112 print('') 113 print('#ifdef REALLY_INITIAL_EXEC') 114 print('') 115 print('\tGLOBL\tGLNAME(_x86_get_dispatch)') 116 print('\tHIDDEN(GLNAME(_x86_get_dispatch))') 117 print('ALIGNTEXT16') 118 print('GLNAME(_x86_get_dispatch):') 119 print('\tcall 1f') 120 print('1:\tpopl %eax') 121 print('\taddl $_GLOBAL_OFFSET_TABLE_+[.-1b], %eax') 122 print('\tmovl _glapi_tls_Dispatch@GOTNTPOFF(%eax), %eax') 123 print('\tret') 124 print('') 125 print('#else') 126 print('EXTERN GLNAME(_glapi_Dispatch)') 127 print('EXTERN GLNAME(_glapi_get_dispatch)') 128 print('#endif') 129 print('') 130 131 print('#if !defined( GLX_X86_READONLY_TEXT )') 132 print('\t\t.section\twtext, "awx", @progbits') 133 print('#endif /* !defined( GLX_X86_READONLY_TEXT ) */') 134 135 print('') 136 print('\t\tALIGNTEXT16') 137 print('\t\tGLOBL GLNAME(gl_dispatch_functions_start)') 138 print('\t\tHIDDEN(GLNAME(gl_dispatch_functions_start))') 139 print('GLNAME(gl_dispatch_functions_start):') 140 print('') 141 return 142 143 144 def printRealFooter(self): 145 print('') 146 print('\t\tGLOBL\tGLNAME(gl_dispatch_functions_end)') 147 print('\t\tHIDDEN(GLNAME(gl_dispatch_functions_end))') 148 print('\t\tALIGNTEXT16') 149 print('GLNAME(gl_dispatch_functions_end):') 150 print('') 151 print('#if defined (__ELF__) && defined (__linux__)') 152 print(' .section .note.GNU-stack,"",%progbits') 153 print('#endif') 154 return 155 156 157 def printBody(self, api): 158 for f in api.functionIterateByOffset(): 159 name = f.dispatch_name() 160 stack = self.get_stack_size(f) 161 alt = "%s@%u" % (name, stack) 162 163 print('\tGL_STUB(%s, %d, %s)' % (name, f.offset, alt)) 164 165 if not f.is_static_entry_point(f.name): 166 print('\tHIDDEN(GL_PREFIX(%s, %s))' % (name, alt)) 167 168 169 for f in api.functionIterateByOffset(): 170 name = f.dispatch_name() 171 stack = self.get_stack_size(f) 172 alt = "%s@%u" % (name, stack) 173 174 for n in f.entry_points: 175 if f.is_static_entry_point(n): 176 if n != f.name: 177 alt2 = "%s@%u" % (n, stack) 178 text = '\tGL_STUB_ALIAS(%s, %d, %s, %s, %s)' % (n, f.offset, alt2, name, alt) 179 180 if f.has_different_protocol(n): 181 print('#if GLAPI_EXPORT_PROTO_ENTRY_POINTS') 182 print(text) 183 print('#endif') 184 else: 185 print(text) 186 187 return 188 189def _parser(): 190 parser = argparse.ArgumentParser() 191 parser.add_argument('-f', 192 dest='filename', 193 default='gl_API.xml', 194 help='An XML file describing an API.') 195 return parser.parse_args() 196 197 198def main(): 199 args = _parser() 200 printer = PrintGenericStubs() 201 202 api = gl_XML.parse_GL_API(args.filename, glX_XML.glx_item_factory()) 203 printer.Print(api) 204 205 206if __name__ == '__main__': 207 main() 208