16888aaefad5a8dfc56d76187d8ff2e3311783e27Logan Chien#!/usr/bin/env python
2ddf5661793de8fb4e16906b7f7822972fcb13c6dZonr Chang#
3ddf5661793de8fb4e16906b7f7822972fcb13c6dZonr Chang# Copyright (C) 2011-2012 The Android Open Source Project
4ddf5661793de8fb4e16906b7f7822972fcb13c6dZonr Chang#
5ddf5661793de8fb4e16906b7f7822972fcb13c6dZonr Chang# Licensed under the Apache License, Version 2.0 (the "License");
6ddf5661793de8fb4e16906b7f7822972fcb13c6dZonr Chang# you may not use this file except in compliance with the License.
7ddf5661793de8fb4e16906b7f7822972fcb13c6dZonr Chang# You may obtain a copy of the License at
8ddf5661793de8fb4e16906b7f7822972fcb13c6dZonr Chang#
9ddf5661793de8fb4e16906b7f7822972fcb13c6dZonr Chang#      http://www.apache.org/licenses/LICENSE-2.0
10ddf5661793de8fb4e16906b7f7822972fcb13c6dZonr Chang#
11ddf5661793de8fb4e16906b7f7822972fcb13c6dZonr Chang# Unless required by applicable law or agreed to in writing, software
12ddf5661793de8fb4e16906b7f7822972fcb13c6dZonr Chang# distributed under the License is distributed on an "AS IS" BASIS,
13ddf5661793de8fb4e16906b7f7822972fcb13c6dZonr Chang# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14ddf5661793de8fb4e16906b7f7822972fcb13c6dZonr Chang# See the License for the specific language governing permissions and
15ddf5661793de8fb4e16906b7f7822972fcb13c6dZonr Chang# limitations under the License.
16ddf5661793de8fb4e16906b7f7822972fcb13c6dZonr Chang#
176888aaefad5a8dfc56d76187d8ff2e3311783e27Logan Chien
18f290793bc65b8483332ac8b568962395c4a63927Zonr Changimport os
196888aaefad5a8dfc56d76187d8ff2e3311783e27Logan Chienimport sys
206888aaefad5a8dfc56d76187d8ff2e3311783e27Logan Chien
211c13147fd7d2294a0f34a569fe36660b6b056a91Daniel Sandlertry:
221c13147fd7d2294a0f34a569fe36660b6b056a91Daniel Sandler    import hashlib
231c13147fd7d2294a0f34a569fe36660b6b056a91Daniel Sandler    sha1 = hashlib.sha1
241c13147fd7d2294a0f34a569fe36660b6b056a91Daniel Sandlerexcept ImportError, e:
251c13147fd7d2294a0f34a569fe36660b6b056a91Daniel Sandler    import sha
261c13147fd7d2294a0f34a569fe36660b6b056a91Daniel Sandler    sha1 = sha.sha
271c13147fd7d2294a0f34a569fe36660b6b056a91Daniel Sandler
286888aaefad5a8dfc56d76187d8ff2e3311783e27Logan Chiendef compute_sha1(h, path):
296888aaefad5a8dfc56d76187d8ff2e3311783e27Logan Chien    f = open(path, 'rb')
306888aaefad5a8dfc56d76187d8ff2e3311783e27Logan Chien    while True:
316888aaefad5a8dfc56d76187d8ff2e3311783e27Logan Chien        buf = f.read(1024)
326888aaefad5a8dfc56d76187d8ff2e3311783e27Logan Chien        h.update(buf)
336888aaefad5a8dfc56d76187d8ff2e3311783e27Logan Chien        if len(buf) < 1024:
346888aaefad5a8dfc56d76187d8ff2e3311783e27Logan Chien            break
356888aaefad5a8dfc56d76187d8ff2e3311783e27Logan Chien    f.close()
366888aaefad5a8dfc56d76187d8ff2e3311783e27Logan Chien
37f290793bc65b8483332ac8b568962395c4a63927Zonr Chang"""The result is a list of pair of file path and its SHA-1 digest"""
386888aaefad5a8dfc56d76187d8ff2e3311783e27Logan Chiendef compute_sha1_list(path_list):
39f290793bc65b8483332ac8b568962395c4a63927Zonr Chang    result = []
406888aaefad5a8dfc56d76187d8ff2e3311783e27Logan Chien    for path in path_list:
41f290793bc65b8483332ac8b568962395c4a63927Zonr Chang        h = sha1()
426888aaefad5a8dfc56d76187d8ff2e3311783e27Logan Chien        compute_sha1(h, path)
43f290793bc65b8483332ac8b568962395c4a63927Zonr Chang        result.append((path, h.digest()))
44f290793bc65b8483332ac8b568962395c4a63927Zonr Chang    return result
45f290793bc65b8483332ac8b568962395c4a63927Zonr Chang
46f290793bc65b8483332ac8b568962395c4a63927Zonr Chang"""For each path like /xxx/libfoo.so, generate a symbol named libfoo_so_SHA1"""
47f290793bc65b8483332ac8b568962395c4a63927Zonr Changdef get_symbol_name(path):
48f290793bc65b8483332ac8b568962395c4a63927Zonr Chang    return os.path.basename(path).replace('.', '_') + '_SHA1';
49f290793bc65b8483332ac8b568962395c4a63927Zonr Chang
50f290793bc65b8483332ac8b568962395c4a63927Zonr Chang"""Print out header for assembly file."""
51f290793bc65b8483332ac8b568962395c4a63927Zonr Changdef print_asm_header(symbols):
52f290793bc65b8483332ac8b568962395c4a63927Zonr Chang    sys.stdout.write("""
53f290793bc65b8483332ac8b568962395c4a63927Zonr Chang/*\
54f290793bc65b8483332ac8b568962395c4a63927Zonr Chang * The mid-2007 version of gcc that ships with Macs requires a\n\
55f290793bc65b8483332ac8b568962395c4a63927Zonr Chang * comma on the .section line, but the rest of the world thinks\n\
56f290793bc65b8483332ac8b568962395c4a63927Zonr Chang * that's a syntax error. It also wants globals to be explicitly\n\
57f290793bc65b8483332ac8b568962395c4a63927Zonr Chang * prefixed with \"_\" as opposed to modern gccs that do the\n\
58f290793bc65b8483332ac8b568962395c4a63927Zonr Chang * prefixing for you.\n\
59f290793bc65b8483332ac8b568962395c4a63927Zonr Chang */\n\
60f290793bc65b8483332ac8b568962395c4a63927Zonr Chang""")
61f290793bc65b8483332ac8b568962395c4a63927Zonr Chang    for sym in symbols:
62f290793bc65b8483332ac8b568962395c4a63927Zonr Chang        sys.stdout.write("""
63f290793bc65b8483332ac8b568962395c4a63927Zonr Chang#ifdef __APPLE_CC__
64f290793bc65b8483332ac8b568962395c4a63927Zonr Chang.globl _%s\n\
65f290793bc65b8483332ac8b568962395c4a63927Zonr Chang#else\n\
66f290793bc65b8483332ac8b568962395c4a63927Zonr Chang.globl %s\n\
67f290793bc65b8483332ac8b568962395c4a63927Zonr Chang#endif\
68f290793bc65b8483332ac8b568962395c4a63927Zonr Chang""" % (sym, sym))
69f290793bc65b8483332ac8b568962395c4a63927Zonr Chang    sys.stdout.write("""
70f290793bc65b8483332ac8b568962395c4a63927Zonr Chang#ifdef __APPLE_CC__
71f290793bc65b8483332ac8b568962395c4a63927Zonr Chang  .section .rodata,\n\
72f290793bc65b8483332ac8b568962395c4a63927Zonr Chang#else\n\
73f290793bc65b8483332ac8b568962395c4a63927Zonr Chang  .section .rodata\n\
74f290793bc65b8483332ac8b568962395c4a63927Zonr Chang#endif\
75f290793bc65b8483332ac8b568962395c4a63927Zonr Chang""" )
76f290793bc65b8483332ac8b568962395c4a63927Zonr Chang
77f290793bc65b8483332ac8b568962395c4a63927Zonr Changdef print_asm_data(data, size):
78f290793bc65b8483332ac8b568962395c4a63927Zonr Chang    col = 0
79f290793bc65b8483332ac8b568962395c4a63927Zonr Chang    sys.stdout.write(".align 8\n")
80f290793bc65b8483332ac8b568962395c4a63927Zonr Chang    for i in xrange(size):
81f290793bc65b8483332ac8b568962395c4a63927Zonr Chang        c = data[i]
82f290793bc65b8483332ac8b568962395c4a63927Zonr Chang        if col == 0:
83f290793bc65b8483332ac8b568962395c4a63927Zonr Chang            sys.stdout.write(".byte ")
84f290793bc65b8483332ac8b568962395c4a63927Zonr Chang        elif col % 4 == 0:
85f290793bc65b8483332ac8b568962395c4a63927Zonr Chang            sys.stdout.write(", ")
86f290793bc65b8483332ac8b568962395c4a63927Zonr Chang        else:
87f290793bc65b8483332ac8b568962395c4a63927Zonr Chang            sys.stdout.write(",")
88f290793bc65b8483332ac8b568962395c4a63927Zonr Chang        sys.stdout.write("0x%02x" % ord(c))
89f290793bc65b8483332ac8b568962395c4a63927Zonr Chang        col += 1
90f290793bc65b8483332ac8b568962395c4a63927Zonr Chang        if col == 8:
91f290793bc65b8483332ac8b568962395c4a63927Zonr Chang            sys.stdout.write("\n")
92f290793bc65b8483332ac8b568962395c4a63927Zonr Chang            col = 0
93f290793bc65b8483332ac8b568962395c4a63927Zonr Chang    if col != 0:
94f290793bc65b8483332ac8b568962395c4a63927Zonr Chang        sys.stdout.write("\n")
95f290793bc65b8483332ac8b568962395c4a63927Zonr Chang
96f290793bc65b8483332ac8b568962395c4a63927Zonr Changdef print_asm_symbol_data(sym, h):
97f290793bc65b8483332ac8b568962395c4a63927Zonr Chang    sys.stdout.write("""
98f290793bc65b8483332ac8b568962395c4a63927Zonr Chang#ifdef __APPLE_CC__
99f290793bc65b8483332ac8b568962395c4a63927Zonr Chang_%s:\n\
100f290793bc65b8483332ac8b568962395c4a63927Zonr Chang#else\n\
101f290793bc65b8483332ac8b568962395c4a63927Zonr Chang%s:\n\
102f290793bc65b8483332ac8b568962395c4a63927Zonr Chang#endif\n\
103f290793bc65b8483332ac8b568962395c4a63927Zonr Chang""" % (sym, sym))
104f290793bc65b8483332ac8b568962395c4a63927Zonr Chang    print_asm_data(h, 20)
105f290793bc65b8483332ac8b568962395c4a63927Zonr Chang
106f290793bc65b8483332ac8b568962395c4a63927Zonr Changdef print_asm(x):
107f290793bc65b8483332ac8b568962395c4a63927Zonr Chang    symbols = [get_symbol_name(item[0]) for item in x]
108f290793bc65b8483332ac8b568962395c4a63927Zonr Chang    print_asm_header(symbols)
109f290793bc65b8483332ac8b568962395c4a63927Zonr Chang    for (symbol, y) in zip(symbols, x):
110f290793bc65b8483332ac8b568962395c4a63927Zonr Chang        print_asm_symbol_data(symbol, y[1])
1116888aaefad5a8dfc56d76187d8ff2e3311783e27Logan Chien
1126888aaefad5a8dfc56d76187d8ff2e3311783e27Logan Chiendef main():
1136888aaefad5a8dfc56d76187d8ff2e3311783e27Logan Chien    if len(sys.argv) < 2:
1146888aaefad5a8dfc56d76187d8ff2e3311783e27Logan Chien        print 'USAGE:', sys.argv[0], '[OUTPUT] [INPUTs]'
1156888aaefad5a8dfc56d76187d8ff2e3311783e27Logan Chien        sys.exit(1)
1166888aaefad5a8dfc56d76187d8ff2e3311783e27Logan Chien
117f290793bc65b8483332ac8b568962395c4a63927Zonr Chang    result = compute_sha1_list(sys.argv[1:])
118f290793bc65b8483332ac8b568962395c4a63927Zonr Chang    print_asm(result)
1196888aaefad5a8dfc56d76187d8ff2e3311783e27Logan Chien
1206888aaefad5a8dfc56d76187d8ff2e3311783e27Logan Chienif __name__ == '__main__':
1216888aaefad5a8dfc56d76187d8ff2e3311783e27Logan Chien    main()
122