summaryrefslogtreecommitdiffstats
path: root/src
diff options
context:
space:
mode:
authorChia-I Wu <[email protected]>2010-12-11 00:26:32 +0800
committerChia-I Wu <[email protected]>2010-12-24 17:28:52 +0800
commitb765b1269fd7091d2f794303474995375b9d1946 (patch)
tree589dfebc77c1cbc5c06fe9544ea2b0ae69f07b95 /src
parent52ca15334992cf7d37beaa17f120401ba4b4bcf4 (diff)
mapi: Fix hidden entries.
Hidden entries are just like normal entries except that they are not exported. Since it is not always possible to hide them, and two hidden aliases can share the same entry, the name of hidden aliases are mangled to '_dispatch_stub_<slot>'.
Diffstat (limited to 'src')
-rw-r--r--src/mapi/mapi/mapi_abi.py71
1 files changed, 55 insertions, 16 deletions
diff --git a/src/mapi/mapi/mapi_abi.py b/src/mapi/mapi/mapi_abi.py
index 0059171e6ab..fb91f6165a0 100644
--- a/src/mapi/mapi/mapi_abi.py
+++ b/src/mapi/mapi/mapi_abi.py
@@ -236,15 +236,32 @@ class ABIPrinter(object):
self.api_entry = 'KHRONOS_APIENTRY'
self.api_attrs = 'KHRONOS_APIATTRIBUTES'
- def c_header(self):
+ def c_notice(self):
return '/* This file is automatically generated by mapi_abi.py. Do not modify. */'
- def c_includes(self):
+ def c_public_includes(self):
"""Return includes of the client API headers."""
defines = ['#define ' + d for d in self.api_defines]
includes = ['#include ' + h for h in self.api_headers]
return "\n".join(defines + includes)
+ def need_entry_point(self, ent):
+ """Return True if an entry point is needed for the entry."""
+ # non-handcode hidden aliases may share the entry they alias
+ use_alias = (ent.hidden and ent.alias and not ent.handcode)
+ return not use_alias
+
+ def c_public_declarations(self, prefix):
+ """Return the declarations of public entry points."""
+ decls = []
+ for ent in self.entries:
+ if not self.need_entry_point(ent):
+ continue
+ export = self.api_call if not ent.hidden else ''
+ decls.append(self._c_decl(ent, prefix, True, export) + ';')
+
+ return "\n".join(decls)
+
def c_mapi_table(self):
"""Return defines of the dispatch table size."""
num_static_entries = 0
@@ -278,16 +295,31 @@ class ABIPrinter(object):
return self.indent + self.indent.join(specv1)
- def _c_function(self, ent, prefix, stringify=False):
+ def _c_function(self, ent, prefix, mangle=False, stringify=False):
"""Return the function name of an entry."""
formats = { True: '"%s%s"', False: '%s%s' }
fmt = formats[stringify]
- return fmt % (prefix, ent.name)
+ name = ent.name
+ if mangle and ent.hidden:
+ name = '_dispatch_stub_' + str(ent.slot)
+ return fmt % (prefix, name)
+
+ def _c_function_call(self, ent, prefix):
+ """Return the function name used for calling."""
+ if ent.handcode:
+ # _c_function does not handle this case
+ fmt = '%s%s'
+ name = fmt % (prefix, ent.handcode)
+ elif self.need_entry_point(ent):
+ name = self._c_function(ent, prefix, True)
+ else:
+ name = self._c_function(ent.alias, prefix, True)
+ return name
- def _c_decl(self, ent, prefix, export=''):
+ def _c_decl(self, ent, prefix, mangle=False, export=''):
"""Return the C declaration for the entry."""
decl = '%s %s %s(%s)' % (ent.c_return(), self.api_entry,
- self._c_function(ent, prefix), ent.c_params())
+ self._c_function(ent, prefix, mangle), ent.c_params())
if export:
decl = export + ' ' + decl
if self.api_attrs:
@@ -313,10 +345,12 @@ class ABIPrinter(object):
"""Return the public dispatch functions."""
dispatches = []
for ent in self.entries:
- if ent.hidden:
+ if not self.need_entry_point(ent):
continue
- proto = self._c_decl(ent, prefix, self.api_call)
+ export = self.api_call if not ent.hidden else ''
+
+ proto = self._c_decl(ent, prefix, True, export)
cast = self._c_cast(ent)
ret = ''
@@ -362,7 +396,7 @@ class ABIPrinter(object):
stubs = []
for ent in self.entries_sorted_by_names:
stubs.append('%s{ (mapi_func) %s, %d, (void *) %d }' % (
- self.indent, self._c_function(ent, prefix),
+ self.indent, self._c_function_call(ent, prefix),
ent.slot, pool_offsets[ent]))
return ',\n'.join(stubs)
@@ -374,10 +408,10 @@ class ABIPrinter(object):
if ent.alias:
continue
- proto = self._c_decl(ent, prefix, 'static')
+ proto = self._c_decl(ent, prefix, False, 'static')
stmt1 = self.indent + '%s(%s);' % (self.noop_warn,
- self._c_function(ent, warn_prefix, True))
+ self._c_function(ent, warn_prefix, False, True))
if ent.ret:
stmt2 = self.indent + 'return (%s) 0;' % (ent.ret)
@@ -406,7 +440,10 @@ class ABIPrinter(object):
asm.append('__asm__(')
for ent in self.entries:
- name = self._c_function(ent, prefix, True)
+ if not self.need_entry_point(ent):
+ continue
+
+ name = self._c_function(ent, prefix, True, True)
if ent.handcode:
asm.append('#if 0')
@@ -417,7 +454,7 @@ class ABIPrinter(object):
if ent.alias:
asm.append('".globl "%s"\\n"' % (name))
asm.append('".set "%s", "%s"\\n"' % (name,
- self._c_function(ent.alias, prefix, True)))
+ self._c_function(ent.alias, prefix, True, True)))
else:
asm.append('STUB_ASM_ENTRY(%s)"\\n"' % (name))
asm.append('"\\t"STUB_ASM_CODE("%d")"\\n"' % (ent.slot))
@@ -430,10 +467,12 @@ class ABIPrinter(object):
return "\n".join(asm)
def output_for_lib(self):
- print self.c_header()
+ print self.c_notice()
print
print '#ifdef MAPI_TMP_DEFINES'
- print self.c_includes()
+ print self.c_public_includes()
+ print
+ print self.c_public_declarations(self.prefix_lib)
print '#undef MAPI_TMP_DEFINES'
print '#endif /* MAPI_TMP_DEFINES */'
print
@@ -486,7 +525,7 @@ class ABIPrinter(object):
print '#endif /* MAPI_TMP_STUB_ASM_GCC */'
def output_for_app(self):
- print self.c_header()
+ print self.c_notice()
print
print self.c_private_declarations(self.prefix_app)
print