12ca6e576421e86e0128991b825c238f1d4221910Joseph Wen#!/usr/bin/env python
22ca6e576421e86e0128991b825c238f1d4221910Joseph Wen#
32ca6e576421e86e0128991b825c238f1d4221910Joseph Wen# Copyright (C) 2011 The Android Open Source Project
42ca6e576421e86e0128991b825c238f1d4221910Joseph Wen#
52ca6e576421e86e0128991b825c238f1d4221910Joseph Wen# Licensed under the Apache License, Version 2.0 (the "License");
62ca6e576421e86e0128991b825c238f1d4221910Joseph Wen# you may not use this file except in compliance with the License.
72ca6e576421e86e0128991b825c238f1d4221910Joseph Wen# You may obtain a copy of the License at
82ca6e576421e86e0128991b825c238f1d4221910Joseph Wen#
92ca6e576421e86e0128991b825c238f1d4221910Joseph Wen#      http://www.apache.org/licenses/LICENSE-2.0
102ca6e576421e86e0128991b825c238f1d4221910Joseph Wen#
112ca6e576421e86e0128991b825c238f1d4221910Joseph Wen# Unless required by applicable law or agreed to in writing, software
122ca6e576421e86e0128991b825c238f1d4221910Joseph Wen# distributed under the License is distributed on an "AS IS" BASIS,
132ca6e576421e86e0128991b825c238f1d4221910Joseph Wen# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
142ca6e576421e86e0128991b825c238f1d4221910Joseph Wen# See the License for the specific language governing permissions and
152ca6e576421e86e0128991b825c238f1d4221910Joseph Wen# limitations under the License.
162ca6e576421e86e0128991b825c238f1d4221910Joseph Wen#
172ca6e576421e86e0128991b825c238f1d4221910Joseph Wen
182ca6e576421e86e0128991b825c238f1d4221910Joseph Wen
192ca6e576421e86e0128991b825c238f1d4221910Joseph Wen"""Convert data files to assembly output."""
202ca6e576421e86e0128991b825c238f1d4221910Joseph Wen
212ca6e576421e86e0128991b825c238f1d4221910Joseph Wenimport sys
222ca6e576421e86e0128991b825c238f1d4221910Joseph Wen
232ca6e576421e86e0128991b825c238f1d4221910Joseph Wen
242ca6e576421e86e0128991b825c238f1d4221910Joseph Wendef PrintHeader(var_name):
252ca6e576421e86e0128991b825c238f1d4221910Joseph Wen  """Print out header for assembly file."""
262ca6e576421e86e0128991b825c238f1d4221910Joseph Wen  sys.stdout.write("""
272ca6e576421e86e0128991b825c238f1d4221910Joseph Wen#ifdef __APPLE_CC__
282ca6e576421e86e0128991b825c238f1d4221910Joseph Wen/*\n\
292ca6e576421e86e0128991b825c238f1d4221910Joseph Wen * The mid-2007 version of gcc that ships with Macs requires a\n\
302ca6e576421e86e0128991b825c238f1d4221910Joseph Wen * comma on the .section line, but the rest of the world thinks\n\
312ca6e576421e86e0128991b825c238f1d4221910Joseph Wen * that's a syntax error. It also wants globals to be explicitly\n\
322ca6e576421e86e0128991b825c238f1d4221910Joseph Wen * prefixed with \"_\" as opposed to modern gccs that do the\n\
332ca6e576421e86e0128991b825c238f1d4221910Joseph Wen * prefixing for you.\n\
342ca6e576421e86e0128991b825c238f1d4221910Joseph Wen */\n\
352ca6e576421e86e0128991b825c238f1d4221910Joseph Wen.globl _%s\n\
362ca6e576421e86e0128991b825c238f1d4221910Joseph Wen  .section .rodata,\n\
372ca6e576421e86e0128991b825c238f1d4221910Joseph Wen  .align 8\n\
382ca6e576421e86e0128991b825c238f1d4221910Joseph Wen_%s:\n\
392ca6e576421e86e0128991b825c238f1d4221910Joseph Wen#else\n\
402ca6e576421e86e0128991b825c238f1d4221910Joseph Wen.globl %s\n\
412ca6e576421e86e0128991b825c238f1d4221910Joseph Wen  .section .rodata\n\
422ca6e576421e86e0128991b825c238f1d4221910Joseph Wen  .align 8\n\
432ca6e576421e86e0128991b825c238f1d4221910Joseph Wen%s:\n\
442ca6e576421e86e0128991b825c238f1d4221910Joseph Wen#endif\n\
452ca6e576421e86e0128991b825c238f1d4221910Joseph Wen""" % (var_name, var_name, var_name, var_name))
462ca6e576421e86e0128991b825c238f1d4221910Joseph Wen
472ca6e576421e86e0128991b825c238f1d4221910Joseph Wen
482ca6e576421e86e0128991b825c238f1d4221910Joseph Wendef File2Asm(var_name):
492ca6e576421e86e0128991b825c238f1d4221910Joseph Wen  """Convert file to assembly output."""
502ca6e576421e86e0128991b825c238f1d4221910Joseph Wen  PrintHeader(var_name)
512ca6e576421e86e0128991b825c238f1d4221910Joseph Wen
522ca6e576421e86e0128991b825c238f1d4221910Joseph Wen  input_size = 0
532ca6e576421e86e0128991b825c238f1d4221910Joseph Wen  col = 0
542ca6e576421e86e0128991b825c238f1d4221910Joseph Wen  while True:
552ca6e576421e86e0128991b825c238f1d4221910Joseph Wen    buf = sys.stdin.read(1024)
562ca6e576421e86e0128991b825c238f1d4221910Joseph Wen    if len(buf) <= 0:
572ca6e576421e86e0128991b825c238f1d4221910Joseph Wen      break
582ca6e576421e86e0128991b825c238f1d4221910Joseph Wen    input_size += len(buf)
592ca6e576421e86e0128991b825c238f1d4221910Joseph Wen    for c in buf:
602ca6e576421e86e0128991b825c238f1d4221910Joseph Wen      if col == 0:
612ca6e576421e86e0128991b825c238f1d4221910Joseph Wen        sys.stdout.write(".byte ")
622ca6e576421e86e0128991b825c238f1d4221910Joseph Wen      sys.stdout.write("0x%02x" % ord(c))
632ca6e576421e86e0128991b825c238f1d4221910Joseph Wen      col += 1
642ca6e576421e86e0128991b825c238f1d4221910Joseph Wen      if col == 8:
652ca6e576421e86e0128991b825c238f1d4221910Joseph Wen        sys.stdout.write("\n")
662ca6e576421e86e0128991b825c238f1d4221910Joseph Wen        col = 0
672ca6e576421e86e0128991b825c238f1d4221910Joseph Wen      elif col % 4 == 0:
682ca6e576421e86e0128991b825c238f1d4221910Joseph Wen        sys.stdout.write(", ")
692ca6e576421e86e0128991b825c238f1d4221910Joseph Wen      else:
702ca6e576421e86e0128991b825c238f1d4221910Joseph Wen        sys.stdout.write(",")
712ca6e576421e86e0128991b825c238f1d4221910Joseph Wen  if col != 0:
722ca6e576421e86e0128991b825c238f1d4221910Joseph Wen    sys.stdout.write("\n")
732ca6e576421e86e0128991b825c238f1d4221910Joseph Wen
742ca6e576421e86e0128991b825c238f1d4221910Joseph Wen  # encode file size
752ca6e576421e86e0128991b825c238f1d4221910Joseph Wen  PrintHeader(var_name + "_size")
762ca6e576421e86e0128991b825c238f1d4221910Joseph Wen  sys.stdout.write("  .long %d\n" % input_size)
772ca6e576421e86e0128991b825c238f1d4221910Joseph Wen
782ca6e576421e86e0128991b825c238f1d4221910Joseph Wen
792ca6e576421e86e0128991b825c238f1d4221910Joseph Wendef main(argv):
802ca6e576421e86e0128991b825c238f1d4221910Joseph Wen  if len(argv) < 2:
812ca6e576421e86e0128991b825c238f1d4221910Joseph Wen    print "usage: %s <name>" % argv[0]
822ca6e576421e86e0128991b825c238f1d4221910Joseph Wen    return 1
832ca6e576421e86e0128991b825c238f1d4221910Joseph Wen
842ca6e576421e86e0128991b825c238f1d4221910Joseph Wen  File2Asm(argv[1])
852ca6e576421e86e0128991b825c238f1d4221910Joseph Wen
862ca6e576421e86e0128991b825c238f1d4221910Joseph Wenif __name__ == "__main__":
872ca6e576421e86e0128991b825c238f1d4221910Joseph Wen  main(sys.argv)
88