13c250c5d6cbf4123e959a3466990fda9fa50987aZonr Chang#!/usr/bin/env python
2c383a500aa59423264811be3874461bf8adbfea0Zonr Chang#
3c383a500aa59423264811be3874461bf8adbfea0Zonr Chang# Copyright (C) 2010 The Android Open Source Project
4c383a500aa59423264811be3874461bf8adbfea0Zonr Chang#
5c383a500aa59423264811be3874461bf8adbfea0Zonr Chang# Licensed under the Apache License, Version 2.0 (the "License");
6c383a500aa59423264811be3874461bf8adbfea0Zonr Chang# you may not use this file except in compliance with the License.
7c383a500aa59423264811be3874461bf8adbfea0Zonr Chang# You may obtain a copy of the License at
8c383a500aa59423264811be3874461bf8adbfea0Zonr Chang#
9c383a500aa59423264811be3874461bf8adbfea0Zonr Chang#      http://www.apache.org/licenses/LICENSE-2.0
10c383a500aa59423264811be3874461bf8adbfea0Zonr Chang#
11c383a500aa59423264811be3874461bf8adbfea0Zonr Chang# Unless required by applicable law or agreed to in writing, software
12c383a500aa59423264811be3874461bf8adbfea0Zonr Chang# distributed under the License is distributed on an "AS IS" BASIS,
13c383a500aa59423264811be3874461bf8adbfea0Zonr Chang# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14c383a500aa59423264811be3874461bf8adbfea0Zonr Chang# See the License for the specific language governing permissions and
15c383a500aa59423264811be3874461bf8adbfea0Zonr Chang# limitations under the License.
16c383a500aa59423264811be3874461bf8adbfea0Zonr Chang#
173c250c5d6cbf4123e959a3466990fda9fa50987aZonr Chang
183c250c5d6cbf4123e959a3466990fda9fa50987aZonr Chang
19e639eb5caa2c386b4a60659a4929e8a6141a2cbeStephen Hines"""Convert Slang data files to assembly output."""
20e639eb5caa2c386b4a60659a4929e8a6141a2cbeStephen Hines
21e639eb5caa2c386b4a60659a4929e8a6141a2cbeStephen Hinesimport sys
22e639eb5caa2c386b4a60659a4929e8a6141a2cbeStephen Hines
23e639eb5caa2c386b4a60659a4929e8a6141a2cbeStephen Hines
24e639eb5caa2c386b4a60659a4929e8a6141a2cbeStephen Hinesdef PrintHeader(var_name):
25e639eb5caa2c386b4a60659a4929e8a6141a2cbeStephen Hines  """Print out header for assembly file."""
263c250c5d6cbf4123e959a3466990fda9fa50987aZonr Chang  sys.stdout.write("""
273c250c5d6cbf4123e959a3466990fda9fa50987aZonr Chang#ifdef __APPLE_CC__
283c250c5d6cbf4123e959a3466990fda9fa50987aZonr Chang/*\n\
293c250c5d6cbf4123e959a3466990fda9fa50987aZonr Chang * The mid-2007 version of gcc that ships with Macs requires a\n\
303c250c5d6cbf4123e959a3466990fda9fa50987aZonr Chang * comma on the .section line, but the rest of the world thinks\n\
313c250c5d6cbf4123e959a3466990fda9fa50987aZonr Chang * that's a syntax error. It also wants globals to be explicitly\n\
323c250c5d6cbf4123e959a3466990fda9fa50987aZonr Chang * prefixed with \"_\" as opposed to modern gccs that do the\n\
333c250c5d6cbf4123e959a3466990fda9fa50987aZonr Chang * prefixing for you.\n\
343c250c5d6cbf4123e959a3466990fda9fa50987aZonr Chang */\n\
353c250c5d6cbf4123e959a3466990fda9fa50987aZonr Chang.globl _%s\n\
363c250c5d6cbf4123e959a3466990fda9fa50987aZonr Chang  .section .rodata,\n\
373c250c5d6cbf4123e959a3466990fda9fa50987aZonr Chang  .align 8\n\
383c250c5d6cbf4123e959a3466990fda9fa50987aZonr Chang_%s:\n\
393c250c5d6cbf4123e959a3466990fda9fa50987aZonr Chang#else\n\
403c250c5d6cbf4123e959a3466990fda9fa50987aZonr Chang.globl %s\n\
413c250c5d6cbf4123e959a3466990fda9fa50987aZonr Chang  .section .rodata\n\
423c250c5d6cbf4123e959a3466990fda9fa50987aZonr Chang  .align 8\n\
433c250c5d6cbf4123e959a3466990fda9fa50987aZonr Chang%s:\n\
443c250c5d6cbf4123e959a3466990fda9fa50987aZonr Chang#endif\n\
453c250c5d6cbf4123e959a3466990fda9fa50987aZonr Chang""" % (var_name, var_name, var_name, var_name))
463c250c5d6cbf4123e959a3466990fda9fa50987aZonr Chang
47e639eb5caa2c386b4a60659a4929e8a6141a2cbeStephen Hines
48e639eb5caa2c386b4a60659a4929e8a6141a2cbeStephen Hinesdef File2Asm(var_name):
49e639eb5caa2c386b4a60659a4929e8a6141a2cbeStephen Hines  """Convert file to assembly output."""
50e639eb5caa2c386b4a60659a4929e8a6141a2cbeStephen Hines  PrintHeader(var_name)
513c250c5d6cbf4123e959a3466990fda9fa50987aZonr Chang
523c250c5d6cbf4123e959a3466990fda9fa50987aZonr Chang  input_size = 0
533c250c5d6cbf4123e959a3466990fda9fa50987aZonr Chang  col = 0
543c250c5d6cbf4123e959a3466990fda9fa50987aZonr Chang  while True:
553c250c5d6cbf4123e959a3466990fda9fa50987aZonr Chang    buf = sys.stdin.read(1024)
563c250c5d6cbf4123e959a3466990fda9fa50987aZonr Chang    if len(buf) <= 0:
573c250c5d6cbf4123e959a3466990fda9fa50987aZonr Chang      break
583c250c5d6cbf4123e959a3466990fda9fa50987aZonr Chang    input_size += len(buf)
593c250c5d6cbf4123e959a3466990fda9fa50987aZonr Chang    for c in buf:
603c250c5d6cbf4123e959a3466990fda9fa50987aZonr Chang      if col == 0:
613c250c5d6cbf4123e959a3466990fda9fa50987aZonr Chang        sys.stdout.write(".byte ")
623c250c5d6cbf4123e959a3466990fda9fa50987aZonr Chang      sys.stdout.write("0x%02x" % ord(c))
633c250c5d6cbf4123e959a3466990fda9fa50987aZonr Chang      col += 1
643c250c5d6cbf4123e959a3466990fda9fa50987aZonr Chang      if col == 16:
653c250c5d6cbf4123e959a3466990fda9fa50987aZonr Chang        sys.stdout.write("\n")
663c250c5d6cbf4123e959a3466990fda9fa50987aZonr Chang        col = 0
673c250c5d6cbf4123e959a3466990fda9fa50987aZonr Chang      elif col % 4 == 0:
683c250c5d6cbf4123e959a3466990fda9fa50987aZonr Chang        sys.stdout.write(", ")
693c250c5d6cbf4123e959a3466990fda9fa50987aZonr Chang      else:
703c250c5d6cbf4123e959a3466990fda9fa50987aZonr Chang        sys.stdout.write(",")
71d124ee6cfcb90229e7121fe81742d23a05375ce8Zonr Chang  # always ends with 0x0
72d124ee6cfcb90229e7121fe81742d23a05375ce8Zonr Chang  sys.stdout.write("0x00")
733c250c5d6cbf4123e959a3466990fda9fa50987aZonr Chang  if col != 0:
743c250c5d6cbf4123e959a3466990fda9fa50987aZonr Chang    sys.stdout.write("\n")
753c250c5d6cbf4123e959a3466990fda9fa50987aZonr Chang
763c250c5d6cbf4123e959a3466990fda9fa50987aZonr Chang  # encode file size
77e639eb5caa2c386b4a60659a4929e8a6141a2cbeStephen Hines  PrintHeader(var_name + "_size")
783c250c5d6cbf4123e959a3466990fda9fa50987aZonr Chang  sys.stdout.write("  .long %d\n" % input_size)
793c250c5d6cbf4123e959a3466990fda9fa50987aZonr Chang
80e639eb5caa2c386b4a60659a4929e8a6141a2cbeStephen Hines
813c250c5d6cbf4123e959a3466990fda9fa50987aZonr Changdef main(argv):
823c250c5d6cbf4123e959a3466990fda9fa50987aZonr Chang  if len(argv) < 2:
833c250c5d6cbf4123e959a3466990fda9fa50987aZonr Chang    print "usage: %s <name>" % argv[0]
843c250c5d6cbf4123e959a3466990fda9fa50987aZonr Chang    return 1
853c250c5d6cbf4123e959a3466990fda9fa50987aZonr Chang
86e639eb5caa2c386b4a60659a4929e8a6141a2cbeStephen Hines  File2Asm(argv[1])
873c250c5d6cbf4123e959a3466990fda9fa50987aZonr Chang
88e639eb5caa2c386b4a60659a4929e8a6141a2cbeStephen Hinesif __name__ == "__main__":
893c250c5d6cbf4123e959a3466990fda9fa50987aZonr Chang  main(sys.argv)
90