diff options
| author | neksard <[email protected]> | 2022-02-10 16:45:33 +0300 | 
|---|---|---|
| committer | Daniil Cherednik <[email protected]> | 2022-02-10 16:45:33 +0300 | 
| commit | 1d9c550e7c38e051d7961f576013a482003a70d9 (patch) | |
| tree | b2cc84ee7850122e7ccf51d0ea21e4fa7e7a5685 /build/scripts/link_dyn_lib.py | |
| parent | 8f7cf138264e0caa318144bf8a2c950e0b0a8593 (diff) | |
Restoring authorship annotation for <[email protected]>. Commit 2 of 2.
Diffstat (limited to 'build/scripts/link_dyn_lib.py')
| -rw-r--r-- | build/scripts/link_dyn_lib.py | 262 | 
1 files changed, 131 insertions, 131 deletions
| diff --git a/build/scripts/link_dyn_lib.py b/build/scripts/link_dyn_lib.py index 709a9b4fbda..23487f5c1ef 100644 --- a/build/scripts/link_dyn_lib.py +++ b/build/scripts/link_dyn_lib.py @@ -30,75 +30,75 @@ def parse_export_file(p):                      yield {'lang': words[0], 'sym': words[1]}                  elif len(words) == 1:                      yield {'lang': 'C', 'sym': words[0]} -                else:  +                else:                      raise Exception('unsupported exports line: ' + l) -def to_c(sym):  -    symbols = collections.deque(sym.split('::'))  -    c_prefixes = [  # demangle prefixes for c++ symbols  -        '_ZN',      # namespace  -        '_ZTIN',    # typeinfo for  -        '_ZTSN',    # typeinfo name for  -        '_ZTTN',    # VTT for  -        '_ZTVN',    # vtable for  -        '_ZNK',     # const methods  -    ]  -    c_sym = ''  -    while symbols:  -        s = symbols.popleft()  -        if s == '*':  -            c_sym += '*'  -            break  -        if '*' in s and len(s) > 1:  -            raise Exception('Unsupported format, cannot guess length of symbol: ' + s)  -        c_sym += str(len(s)) + s  -    if symbols:  -        raise Exception('Unsupported format: ' + sym)  -    if c_sym[-1] != '*':  -        c_sym += 'E*'  -    return ['{prefix}{sym}'.format(prefix=prefix, sym=c_sym) for prefix in c_prefixes]  -  -  +def to_c(sym): +    symbols = collections.deque(sym.split('::')) +    c_prefixes = [  # demangle prefixes for c++ symbols +        '_ZN',      # namespace +        '_ZTIN',    # typeinfo for +        '_ZTSN',    # typeinfo name for +        '_ZTTN',    # VTT for +        '_ZTVN',    # vtable for +        '_ZNK',     # const methods +    ] +    c_sym = '' +    while symbols: +        s = symbols.popleft() +        if s == '*': +            c_sym += '*' +            break +        if '*' in s and len(s) > 1: +            raise Exception('Unsupported format, cannot guess length of symbol: ' + s) +        c_sym += str(len(s)) + s +    if symbols: +        raise Exception('Unsupported format: ' + sym) +    if c_sym[-1] != '*': +        c_sym += 'E*' +    return ['{prefix}{sym}'.format(prefix=prefix, sym=c_sym) for prefix in c_prefixes] + +  def fix_darwin_param(ex):      for item in ex: -        if item.get('linux_version'):  -            continue  -  +        if item.get('linux_version'): +            continue +          if item['lang'] == 'C':              yield '-Wl,-exported_symbol,_' + item['sym'] -        elif item['lang'] == 'C++':  -            for sym in to_c(item['sym']):  -                yield '-Wl,-exported_symbol,_' + sym  +        elif item['lang'] == 'C++': +            for sym in to_c(item['sym']): +                yield '-Wl,-exported_symbol,_' + sym          else:              raise Exception('unsupported lang: ' + item['lang'])  def fix_gnu_param(arch, ex):      d = collections.defaultdict(list) -    version = None  +    version = None      for item in ex: -        if item.get('linux_version'):  -            if not version:  -                version = item.get('linux_version')  -            else:  -                raise Exception('More than one linux_version defined')  -        elif item['lang'] == 'C++':  -            d['C'].extend(to_c(item['sym']))  -        else:  -            d[item['lang']].append(item['sym'])  +        if item.get('linux_version'): +            if not version: +                version = item.get('linux_version') +            else: +                raise Exception('More than one linux_version defined') +        elif item['lang'] == 'C++': +            d['C'].extend(to_c(item['sym'])) +        else: +            d[item['lang']].append(item['sym'])      with tempfile.NamedTemporaryFile(mode='wt', delete=False) as f: -        if version:  -            f.write('{} {{\nglobal:\n'.format(version))  -        else:  -            f.write('{\nglobal:\n')  +        if version: +            f.write('{} {{\nglobal:\n'.format(version)) +        else: +            f.write('{\nglobal:\n')          for k, v in d.items():              f.write('    extern "' + k + '" {\n')              for x in v: -                f.write('        ' + x + ';\n')  +                f.write('        ' + x + ';\n')              f.write('    };\n') @@ -208,87 +208,87 @@ if __name__ == '__main__':          if os.path.exists(opts.soname):              os.unlink(opts.soname)          os.link(opts.target, opts.soname) -  -  -# -----------------Test---------------- #  -def write_temp_file(content):  -    import yatest.common as yc  -    filename = yc.output_path('test.exports')  -    with open(filename, 'w') as f:  -        f.write(content)  -    return filename  -  -  -def test_fix_cmd_darwin():  -    export_file_content = """  -C++ geobase5::details::lookup_impl::*  -C++ geobase5::hardcoded_service  -"""  -    filename = write_temp_file(export_file_content)  -    args = ['-Wl,--version-script={}'.format(filename)]  + + +# -----------------Test---------------- # +def write_temp_file(content): +    import yatest.common as yc +    filename = yc.output_path('test.exports') +    with open(filename, 'w') as f: +        f.write(content) +    return filename + + +def test_fix_cmd_darwin(): +    export_file_content = """ +C++ geobase5::details::lookup_impl::* +C++ geobase5::hardcoded_service +""" +    filename = write_temp_file(export_file_content) +    args = ['-Wl,--version-script={}'.format(filename)]      assert fix_cmd('DARWIN', False, args) == [ -        '-Wl,-exported_symbol,__ZN8geobase57details11lookup_impl*',  -        '-Wl,-exported_symbol,__ZTIN8geobase57details11lookup_impl*',  -        '-Wl,-exported_symbol,__ZTSN8geobase57details11lookup_impl*',  -        '-Wl,-exported_symbol,__ZTTN8geobase57details11lookup_impl*',  -        '-Wl,-exported_symbol,__ZTVN8geobase57details11lookup_impl*',  -        '-Wl,-exported_symbol,__ZNK8geobase57details11lookup_impl*',  -        '-Wl,-exported_symbol,__ZN8geobase517hardcoded_serviceE*',  -        '-Wl,-exported_symbol,__ZTIN8geobase517hardcoded_serviceE*',  -        '-Wl,-exported_symbol,__ZTSN8geobase517hardcoded_serviceE*',  -        '-Wl,-exported_symbol,__ZTTN8geobase517hardcoded_serviceE*',  -        '-Wl,-exported_symbol,__ZTVN8geobase517hardcoded_serviceE*',  -        '-Wl,-exported_symbol,__ZNK8geobase517hardcoded_serviceE*',  -    ]  -  -  -def run_fix_gnu_param(export_file_content):  -    filename = write_temp_file(export_file_content)  -    result = fix_gnu_param('LINUX', list(parse_export_file(filename)))[0]  -    version_script_path = result[len('-Wl,--version-script='):]  -    with open(version_script_path) as f:  -        content = f.read()  -    return content  -  -  -def test_fix_gnu_param():  -    export_file_content = """  -C++ geobase5::details::lookup_impl::*  -C   getFactoryMap  -"""  -    assert run_fix_gnu_param(export_file_content) == """{  -global:  -    extern "C" {  -        _ZN8geobase57details11lookup_impl*;  -        _ZTIN8geobase57details11lookup_impl*;  -        _ZTSN8geobase57details11lookup_impl*;  -        _ZTTN8geobase57details11lookup_impl*;  -        _ZTVN8geobase57details11lookup_impl*;  -        _ZNK8geobase57details11lookup_impl*;  -        getFactoryMap;  -    };  -local: *;  -};  -"""  -  -  -def test_fix_gnu_param_with_linux_version():  -    export_file_content = """  -C++ geobase5::details::lookup_impl::*  -linux_version ver1.0  -C   getFactoryMap  -"""  -    assert run_fix_gnu_param(export_file_content) == """ver1.0 {  -global:  -    extern "C" {  -        _ZN8geobase57details11lookup_impl*;  -        _ZTIN8geobase57details11lookup_impl*;  -        _ZTSN8geobase57details11lookup_impl*;  -        _ZTTN8geobase57details11lookup_impl*;  -        _ZTVN8geobase57details11lookup_impl*;  -        _ZNK8geobase57details11lookup_impl*;  -        getFactoryMap;  -    };  -local: *;  -};  -"""  +        '-Wl,-exported_symbol,__ZN8geobase57details11lookup_impl*', +        '-Wl,-exported_symbol,__ZTIN8geobase57details11lookup_impl*', +        '-Wl,-exported_symbol,__ZTSN8geobase57details11lookup_impl*', +        '-Wl,-exported_symbol,__ZTTN8geobase57details11lookup_impl*', +        '-Wl,-exported_symbol,__ZTVN8geobase57details11lookup_impl*', +        '-Wl,-exported_symbol,__ZNK8geobase57details11lookup_impl*', +        '-Wl,-exported_symbol,__ZN8geobase517hardcoded_serviceE*', +        '-Wl,-exported_symbol,__ZTIN8geobase517hardcoded_serviceE*', +        '-Wl,-exported_symbol,__ZTSN8geobase517hardcoded_serviceE*', +        '-Wl,-exported_symbol,__ZTTN8geobase517hardcoded_serviceE*', +        '-Wl,-exported_symbol,__ZTVN8geobase517hardcoded_serviceE*', +        '-Wl,-exported_symbol,__ZNK8geobase517hardcoded_serviceE*', +    ] + + +def run_fix_gnu_param(export_file_content): +    filename = write_temp_file(export_file_content) +    result = fix_gnu_param('LINUX', list(parse_export_file(filename)))[0] +    version_script_path = result[len('-Wl,--version-script='):] +    with open(version_script_path) as f: +        content = f.read() +    return content + + +def test_fix_gnu_param(): +    export_file_content = """ +C++ geobase5::details::lookup_impl::* +C   getFactoryMap +""" +    assert run_fix_gnu_param(export_file_content) == """{ +global: +    extern "C" { +        _ZN8geobase57details11lookup_impl*; +        _ZTIN8geobase57details11lookup_impl*; +        _ZTSN8geobase57details11lookup_impl*; +        _ZTTN8geobase57details11lookup_impl*; +        _ZTVN8geobase57details11lookup_impl*; +        _ZNK8geobase57details11lookup_impl*; +        getFactoryMap; +    }; +local: *; +}; +""" + + +def test_fix_gnu_param_with_linux_version(): +    export_file_content = """ +C++ geobase5::details::lookup_impl::* +linux_version ver1.0 +C   getFactoryMap +""" +    assert run_fix_gnu_param(export_file_content) == """ver1.0 { +global: +    extern "C" { +        _ZN8geobase57details11lookup_impl*; +        _ZTIN8geobase57details11lookup_impl*; +        _ZTSN8geobase57details11lookup_impl*; +        _ZTTN8geobase57details11lookup_impl*; +        _ZTVN8geobase57details11lookup_impl*; +        _ZNK8geobase57details11lookup_impl*; +        getFactoryMap; +    }; +local: *; +}; +""" | 
