blob: 373f85c379e19a2d62847550e3aef896ce9c97a0 [file] [log] [blame]
#!/usr/bin/python
# Copyright (c) 2012 The Native Client Authors. All rights reserved.
# Use of this source code is governed by a BSD-style license that can be
# found in the LICENSE file.
import driver_tools
from driver_env import env
from driver_log import Log
import sys
EXTRA_ENV = {
'INPUTS' : '',
'OUTPUT' : '',
'MC_FLAGS' : '-assemble -filetype=obj ${MC_FLAGS_%ARCH%}',
'MC_FLAGS_ARM' : ('-arch=arm -triple=armv7a-nacl -mcpu=cortex-a9 ' +
'-mattr=+neon'),
'MC_FLAGS_X8632' : '-arch=x86 -triple=i686-nacl',
'MC_FLAGS_X8664' : '-arch=x86-64 -triple=x86_64-nacl',
'MC_FLAGS_MIPS32': '-arch=mipsel -triple=mipsel-nacl',
'MC_FLAGS_ARM_NONSFI': ('-arch=arm -triple=armv7a -mcpu=cortex-a9 '
'-mattr=+neon'),
'MC_FLAGS_X8632_NONSFI': '-arch=x86 -triple=i686',
'RUN_LLVM_AS' : '${LLVM_AS} ${input} -o ${output}',
'RUN_LLVM_MC' : '${LLVM_MC} ${MC_FLAGS} ${input} -o ${output}',
}
VERSION_STR = """Portable Native Client assembler
Compatibility:
GNU assembler version 2.21.51 (pnacl-pc-nacl) using BFD version (GNU Binutils) 2.21.51.20110525
Low Level Virtual Machine (http://llvm.org/)
"""
def DumpVersionDebug():
sys.stderr.write(VERSION_STR)
def DumpVersionAndExit():
sys.stdout.write(VERSION_STR)
driver_tools.DriverExit(0)
ASPatterns = [
( '-o(.+)', "env.set('OUTPUT', pathtools.normalize($0))"),
( ('-o', '(.+)'), "env.set('OUTPUT', pathtools.normalize($0))"),
( '-v', DumpVersionDebug),
( '--version', DumpVersionAndExit),
# Ignore these assembler flags
( '(-Qy)', ""),
( ('(--traditional-format)', '.*'), ""),
( '(-gstabs)', ""),
( '(--gstabs)', ""),
( '(-gdwarf2)', ""),
( '(--gdwarf2)', ""),
( '(--fatal-warnings)', ""),
( '(-meabi=.*)', ""),
( '(-mfpu=.*)', ""),
( '(-march=.*)', ""),
( '(-.+)', driver_tools.UnrecognizedOption),
# Unmatched parameters should be treated as
# assembly inputs by the "as" incarnation.
( '(-)', "env.append('INPUTS', $0)"),
( '(.*)', "env.append('INPUTS', pathtools.normalize($0))"),
]
def main(argv):
env.update(EXTRA_ENV)
driver_tools.ParseArgs(argv, ASPatterns)
arch = driver_tools.GetArch()
inputs = env.get('INPUTS')
output = env.getone('OUTPUT')
for path in inputs + [output]:
driver_tools.CheckPathLength(path)
num_inputs = len(inputs)
if num_inputs > 1:
Log.Fatal('Expecting exactly one input file')
elif num_inputs == 1:
the_input = inputs[0]
else:
# stdin
the_input = '-'
if arch:
output_type = 'o'
else:
output_type = 'po'
if output == '':
output = 'a.out'
env.push()
env.set('input', the_input)
env.set('output', output)
if output_type == 'po':
# .ll to .po
driver_tools.Run("${RUN_LLVM_AS}")
else:
# .s to .o
driver_tools.Run("${RUN_LLVM_MC}")
env.pop()
# only reached in case of no errors
return 0
def get_help(argv):
return """
LLVM Assembler for PNaCl
Transform LLVM assembly (.ll) to LLVM bitcode.
Usage: pnacl-as [options] <input .ll file> -o <output.po>
OPTIONS:
-o <file> Output to file
--version Display version information
-help | -h Output this help.
"""