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