Index: pydir/szbuild.py |
diff --git a/pydir/szbuild.py b/pydir/szbuild.py |
index dd94bda7db7c159b3377a707ed17d8b3177d7db6..e922190b9de7fe8750821376ccec0896f32f416c 100755 |
--- a/pydir/szbuild.py |
+++ b/pydir/szbuild.py |
@@ -9,6 +9,15 @@ import sys |
from utils import shellcmd |
from utils import FindBaseNaCl |
+def NewerThanOrNotThere(old_path, new_path): |
+ """Returns whether old_path is newer than new_path. |
+ |
+ Also returns true if either path doesn't exist. |
+ """ |
+ if not (os.path.exists(old_path) and os.path.exists(new_path)): |
+ return True |
+ return os.path.getmtime(old_path) > os.path.getmtime(new_path) |
+ |
def BuildRegex(patterns, syms): |
"""Build a regular expression string for inclusion or exclusion. |
@@ -79,14 +88,14 @@ def main(): |
notation, so e.g. use '0:10' or ':10' for the first 10 lines of |
the file, or '1' for the second line of the file. |
- The --init argument does first-time initialization for the pexe, |
- including creation of the Subzero symbol file that is implicitly |
- used in the --include and --exclude arguments. It can be removed |
- from the command line for subsequent executions if the pexe |
- doesn't change. |
+ This script uses file modification timestamps to determine whether |
+ llc and Subzero re-translation are needed. It checks timestamps |
+ of llc, llvm2ice, and the pexe against the translated object files |
+ to determine the minimal work necessary. The --force option |
+ suppresses those checks and re-translates everything. |
- This scripts augments PATH so that various PNaCl and LLVM tools |
- can be run. These extra paths are within the native_client tree. |
+ This script augments PATH so that various PNaCl and LLVM tools can |
+ be run. These extra paths are within the native_client tree. |
When changes are made to these tools, copy them this way: |
cd native_client |
toolchain_build/toolchain_build_pnacl.py llvm_i686_linux \\ |
@@ -96,8 +105,8 @@ def main(): |
description=' ' + main.__doc__, |
formatter_class=argparse.RawTextHelpFormatter) |
argparser.add_argument('pexe', help='Finalized pexe to translate') |
- argparser.add_argument('--init', dest='init', action='store_true', |
- help='Perform first-time setup for the pexe') |
+ argparser.add_argument('--force', dest='force', action='store_true', |
+ help='Force all re-translations of the pexe') |
argparser.add_argument('--include', '-i', default=[], dest='include', |
action='append', |
help='Subzero symbols to include ' + |
@@ -145,9 +154,16 @@ def main(): |
sym_sz_unescaped = pexe_base_unescaped + '.sym.sz.txt' |
whitelist_sz = pexe_base + '.wl.sz.txt' |
whitelist_sz_unescaped = pexe_base_unescaped + '.wl.sz.txt' |
+ llvm2ice = ( |
+ '{root}/toolchain_build/src/subzero/llvm2ice' |
+ ).format(root=nacl_root) |
+ llcbin = ( |
+ '{root}/toolchain/linux_x86/pnacl_newlib/host_x86_32/bin/llc' |
+ ).format(root=nacl_root) |
+ opt_level = args.optlevel |
- if args.init: |
- opt_level = args.optlevel |
+ if args.force or NewerThanOrNotThere(pexe, obj_llc) or \ |
+ NewerThanOrNotThere(llcbin, obj_llc): |
opt_level_map = { 'm1':'0', '-1':'0', '0':'0', '1':'1', '2':'2' } |
shellcmd(( |
'pnacl-translate -ffunction-sections -c -arch x86-32-linux ' + |
@@ -159,10 +175,14 @@ def main(): |
'objcopy --redefine-sym _start=_user_start {obj}' |
).format(obj=obj_llc), echo=args.verbose) |
shellcmd(( |
- '{root}/toolchain_build/src/subzero/llvm2ice ' + |
- '-O{level} -bitcode-format=pnacl -disable-globals ' + |
+ 'nm {obj} | sed -n "s/.* [a-zA-Z] //p" > {sym}' |
+ ).format(obj=obj_llc, sym=sym_llc), echo=args.verbose) |
+ if args.force or NewerThanOrNotThere(pexe, obj_sz) or \ |
+ NewerThanOrNotThere(llvm2ice, obj_sz): |
+ shellcmd(( |
+ '{l2i} -O{level} -bitcode-format=pnacl -disable-globals ' + |
'-externalize -ffunction-sections {pexe} -o {asm}' |
- ).format(root=nacl_root,level=opt_level, pexe=pexe, asm=asm_sz), |
+ ).format(l2i=llvm2ice, level=opt_level, pexe=pexe, asm=asm_sz), |
echo=args.verbose) |
shellcmd(( |
'llvm-mc -arch=x86 -x86-asm-syntax=intel -filetype=obj -o {obj} ' + |
@@ -174,9 +194,6 @@ def main(): |
shellcmd(( |
'nm {obj} | sed -n "s/.* [a-zA-Z] //p" > {sym}' |
).format(obj=obj_sz, sym=sym_sz), echo=args.verbose) |
- shellcmd(( |
- 'nm {obj} | sed -n "s/.* [a-zA-Z] //p" > {sym}' |
- ).format(obj=obj_llc, sym=sym_llc), echo=args.verbose) |
with open(sym_sz_unescaped) as f: |
sz_syms = f.read().splitlines() |