| Index: tools/generate_stubs/generate_stubs.py
|
| diff --git a/tools/generate_stubs/generate_stubs.py b/tools/generate_stubs/generate_stubs.py
|
| index 46ddb7de19932ab019cee62284e511ad9e65dc6a..4c0fcac40cdaca862ec89a13812cb498ce057d55 100755
|
| --- a/tools/generate_stubs/generate_stubs.py
|
| +++ b/tools/generate_stubs/generate_stubs.py
|
| @@ -85,13 +85,14 @@ FILE_TYPE_WIN_DEF = 'windows_def'
|
| # declaration marking the symbol as weak. This template takes the following
|
| # named parameters.
|
| # return_type: The return type.
|
| +# export: The macro used to alter the stub's visibility.
|
| # name: The name of the function.
|
| # params: The parameters to the function.
|
| # return_prefix: 'return ' if this function is not void. '' otherwise.
|
| # arg_list: The arguments used to call the stub function.
|
| STUB_FUNCTION_DEFINITION = (
|
| """extern %(return_type)s %(name)s(%(params)s) __attribute__((weak));
|
| -%(return_type)s %(name)s(%(params)s) {
|
| +%(return_type)s %(export)s %(name)s(%(params)s) {
|
| %(return_prefix)s%(name)s_ptr(%(arg_list)s);
|
| }""")
|
|
|
| @@ -100,6 +101,7 @@ STUB_FUNCTION_DEFINITION = (
|
| # Includes a forward declaration marking the symbol as weak.
|
| # This template takes the following named parameters.
|
| # return_type: The return type.
|
| +# export: The macro used to alter the stub's visibility.
|
| # name: The name of the function.
|
| # params: The parameters to the function.
|
| # arg_list: The arguments used to call the stub function without the
|
| @@ -108,7 +110,7 @@ STUB_FUNCTION_DEFINITION = (
|
| # argument.
|
| VARIADIC_STUB_FUNCTION_DEFINITION = (
|
| """extern %(return_type)s %(name)s(%(params)s) __attribute__((weak));
|
| -%(return_type)s %(name)s(%(params)s) {
|
| +%(return_type)s %(export)s %(name)s(%(params)s) {
|
| va_list args___;
|
| va_start(args___, %(last_named_arg)s);
|
| %(return_type)s ret___ = %(name)s_ptr(%(arg_list)s, va_arg(args___, void*));
|
| @@ -122,13 +124,14 @@ VARIADIC_STUB_FUNCTION_DEFINITION = (
|
| # This template takes the following named parameters.
|
| # name: The name of the function.
|
| # params: The parameters to the function.
|
| +# export: The macro used to alter the stub's visibility.
|
| # arg_list: The arguments used to call the stub function without the
|
| # variadic argument.
|
| # last_named_arg: Name of the last named argument before the variadic
|
| # argument.
|
| VOID_VARIADIC_STUB_FUNCTION_DEFINITION = (
|
| """extern void %(name)s(%(params)s) __attribute__((weak));
|
| -void %(name)s(%(params)s) {
|
| +void %(export)s %(name)s(%(params)s) {
|
| va_list args___;
|
| va_start(args___, %(last_named_arg)s);
|
| %(name)s_ptr(%(arg_list)s, va_arg(args___, void*));
|
| @@ -517,16 +520,19 @@ class PosixStubWriter(object):
|
| functions plus initialization code for them.
|
| """
|
|
|
| - def __init__(self, module_name, signatures):
|
| + def __init__(self, module_name, export_macro, signatures):
|
| """Initializes PosixStubWriter for this set of signatures and module_name.
|
|
|
| Args:
|
| module_name: The name of the module we are writing a stub for.
|
| + export_macro: A preprocessor macro used to annotate stub symbols with
|
| + an EXPORT marking, to control visibility.
|
| signatures: The list of signature hashes, as produced by ParseSignatures,
|
| to create stubs for.
|
| """
|
| self.signatures = signatures
|
| self.module_name = module_name
|
| + self.export_macro = export_macro
|
|
|
| @classmethod
|
| def CStyleIdentifier(cls, identifier):
|
| @@ -654,13 +660,15 @@ class PosixStubWriter(object):
|
| 'name': signature['name'],
|
| 'params': ', '.join(signature['params']),
|
| 'arg_list': ', '.join(arguments[0:-1]),
|
| - 'last_named_arg': arguments[-2]}
|
| + 'last_named_arg': arguments[-2],
|
| + 'export': signature.get('export', '')}
|
| else:
|
| return VOID_VARIADIC_STUB_FUNCTION_DEFINITION % {
|
| 'name': signature['name'],
|
| 'params': ', '.join(signature['params']),
|
| 'arg_list': ', '.join(arguments[0:-1]),
|
| - 'last_named_arg': arguments[-2]}
|
| + 'last_named_arg': arguments[-2],
|
| + 'export': signature.get('export', '')}
|
| else:
|
| # This is a regular function.
|
| return STUB_FUNCTION_DEFINITION % {
|
| @@ -668,7 +676,8 @@ class PosixStubWriter(object):
|
| 'name': signature['name'],
|
| 'params': ', '.join(signature['params']),
|
| 'return_prefix': return_prefix,
|
| - 'arg_list': arg_list}
|
| + 'arg_list': arg_list,
|
| + 'export': signature.get('export', '')}
|
|
|
| @classmethod
|
| def WriteImplementationPreamble(cls, header_path, outfile):
|
| @@ -816,6 +825,7 @@ class PosixStubWriter(object):
|
| """
|
| outfile.write('// Stubs that dispatch to the real implementations.\n')
|
| for sig in self.signatures:
|
| + sig['export'] = self.export_macro
|
| outfile.write('%s\n' % PosixStubWriter.StubFunction(sig))
|
|
|
| def WriteModuleInitializeFunctions(self, outfile):
|
| @@ -922,6 +932,13 @@ def CreateOptionParser():
|
| default=None,
|
| help=('Name of output DLL or LIB for DEF creation using '
|
| '%s type.' % FILE_TYPE_WIN_DEF))
|
| + parser.add_option('-x',
|
| + '--export_macro',
|
| + dest='export_macro',
|
| + default='',
|
| + help=('A macro to place between the return type and '
|
| + 'function name, e.g. MODULE_EXPORT, to control the '
|
| + 'visbility of the stub functions.'))
|
|
|
| return parser
|
|
|
| @@ -996,7 +1013,8 @@ def CreateOutputDirectories(options):
|
| return out_dir, intermediate_dir
|
|
|
|
|
| -def CreateWindowsLibForSigFiles(sig_files, out_dir, intermediate_dir, machine):
|
| +def CreateWindowsLibForSigFiles(sig_files, out_dir, intermediate_dir, machine,
|
| + export_macro):
|
| """For each signature file, create a windows lib.
|
|
|
| Args:
|
| @@ -1005,12 +1023,16 @@ def CreateWindowsLibForSigFiles(sig_files, out_dir, intermediate_dir, machine):
|
| intermediate_dir: String holding path to directory generated intermdiate
|
| artifacts.
|
| machine: String holding the machine type, 'X86' or 'X64'.
|
| + export_macro: A preprocessor macro used to annotate stub symbols with
|
| + an EXPORT marking, to control visibility.
|
| """
|
| for input_path in sig_files:
|
| infile = open(input_path, 'r')
|
| try:
|
| signatures = ParseSignatures(infile)
|
| module_name = ExtractModuleName(os.path.basename(input_path))
|
| + for sig in signatures:
|
| + sig['export'] = export_macro
|
| CreateWindowsLib(module_name, signatures, intermediate_dir, out_dir,
|
| machine)
|
| finally:
|
| @@ -1045,7 +1067,7 @@ def CreateWindowsDefForSigFiles(sig_files, out_dir, module_name):
|
|
|
| def CreatePosixStubsForSigFiles(sig_files, stub_name, out_dir,
|
| intermediate_dir, path_from_source,
|
| - extra_stub_header):
|
| + extra_stub_header, export_macro):
|
| """Create a posix stub library with a module for each signature file.
|
|
|
| Args:
|
| @@ -1057,6 +1079,8 @@ def CreatePosixStubsForSigFiles(sig_files, stub_name, out_dir,
|
| project root.
|
| extra_stub_header: String with path to file of extra lines to insert
|
| into the generated header for the stub library.
|
| + export_macro: A preprocessor macro used to annotate stub symbols with
|
| + an EXPORT marking, to control visibility.
|
| """
|
| header_base_name = stub_name + '.h'
|
| header_path = os.path.join(out_dir, header_base_name)
|
| @@ -1093,7 +1117,7 @@ def CreatePosixStubsForSigFiles(sig_files, stub_name, out_dir,
|
| signatures = ParseSignatures(infile)
|
| finally:
|
| infile.close()
|
| - writer = PosixStubWriter(name, signatures)
|
| + writer = PosixStubWriter(name, export_macro, signatures)
|
| writer.WriteImplementationContents(namespace, impl_file)
|
|
|
| # Lastly, output the umbrella function for the file.
|
| @@ -1116,13 +1140,15 @@ def main():
|
| out_dir, intermediate_dir = CreateOutputDirectories(options)
|
|
|
| if options.type == FILE_TYPE_WIN_X86:
|
| - CreateWindowsLibForSigFiles(args, out_dir, intermediate_dir, 'X86')
|
| + CreateWindowsLibForSigFiles(args, out_dir, intermediate_dir, 'X86',
|
| + options.export_macro)
|
| elif options.type == FILE_TYPE_WIN_X64:
|
| - CreateWindowsLibForSigFiles(args, out_dir, intermediate_dir, 'X64')
|
| + CreateWindowsLibForSigFiles(args, out_dir, intermediate_dir, 'X64',
|
| + options.export_macro)
|
| elif options.type == FILE_TYPE_POSIX_STUB:
|
| CreatePosixStubsForSigFiles(args, options.stubfile_name, out_dir,
|
| intermediate_dir, options.path_from_source,
|
| - options.extra_stub_header)
|
| + options.extra_stub_header, options.export_macro)
|
| elif options.type == FILE_TYPE_WIN_DEF:
|
| CreateWindowsDefForSigFiles(args, out_dir, options.module_name)
|
|
|
|
|