socsvn commit: r222616 - in soc2011/gk/ino64-head/tools/tools/shlib-compat: . test test/libtest3

gk at FreeBSD.org gk at FreeBSD.org
Mon May 30 23:09:59 UTC 2011


Author: gk
Date: Mon May 30 23:09:56 2011
New Revision: 222616
URL: http://svnweb.FreeBSD.org/socsvn/?view=rev&rev=222616

Log:
  shlib-compat: add PrettyPrinter to dump definitions in C-like syntax
  
  Merge rev bf093c6ae5f5ce15a424

Added:
  soc2011/gk/ino64-head/tools/tools/shlib-compat/README
Modified:
  soc2011/gk/ino64-head/tools/tools/shlib-compat/shlib-compat
  soc2011/gk/ino64-head/tools/tools/shlib-compat/test/libtest3/test.c
  soc2011/gk/ino64-head/tools/tools/shlib-compat/test/regress.1-1.out
  soc2011/gk/ino64-head/tools/tools/shlib-compat/test/regress.1-2.out
  soc2011/gk/ino64-head/tools/tools/shlib-compat/test/regress.1-3.out
  soc2011/gk/ino64-head/tools/tools/shlib-compat/test/regress.2-1.out
  soc2011/gk/ino64-head/tools/tools/shlib-compat/test/regress.2-2.out
  soc2011/gk/ino64-head/tools/tools/shlib-compat/test/regress.2-3.out
  soc2011/gk/ino64-head/tools/tools/shlib-compat/test/regress.3-1.out
  soc2011/gk/ino64-head/tools/tools/shlib-compat/test/regress.3-2.out
  soc2011/gk/ino64-head/tools/tools/shlib-compat/test/regress.3-3.out

Added: soc2011/gk/ino64-head/tools/tools/shlib-compat/README
==============================================================================
--- /dev/null	00:00:00 1970	(empty, because file is newly added)
+++ soc2011/gk/ino64-head/tools/tools/shlib-compat/README	Mon May 30 23:09:56 2011	(r222616)
@@ -0,0 +1,5 @@
+ABI compatibility checker for shared libraries with symbol versioning
+
+shlib-compat uses dwarf debugging symbols to recreate definitions of exported
+symbols, including function arguments and structural types.
+

Modified: soc2011/gk/ino64-head/tools/tools/shlib-compat/shlib-compat
==============================================================================
--- soc2011/gk/ino64-head/tools/tools/shlib-compat/shlib-compat	Mon May 30 21:56:37 2011	(r222615)
+++ soc2011/gk/ino64-head/tools/tools/shlib-compat/shlib-compat	Mon May 30 23:09:56 2011	(r222616)
@@ -27,7 +27,6 @@
 import os
 import sys
 import re
-import json
 import optparse
 
 class Config(object):
@@ -44,6 +43,16 @@
     cmpcache_enabled = True
     dwarfcache_enabled = True
 
+    class FileConfig(object):
+        filename = None
+        out = sys.stdout
+        def init(self, outname):
+            if outname and outname != '-':
+                self.out = open(outname, "w")
+
+    origfile = FileConfig()
+    newfile = FileConfig()
+
     @classmethod
     def init(cls):
         cls.version_filter = StrFilter()
@@ -109,8 +118,8 @@
     def put(self, id, obj):
         if self.enabled:
             if self.items.has_key(id) and obj is not self.items[id]:
-                #raise ValueError, "Item is already cached: %d (%s, %s)" % \
-                #        (id, self.items[id], obj)
+                #raise ValueError("Item is already cached: %d (%s, %s)" %
+                #        (id, self.items[id], obj))
                 print >> sys.stderr, "WARN: Item is already cached: %d (%s, %s)" % \
                         (id, self.items[id], obj)
             self.items[id] = obj
@@ -128,6 +137,24 @@
         self.added = self.new - self.common
         self.removed = self.orig - self.common
 
+class PrettyPrinter(object):
+    def __init__(self):
+        self.stack = []
+
+    def run_nested(self, obj):
+        ex = obj._pp_ex(self)
+        self.stack.append(ex)
+
+    def run(self, obj):
+        self._result = obj._pp(self)
+        return self._result
+
+    def nested(self):
+        return sorted(set(self.stack))
+
+    def result(self):
+        return self._result;
+
 # }}}
 
 #{{{ symbols and version maps
@@ -150,7 +177,8 @@
 class CommonSymbol(object):
     def __init__(self, origsym, newsym):
         if origsym.name != newsym.name or origsym.version != newsym.version:
-            raise RuntimeError, "Symbols have different names:", [origsym, newsym]
+            raise RuntimeError("Symbols have different names: %s",
+                    [origsym, newsym])
         self.origsym = origsym
         self.newsym = newsym
         self.name = newsym.name
@@ -166,7 +194,8 @@
 
     def append(self, symbol):
         if (self.symbols.has_key(symbol.name)):
-            raise ValueError, "Symbol is already defined %s@@%s" % (symbol.name, self.name)
+            raise ValueError("Symbol is already defined %s@%s" %
+                    (symbol.name, self.name))
         self.symbols[symbol.name] = symbol
 
     def names(self):
@@ -189,9 +218,14 @@
 
     def __getattr__(self, attr):
         if not self.attrs.has_key(attr):
-            raise AttributeError
+            raise AttributeError('%s in %s' % (attr, str(self)))
         return self.attrs[attr]
 
+    def _name_opt(self, default=''):
+        if not self.name:
+            return default
+        return self.name
+
     def _alias(self):
         if self._is_alias:
             return self.type._alias()
@@ -218,8 +252,8 @@
             if ind != 0:
                 Dwarf.cmpcache.put(ind, r)
         else:
-            raise RuntimeError, 'Comparing different classes: %s, %s' % \
-                    (a.__class__.__name__, b.__class__.__name__)
+            raise RuntimeError('Comparing different classes: %s, %s' %
+                    (a.__class__.__name__, b.__class__.__name__))
         return r
 
     def __repr__(self):
@@ -232,19 +266,18 @@
             p.append("%s=%s" % (k, v))
         return self.__class__.__name__ + '(' + ', '.join(p) + ')'
 
-    @staticmethod
-    def serialize_any(obj):
-        if isinstance(obj, Def):
-            return obj.serialize()
-        elif type(obj) is list:
-            return [ Def.serialize_any(x) for x in obj ]
-        return obj
+    def _mapval(self, param, vals):
+        if param not in vals.keys():
+            raise NotImplementedError("Invalid value '%s': %s" %
+                    (param, str(self)))
+        return vals[param]
+
+    def _pp_ex(self, pp):
+        raise NotImplementedError('Extended pretty print not implemeted: %s' %
+                str(self))
 
-    def serialize(self):
-        d = { '.name': self.name, '.tag': self.__class__.__name__ }
-        for (k, v) in self.attrs.items():
-            d[k] = Def.serialize_any(v)
-        return d
+    def _pp(self, pp):
+        raise NotImplementedError('Pretty print not implemeted: %s' % str(self))
 
 class AnonymousDef(Def):
     def __init__(self, id, **kwargs):
@@ -262,41 +295,94 @@
     def __init__(self):
         AnonymousDef.__init__(self, 0)
 
+    def _pp(self, pp):
+        return "void"
+
 class VarArgs(AnonymousDef):
-    pass
+    def _pp(self, pp):
+        return "..."
 
 class PointerDef(AnonymousDef):
-    pass
+    def _pp(self, pp):
+        t = pp.run(self.type)
+        return "%s*" % (t,)
 
 class BaseTypeDef(Def):
-    pass
+    def _pp(self, pp):
+        if self.encoding in ['DW_ATE_signed', 'DW_ATE_unsigned', 'DW_ATE_unsigned_char' ]:
+            sign = '' if self.encoding == 'DW_ATE_signed' else 'u'
+            bits = int(self.byte_size) * 8
+            return '%sint%s_t' % (sign, bits)
+        elif self.encoding == 'DW_ATE_signed_char' and int(self.byte_size) == 1:
+            return 'char';
+        elif self.encoding == 'DW_ATE_float':
+            return self._mapval(self.byte_size, {
+                '16': 'long double',
+                '8': 'double',
+                '4': 'float',
+            })
+        raise NotImplementedError('Invalid encoding: %s' % self)
 
 class TypeAliasDef(Def):
     _is_alias = True
+    def _pp(self, pp):
+        alias = self._alias()
+        # push typedef name
+        if self.name and not alias.name:
+            alias.name = 'T(%s)' % self.name
+        # return type with modifiers
+        return self.type._pp(pp)
 
 class EnumerationTypeDef(Def):
-    pass
+    def _pp(self, pp):
+        return 'enum ' + self._name_opt('UNKNOWN')
 
 class ConstTypeDef(AnonymousDef):
     _is_alias = True
+    def _pp(self, pp):
+        return 'const ' + self.type._pp(pp)
 
 class VolatileTypeDef(AnonymousDef):
     _is_alias = True
+    def _pp(self, pp):
+        return 'volatile ' + self.type._pp(pp)
 
 class ArrayDef(AnonymousDef):
-    pass
+    def _pp(self, pp):
+        t = pp.run(self.type)
+        assert len(self.subranges) == 1
+        try:
+            sz = int(self.subranges[0].upper_bound) + 1
+        except ValueError:
+            s = re.sub(r'\(.+\)', '', self.subranges[0].upper_bound)
+            sz = int(s) + 1
+        return '%s[%s]' % (t, sz)
 
 class ArraySubrangeDef(AnonymousDef):
     pass
 
 class FunctionDef(Def):
-    pass
+    def _pp(self, pp):
+        result = pp.run(self.result)
+        if not self.params:
+            params = "void"
+        else:
+            params = ', '.join([ pp.run(x) for x in self.params ])
+        return "%s %s(%s);" % (result, self.name, params)
 
 class FunctionTypeDef(Def):
-    pass
+    def _pp(self, pp):
+        result = pp.run(self.result)
+        if not self.params:
+            params = "void"
+        else:
+            params = ', '.join([ pp.run(x) for x in self.params ])
+        return "F(%s, %s, (%s))" % (self._name_opt(), result, params)
 
 class ParameterDef(Def):
-    pass
+    def _pp(self, pp):
+        t = pp.run(self.type)
+        return "%s %s" % (t, self._name_opt())
 
 # TODO
 class StructForwardDef(Def):
@@ -312,19 +398,41 @@
                 cache.replace(self.id, complete)
 
 class StructIncompleteDef(IncompleteDef):
-    pass
+    def _pp(self, pp):
+        return "struct %s" % (self.name,)
 
 class UnionIncompleteDef(IncompleteDef):
-    pass
+    def _pp(self, pp):
+        return "union %s" % (self.name,)
 
 class StructDef(Def):
-    pass
+    def _pp_ex(self, pp, suffix=';'):
+        members = [ pp.run(x) for x in self.members ]
+        return "struct %s { %s }%s" % \
+                (self._name_opt(), ' '.join(members), suffix)
+    def _pp(self, pp):
+        if self.name:
+            pp.run_nested(self)
+            return "struct %s" % (self.name,)
+        else:
+            return self._pp_ex(pp, suffix='')
 
 class UnionDef(Def):
-    pass
+    def _pp_ex(self, pp, suffix=';'):
+        members = [ pp.run(x) for x in self.members ]
+        return "union %s { %s }%s" % \
+                (self._name_opt(), ' '.join(members), suffix)
+    def _pp(self, pp):
+        if self.name:
+            pp.run_nested(self)
+            return "union %s" % (self.name,)
+        else:
+            return self._pp_ex(pp, suffix='')
 
 class MemberDef(Def):
-    pass
+    def _pp(self, pp):
+        t = pp.run(self.type)
+        return "%s %s;" % (t, self._name_opt())
 
 class Dwarf(object):
 
@@ -371,9 +479,9 @@
         members = [ self.build(x) for x in raw.nested ]
         byte_size = raw.optarg('byte_size', None)
         if byte_size == None:
-            obj = StructForwardDef(raw.id, raw.name, members=members, \
+            obj = StructForwardDef(raw.id, raw.name, members=members,
                     forcename=raw.name)
-        obj = StructDef(raw.id, raw.optname, members=members, \
+        obj = StructDef(raw.id, raw.optname, members=members,
                 byte_size=byte_size)
         incomplete.update(obj, cache=raw.unit.cache)
         return obj
@@ -387,7 +495,7 @@
             return incomplete
         members = [ self.build(x) for x in raw.nested ]
         byte_size = raw.optarg('byte_size', None)
-        obj = UnionDef(raw.id, raw.optname, members=members, \
+        obj = UnionDef(raw.id, raw.optname, members=members,
                 byte_size=byte_size)
         obj.incomplete = incomplete
         incomplete.complete = obj
@@ -407,11 +515,11 @@
 
     def build_enumeration_type(self, raw):
         # TODO handle DW_TAG_enumerator ???
-        return EnumerationTypeDef(raw.id, name=raw.optname, \
+        return EnumerationTypeDef(raw.id, name=raw.optname,
                 byte_size=raw.arg('byte_size'))
 
     def build_base_type(self, raw):
-        return BaseTypeDef(raw.id, raw.optname, \
+        return BaseTypeDef(raw.id, raw.optname,
                 byte_size=raw.arg('byte_size'), encoding=raw.arg('encoding'))
 
     def build_array_type(self, raw):
@@ -421,7 +529,7 @@
 
     def build_subrange_type(self, raw):
         type = self.buildref(raw.unit, raw.arg('type'))
-        return ArraySubrangeDef(raw.id, type=type, \
+        return ArraySubrangeDef(raw.id, type=type,
                 upper_bound=raw.arg('upper_bound'))
 
     def build_unspecified_parameters(self, raw):
@@ -434,7 +542,7 @@
             if (id.startswith('<') and id.endswith('>')):
                 return int(id[1:-1])
             else:
-                raise ValueError, "Invalid dwarf id: %s" % id
+                raise ValueError("Invalid dwarf id: %s" % id)
 
     def build(self, raw):
         obj = raw.unit.cache.get(raw.id)
@@ -444,7 +552,7 @@
         try:
             builder = getattr(self, builder_name)
         except AttributeError:
-            raise AttributeError, "Unknown dwarf tag: %s" % raw
+            raise AttributeError("Unknown dwarf tag: %s" % raw)
         obj = builder(raw)
         raw.unit.cache.put(obj.id, obj)
         return obj
@@ -487,11 +595,11 @@
                 try:
                     raw = dwarfdump.offsetmap[sym.offset]
                 except:
-                    print >> sys.stderr, "WARN: Symbol %s (%s) wan't found at offset 0x%x" % \
+                    print >> sys.stderr, "WARN: Symbol %s (%s) not found at offset 0x%x" % \
                             (sym.name_ver, self.libfile, sym.offset)
                     continue
-                if Config.verbose > 1:
-                    print "Parse symbol %s (%s)" % (sym.name_ver, self.libfile)
+                if Config.verbose >= 3:
+                    print "Parsing symbol %s (%s)" % (sym.name_ver, self.libfile)
                 sym.definition = dwarf.build(raw)
 
     def parse(self):
@@ -551,7 +659,7 @@
             elif table == '':
                 self.parser = self.parse_local
             else:
-                raise ValueError, "Invalid symbol table: %s" % table
+                raise ValueError("Invalid symbol table: %s" % table)
             return True
         return False
 
@@ -562,7 +670,7 @@
             return
         m = self.re_local_symbol.match(line)
         if (not m):
-                raise ValueError, "Invalid symbol definition: %s" % line
+            raise ValueError("Invalid symbol definition: %s" % line)
         p = m.groupdict()
         if (p['symbol'] and p['symbol'].find('@') == -1):
             self.add_symbol(self.local_symbols, p);
@@ -574,7 +682,7 @@
             return
         m = self.re_dynamic_symbol.match(line)
         if (not m):
-                raise ValueError, "Invalid symbol definition: %s" % line
+            raise ValueError("Invalid symbol definition: %s" % line)
         p = m.groupdict()
         if (p['symbol'] and p['ver']):
             self.add_symbol(self.dynamic_symbols, p);
@@ -585,7 +693,7 @@
 
     class Unit(object):
         def __init__(self):
-            self.cache = Cache(enabled=Config.dwarfcache_enabled, \
+            self.cache = Cache(enabled=Config.dwarfcache_enabled,
                     stats=DwarfdumpParser.tagcache_stats)
             self.incomplete = Cache()
             self.tags = {}
@@ -612,7 +720,8 @@
             try:
                 return self.args[name]
             except KeyError:
-                raise KeyError, "Argument '%s' not found in %s: %s" % (name, self, self.args)
+                raise KeyError("Argument '%s' not found in %s: %s" %
+                        (name, self, self.args))
 
         def optarg(self, a, default):
             try:
@@ -643,7 +752,7 @@
         if line == '.debug_info':
             self.parser = self.parse_debuginfo
         else:
-            raise ValueError, "Invalid dwarfdump header: %s" % line
+            raise ValueError("Invalid dwarfdump header: %s" % line)
 
     def parse_argvalue(self, args):
         assert args.startswith('<')
@@ -664,7 +773,8 @@
     def parse_arg(self, tag, args):
         m = self.re_argname.match(args)
         if not m:
-            raise ValueError, "Invalid dwarfdump: couldn't parse arguments: %s" % args
+            raise ValueError("Invalid dwarfdump: couldn't parse arguments: %s" %
+                    args)
         argname = m.group('arg')
         args = args[len(argname):]
         value = []
@@ -680,7 +790,7 @@
     def parse_debuginfo(self, line):
         m = self.re_header.match(line)
         if not m:
-            raise ValueError, "Invalid dwarfdump: %s" % line
+            raise ValueError("Invalid dwarfdump: %s" % line)
         if m.group('level') == '0':
             self.current_unit = DwarfdumpParser.Unit()
             return
@@ -693,8 +803,8 @@
                 tag.tag not in DwarfdumpParser.skip_tags:
             offset = int(tag.args['DW_AT_low_pc'], 16)
             if self.offsetmap.has_key(offset):
-                raise ValueError, "Dwarf dump parse error: " + \
-                        "symbol is aleady defined at offset 0x%x" % offset
+                raise ValueError("Dwarf dump parse error: " +
+                        "symbol is aleady defined at offset 0x%x" % offset)
             self.offsetmap[offset] = tag
         if len(self.stack) > 0:
             prev = self.stack.pop()
@@ -722,7 +832,7 @@
 def common_symbols(origlib, newlib):
     result = []
     verdiff = ListDiff(origlib.versions.keys(), newlib.versions.keys())
-    if Config.verbose > 0:
+    if Config.verbose >= 1:
         print 'Original versions:   ', list_str(verdiff.orig)
         print 'New versions:        ', list_str(verdiff.new)
     for vername in verdiff.added:
@@ -756,38 +866,86 @@
         for symname in names:
             sym = ver.symbols[symname]
             match = sym.origsym.definition == sym.newsym.definition
-            if Config.verbose or not match:
-                print '==== %s: definitions%s match' % \
-                        (sym.origsym.name_ver, "" if match else " don't")
+            if Config.verbose >= 1 or not match:
+                print '%s: definitions %smatch' % \
+                        (sym.origsym.name_ver, "" if match else "mis")
                 if Config.dump and not match:
-                    for xsym in [sym.origsym, sym.newsym]:
-                        print '---- %s %s:' % \
+                    for x in [(sym.origsym, Config.origfile),
+                            (sym.newsym, Config.newfile)]:
+                        xsym = x[0]
+                        xout = x[1].out
+                        print >> xout, '\n// Definitions mismatch: %s %s' % \
                                 (xsym.name_ver, xsym.lib.libfile)
-                        print json.dump(xsym.definition.serialize(), sys.stdout)
-
+                        pp = PrettyPrinter()
+                        pp.run(xsym.definition)
+                        for i in pp.nested():
+                            print >> xout, i
+                        print >> xout, pp.result()
+
+def dump_symbols(commonver):
+    class SymbolDump(object):
+        def __init__(self, io_conf):
+            self.io_conf = io_conf
+            self.pp = PrettyPrinter()
+            self.res = []
+        def run(self, sym):
+            r = self.pp.run(sym.definition)
+            self.res.append('/* %s@%s */ %s' % (sym.name, sym.version, r))
+        def finish(self):
+            print >> self.io_conf.out, '\n// Symbol dump: version %s, library %s' % \
+                    (ver.name, self.io_conf.filename)
+            for i in self.pp.nested():
+                print >> self.io_conf.out, i
+            print >> self.io_conf.out, ''
+            for i in self.res:
+                print >> self.io_conf.out, i
+    for ver in commonver:
+        names = sorted(ver.names());
+        d_orig = SymbolDump(Config.origfile)
+        d_new = SymbolDump(Config.newfile)
+        for symname in names:
+            sym = ver.symbols[symname]
+            if not sym.origsym.definition or not sym.newsym.definition:
+                # XXX
+                print >> sys.stderr, 'WARN: Missing symbol definition: %s@%s' % \
+                        (symname, ver.name)
+                continue
+            d_orig.run(sym.origsym)
+            d_new.run(sym.newsym)
+        d_orig.finish()
+        d_new.finish()
 
 if __name__ == '__main__':
     Config.init()
-    parser = optparse.OptionParser(usage="usage: %prog origlib newlib", \
+    parser = optparse.OptionParser(usage="usage: %prog origlib newlib",
             version="%prog " + Config.version)
-    parser.add_option('-v', '--verbose', action='count', \
+    parser.add_option('-v', '--verbose', action='count',
             help="verbose mode, may be specified several times")
-    parser.add_option('--dump', action='store_true', \
-            help="dump json representation if symbol definitions don't match")
-    parser.add_option('--exclude-ver', action='append', metavar="re")
-    parser.add_option('--include-ver', action='append', metavar="re")
-    parser.add_option('--exclude-sym', action='append', metavar="re")
-    parser.add_option('--include-sym', action='append', metavar="re")
+    parser.add_option('--dump', action='store_true',
+            help="dump symbol definitions")
+    parser.add_option('--out-orig', action='store',
+            help="result output file for original library", metavar="ORIGFILE")
+    parser.add_option('--out-new', action='store',
+            help="result output file for new library", metavar="NEWFILE")
+    parser.add_option('--exclude-ver', action='append', metavar="RE")
+    parser.add_option('--include-ver', action='append', metavar="RE")
+    parser.add_option('--exclude-sym', action='append', metavar="RE")
+    parser.add_option('--include-sym', action='append', metavar="RE")
     (opts, args) = parser.parse_args()
 
     if len(args) != 2:
         parser.print_help()
         sys.exit(-1)
+    if opts.out_orig:
+        Config.origfile.init(opts.out_orig)
+    if opts.out_new:
+        Config.newfile.init(opts.out_new)
+    if opts.dump:
+        Config.dump = True
+        Config.verbose = 1
     if opts.verbose:
         Config.verbose = opts.verbose
-    if opts.dump:
-        Config.verbose = opts.dump
-    for (k, v) in ({ '_sym': Config.symbol_filter, \
+    for (k, v) in ({ '_sym': Config.symbol_filter,
             '_ver': Config.version_filter }).items():
         for a in [ 'exclude', 'include' ]:
             opt = getattr(opts, a + k)
@@ -796,16 +954,18 @@
     Config.version_filter.compile()
     Config.symbol_filter.compile()
 
-    (origfile, newfile) = (args[0], args[1])
+    (Config.origfile.filename, Config.newfile.filename) = (args[0], args[1])
 
-    origlib = Shlib(origfile)
+    origlib = Shlib(Config.origfile.filename)
     origlib.parse()
-    newlib = Shlib(newfile)
+    newlib = Shlib(Config.newfile.filename)
     newlib.parse()
 
     commonver = common_symbols(origlib, newlib)
+    if Config.dump:
+        dump_symbols(commonver)
     cmp_symbols(commonver)
-    if Config.verbose > 2:
+    if Config.verbose >= 4:
         print Dwarf.cmpcache.stats.show('Cmp')
         print DwarfdumpParser.tagcache_stats.show('Dwarf tag')
 

Modified: soc2011/gk/ino64-head/tools/tools/shlib-compat/test/libtest3/test.c
==============================================================================
--- soc2011/gk/ino64-head/tools/tools/shlib-compat/test/libtest3/test.c	Mon May 30 21:56:37 2011	(r222615)
+++ soc2011/gk/ino64-head/tools/tools/shlib-compat/test/libtest3/test.c	Mon May 30 23:09:56 2011	(r222616)
@@ -20,12 +20,25 @@
 	uint32_t	f2_int32;
 };
 
+enum f3_t {
+	f3_val0, f3_val1
+};
+
+struct s4 {
+	struct s1	f1_s1;
+	uint32_t	f2_int32;
+	enum f3_t	f3_enum;
+};
+
+typedef int i32;
+
 int	func1(int a, int b);
 int	func2(int64_t a, uint64_t b);
 void	func3(struct s1 *s);
 void	func4(struct s1 s);
-int	func5(int a, void *b, struct s2 *s);
-int	func6(char a, struct s3 *s);
+int32_t	func5(i32 a, void *b, struct s2 *s);
+int	func6__compat(char a, struct s3 *s);
+int	func6(char a, struct s4 *s);
 
 int
 func1(int a, int b)
@@ -56,7 +69,15 @@
 }
 
 int
-func6(char a, struct s3 *s)
+func6(char a, struct s4 *s)
 {
 	return (0);
 }
+
+int
+func6__compat(char a, struct s3 *s)
+{
+	return (0);
+}
+
+__sym_compat(func6, func6__compat, TEST_1.0);

Modified: soc2011/gk/ino64-head/tools/tools/shlib-compat/test/regress.1-1.out
==============================================================================
--- soc2011/gk/ino64-head/tools/tools/shlib-compat/test/regress.1-1.out	Mon May 30 21:56:37 2011	(r222615)
+++ soc2011/gk/ino64-head/tools/tools/shlib-compat/test/regress.1-1.out	Mon May 30 23:09:56 2011	(r222616)
@@ -1,20 +1,8 @@
-Parse symbol func3 at TEST_1.0 (libtest1/libtest1.so.0)
-Parse symbol func2 at TEST_1.0 (libtest1/libtest1.so.0)
-Parse symbol func1 at TEST_1.0 (libtest1/libtest1.so.0)
-Parse symbol func6 at TEST_1.0 (libtest1/libtest1.so.0)
-Parse symbol func5 at TEST_1.0 (libtest1/libtest1.so.0)
-Parse symbol func4 at TEST_1.0 (libtest1/libtest1.so.0)
-Parse symbol func3 at TEST_1.0 (libtest1/libtest1.so.0)
-Parse symbol func2 at TEST_1.0 (libtest1/libtest1.so.0)
-Parse symbol func1 at TEST_1.0 (libtest1/libtest1.so.0)
-Parse symbol func6 at TEST_1.0 (libtest1/libtest1.so.0)
-Parse symbol func5 at TEST_1.0 (libtest1/libtest1.so.0)
-Parse symbol func4 at TEST_1.0 (libtest1/libtest1.so.0)
 Original versions:    TEST_1.0
 New versions:         TEST_1.0
-==== func1 at TEST_1.0: definitions match
-==== func2 at TEST_1.0: definitions match
-==== func3 at TEST_1.0: definitions match
-==== func4 at TEST_1.0: definitions match
-==== func5 at TEST_1.0: definitions match
-==== func6 at TEST_1.0: definitions match
+func1 at TEST_1.0: definitions match
+func2 at TEST_1.0: definitions match
+func3 at TEST_1.0: definitions match
+func4 at TEST_1.0: definitions match
+func5 at TEST_1.0: definitions match
+func6 at TEST_1.0: definitions match

Modified: soc2011/gk/ino64-head/tools/tools/shlib-compat/test/regress.1-2.out
==============================================================================
--- soc2011/gk/ino64-head/tools/tools/shlib-compat/test/regress.1-2.out	Mon May 30 21:56:37 2011	(r222615)
+++ soc2011/gk/ino64-head/tools/tools/shlib-compat/test/regress.1-2.out	Mon May 30 23:09:56 2011	(r222616)
@@ -1,23 +1,10 @@
-Parse symbol func3 at TEST_1.0 (libtest1/libtest1.so.0)
-Parse symbol func2 at TEST_1.0 (libtest1/libtest1.so.0)
-Parse symbol func1 at TEST_1.0 (libtest1/libtest1.so.0)
-Parse symbol func6 at TEST_1.0 (libtest1/libtest1.so.0)
-Parse symbol func5 at TEST_1.0 (libtest1/libtest1.so.0)
-Parse symbol func4 at TEST_1.0 (libtest1/libtest1.so.0)
-Parse symbol func3 at TEST_1.0 (libtest2/libtest2.so.0)
-Parse symbol func2 at TEST_1.0 (libtest2/libtest2.so.0)
-Parse symbol func1 at TEST_1.0 (libtest2/libtest2.so.0)
-Parse symbol func6 at TEST_1.0 (libtest2/libtest2.so.0)
-Parse symbol func5 at TEST_1.0 (libtest2/libtest2.so.0)
-Parse symbol func4 at TEST_1.0 (libtest2/libtest2.so.0)
-Parse symbol func1 at TEST_1.1 (libtest2/libtest2.so.0)
 Original versions:    TEST_1.0
 New versions:         TEST_1.0, TEST_1.1
 Added version:        TEST_1.1
     Added symbols:    func1 at TEST_1.1
-==== func1 at TEST_1.0: definitions match
-==== func2 at TEST_1.0: definitions match
-==== func3 at TEST_1.0: definitions match
-==== func4 at TEST_1.0: definitions match
-==== func5 at TEST_1.0: definitions match
-==== func6 at TEST_1.0: definitions match
+func1 at TEST_1.0: definitions match
+func2 at TEST_1.0: definitions match
+func3 at TEST_1.0: definitions match
+func4 at TEST_1.0: definitions match
+func5 at TEST_1.0: definitions match
+func6 at TEST_1.0: definitions match

Modified: soc2011/gk/ino64-head/tools/tools/shlib-compat/test/regress.1-3.out
==============================================================================
--- soc2011/gk/ino64-head/tools/tools/shlib-compat/test/regress.1-3.out	Mon May 30 21:56:37 2011	(r222615)
+++ soc2011/gk/ino64-head/tools/tools/shlib-compat/test/regress.1-3.out	Mon May 30 23:09:56 2011	(r222616)
@@ -1,20 +1,8 @@
-Parse symbol func3 at TEST_1.0 (libtest1/libtest1.so.0)
-Parse symbol func2 at TEST_1.0 (libtest1/libtest1.so.0)
-Parse symbol func1 at TEST_1.0 (libtest1/libtest1.so.0)
-Parse symbol func6 at TEST_1.0 (libtest1/libtest1.so.0)
-Parse symbol func5 at TEST_1.0 (libtest1/libtest1.so.0)
-Parse symbol func4 at TEST_1.0 (libtest1/libtest1.so.0)
-Parse symbol func3 at TEST_1.0 (libtest3/libtest3.so.0)
-Parse symbol func2 at TEST_1.0 (libtest3/libtest3.so.0)
-Parse symbol func1 at TEST_1.0 (libtest3/libtest3.so.0)
-Parse symbol func6 at TEST_1.0 (libtest3/libtest3.so.0)
-Parse symbol func5 at TEST_1.0 (libtest3/libtest3.so.0)
-Parse symbol func4 at TEST_1.0 (libtest3/libtest3.so.0)
 Original versions:    TEST_1.0
 New versions:         TEST_1.0
-==== func1 at TEST_1.0: definitions match
-==== func2 at TEST_1.0: definitions match
-==== func3 at TEST_1.0: definitions match
-==== func4 at TEST_1.0: definitions match
-==== func5 at TEST_1.0: definitions don't match
-==== func6 at TEST_1.0: definitions match
+func1 at TEST_1.0: definitions match
+func2 at TEST_1.0: definitions match
+func3 at TEST_1.0: definitions match
+func4 at TEST_1.0: definitions match
+func5 at TEST_1.0: definitions mismatch
+func6 at TEST_1.0: definitions match

Modified: soc2011/gk/ino64-head/tools/tools/shlib-compat/test/regress.2-1.out
==============================================================================
--- soc2011/gk/ino64-head/tools/tools/shlib-compat/test/regress.2-1.out	Mon May 30 21:56:37 2011	(r222615)
+++ soc2011/gk/ino64-head/tools/tools/shlib-compat/test/regress.2-1.out	Mon May 30 23:09:56 2011	(r222616)
@@ -1,23 +1,10 @@
-Parse symbol func3 at TEST_1.0 (libtest2/libtest2.so.0)
-Parse symbol func2 at TEST_1.0 (libtest2/libtest2.so.0)
-Parse symbol func1 at TEST_1.0 (libtest2/libtest2.so.0)
-Parse symbol func6 at TEST_1.0 (libtest2/libtest2.so.0)
-Parse symbol func5 at TEST_1.0 (libtest2/libtest2.so.0)
-Parse symbol func4 at TEST_1.0 (libtest2/libtest2.so.0)
-Parse symbol func1 at TEST_1.1 (libtest2/libtest2.so.0)
-Parse symbol func3 at TEST_1.0 (libtest1/libtest1.so.0)
-Parse symbol func2 at TEST_1.0 (libtest1/libtest1.so.0)
-Parse symbol func1 at TEST_1.0 (libtest1/libtest1.so.0)
-Parse symbol func6 at TEST_1.0 (libtest1/libtest1.so.0)
-Parse symbol func5 at TEST_1.0 (libtest1/libtest1.so.0)
-Parse symbol func4 at TEST_1.0 (libtest1/libtest1.so.0)
 Original versions:    TEST_1.0, TEST_1.1
 New versions:         TEST_1.0
 Removed version:      TEST_1.1
     Removed symbols:  func1 at TEST_1.1
-==== func1 at TEST_1.0: definitions match
-==== func2 at TEST_1.0: definitions match
-==== func3 at TEST_1.0: definitions match
-==== func4 at TEST_1.0: definitions match
-==== func5 at TEST_1.0: definitions match
-==== func6 at TEST_1.0: definitions match
+func1 at TEST_1.0: definitions match
+func2 at TEST_1.0: definitions match
+func3 at TEST_1.0: definitions match
+func4 at TEST_1.0: definitions match
+func5 at TEST_1.0: definitions match
+func6 at TEST_1.0: definitions match

Modified: soc2011/gk/ino64-head/tools/tools/shlib-compat/test/regress.2-2.out
==============================================================================
--- soc2011/gk/ino64-head/tools/tools/shlib-compat/test/regress.2-2.out	Mon May 30 21:56:37 2011	(r222615)
+++ soc2011/gk/ino64-head/tools/tools/shlib-compat/test/regress.2-2.out	Mon May 30 23:09:56 2011	(r222616)
@@ -1,23 +1,9 @@
-Parse symbol func3 at TEST_1.0 (libtest2/libtest2.so.0)
-Parse symbol func2 at TEST_1.0 (libtest2/libtest2.so.0)
-Parse symbol func1 at TEST_1.0 (libtest2/libtest2.so.0)
-Parse symbol func6 at TEST_1.0 (libtest2/libtest2.so.0)
-Parse symbol func5 at TEST_1.0 (libtest2/libtest2.so.0)
-Parse symbol func4 at TEST_1.0 (libtest2/libtest2.so.0)
-Parse symbol func1 at TEST_1.1 (libtest2/libtest2.so.0)
-Parse symbol func3 at TEST_1.0 (libtest2/libtest2.so.0)
-Parse symbol func2 at TEST_1.0 (libtest2/libtest2.so.0)
-Parse symbol func1 at TEST_1.0 (libtest2/libtest2.so.0)
-Parse symbol func6 at TEST_1.0 (libtest2/libtest2.so.0)
-Parse symbol func5 at TEST_1.0 (libtest2/libtest2.so.0)
-Parse symbol func4 at TEST_1.0 (libtest2/libtest2.so.0)
-Parse symbol func1 at TEST_1.1 (libtest2/libtest2.so.0)
 Original versions:    TEST_1.0, TEST_1.1
 New versions:         TEST_1.0, TEST_1.1
-==== func1 at TEST_1.0: definitions match
-==== func2 at TEST_1.0: definitions match
-==== func3 at TEST_1.0: definitions match
-==== func4 at TEST_1.0: definitions match
-==== func5 at TEST_1.0: definitions match
-==== func6 at TEST_1.0: definitions match
-==== func1 at TEST_1.1: definitions match
+func1 at TEST_1.0: definitions match
+func2 at TEST_1.0: definitions match
+func3 at TEST_1.0: definitions match
+func4 at TEST_1.0: definitions match
+func5 at TEST_1.0: definitions match
+func6 at TEST_1.0: definitions match
+func1 at TEST_1.1: definitions match

Modified: soc2011/gk/ino64-head/tools/tools/shlib-compat/test/regress.2-3.out
==============================================================================
--- soc2011/gk/ino64-head/tools/tools/shlib-compat/test/regress.2-3.out	Mon May 30 21:56:37 2011	(r222615)
+++ soc2011/gk/ino64-head/tools/tools/shlib-compat/test/regress.2-3.out	Mon May 30 23:09:56 2011	(r222616)
@@ -1,23 +1,10 @@
-Parse symbol func3 at TEST_1.0 (libtest2/libtest2.so.0)
-Parse symbol func2 at TEST_1.0 (libtest2/libtest2.so.0)
-Parse symbol func1 at TEST_1.0 (libtest2/libtest2.so.0)
-Parse symbol func6 at TEST_1.0 (libtest2/libtest2.so.0)
-Parse symbol func5 at TEST_1.0 (libtest2/libtest2.so.0)
-Parse symbol func4 at TEST_1.0 (libtest2/libtest2.so.0)
-Parse symbol func1 at TEST_1.1 (libtest2/libtest2.so.0)
-Parse symbol func3 at TEST_1.0 (libtest3/libtest3.so.0)
-Parse symbol func2 at TEST_1.0 (libtest3/libtest3.so.0)
-Parse symbol func1 at TEST_1.0 (libtest3/libtest3.so.0)
-Parse symbol func6 at TEST_1.0 (libtest3/libtest3.so.0)
-Parse symbol func5 at TEST_1.0 (libtest3/libtest3.so.0)
-Parse symbol func4 at TEST_1.0 (libtest3/libtest3.so.0)
 Original versions:    TEST_1.0, TEST_1.1
 New versions:         TEST_1.0
 Removed version:      TEST_1.1
     Removed symbols:  func1 at TEST_1.1
-==== func1 at TEST_1.0: definitions match
-==== func2 at TEST_1.0: definitions match
-==== func3 at TEST_1.0: definitions match
-==== func4 at TEST_1.0: definitions match
-==== func5 at TEST_1.0: definitions don't match
-==== func6 at TEST_1.0: definitions match
+func1 at TEST_1.0: definitions match
+func2 at TEST_1.0: definitions match
+func3 at TEST_1.0: definitions match
+func4 at TEST_1.0: definitions match
+func5 at TEST_1.0: definitions mismatch
+func6 at TEST_1.0: definitions match

Modified: soc2011/gk/ino64-head/tools/tools/shlib-compat/test/regress.3-1.out
==============================================================================
--- soc2011/gk/ino64-head/tools/tools/shlib-compat/test/regress.3-1.out	Mon May 30 21:56:37 2011	(r222615)
+++ soc2011/gk/ino64-head/tools/tools/shlib-compat/test/regress.3-1.out	Mon May 30 23:09:56 2011	(r222616)
@@ -1,20 +1,8 @@
-Parse symbol func3 at TEST_1.0 (libtest3/libtest3.so.0)
-Parse symbol func2 at TEST_1.0 (libtest3/libtest3.so.0)
-Parse symbol func1 at TEST_1.0 (libtest3/libtest3.so.0)
-Parse symbol func6 at TEST_1.0 (libtest3/libtest3.so.0)
-Parse symbol func5 at TEST_1.0 (libtest3/libtest3.so.0)
-Parse symbol func4 at TEST_1.0 (libtest3/libtest3.so.0)
-Parse symbol func3 at TEST_1.0 (libtest1/libtest1.so.0)
-Parse symbol func2 at TEST_1.0 (libtest1/libtest1.so.0)
-Parse symbol func1 at TEST_1.0 (libtest1/libtest1.so.0)
-Parse symbol func6 at TEST_1.0 (libtest1/libtest1.so.0)
-Parse symbol func5 at TEST_1.0 (libtest1/libtest1.so.0)
-Parse symbol func4 at TEST_1.0 (libtest1/libtest1.so.0)
 Original versions:    TEST_1.0
 New versions:         TEST_1.0
-==== func1 at TEST_1.0: definitions match
-==== func2 at TEST_1.0: definitions match
-==== func3 at TEST_1.0: definitions match
-==== func4 at TEST_1.0: definitions match
-==== func5 at TEST_1.0: definitions don't match
-==== func6 at TEST_1.0: definitions match
+func1 at TEST_1.0: definitions match
+func2 at TEST_1.0: definitions match
+func3 at TEST_1.0: definitions match
+func4 at TEST_1.0: definitions match
+func5 at TEST_1.0: definitions mismatch
+func6 at TEST_1.0: definitions match

Modified: soc2011/gk/ino64-head/tools/tools/shlib-compat/test/regress.3-2.out
==============================================================================
--- soc2011/gk/ino64-head/tools/tools/shlib-compat/test/regress.3-2.out	Mon May 30 21:56:37 2011	(r222615)
+++ soc2011/gk/ino64-head/tools/tools/shlib-compat/test/regress.3-2.out	Mon May 30 23:09:56 2011	(r222616)
@@ -1,23 +1,10 @@
-Parse symbol func3 at TEST_1.0 (libtest3/libtest3.so.0)
-Parse symbol func2 at TEST_1.0 (libtest3/libtest3.so.0)
-Parse symbol func1 at TEST_1.0 (libtest3/libtest3.so.0)
-Parse symbol func6 at TEST_1.0 (libtest3/libtest3.so.0)
-Parse symbol func5 at TEST_1.0 (libtest3/libtest3.so.0)
-Parse symbol func4 at TEST_1.0 (libtest3/libtest3.so.0)
-Parse symbol func3 at TEST_1.0 (libtest2/libtest2.so.0)
-Parse symbol func2 at TEST_1.0 (libtest2/libtest2.so.0)
-Parse symbol func1 at TEST_1.0 (libtest2/libtest2.so.0)
-Parse symbol func6 at TEST_1.0 (libtest2/libtest2.so.0)
-Parse symbol func5 at TEST_1.0 (libtest2/libtest2.so.0)
-Parse symbol func4 at TEST_1.0 (libtest2/libtest2.so.0)
-Parse symbol func1 at TEST_1.1 (libtest2/libtest2.so.0)
 Original versions:    TEST_1.0
 New versions:         TEST_1.0, TEST_1.1
 Added version:        TEST_1.1
     Added symbols:    func1 at TEST_1.1
-==== func1 at TEST_1.0: definitions match
-==== func2 at TEST_1.0: definitions match
-==== func3 at TEST_1.0: definitions match
-==== func4 at TEST_1.0: definitions match
-==== func5 at TEST_1.0: definitions don't match
-==== func6 at TEST_1.0: definitions match
+func1 at TEST_1.0: definitions match
+func2 at TEST_1.0: definitions match
+func3 at TEST_1.0: definitions match
+func4 at TEST_1.0: definitions match
+func5 at TEST_1.0: definitions mismatch
+func6 at TEST_1.0: definitions match

Modified: soc2011/gk/ino64-head/tools/tools/shlib-compat/test/regress.3-3.out
==============================================================================
--- soc2011/gk/ino64-head/tools/tools/shlib-compat/test/regress.3-3.out	Mon May 30 21:56:37 2011	(r222615)
+++ soc2011/gk/ino64-head/tools/tools/shlib-compat/test/regress.3-3.out	Mon May 30 23:09:56 2011	(r222616)
@@ -1,20 +1,8 @@
-Parse symbol func3 at TEST_1.0 (libtest3/libtest3.so.0)
-Parse symbol func2 at TEST_1.0 (libtest3/libtest3.so.0)
-Parse symbol func1 at TEST_1.0 (libtest3/libtest3.so.0)
-Parse symbol func6 at TEST_1.0 (libtest3/libtest3.so.0)
-Parse symbol func5 at TEST_1.0 (libtest3/libtest3.so.0)
-Parse symbol func4 at TEST_1.0 (libtest3/libtest3.so.0)
-Parse symbol func3 at TEST_1.0 (libtest3/libtest3.so.0)
-Parse symbol func2 at TEST_1.0 (libtest3/libtest3.so.0)
-Parse symbol func1 at TEST_1.0 (libtest3/libtest3.so.0)
-Parse symbol func6 at TEST_1.0 (libtest3/libtest3.so.0)
-Parse symbol func5 at TEST_1.0 (libtest3/libtest3.so.0)
-Parse symbol func4 at TEST_1.0 (libtest3/libtest3.so.0)
 Original versions:    TEST_1.0
 New versions:         TEST_1.0
-==== func1 at TEST_1.0: definitions match
-==== func2 at TEST_1.0: definitions match
-==== func3 at TEST_1.0: definitions match
-==== func4 at TEST_1.0: definitions match
-==== func5 at TEST_1.0: definitions match
-==== func6 at TEST_1.0: definitions match
+func1 at TEST_1.0: definitions match
+func2 at TEST_1.0: definitions match
+func3 at TEST_1.0: definitions match
+func4 at TEST_1.0: definitions match
+func5 at TEST_1.0: definitions match
+func6 at TEST_1.0: definitions match


More information about the svn-soc-all mailing list