def HasBitcodeInputs(inputs): for f in inputs: if ldtools.IsFlag(f): continue elif filetype.IsLLVMBitcode(f) or filetype.IsBitcodeArchive(f): return True return False
def DoTranslate(infile, outfile): args = env.get('TRANSLATE_FLAGS') args += ['-Wl,'+s for s in env.get('LD_FLAGS_NATIVE')] if infile: args += [infile] args += ['-Wl,'+s if ldtools.IsFlag(s) else s for s in env.get('NATIVE_OBJECTS')] args += ['-o', outfile] RunDriver('pnacl-translate', args)
def FilterPlls(inputs): """ Split the input list into PLLs and other objects. """ plls = [] other = [] for f in inputs: if ldtools.IsFlag(f) or not filetype.IsPll(f): other.append(f) else: plls.append(f) return (plls, other)
def CheckInputsArch(inputs): count = 0 for f in inputs: if ldtools.IsFlag(f): continue elif filetype.IsLLVMBitcode(f) or filetype.IsBitcodeArchive(f): pass elif filetype.IsNative(f): ArchMerge(f, True) else: Log.Fatal("%s: Unexpected type of file for linking (%s)", pathtools.touser(f), filetype.FileType(f)) count += 1 if count == 0: Log.Fatal("no input files")
def SplitLinkLine(inputs): """ Split the input list into bitcode and native objects (.o, .a) """ normal = [] native = [] # Group flags need special handling because they need to go into the right # list based on the type of the inputs in the group. If the group has both # native and bitcode files (which is unfortunately the case for # irt_browser_lib) then the group flags need to go in both lists. if '--start-group' in inputs: start_group = inputs.index('--start-group') # Start with the inputs before the first group normal, native = SplitLinkLine(inputs[:start_group]) try: end_group = inputs.index('--end-group') except ValueError: Log.Fatal("Found --start-group without matching --end-group") # Add the contents of the group together with the --{start,end}-group flags norm_group, native_group = SplitLinkLine(inputs[start_group + 1:end_group]) if len(norm_group) > 0: normal.extend(['--start-group'] + norm_group + ['--end-group']) if len(native_group) > 0: native.extend(['--start-group'] + native_group + ['--end-group']) # Add the inputs after the first group norm_last, native_last = SplitLinkLine(inputs[end_group + 1:]) return normal + norm_last, native + native_last # If no groups, split the inputs based on their type. for f in inputs: if ldtools.IsFlag(f): normal.append(f) elif filetype.IsNativeArchive(f) or filetype.IsNativeObject(f): native.append(f) else: normal.append(f) return (normal, native)
def main(argv): env.update(EXTRA_ENV) driver_tools.ParseArgs(argv, TranslatorPatterns) driver_tools.GetArch(required = True) SetUpArch() SetUpLinkOptions() # Now commit to whether or not Subzero is used. use_sz = env.getbool('USE_SZ') and not env.getbool('SZ_UNSUPPORTED') inputs = env.get('INPUTS') output = env.getone('OUTPUT') if len(inputs) == 0: Log.Fatal("No input files") for path in inputs: driver_tools.CheckPathLength(path) if output == '': Log.Fatal("Please specify output file with -o") # Find the bitcode file on the command line. bcfiles = [f for f in inputs if not ldtools.IsFlag(f) and (filetype.IsPNaClBitcode(f) or filetype.IsLLVMBitcode(f) or filetype.FileType(f) == 'll')] if len(bcfiles) > 1: Log.Fatal('Expecting at most 1 bitcode file') elif len(bcfiles) == 1: bcfile = bcfiles[0] else: bcfile = None if ((env.getbool('ALLOW_LLVM_BITCODE_INPUT') or env.getone('TARGET_OS') != 'nacl' or env.getbool('USE_EMULATOR')) and env.getone('SPLIT_MODULE') == 'auto'): # When llvm input is allowed, the pexe may not be ABI-stable, so do not # split it. Non-ABI-stable pexes may have symbol naming and visibility # issues that the current splitting scheme doesn't account for. # # For now, also do not enable multi-threaded translation when TARGET_OS != # 'nacl', since in these cases we will be using the host toolchain's # linker. # # The x86->arm emulator is very flaky when threading is used, so don't # do module splitting when using it. env.set('SPLIT_MODULE', 'seq') # Do not set -streaming-bitcode for sandboxed mode, because it is already # in the default command line. if not env.getbool('SANDBOXED') and env.getbool('STREAM_BITCODE'): env.append('LLC_FLAGS_EXTRA', '-streaming-bitcode') if env.getone('SPLIT_MODULE') == 'seq': env.set('SPLIT_MODULE', '1') env.set('SZ_THREADS', '0') elif env.getone('SPLIT_MODULE') == 'auto': try: num_modules = min(4, multiprocessing.cpu_count()) except NotImplementedError: num_modules = 2 env.set('SPLIT_MODULE', str(num_modules)) env.set('SZ_THREADS', str(num_modules)) else: num_modules = int(env.getone('SPLIT_MODULE')) if num_modules < 1: Log.Fatal('Value given for -split-module must be > 0') env.set('SPLIT_MODULE', str(num_modules)) env.set('SZ_THREADS', str(num_modules)) modules = env.getone('SPLIT_MODULE') module_sched = env.getone('SPLIT_MODULE_SCHED') sz_threads = env.getone('SZ_THREADS') # TODO(dschuff,jvoung): No need to specify -split-module=X since the IPC # already has a parameter for the number of threads and modules. env.append('LLC_FLAGS_EXTRA', '-split-module=' + modules) env.append('LD_FLAGS', '-split-module=' + ('1' if use_sz else modules)) env.append('LLC_FLAGS_EXTRA', '-split-module-sched=' + module_sched) # In sandboxed mode, the IPC already has a parameter for the number # of threads, so no need to specify that again via argv[]. if not env.getbool('SANDBOXED'): env.append('SZ_FLAGS_EXTRA', '--threads=' + sz_threads) # If there's a bitcode file, translate it now. tng = driver_tools.TempNameGen(inputs + bcfiles, output) output_type = env.getone('OUTPUT_TYPE') if bcfile: sfile = None if output_type == 's': sfile = output ofile = None if output_type == 'o': ofile = output elif output_type != 's': ofile = tng.TempNameForInput(bcfile, 'o') if sfile: RunCompiler(bcfile, sfile, outfiletype='asm', use_sz=use_sz) if ofile: RunAS(sfile, ofile) else: RunCompiler(bcfile, ofile, outfiletype='obj', use_sz=use_sz) else: ofile = None # If we've been told to stop after translation, stop now. if output_type in ('o','s'): return 0 if use_sz: # Reset SPLIT_MODULE to 1 to fall back to normal linking behavior. env.set('SPLIT_MODULE', '1') # Replace the bitcode file with __BITCODE__ in the input list if bcfile: inputs = ListReplace(inputs, bcfile, '__BITCODE__') env.set('INPUTS', *inputs) if int(env.getone('SPLIT_MODULE')) > 1: modules = int(env.getone('SPLIT_MODULE')) for i in range(1, modules): filename = ofile + '.module%d' % i TempFiles.add(filename) env.append('INPUTS', filename) if env.getone('TARGET_OS') != 'nacl': RunHostLD(ofile, output) else: RunLD(ofile, output) return 0
def main(argv): env.update(EXTRA_ENV) driver_tools.ParseArgs(argv, TranslatorPatterns) driver_tools.GetArch(required=True) inputs = env.get('INPUTS') output = env.getone('OUTPUT') if len(inputs) == 0: Log.Fatal("No input files") if output == '': Log.Fatal("Please specify output file with -o") # Find the bitcode file on the command line. bcfiles = [ f for f in inputs if not ldtools.IsFlag(f) and (filetype.IsPNaClBitcode( f) or filetype.IsLLVMBitcode(f) or filetype.FileType(f) == 'll') ] if len(bcfiles) > 1: Log.Fatal('Expecting at most 1 bitcode file') elif len(bcfiles) == 1: bcfile = bcfiles[0] else: bcfile = None if not env.getbool('SPLIT_MODULE'): try: env.set('SPLIT_MODULE', str(min(4, multiprocessing.cpu_count()))) except NotImplementedError: env.set('SPLIT_MODULE', '2') elif int(env.getone('SPLIT_MODULE')) < 1: Log.Fatal('Value given for -split-module must be > 0') if (env.getbool('ALLOW_LLVM_BITCODE_INPUT') or env.getone('ARCH') == 'X8632_LINUX' or env.getbool('USE_EMULATOR')): # When llvm input is allowed, the pexe may not be ABI-stable, so do not # split it. For now also do not support threading non-SFI baremetal mode. # Non-ABI-stable pexes may have symbol naming and visibility issues that the # current splitting scheme doesn't account for. # If the link would require a non-standard command line, do not split the # modules because the sandboxed linker doesn't support that combination. # The x86->arm emulator is very flaky when threading is used, so don't # do module splitting when using it. env.set('SPLIT_MODULE', '1') else: modules = env.getone('SPLIT_MODULE') if modules != '1': env.append('LLC_FLAGS_EXTRA', '-split-module=' + modules) env.append('LD_FLAGS', '-split-module=' + modules) if not env.getbool('SANDBOXED') and env.getbool('STREAM_BITCODE'): # Do not set -streaming-bitcode for sandboxed mode, because it is already # in the default command line. env.append('LLC_FLAGS_EXTRA', '-streaming-bitcode') # If there's a bitcode file, translate it now. tng = driver_tools.TempNameGen(inputs + bcfiles, output) output_type = env.getone('OUTPUT_TYPE') if bcfile: sfile = None if output_type == 's': sfile = output ofile = None if output_type == 'o': ofile = output elif output_type != 's': ofile = tng.TempNameForInput(bcfile, 'o') if sfile: RunLLC(bcfile, sfile, outfiletype='asm') if ofile: RunAS(sfile, ofile) else: RunLLC(bcfile, ofile, outfiletype='obj') else: ofile = None # If we've been told to stop after translation, stop now. if output_type in ('o', 's'): return 0 # Replace the bitcode file with __BITCODE__ in the input list if bcfile: inputs = ListReplace(inputs, bcfile, '__BITCODE__') env.set('INPUTS', *inputs) if int(env.getone('SPLIT_MODULE')) > 1: modules = int(env.getone('SPLIT_MODULE')) for i in range(1, modules): filename = ofile + '.module%d' % i TempFiles.add(filename) env.append('INPUTS', filename) if env.getone('ARCH') == 'X8632_LINUX': RunHostLD(ofile, output) else: RunLD(ofile, output) return 0
def main(argv): env.update(EXTRA_ENV) driver_tools.ParseArgs(argv, TranslatorPatterns) if env.getbool('SHARED'): Log.Fatal('Not handling SHARED') driver_tools.GetArch(required = True) inputs = env.get('INPUTS') output = env.getone('OUTPUT') if len(inputs) == 0: Log.Fatal("No input files") if output == '': Log.Fatal("Please specify output file with -o") # Find the bitcode file on the command line. bcfiles = [f for f in inputs if not ldtools.IsFlag(f) and (filetype.IsPNaClBitcode(f) or filetype.IsLLVMBitcode(f) or filetype.FileType(f) == 'll')] if len(bcfiles) > 1: Log.Fatal('Expecting at most 1 bitcode file') elif len(bcfiles) == 1: bcfile = bcfiles[0] else: bcfile = None # If there's a bitcode file, translate it now. tng = driver_tools.TempNameGen(inputs + bcfiles, output) output_type = env.getone('OUTPUT_TYPE') if bcfile: sfile = None if output_type == 's': sfile = output elif env.getbool('FORCE_INTERMEDIATE_S'): sfile = tng.TempNameForInput(bcfile, 's') ofile = None if output_type == 'o': ofile = output elif output_type != 's': ofile = tng.TempNameForInput(bcfile, 'o') if sfile: RunLLC(bcfile, sfile, outfiletype='asm') if ofile: RunAS(sfile, ofile) else: RunLLC(bcfile, ofile, outfiletype='obj') else: ofile = None # If we've been told to stop after translation, stop now. if output_type in ('o','s'): return 0 # Replace the bitcode file with __BITCODE__ in the input list if bcfile: inputs = ListReplace(inputs, bcfile, '__BITCODE__') env.set('INPUTS', *inputs) # Determine the output type, in this order of precedence: # 1) Output type can be specified on command-line (-S, -c, -static) # -S and -c are handled above by the check that output_type in ('o', 's'). # 2) Otherwise, assume static nexe output. if env.getbool('STATIC'): output_type = 'nexe' else: # Until we stabilize the ABI for shared libraries, # assume that pnacl-translate only handles pexes -> nexes, # to avoid a dependency on bitcode metadata. output_type = 'nexe' env.set('STATIC', '1') assert output_type in ('so','nexe') if env.getone('ARCH') == 'LINUX_X8632': RunHostLD(ofile, output) else: RunLD(ofile, output) return 0
def main(argv): env.update(EXTRA_ENV) driver_tools.ParseArgs(argv, TranslatorPatterns) driver_tools.GetArch(required=True) inputs = env.get('INPUTS') output = env.getone('OUTPUT') if len(inputs) == 0: Log.Fatal("No input files") if output == '': Log.Fatal("Please specify output file with -o") # Find the bitcode file on the command line. bcfiles = [ f for f in inputs if not ldtools.IsFlag(f) and (filetype.IsPNaClBitcode( f) or filetype.IsLLVMBitcode(f) or filetype.FileType(f) == 'll') ] if len(bcfiles) > 1: Log.Fatal('Expecting at most 1 bitcode file') elif len(bcfiles) == 1: bcfile = bcfiles[0] else: bcfile = None # If there's a bitcode file, translate it now. tng = driver_tools.TempNameGen(inputs + bcfiles, output) output_type = env.getone('OUTPUT_TYPE') if bcfile: sfile = None if output_type == 's': sfile = output ofile = None if output_type == 'o': ofile = output elif output_type != 's': ofile = tng.TempNameForInput(bcfile, 'o') if sfile: RunLLC(bcfile, sfile, outfiletype='asm') if ofile: RunAS(sfile, ofile) else: RunLLC(bcfile, ofile, outfiletype='obj') else: ofile = None # If we've been told to stop after translation, stop now. if output_type in ('o', 's'): return 0 # Replace the bitcode file with __BITCODE__ in the input list if bcfile: inputs = ListReplace(inputs, bcfile, '__BITCODE__') env.set('INPUTS', *inputs) if env.getone('ARCH') == 'LINUX_X8632': RunHostLD(ofile, output) else: RunLD(ofile, output) return 0