diff options
Diffstat (limited to 'src')
| -rw-r--r-- | src/mapi/mapi/mapi_abi.py | 71 | 
1 files changed, 55 insertions, 16 deletions
| diff --git a/src/mapi/mapi/mapi_abi.py b/src/mapi/mapi/mapi_abi.py index 0059171e6a..fb91f6165a 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_decl(self, ent, prefix, export=''): +    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, 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 | 
