#!/usr/bin/env python2

import argparse
import os
import tempfile
from utils import shellcmd
from utils import FindBaseNaCl

if __name__ == '__main__':
    argparser = argparse.ArgumentParser()
    argparser.add_argument('cfile', nargs='+', type=str,
        help='C file(s) to convert')
    argparser.add_argument('--dir', nargs='?', type=str, default='.',
                           help='Output directory')
    argparser.add_argument('--disable-verify', action='store_true')
    args = argparser.parse_args()

    nacl_root = FindBaseNaCl()
    # Prepend bin to $PATH.
    os.environ['PATH'] = (
        nacl_root + '/toolchain/linux_x86/pnacl_newlib/bin' + os.pathsep +
        os.pathsep + os.environ['PATH'])

    tempdir = tempfile.mkdtemp()

    for cname in args.cfile:
        basename = os.path.splitext(cname)[0]
        llname = os.path.join(tempdir, basename + '.ll')
        pnaclname = basename + '.pnacl.ll'
        pnaclname = os.path.join(args.dir, pnaclname)

        shellcmd('pnacl-clang -O2 -c {0} -o {1}'.format(cname, llname))
        shellcmd('pnacl-opt ' +
                 '-pnacl-abi-simplify-preopt -pnacl-abi-simplify-postopt' +
                 ('' if args.disable_verify else
                  ' -verify-pnaclabi-module -verify-pnaclabi-functions') +
                 ' -pnaclabi-allow-debug-metadata'
                 ' {0} -S -o {1}'.format(llname, pnaclname))
