| 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 103 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 114 Each --include and --exclude argument can be a regular expression or a range | 114 Each --include and --exclude argument can be a regular expression or a range |
| 115 of lines in the symbol file. Each regular expression is wrapped inside | 115 of lines in the symbol file. Each regular expression is wrapped inside |
| 116 '^$', so if you want a substring match on 'foo', use '.*foo.*' instead. | 116 '^$', so if you want a substring match on 'foo', use '.*foo.*' instead. |
| 117 Ranges use python-style 'first:last' notation, so e.g. use '0:10' or ':10' | 117 Ranges use python-style 'first:last' notation, so e.g. use '0:10' or ':10' |
| 118 for the first 10 lines of the file, or '1' for the second line of the file. | 118 for the first 10 lines of the file, or '1' for the second line of the file. |
| 119 | 119 |
| 120 If no --include or --exclude arguments are given, the executable is produced | 120 If no --include or --exclude arguments are given, the executable is produced |
| 121 entirely using Subzero, without using llc or linker tricks. | 121 entirely using Subzero, without using llc or linker tricks. |
| 122 | 122 |
| 123 This script uses file modification timestamps to determine whether llc and | 123 This script uses file modification timestamps to determine whether llc and |
| 124 Subzero re-translation are needed. It checks timestamps of llc, llvm2ice, | 124 Subzero re-translation are needed. It checks timestamps of llc, pnacl-sz, |
| 125 and the pexe against the translated object files to determine the minimal | 125 and the pexe against the translated object files to determine the minimal |
| 126 work necessary. The --force option suppresses those checks and | 126 work necessary. The --force option suppresses those checks and |
| 127 re-translates everything. | 127 re-translates everything. |
| 128 | 128 |
| 129 This script augments PATH so that various PNaCl and LLVM tools can be run. | 129 This script augments PATH so that various PNaCl and LLVM tools can be run. |
| 130 These extra paths are within the native_client tree. When changes are made | 130 These extra paths are within the native_client tree. When changes are made |
| 131 to these tools, copy them this way: | 131 to these tools, copy them this way: |
| 132 cd native_client | 132 cd native_client |
| 133 toolchain_build/toolchain_build_pnacl.py llvm_x86_64_linux \\ | 133 toolchain_build/toolchain_build_pnacl.py llvm_x86_64_linux \\ |
| 134 --install=toolchain/linux_x86/pnacl_newlib | 134 --install=toolchain/linux_x86/pnacl_newlib |
| (...skipping 27 matching lines...) Expand all Loading... |
| 162 obj_sz = pexe_base + '.sz.o' | 162 obj_sz = pexe_base + '.sz.o' |
| 163 asm_sz = pexe_base + '.sz.s' | 163 asm_sz = pexe_base + '.sz.s' |
| 164 obj_llc_weak = pexe_base + '.weak.llc.o' | 164 obj_llc_weak = pexe_base + '.weak.llc.o' |
| 165 obj_sz_weak = pexe_base + '.weak.sz.o' | 165 obj_sz_weak = pexe_base + '.weak.sz.o' |
| 166 obj_partial = obj_sz # overridden for hybrid mode | 166 obj_partial = obj_sz # overridden for hybrid mode |
| 167 sym_llc = pexe_base + '.sym.llc.txt' | 167 sym_llc = pexe_base + '.sym.llc.txt' |
| 168 sym_sz = pexe_base + '.sym.sz.txt' | 168 sym_sz = pexe_base + '.sym.sz.txt' |
| 169 sym_sz_unescaped = pexe_base_unescaped + '.sym.sz.txt' | 169 sym_sz_unescaped = pexe_base_unescaped + '.sym.sz.txt' |
| 170 whitelist_sz = pexe_base + '.wl.sz.txt' | 170 whitelist_sz = pexe_base + '.wl.sz.txt' |
| 171 whitelist_sz_unescaped = pexe_base_unescaped + '.wl.sz.txt' | 171 whitelist_sz_unescaped = pexe_base_unescaped + '.wl.sz.txt' |
| 172 llvm2ice = ( | 172 pnacl_sz = ( |
| 173 '{root}/toolchain_build/src/subzero/llvm2ice' | 173 '{root}/toolchain_build/src/subzero/pnacl-sz' |
| 174 ).format(root=nacl_root) | 174 ).format(root=nacl_root) |
| 175 llcbin = 'llc' | 175 llcbin = 'llc' |
| 176 gold = 'le32-nacl-ld.gold' | 176 gold = 'le32-nacl-ld.gold' |
| 177 opt_level = args.optlevel | 177 opt_level = args.optlevel |
| 178 opt_level_map = { 'm1':'0', '-1':'0', '0':'0', '1':'1', '2':'2' } | 178 opt_level_map = { 'm1':'0', '-1':'0', '0':'0', '1':'1', '2':'2' } |
| 179 hybrid = args.include or args.exclude | 179 hybrid = args.include or args.exclude |
| 180 | 180 |
| 181 if hybrid and (args.force or | 181 if hybrid and (args.force or |
| 182 NewerThanOrNotThere(pexe, obj_llc) or | 182 NewerThanOrNotThere(pexe, obj_llc) or |
| 183 NewerThanOrNotThere(llcbin, obj_llc)): | 183 NewerThanOrNotThere(llcbin, obj_llc)): |
| (...skipping 15 matching lines...) Expand all Loading... |
| 199 shellcmd(( | 199 shellcmd(( |
| 200 'objcopy --redefine-sym _start=_user_start {obj}' | 200 'objcopy --redefine-sym _start=_user_start {obj}' |
| 201 ).format(obj=obj_llc), echo=args.verbose) | 201 ).format(obj=obj_llc), echo=args.verbose) |
| 202 # Generate llc syms file for consistency, even though it's not used. | 202 # Generate llc syms file for consistency, even though it's not used. |
| 203 shellcmd(( | 203 shellcmd(( |
| 204 'nm {obj} | sed -n "s/.* [a-zA-Z] //p" > {sym}' | 204 'nm {obj} | sed -n "s/.* [a-zA-Z] //p" > {sym}' |
| 205 ).format(obj=obj_llc, sym=sym_llc), echo=args.verbose) | 205 ).format(obj=obj_llc, sym=sym_llc), echo=args.verbose) |
| 206 | 206 |
| 207 if (args.force or | 207 if (args.force or |
| 208 NewerThanOrNotThere(pexe, obj_sz) or | 208 NewerThanOrNotThere(pexe, obj_sz) or |
| 209 NewerThanOrNotThere(llvm2ice, obj_sz)): | 209 NewerThanOrNotThere(pnacl_sz, obj_sz)): |
| 210 # Run llvm2ice regardless of hybrid mode. | 210 # Run pnacl-sz regardless of hybrid mode. |
| 211 shellcmd([llvm2ice, | 211 shellcmd([pnacl_sz, |
| 212 '-O' + opt_level, | 212 '-O' + opt_level, |
| 213 '-bitcode-format=pnacl', | 213 '-bitcode-format=pnacl', |
| 214 '-filetype=' + args.filetype, | 214 '-filetype=' + args.filetype, |
| 215 '-o', obj_sz if args.filetype == 'obj' else asm_sz] + | 215 '-o', obj_sz if args.filetype == 'obj' else asm_sz] + |
| 216 (['-externalize', | 216 (['-externalize', |
| 217 '-ffunction-sections', | 217 '-ffunction-sections', |
| 218 '-fdata-sections'] if hybrid else []) + | 218 '-fdata-sections'] if hybrid else []) + |
| 219 (['-sandbox'] if args.sandbox else []) + | 219 (['-sandbox'] if args.sandbox else []) + |
| 220 args.sz_args + | 220 args.sz_args + |
| 221 [pexe], | 221 [pexe], |
| (...skipping 95 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 317 if args.verbose: | 317 if args.verbose: |
| 318 print 'PATH: {path}'.format(path=path_addition) | 318 print 'PATH: {path}'.format(path=path_addition) |
| 319 if hybrid: | 319 if hybrid: |
| 320 print 'include={regex}'.format(regex=re_include_str) | 320 print 'include={regex}'.format(regex=re_include_str) |
| 321 print 'exclude={regex}'.format(regex=re_exclude_str) | 321 print 'exclude={regex}'.format(regex=re_exclude_str) |
| 322 print 'default_match={dm}'.format(dm=default_match) | 322 print 'default_match={dm}'.format(dm=default_match) |
| 323 print 'Number of Subzero syms = {num}'.format(num=len(sz_syms)) | 323 print 'Number of Subzero syms = {num}'.format(num=len(sz_syms)) |
| 324 | 324 |
| 325 if __name__ == '__main__': | 325 if __name__ == '__main__': |
| 326 main() | 326 main() |
| OLD | NEW |