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

Unified 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: Code review changes Created 4 years, 12 months 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 side-by-side diff with in-line comments
Download patch
« no previous file with comments | « pydir/crosstest_generator.py ('k') | pydir/szbuild_spec2k.py » ('j') | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: pydir/szbuild.py
diff --git a/pydir/szbuild.py b/pydir/szbuild.py
index 73633a4ac66432396924a4c0f67e328347a4a346..95a6a2c9579df5a1f71de5ec2e8e2fd1fd9fab93 100755
--- a/pydir/szbuild.py
+++ b/pydir/szbuild.py
@@ -6,8 +6,7 @@ import pipes
import re
import sys
-from utils import shellcmd
-from utils import FindBaseNaCl
+from utils import shellcmd, FindBaseNaCl, get_sfi_string
def NewerThanOrNotThere(old_path, new_path):
"""Returns whether old_path is newer than new_path.
@@ -85,6 +84,8 @@ def AddOptionalArgs(argparser):
help='Output file type. Default %(default)s.')
argparser.add_argument('--sandbox', dest='sandbox', action='store_true',
help='Enable sandboxing in the translator')
+ argparser.add_argument('--nonsfi', dest='nonsfi', action='store_true',
+ help='Enable Non-SFI in the translator')
argparser.add_argument('--enable-block-profile',
dest='enable_block_profile', action='store_true',
help='Enable basic block profiling.')
@@ -101,6 +102,116 @@ def AddOptionalArgs(argparser):
argparser.add_argument('--no-sz', dest='nosz', action='store_true',
help='Run only post-Subzero build steps')
+def LinkSandbox(objs, exe, target, verbose=True):
+ assert target in ('x8632', 'arm32'), \
+ '-sandbox is not available for %s' % target
+ nacl_root = FindBaseNaCl()
+ gold = ('{root}/toolchain/linux_x86/pnacl_newlib_raw/bin/' +
+ 'le32-nacl-ld.gold').format(root=nacl_root)
+ target_lib_dir = {
+ 'arm32': 'arm',
+ 'x8632': 'x86-32',
+ }[target]
+ linklib = ('{root}/toolchain/linux_x86/pnacl_newlib_raw/translator/' +
+ '{target_dir}/lib').format(root=nacl_root,
+ target_dir=target_lib_dir)
+ shellcmd([gold,
+ '-nostdlib',
+ '--no-fix-cortex-a8',
+ '--eh-frame-hdr',
+ '-z', 'text',
+ #'-z', 'noexecstack',
+ '--build-id',
+ '--entry=__pnacl_start',
+ '-static', #'-pie',
+ '{linklib}/crtbegin.o'.format(linklib=linklib)] +
+ objs +
+ [('{root}/toolchain_build/src/subzero/build/runtime/' +
+ 'szrt_sb_{target}.o').format(root=nacl_root, target=target),
+ '{linklib}/libpnacl_irt_shim_dummy.a'.format(linklib=linklib),
+ '--start-group',
+ '{linklib}/libgcc.a'.format(linklib=linklib),
+ '{linklib}/libcrt_platform.a'.format(linklib=linklib),
+ '--end-group',
+ '{linklib}/crtend.o'.format(linklib=linklib),
+ '--undefined=_start',
+ '--defsym=__Sz_AbsoluteZero=0',
+ #'--defsym=_begin=0',
+ '-o', exe
+ ], echo=verbose)
+
+def LinkNonsfi(objs, exe, target, verbose=True):
+ nacl_root = FindBaseNaCl()
+ gold = ('{root}/toolchain/linux_x86/pnacl_newlib_raw/bin/' +
+ 'le32-nacl-ld.gold').format(root=nacl_root)
+ target_lib_dir = {
+ 'arm32': 'arm-nonsfi',
+ 'x8632': 'x86-32-nonsfi',
+ }[target]
+ linklib = ('{root}/toolchain/linux_x86/pnacl_newlib_raw/translator/' +
+ '{target_dir}/lib').format(root=nacl_root,
+ target_dir=target_lib_dir)
+ shellcmd([gold,
+ '-nostdlib',
+ '--no-fix-cortex-a8',
+ '--eh-frame-hdr',
+ '-z', 'text',
+ '-z', 'noexecstack',
+ '--build-id',
+ '--entry=__pnacl_start',
+ '-pie',
+ '{linklib}/crtbegin.o'.format(linklib=linklib)] +
+ objs +
+ [('{root}/toolchain_build/src/subzero/build/runtime/' +
+ 'szrt_nonsfi_{target}.o').format(root=nacl_root, target=target),
+ '{linklib}/libpnacl_irt_shim_dummy.a'.format(linklib=linklib),
+ '--start-group',
+ '{linklib}/libgcc.a'.format(linklib=linklib),
+ '{linklib}/libcrt_platform.a'.format(linklib=linklib),
+ '--end-group',
+ '{linklib}/crtend.o'.format(linklib=linklib),
+ '--undefined=_start',
+ '--defsym=__Sz_AbsoluteZero=0',
+ '--defsym=_begin=0',
+ '-o', exe
+ ], echo=verbose)
+
+def LinkNative(objs, exe, target, verbose=True):
+ nacl_root = FindBaseNaCl()
+ linker = {
+ 'arm32': '/usr/bin/arm-linux-gnueabihf-g++',
+ 'x8632': ('{root}/../third_party/llvm-build/Release+Asserts/bin/clang'
+ ).format(root=nacl_root),
+ 'x8664': ('{root}/../third_party/llvm-build/Release+Asserts/bin/clang'
+ ).format(root=nacl_root)
+ }[target]
+
+ extra_linker_args = {
+ 'arm32': ['-mcpu=cortex-a9'],
+ 'x8632': ['-m32'],
+ 'x8664': ['-mx32']
+ }[target]
+
+ lib_dir = {
+ 'arm32': 'arm-linux',
+ 'x8632': 'x86-32-linux',
+ 'x8664': 'x86-64-linux',
+ }[target]
+
+ shellcmd([linker] +
+ extra_linker_args +
+ objs +
+ ['-o', exe,
+ ('{root}/toolchain/linux_x86/pnacl_newlib_raw/translator/' +
+ '{lib_dir}/lib/' +
+ '{{unsandboxed_irt,irt_random,irt_query_list}}.o').format(
+ root=nacl_root, lib_dir=lib_dir),
+ ('{root}/toolchain_build/src/subzero/build/runtime/' +
+ 'szrt_native_{target}.o').format(root=nacl_root, target=target),
+ '-lm', '-lpthread', '-lrt',
+ '-Wl,--defsym=__Sz_AbsoluteZero=0'
+ ], echo=verbose)
+
def main():
"""Create a hybrid translation from Subzero and llc.
@@ -183,14 +294,15 @@ def ProcessPexe(args, pexe, exe):
opt_level = args.optlevel
opt_level_map = { 'm1':'0', '-1':'0', '0':'0', '1':'1', '2':'2' }
hybrid = args.include or args.exclude
+ native = not args.sandbox and not args.nonsfi
if hybrid and (args.force or
NewerThanOrNotThere(pexe, obj_llc) or
NewerThanOrNotThere(llcbin, obj_llc)):
arch = {
- 'arm32': 'armv7' if args.sandbox else 'arm-nonsfi',
- 'x8632': 'x86-32' if args.sandbox else 'x86-32-linux',
- 'x8664': 'x86-64' if args.sandbox else 'x86-64-linux',
+ 'arm32': 'arm' + get_sfi_string(args, 'v7', '-nonsfi', '-nonsfi'),
+ 'x8632': 'x86-32' + get_sfi_string(args, '', '-nonsfi', '-linux'),
+ 'x8664': 'x86-64' + get_sfi_string(args, '', '', '-linux')
}[args.target]
# Only run pnacl-translate in hybrid mode.
@@ -207,7 +319,7 @@ def ProcessPexe(args, pexe, exe):
args.llc_args +
[pexe],
echo=args.verbose)
- if not args.sandbox:
+ if native:
shellcmd((
'{objcopy} --redefine-sym _start=_user_start {obj}'
).format(objcopy=objcopy, obj=obj_llc), echo=args.verbose)
@@ -231,6 +343,7 @@ def ProcessPexe(args, pexe, exe):
'-ffunction-sections',
'-fdata-sections'] if hybrid else []) +
(['-sandbox'] if args.sandbox else []) +
+ (['-nonsfi'] if args.nonsfi else []) +
(['-enable-block-profile'] if
args.enable_block_profile and not args.sandbox
else []) +
@@ -239,9 +352,11 @@ def ProcessPexe(args, pexe, exe):
echo=args.verbose)
if args.filetype != 'obj':
triple = {
- 'arm32': 'arm-nacl' if args.sandbox else 'arm',
- 'x8632': 'i686-nacl' if args.sandbox else 'i686',
- 'x8664': 'x86_64-nacl' if args.sandbox else 'x86_64-linux-gnux32',
+ 'arm32': 'arm' + get_sfi_string(args, '-nacl', '', ''),
+ 'x8632': 'i686' + get_sfi_string(args, '-nacl', '', ''),
+ 'x8664': 'x86_64' +
+ get_sfi_string(args, '-nacl', '-linux-gnux32',
+ '-linux-gnux32'),
}[args.target]
shellcmd((
@@ -249,7 +364,7 @@ def ProcessPexe(args, pexe, exe):
).format(base=path_addition, asm=asm_sz, obj=obj_sz,
triple=triple),
echo=args.verbose)
- if not args.sandbox:
+ if native:
shellcmd((
'{objcopy} --redefine-sym _start=_user_start {obj}'
).format(objcopy=objcopy, obj=obj_sz), echo=args.verbose)
@@ -317,69 +432,17 @@ def ProcessPexe(args, pexe, exe):
'{objcopy} --globalize-symbol={start} ' +
'--globalize-symbol=__Sz_block_profile_info {partial}'
).format(objcopy=objcopy, partial=obj_partial,
- start='_start' if args.sandbox else '_user_start'),
+ start=get_sfi_string(args, '_start', '_start',
+ '_user_start')),
echo=args.verbose)
# Run the linker regardless of hybrid mode.
if args.sandbox:
- assert args.target in ('x8632', 'arm32'), \
- '-sandbox is not available for %s' % args.target
- target_lib_dir = {
- 'arm32': 'arm',
- 'x8632': 'x86-32',
- }[args.target]
- linklib = ('{root}/toolchain/linux_x86/pnacl_newlib_raw/translator/' +
- '{target_dir}/lib').format(root=nacl_root,
- target_dir=target_lib_dir)
- shellcmd((
- '{gold} -nostdlib --no-fix-cortex-a8 --eh-frame-hdr -z text ' +
- '--build-id --entry=__pnacl_start -static ' +
- '{linklib}/crtbegin.o {partial} ' +
- '{root}/toolchain_build/src/subzero/build/runtime/' +
- 'szrt_sb_{target}.o ' +
- '{linklib}/libpnacl_irt_shim_dummy.a --start-group ' +
- '{linklib}/libgcc.a {linklib}/libcrt_platform.a ' +
- '--end-group {linklib}/crtend.o --undefined=_start ' +
- '--defsym=__Sz_AbsoluteZero=0 ' +
- '-o {exe}'
- ).format(gold=gold, linklib=linklib, partial=obj_partial, exe=exe,
- root=nacl_root, target=args.target),
- echo=args.verbose)
+ LinkSandbox([obj_partial], exe, args.target, args.verbose)
+ elif args.nonsfi:
+ LinkNonsfi([obj_partial], exe, args.target, args.verbose)
else:
- linker = {
- 'arm32': '/usr/bin/arm-linux-gnueabihf-g++',
- 'x8632': ('{root}/../third_party/llvm-build/Release+Asserts/bin/clang'
- ).format(root=nacl_root),
- 'x8664': ('{root}/../third_party/llvm-build/Release+Asserts/bin/clang'
- ).format(root=nacl_root)
- }[args.target]
-
- extra_linker_args = ' '.join({
- 'arm32': ['-mcpu=cortex-a9'],
- 'x8632': ['-m32'],
- 'x8664': ['-mx32']
- }[args.target])
-
- lib_dir = {
- 'arm32': 'arm-linux',
- 'x8632': 'x86-32-linux',
- 'x8664': 'x86-64-linux',
- }[args.target]
-
- shellcmd((
- '{ld} {ld_extra_args} {partial} -o {exe} ' +
- # Keep the rest of this command line (except szrt_native_x8632.o) in
- # sync with RunHostLD() in pnacl-translate.py.
- '{root}/toolchain/linux_x86/pnacl_newlib_raw/translator/' +
- '{lib_dir}/lib/' +
- '{{unsandboxed_irt,irt_random,irt_query_list}}.o ' +
- '{root}/toolchain_build/src/subzero/build/runtime/' +
- 'szrt_native_{target}.o -lpthread -lrt ' +
- '-Wl,--defsym=__Sz_AbsoluteZero=0'
- ).format(ld=linker, ld_extra_args=extra_linker_args,
- partial=obj_partial, exe=exe, root=nacl_root,
- target=args.target, lib_dir=lib_dir),
- echo=args.verbose)
+ LinkNative([obj_partial], exe, args.target, args.verbose)
# Put the extra verbose printing at the end.
if args.verbose and hybrid:
« no previous file with comments | « pydir/crosstest_generator.py ('k') | pydir/szbuild_spec2k.py » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698