Chromium Code Reviews| 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 67 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 78 argparser.add_argument('-O', default='2', dest='optlevel', | 78 argparser.add_argument('-O', default='2', dest='optlevel', |
| 79 choices=['m1', '-1', '0', '1', '2'], | 79 choices=['m1', '-1', '0', '1', '2'], |
| 80 help='Optimization level ' + | 80 help='Optimization level ' + |
| 81 '(m1 and -1 are equivalent).' + | 81 '(m1 and -1 are equivalent).' + |
| 82 ' Default %(default)s.') | 82 ' Default %(default)s.') |
| 83 argparser.add_argument('--filetype', default='iasm', dest='filetype', | 83 argparser.add_argument('--filetype', default='iasm', dest='filetype', |
| 84 choices=['obj', 'asm', 'iasm'], | 84 choices=['obj', 'asm', 'iasm'], |
| 85 help='Output file type. Default %(default)s.') | 85 help='Output file type. Default %(default)s.') |
| 86 argparser.add_argument('--sandbox', dest='sandbox', action='store_true', | 86 argparser.add_argument('--sandbox', dest='sandbox', action='store_true', |
| 87 help='Enable sandboxing in the translator') | 87 help='Enable sandboxing in the translator') |
| 88 argparser.add_argument('--nonsfi', dest='nonsfi', action='store_true', | |
| 89 help='Enable Non-SFI in the translator') | |
| 88 argparser.add_argument('--enable-block-profile', | 90 argparser.add_argument('--enable-block-profile', |
| 89 dest='enable_block_profile', action='store_true', | 91 dest='enable_block_profile', action='store_true', |
| 90 help='Enable basic block profiling.') | 92 help='Enable basic block profiling.') |
| 91 argparser.add_argument('--target', default='x8632', dest='target', | 93 argparser.add_argument('--target', default='x8632', dest='target', |
| 92 choices=['arm32', 'x8632'], | 94 choices=['arm32', 'x8632'], |
| 93 help='Generate code for specified target.') | 95 help='Generate code for specified target.') |
| 94 argparser.add_argument('--verbose', '-v', dest='verbose', | 96 argparser.add_argument('--verbose', '-v', dest='verbose', |
| 95 action='store_true', | 97 action='store_true', |
| 96 help='Display some extra debugging output') | 98 help='Display some extra debugging output') |
| 97 argparser.add_argument('--sz', dest='sz_args', action='append', default=[], | 99 argparser.add_argument('--sz', dest='sz_args', action='append', default=[], |
| (...skipping 78 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 176 whitelist_sz_unescaped = pexe_base_unescaped + '.wl.sz.txt' | 178 whitelist_sz_unescaped = pexe_base_unescaped + '.wl.sz.txt' |
| 177 pnacl_sz = ( | 179 pnacl_sz = ( |
| 178 '{root}/toolchain_build/src/subzero/pnacl-sz' | 180 '{root}/toolchain_build/src/subzero/pnacl-sz' |
| 179 ).format(root=nacl_root) | 181 ).format(root=nacl_root) |
| 180 llcbin = '{base}/pnacl-llc'.format(base=path_addition) | 182 llcbin = '{base}/pnacl-llc'.format(base=path_addition) |
| 181 gold = '{base}/le32-nacl-ld.gold'.format(base=path_addition) | 183 gold = '{base}/le32-nacl-ld.gold'.format(base=path_addition) |
| 182 objcopy = '{base}/le32-nacl-objcopy'.format(base=path_addition) | 184 objcopy = '{base}/le32-nacl-objcopy'.format(base=path_addition) |
| 183 opt_level = args.optlevel | 185 opt_level = args.optlevel |
| 184 opt_level_map = { 'm1':'0', '-1':'0', '0':'0', '1':'1', '2':'2' } | 186 opt_level_map = { 'm1':'0', '-1':'0', '0':'0', '1':'1', '2':'2' } |
| 185 hybrid = args.include or args.exclude | 187 hybrid = args.include or args.exclude |
| 188 sb_or_nonsfi = args.sandbox or args.nonsfi | |
| 186 | 189 |
| 187 if hybrid and (args.force or | 190 if hybrid and (args.force or |
| 188 NewerThanOrNotThere(pexe, obj_llc) or | 191 NewerThanOrNotThere(pexe, obj_llc) or |
| 189 NewerThanOrNotThere(llcbin, obj_llc)): | 192 NewerThanOrNotThere(llcbin, obj_llc)): |
| 190 arch = { | 193 arch = { |
| 191 'arm32': 'armv7' if args.sandbox else 'arm-nonsfi', | 194 'arm32': 'armv7' if args.sandbox else 'arm-nonsfi', |
| 192 'x8632': 'x86-32' if args.sandbox else 'x86-32-linux', | 195 'x8632': 'x86-32' if args.sandbox else |
|
John
2015/12/22 15:44:38
this makes me sad. can something be done about thi
Jim Stichnoth
2015/12/28 07:54:07
What is your specific suggestion? (just to avoid
| |
| 196 'x86-32-nonsfi' if args.nonsfi else 'x86-32-linux', | |
| 193 }[args.target] | 197 }[args.target] |
| 194 | 198 |
| 195 # Only run pnacl-translate in hybrid mode. | 199 # Only run pnacl-translate in hybrid mode. |
| 196 shellcmd(['{base}/pnacl-translate'.format(base=path_addition), | 200 shellcmd(['{base}/pnacl-translate'.format(base=path_addition), |
| 197 '-split-module=1', | 201 '-split-module=1', |
| 198 '-ffunction-sections', | 202 '-ffunction-sections', |
| 199 '-fdata-sections', | 203 '-fdata-sections', |
| 200 '-c', | 204 '-c', |
| 201 '-arch', arch, | 205 '-arch', arch, |
| 202 '-O' + opt_level_map[opt_level], | 206 '-O' + opt_level_map[opt_level], |
| 203 '--pnacl-driver-append-LLC_FLAGS_EXTRA=-externalize', | 207 '--pnacl-driver-append-LLC_FLAGS_EXTRA=-externalize', |
| 204 '-o', obj_llc] + | 208 '-o', obj_llc] + |
| 205 (['--pnacl-driver-verbose'] if args.verbose else []) + | 209 (['--pnacl-driver-verbose'] if args.verbose else []) + |
| 206 args.llc_args + | 210 args.llc_args + |
| 207 [pexe], | 211 [pexe], |
| 208 echo=args.verbose) | 212 echo=args.verbose) |
| 209 if not args.sandbox: | 213 if not sb_or_nonsfi: |
| 210 shellcmd(( | 214 shellcmd(( |
| 211 '{objcopy} --redefine-sym _start=_user_start {obj}' | 215 '{objcopy} --redefine-sym _start=_user_start {obj}' |
| 212 ).format(objcopy=objcopy, obj=obj_llc), echo=args.verbose) | 216 ).format(objcopy=objcopy, obj=obj_llc), echo=args.verbose) |
| 213 # Generate llc syms file for consistency, even though it's not used. | 217 # Generate llc syms file for consistency, even though it's not used. |
| 214 shellcmd(( | 218 shellcmd(( |
| 215 'nm {obj} | sed -n "s/.* [a-zA-Z] //p" > {sym}' | 219 'nm {obj} | sed -n "s/.* [a-zA-Z] //p" > {sym}' |
| 216 ).format(obj=obj_llc, sym=sym_llc), echo=args.verbose) | 220 ).format(obj=obj_llc, sym=sym_llc), echo=args.verbose) |
| 217 | 221 |
| 218 if (args.force or | 222 if (args.force or |
| 219 NewerThanOrNotThere(pexe, obj_sz) or | 223 NewerThanOrNotThere(pexe, obj_sz) or |
| 220 NewerThanOrNotThere(pnacl_sz, obj_sz)): | 224 NewerThanOrNotThere(pnacl_sz, obj_sz)): |
| 221 if not args.nosz: | 225 if not args.nosz: |
| 222 # Run pnacl-sz regardless of hybrid mode. | 226 # Run pnacl-sz regardless of hybrid mode. |
| 223 shellcmd([pnacl_sz, | 227 shellcmd([pnacl_sz, |
| 224 '-O' + opt_level, | 228 '-O' + opt_level, |
| 225 '-bitcode-format=pnacl', | 229 '-bitcode-format=pnacl', |
| 226 '-filetype=' + args.filetype, | 230 '-filetype=' + args.filetype, |
| 227 '-o', obj_sz if args.filetype == 'obj' else asm_sz, | 231 '-o', obj_sz if args.filetype == 'obj' else asm_sz, |
| 228 '-target=' + args.target] + | 232 '-target=' + args.target] + |
| 229 (['-externalize', | 233 (['-externalize', |
| 230 '-ffunction-sections', | 234 '-ffunction-sections', |
| 231 '-fdata-sections'] if hybrid else []) + | 235 '-fdata-sections'] if hybrid else []) + |
| 232 (['-sandbox'] if args.sandbox else []) + | 236 (['-sandbox'] if args.sandbox else []) + |
| 237 (['-nonsfi'] if args.nonsfi else []) + | |
| 233 (['-enable-block-profile'] if | 238 (['-enable-block-profile'] if |
| 234 args.enable_block_profile and not args.sandbox | 239 args.enable_block_profile and not args.sandbox |
| 235 else []) + | 240 else []) + |
| 236 args.sz_args + | 241 args.sz_args + |
| 237 [pexe], | 242 [pexe], |
| 238 echo=args.verbose) | 243 echo=args.verbose) |
| 239 if args.filetype != 'obj': | 244 if args.filetype != 'obj': |
| 240 triple = { | 245 triple = { |
| 241 'arm32': 'arm-nacl' if args.sandbox else 'arm', | 246 'arm32': 'arm-nacl' if args.sandbox else 'arm', |
| 242 'x8632': 'i686-nacl' if args.sandbox else 'i686', | 247 'x8632': 'i686-nacl' if args.sandbox else 'i686', |
| 243 }[args.target] | 248 }[args.target] |
| 244 | 249 |
| 245 shellcmd(( | 250 shellcmd(( |
| 246 '{base}/llvm-mc -triple={triple} -filetype=obj -o {obj} {asm}' | 251 '{base}/llvm-mc -triple={triple} -filetype=obj -o {obj} {asm}' |
| 247 ).format(base=path_addition, asm=asm_sz, obj=obj_sz, | 252 ).format(base=path_addition, asm=asm_sz, obj=obj_sz, |
| 248 triple=triple), | 253 triple=triple), |
| 249 echo=args.verbose) | 254 echo=args.verbose) |
| 250 if not args.sandbox: | 255 if not sb_or_nonsfi: |
| 251 shellcmd(( | 256 shellcmd(( |
| 252 '{objcopy} --redefine-sym _start=_user_start {obj}' | 257 '{objcopy} --redefine-sym _start=_user_start {obj}' |
| 253 ).format(objcopy=objcopy, obj=obj_sz), echo=args.verbose) | 258 ).format(objcopy=objcopy, obj=obj_sz), echo=args.verbose) |
| 254 if hybrid: | 259 if hybrid: |
| 255 shellcmd(( | 260 shellcmd(( |
| 256 'nm {obj} | sed -n "s/.* [a-zA-Z] //p" > {sym}' | 261 'nm {obj} | sed -n "s/.* [a-zA-Z] //p" > {sym}' |
| 257 ).format(obj=obj_sz, sym=sym_sz), echo=args.verbose) | 262 ).format(obj=obj_sz, sym=sym_sz), echo=args.verbose) |
| 258 | 263 |
| 259 if hybrid: | 264 if hybrid: |
| 260 with open(sym_sz_unescaped) as f: | 265 with open(sym_sz_unescaped) as f: |
| (...skipping 45 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 306 sz=obj_sz_weak, llc=obj_llc_weak), | 311 sz=obj_sz_weak, llc=obj_llc_weak), |
| 307 echo=args.verbose) | 312 echo=args.verbose) |
| 308 shellcmd(( | 313 shellcmd(( |
| 309 '{objcopy} -w --localize-symbol="*" {partial}' | 314 '{objcopy} -w --localize-symbol="*" {partial}' |
| 310 ).format(objcopy=objcopy, partial=obj_partial), | 315 ).format(objcopy=objcopy, partial=obj_partial), |
| 311 echo=args.verbose) | 316 echo=args.verbose) |
| 312 shellcmd(( | 317 shellcmd(( |
| 313 '{objcopy} --globalize-symbol={start} ' + | 318 '{objcopy} --globalize-symbol={start} ' + |
| 314 '--globalize-symbol=__Sz_block_profile_info {partial}' | 319 '--globalize-symbol=__Sz_block_profile_info {partial}' |
| 315 ).format(objcopy=objcopy, partial=obj_partial, | 320 ).format(objcopy=objcopy, partial=obj_partial, |
| 316 start='_start' if args.sandbox else '_user_start'), | 321 start='_start' if sb_or_nonsfi else '_user_start'), |
| 317 echo=args.verbose) | 322 echo=args.verbose) |
| 318 | 323 |
| 319 # Run the linker regardless of hybrid mode. | 324 # Run the linker regardless of hybrid mode. |
| 320 if args.sandbox: | 325 if args.sandbox: |
| 321 assert args.target in ('x8632', 'arm32'), \ | 326 assert args.target in ('x8632', 'arm32'), \ |
| 322 '-sandbox is not available for %s' % args.target | 327 '-sandbox is not available for %s' % args.target |
| 323 target_lib_dir = { | 328 target_lib_dir = { |
| 324 'arm32': 'arm', | 329 'arm32': 'arm', |
| 325 'x8632': 'x86-32', | 330 'x8632': 'x86-32', |
| 326 }[args.target] | 331 }[args.target] |
| 327 linklib = ('{root}/toolchain/linux_x86/pnacl_newlib_raw/translator/' + | 332 linklib = ('{root}/toolchain/linux_x86/pnacl_newlib_raw/translator/' + |
| 328 '{target_dir}/lib').format(root=nacl_root, | 333 '{target_dir}/lib').format(root=nacl_root, |
| 329 target_dir=target_lib_dir) | 334 target_dir=target_lib_dir) |
| 330 shellcmd(( | 335 shellcmd(( |
| 331 '{gold} -nostdlib --no-fix-cortex-a8 --eh-frame-hdr -z text ' + | 336 '{gold} -nostdlib --no-fix-cortex-a8 --eh-frame-hdr -z text ' + |
| 332 '--build-id --entry=__pnacl_start -static ' + | 337 '--build-id --entry=__pnacl_start -static ' + |
| 333 '{linklib}/crtbegin.o {partial} ' + | 338 '{linklib}/crtbegin.o {partial} ' + |
| 334 '{root}/toolchain_build/src/subzero/build/runtime/' + | 339 '{root}/toolchain_build/src/subzero/build/runtime/' + |
| 335 'szrt_sb_{target}.o ' + | 340 'szrt_sb_{target}.o ' + |
| 336 '{linklib}/libpnacl_irt_shim_dummy.a --start-group ' + | 341 '{linklib}/libpnacl_irt_shim_dummy.a --start-group ' + |
| 337 '{linklib}/libgcc.a {linklib}/libcrt_platform.a ' + | 342 '{linklib}/libgcc.a {linklib}/libcrt_platform.a ' + |
| 338 '--end-group {linklib}/crtend.o --undefined=_start ' + | 343 '--end-group {linklib}/crtend.o --undefined=_start ' + |
| 339 '--defsym=__Sz_AbsoluteZero=0 ' + | 344 '--defsym=__Sz_AbsoluteZero=0 ' + |
| 340 '-o {exe}' | 345 '-o {exe}' |
| 341 ).format(gold=gold, linklib=linklib, partial=obj_partial, exe=exe, | 346 ).format(gold=gold, linklib=linklib, partial=obj_partial, exe=exe, |
| 342 root=nacl_root, target=args.target), | 347 root=nacl_root, target=args.target), |
| 343 echo=args.verbose) | 348 echo=args.verbose) |
| 349 elif args.nonsfi: | |
| 350 # TODO(stichnot): args.nonsfi and args.sandbox branches are nearly | |
| 351 # identical; refactor. | |
| 352 target_lib_dir = { | |
| 353 'arm32': 'arm-nonsfi', | |
| 354 'x8632': 'x86-32-nonsfi', | |
| 355 }[args.target] | |
| 356 linklib = ('{root}/toolchain/linux_x86/pnacl_newlib_raw/translator/' + | |
| 357 '{target_dir}/lib').format(root=nacl_root, | |
| 358 target_dir=target_lib_dir) | |
| 359 shellcmd(( | |
| 360 '{gold} -nostdlib --no-fix-cortex-a8 --eh-frame-hdr -z text ' + | |
| 361 '-z noexecstack ' + | |
| 362 '--build-id --entry=__pnacl_start -pie ' + | |
| 363 '{linklib}/crtbegin.o {partial} ' + | |
| 364 '{root}/toolchain_build/src/subzero/build/runtime/' + | |
| 365 'szrt_nonsfi_{target}.o ' + | |
| 366 '{linklib}/libpnacl_irt_shim_dummy.a --start-group ' + | |
| 367 '{linklib}/libgcc.a {linklib}/libcrt_platform.a ' + | |
| 368 '--end-group {linklib}/crtend.o --undefined=_start ' + | |
| 369 '--defsym=__Sz_AbsoluteZero=0 ' + | |
| 370 '--defsym=_begin=0 ' + | |
| 371 '-o {exe}' | |
| 372 ).format(gold=gold, linklib=linklib, partial=obj_partial, exe=exe, | |
| 373 root=nacl_root, target=args.target), | |
| 374 echo=args.verbose) | |
| 344 else: | 375 else: |
| 345 linker = { | 376 linker = { |
| 346 'arm32': '/usr/bin/arm-linux-gnueabihf-g++', | 377 'arm32': '/usr/bin/arm-linux-gnueabihf-g++', |
| 347 'x8632': ('{root}/../third_party/llvm-build/Release+Asserts/bin/clang' | 378 'x8632': ('{root}/../third_party/llvm-build/Release+Asserts/bin/clang' |
| 348 ).format(root=nacl_root) | 379 ).format(root=nacl_root) |
| 349 }[args.target] | 380 }[args.target] |
| 350 | 381 |
| 351 extra_linker_args = ' '.join({ | 382 extra_linker_args = ' '.join({ |
| 352 'arm32': ['-mcpu=cortex-a9'], | 383 'arm32': ['-mcpu=cortex-a9'], |
| 353 'x8632': ['-m32'] | 384 'x8632': ['-m32'] |
| (...skipping 21 matching lines...) Expand all Loading... | |
| 375 | 406 |
| 376 # Put the extra verbose printing at the end. | 407 # Put the extra verbose printing at the end. |
| 377 if args.verbose and hybrid: | 408 if args.verbose and hybrid: |
| 378 print 'include={regex}'.format(regex=re_include_str) | 409 print 'include={regex}'.format(regex=re_include_str) |
| 379 print 'exclude={regex}'.format(regex=re_exclude_str) | 410 print 'exclude={regex}'.format(regex=re_exclude_str) |
| 380 print 'default_match={dm}'.format(dm=default_match) | 411 print 'default_match={dm}'.format(dm=default_match) |
| 381 print 'Number of Subzero syms = {num}'.format(num=len(sz_syms)) | 412 print 'Number of Subzero syms = {num}'.format(num=len(sz_syms)) |
| 382 | 413 |
| 383 if __name__ == '__main__': | 414 if __name__ == '__main__': |
| 384 main() | 415 main() |
| OLD | NEW |