Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(356)

Side by Side Diff: pydir/szbuild.py

Issue 1506653002: Subzero: Add Non-SFI support for x86-32. (Closed) Base URL: https://chromium.googlesource.com/native_client/pnacl-subzero.git@master
Patch Set: Fill in part of the lit test Created 5 years ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
OLDNEW
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
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
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
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
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()
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698