| #!/usr/bin/env python3 | 
 | # | 
 | # Copyright (c) 2017, the Dart project authors.  Please see the AUTHORS file | 
 | # for details. All rights reserved. Use of this source code is governed by a | 
 | # BSD-style license that can be found in the LICENSE file. | 
 |  | 
 | # Generates an assembly source file the defines a symbol with the bytes from | 
 | # a given file. | 
 |  | 
 | import os | 
 | import sys | 
 | from optparse import OptionParser | 
 |  | 
 |  | 
 | def Main(): | 
 |     parser = OptionParser() | 
 |     parser.add_option( | 
 |         "--output", | 
 |         action="store", | 
 |         type="string", | 
 |         help="output assembly file name") | 
 |     parser.add_option( | 
 |         "--input", action="store", type="string", help="input binary blob file") | 
 |     parser.add_option("--symbol_name", action="store", type="string") | 
 |     parser.add_option("--executable", action="store_true", default=False) | 
 |     parser.add_option("--target_os", action="store", type="string") | 
 |     parser.add_option("--size_symbol_name", action="store", type="string") | 
 |     parser.add_option("--target_arch", action="store", type="string") | 
 |     parser.add_option("--incbin", action="store_true", default=False) | 
 |  | 
 |     (options, args) = parser.parse_args() | 
 |     if not options.output: | 
 |         sys.stderr.write("--output not specified\n") | 
 |         parser.print_help() | 
 |         return -1 | 
 |     if not options.input: | 
 |         sys.stderr.write("--input not specified\n") | 
 |         parser.print_help() | 
 |         return -1 | 
 |     if not os.path.isfile(options.input): | 
 |         sys.stderr.write("input file does not exist: %s\n" % options.input) | 
 |         parser.print_help() | 
 |         return -1 | 
 |     if not options.symbol_name: | 
 |         sys.stderr.write("--symbol_name not specified\n") | 
 |         parser.print_help() | 
 |         return -1 | 
 |     if not options.target_os: | 
 |         sys.stderr.write("--target_os not specified\n") | 
 |         parser.print_help() | 
 |         return -1 | 
 |  | 
 |     with open(options.output, "w") as output_file: | 
 |         if options.target_os in ["mac", "ios"]: | 
 |             if options.executable: | 
 |                 output_file.write(".text\n") | 
 |             else: | 
 |                 output_file.write(".const\n") | 
 |             output_file.write(".global _%s\n" % options.symbol_name) | 
 |             output_file.write(".balign 32\n") | 
 |             output_file.write("_%s:\n" % options.symbol_name) | 
 |         elif options.target_os in ["win"]: | 
 |             output_file.write("ifndef _ML64_X64\n") | 
 |             output_file.write(".model flat, C\n") | 
 |             output_file.write("endif\n") | 
 |             if options.executable: | 
 |                 output_file.write(".code\n") | 
 |             else: | 
 |                 output_file.write(".const\n") | 
 |             output_file.write("public %s\n" % options.symbol_name) | 
 |             output_file.write("%s label byte\n" % options.symbol_name) | 
 |         elif options.target_os in ["win_gnu"]: | 
 |             # Cross compilation from Linux to Windows. | 
 |             if options.executable: | 
 |                 output_file.write(".text\n") | 
 |             else: | 
 |                 output_file.write(".section .rodata\n") | 
 |             output_file.write(".global %s\n" % options.symbol_name) | 
 |             output_file.write(".balign 32\n") | 
 |             output_file.write("%s:\n" % options.symbol_name) | 
 |         else: | 
 |             if options.executable: | 
 |                 output_file.write(".text\n") | 
 |                 output_file.write(".type %s STT_FUNC\n" % options.symbol_name) | 
 |             else: | 
 |                 output_file.write(".section .rodata\n") | 
 |                 output_file.write(".type %s STT_OBJECT\n" % options.symbol_name) | 
 |             output_file.write(".global %s\n" % options.symbol_name) | 
 |             output_file.write(".balign 32\n") | 
 |             output_file.write("%s:\n" % options.symbol_name) | 
 |  | 
 |         size = 0 | 
 |         with open(options.input, "rb") as input_file: | 
 |             if options.target_os in ["win"]: | 
 |                 for byte in input_file.read(): | 
 |                     output_file.write("byte %d\n" % (byte if isinstance(byte, int) else ord(byte))) | 
 |                     size += 1 | 
 |             else: | 
 |                 incbin = options.incbin | 
 |                 for byte in input_file.read(): | 
 |                     size += 1 | 
 |                     if not incbin: | 
 |                         output_file.write( | 
 |                             ".byte %d\n" % | 
 |                             (byte if isinstance(byte, int) else ord(byte))) | 
 |                 if incbin: | 
 |                     output_file.write(".incbin \"%s\"\n" % options.input) | 
 |  | 
 |         if options.target_os not in ["mac", "ios", "win", "win_gnu"]: | 
 |             output_file.write(".size {0}, .-{0}\n".format(options.symbol_name)) | 
 |  | 
 |         if options.size_symbol_name: | 
 |             if not options.target_arch: | 
 |                 sys.stderr.write("--target_arch not specified\n") | 
 |                 parser.print_help() | 
 |                 return -1 | 
 |  | 
 |             is64bit = 0 | 
 |             if options.target_arch: | 
 |                 if options.target_arch in ["arm64", "x64", "riscv64"]: | 
 |                     is64bit = 1 | 
 |  | 
 |             if options.target_os in ["win"]: | 
 |                 output_file.write("public %s\n" % options.size_symbol_name) | 
 |                 output_file.write("%s label byte\n" % options.size_symbol_name) | 
 |                 if (is64bit == 1): | 
 |                     output_file.write("qword %d\n" % size) | 
 |                 else: | 
 |                     output_file.write("dword %d\n" % size) | 
 |             else: | 
 |                 if options.target_os in ["mac", "ios"]: | 
 |                     output_file.write( | 
 |                         ".global _%s\n" % options.size_symbol_name) | 
 |                     output_file.write("_%s:\n" % options.size_symbol_name) | 
 |                 else: | 
 |                     output_file.write(".global %s\n" % options.size_symbol_name) | 
 |                     output_file.write("%s:\n" % options.size_symbol_name) | 
 |                 if (is64bit == 1): | 
 |                     output_file.write(".quad %d\n" % size) | 
 |                 else: | 
 |                     output_file.write(".long %d\n" % size) | 
 |  | 
 |         if options.target_os in ["win"]: | 
 |             output_file.write("end\n") | 
 |  | 
 |     return 0 | 
 |  | 
 |  | 
 | if __name__ == "__main__": | 
 |     sys.exit(Main()) |