Go to most recent revision | Details | Last modification | View Log | RSS feed
Rev | Author | Line No. | Line |
---|---|---|---|
5564 | serge | 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 |
||
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) |