OLD | NEW |
1 #!/usr/bin/env python2 | 1 #!/usr/bin/env python2 |
2 | 2 |
3 import argparse | 3 import argparse |
4 import os | 4 import os |
5 import pipes | 5 import pipes |
6 import re | 6 import re |
7 import sys | 7 import sys |
8 | 8 |
9 from utils import shellcmd | 9 from utils import shellcmd |
10 from utils import FindBaseNaCl | 10 from utils import FindBaseNaCl |
(...skipping 43 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
54 returned if neither the include nor the exclude regex matches. | 54 returned if neither the include nor the exclude regex matches. |
55 """ | 55 """ |
56 if re_exclude.match(sym): | 56 if re_exclude.match(sym): |
57 # Always honor an explicit exclude before considering | 57 # Always honor an explicit exclude before considering |
58 # includes. | 58 # includes. |
59 return False | 59 return False |
60 if re_include.match(sym): | 60 if re_include.match(sym): |
61 return True | 61 return True |
62 return default_match | 62 return default_match |
63 | 63 |
| 64 def AddOptionalArgs(argparser): |
| 65 argparser.add_argument('--force', dest='force', action='store_true', |
| 66 help='Force all re-translations of the pexe') |
| 67 argparser.add_argument('--include', '-i', default=[], dest='include', |
| 68 action='append', |
| 69 help='Subzero symbols to include ' + |
| 70 '(regex or line range)') |
| 71 argparser.add_argument('--exclude', '-e', default=[], dest='exclude', |
| 72 action='append', |
| 73 help='Subzero symbols to exclude ' + |
| 74 '(regex or line range)') |
| 75 argparser.add_argument('--output', '-o', default='a.out', dest='output', |
| 76 action='store', |
| 77 help='Output executable. Default %(default)s.') |
| 78 argparser.add_argument('-O', default='2', dest='optlevel', |
| 79 choices=['m1', '-1', '0', '1', '2'], |
| 80 help='Optimization level ' + |
| 81 '(m1 and -1 are equivalent).' + |
| 82 ' Default %(default)s.') |
| 83 argparser.add_argument('--verbose', '-v', dest='verbose', |
| 84 action='store_true', |
| 85 help='Display some extra debugging output') |
| 86 argparser.add_argument('--stats', dest='stats', action='store_true', |
| 87 help='Enable Subzero stats output') |
| 88 |
64 def main(): | 89 def main(): |
65 """Create a hybrid translation from Subzero and llc. | 90 """Create a hybrid translation from Subzero and llc. |
66 | 91 |
67 Takes a finalized pexe and builds a native executable as a | 92 Takes a finalized pexe and builds a native executable as a |
68 hybrid of Subzero and llc translated bitcode. Linker tricks are | 93 hybrid of Subzero and llc translated bitcode. Linker tricks are |
69 used to determine whether Subzero or llc generated symbols are | 94 used to determine whether Subzero or llc generated symbols are |
70 used, on a per-symbol basis. | 95 used, on a per-symbol basis. |
71 | 96 |
72 By default, for every symbol, its llc version is used. Subzero | 97 By default, for every symbol, its llc version is used. Subzero |
73 symbols can be enabled by regular expressions on the symbol name, | 98 symbols can be enabled by regular expressions on the symbol name, |
(...skipping 23 matching lines...) Expand all Loading... |
97 This script augments PATH so that various PNaCl and LLVM tools can | 122 This script augments PATH so that various PNaCl and LLVM tools can |
98 be run. These extra paths are within the native_client tree. | 123 be run. These extra paths are within the native_client tree. |
99 When changes are made to these tools, copy them this way: | 124 When changes are made to these tools, copy them this way: |
100 cd native_client | 125 cd native_client |
101 toolchain_build/toolchain_build_pnacl.py llvm_i686_linux \\ | 126 toolchain_build/toolchain_build_pnacl.py llvm_i686_linux \\ |
102 --install=toolchain/linux_x86/pnacl_newlib | 127 --install=toolchain/linux_x86/pnacl_newlib |
103 """ | 128 """ |
104 argparser = argparse.ArgumentParser( | 129 argparser = argparse.ArgumentParser( |
105 description=' ' + main.__doc__, | 130 description=' ' + main.__doc__, |
106 formatter_class=argparse.RawTextHelpFormatter) | 131 formatter_class=argparse.RawTextHelpFormatter) |
| 132 AddOptionalArgs(argparser) |
107 argparser.add_argument('pexe', help='Finalized pexe to translate') | 133 argparser.add_argument('pexe', help='Finalized pexe to translate') |
108 argparser.add_argument('--force', dest='force', action='store_true', | |
109 help='Force all re-translations of the pexe') | |
110 argparser.add_argument('--include', '-i', default=[], dest='include', | |
111 action='append', | |
112 help='Subzero symbols to include ' + | |
113 '(regex or line range)') | |
114 argparser.add_argument('--exclude', '-e', default=[], dest='exclude', | |
115 action='append', | |
116 help='Subzero symbols to exclude ' + | |
117 '(regex or line range)') | |
118 argparser.add_argument('--output', '-o', default='a.out', dest='output', | |
119 action='store', | |
120 help='Output executable. Default %(default)s.') | |
121 argparser.add_argument('-O', default='2', dest='optlevel', | |
122 choices=['m1', '-1', '0', '1', '2'], | |
123 help='Optimization level ' + | |
124 '(m1 and -1 are equivalent).' + | |
125 ' Default %(default)s.') | |
126 argparser.add_argument('--verbose', '-v', dest='verbose', | |
127 action='store_true', | |
128 help='Display some extra debugging output') | |
129 args = argparser.parse_args() | 134 args = argparser.parse_args() |
| 135 pexe = args.pexe |
| 136 exe = args.output |
| 137 ProcessPexe(args, pexe, exe) |
130 | 138 |
131 pexe = args.pexe | 139 def ProcessPexe(args, pexe, exe): |
132 [pexe_base, ext] = os.path.splitext(pexe) | 140 [pexe_base, ext] = os.path.splitext(pexe) |
133 if ext != '.pexe': | 141 if ext != '.pexe': |
134 pexe_base = pexe | 142 pexe_base = pexe |
135 pexe_base_unescaped = pexe_base | 143 pexe_base_unescaped = pexe_base |
136 pexe_base = pipes.quote(pexe_base) | 144 pexe_base = pipes.quote(pexe_base) |
137 pexe = pipes.quote(pexe) | 145 pexe = pipes.quote(pexe) |
138 exe = args.output | |
139 | 146 |
140 nacl_root = FindBaseNaCl() | 147 nacl_root = FindBaseNaCl() |
141 os.environ['PATH'] = ( | 148 os.environ['PATH'] = ( |
142 '{root}/toolchain/linux_x86/pnacl_newlib/bin{sep}' + | 149 '{root}/toolchain/linux_x86/pnacl_newlib/bin{sep}' + |
143 '{root}/toolchain/linux_x86/pnacl_newlib/host_x86_32/bin{sep}' + | 150 '{root}/toolchain/linux_x86/pnacl_newlib/host_x86_32/bin{sep}' + |
144 '{path}' | 151 '{path}' |
145 ).format(root=nacl_root, sep=os.pathsep, path=os.environ['PATH']) | 152 ).format(root=nacl_root, sep=os.pathsep, path=os.environ['PATH']) |
146 obj_llc = pexe_base + '.llc.o' | 153 obj_llc = pexe_base + '.llc.o' |
147 obj_sz = pexe_base + '.sz.o' | 154 obj_sz = pexe_base + '.sz.o' |
148 asm_sz = pexe_base + '.sz.s' | 155 asm_sz = pexe_base + '.sz.s' |
(...skipping 25 matching lines...) Expand all Loading... |
174 shellcmd(( | 181 shellcmd(( |
175 'objcopy --redefine-sym _start=_user_start {obj}' | 182 'objcopy --redefine-sym _start=_user_start {obj}' |
176 ).format(obj=obj_llc), echo=args.verbose) | 183 ).format(obj=obj_llc), echo=args.verbose) |
177 shellcmd(( | 184 shellcmd(( |
178 'nm {obj} | sed -n "s/.* [a-zA-Z] //p" > {sym}' | 185 'nm {obj} | sed -n "s/.* [a-zA-Z] //p" > {sym}' |
179 ).format(obj=obj_llc, sym=sym_llc), echo=args.verbose) | 186 ).format(obj=obj_llc, sym=sym_llc), echo=args.verbose) |
180 if args.force or NewerThanOrNotThere(pexe, obj_sz) or \ | 187 if args.force or NewerThanOrNotThere(pexe, obj_sz) or \ |
181 NewerThanOrNotThere(llvm2ice, obj_sz): | 188 NewerThanOrNotThere(llvm2ice, obj_sz): |
182 shellcmd(( | 189 shellcmd(( |
183 '{l2i} -O{level} -bitcode-format=pnacl -disable-globals ' + | 190 '{l2i} -O{level} -bitcode-format=pnacl -disable-globals ' + |
184 '-externalize -ffunction-sections {pexe} -o {asm}' | 191 '-externalize -ffunction-sections {pexe} -o {asm}' + |
| 192 (' --stats' if args.stats else '') |
185 ).format(l2i=llvm2ice, level=opt_level, pexe=pexe, asm=asm_sz), | 193 ).format(l2i=llvm2ice, level=opt_level, pexe=pexe, asm=asm_sz), |
186 echo=args.verbose) | 194 echo=args.verbose) |
187 shellcmd(( | 195 shellcmd(( |
188 'llvm-mc -arch=x86 -x86-asm-syntax=intel -filetype=obj -o {obj} ' + | 196 'llvm-mc -arch=x86 -x86-asm-syntax=intel -filetype=obj -o {obj} ' + |
189 '{asm}' | 197 '{asm}' |
190 ).format(asm=asm_sz, obj=obj_sz), echo=args.verbose) | 198 ).format(asm=asm_sz, obj=obj_sz), echo=args.verbose) |
191 shellcmd(( | 199 shellcmd(( |
192 'objcopy --redefine-sym _start=_user_start {obj}' | 200 'objcopy --redefine-sym _start=_user_start {obj}' |
193 ).format(obj=obj_sz), echo=args.verbose) | 201 ).format(obj=obj_sz), echo=args.verbose) |
194 shellcmd(( | 202 shellcmd(( |
(...skipping 53 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
248 # Put the extra verbose printing at the end. | 256 # Put the extra verbose printing at the end. |
249 if args.verbose: | 257 if args.verbose: |
250 print 'PATH={path}'.format(path=os.environ['PATH']) | 258 print 'PATH={path}'.format(path=os.environ['PATH']) |
251 print 'include={regex}'.format(regex=re_include_str) | 259 print 'include={regex}'.format(regex=re_include_str) |
252 print 'exclude={regex}'.format(regex=re_exclude_str) | 260 print 'exclude={regex}'.format(regex=re_exclude_str) |
253 print 'default_match={dm}'.format(dm=default_match) | 261 print 'default_match={dm}'.format(dm=default_match) |
254 print 'Number of Subzero syms = {num}'.format(num=len(sz_syms)) | 262 print 'Number of Subzero syms = {num}'.format(num=len(sz_syms)) |
255 | 263 |
256 if __name__ == '__main__': | 264 if __name__ == '__main__': |
257 main() | 265 main() |
OLD | NEW |