Mercurial > lcfOS
view python/zcc.py @ 284:05184b95fa16
Moved tests to seperate folder
author | Windel Bouwman |
---|---|
date | Fri, 15 Nov 2013 13:43:22 +0100 |
parents | 4496cae24d7f |
children | 1c7c1e619be8 |
line wrap: on
line source
#!/usr/bin/python import sys, argparse import c3, ppci, codegen import codegenarm from optimize import optimize import outstream import hexfile import logging logformat='%(asctime)s|%(levelname)s|%(name)s|%(message)s' def logLevel(s): numeric_level = getattr(logging, s.upper(), None) if not isinstance(numeric_level, int): raise ValueError('Invalid log level: {}'.format(s)) return numeric_level # Parse arguments: parser = argparse.ArgumentParser(description='lcfos Compiler') parser.add_argument('source', type=argparse.FileType('r'), \ help='the source file to build') parser.add_argument('--dumpir', action='store_true', help="Dump IR-code") parser.add_argument('--dumpasm', action='store_true', help="Dump ASM-code") parser.add_argument('--optimize', action='store_true', help="Optimize") parser.add_argument('--package_dir', help="Look in this directory for packages") parser.add_argument('-o', '--output', help='Output file', metavar='filename') parser.add_argument('--hexfile', help='Output hexfile', type=argparse.FileType('w')) parser.add_argument('--log', help='Log level (INFO,DEBUG)', type=logLevel) def zcc(src, outs, diag, dumpir=False, do_optimize=False, pack_dir=None): logging.info('Zcc started') # Front end: c3b = c3.Builder(diag) ircode = c3b.build(src, pack_dir=pack_dir) if not ircode: return # Optimization passes: if do_optimize: optimize(ircode) if dumpir: ircode.dump() # Code generation: cg = codegenarm.ArmCodeGenerator(outs) obj = cg.generate(ircode) return True def main(args): logging.basicConfig(format=logformat, level=args.log) src = args.source.read() args.source.close() diag = ppci.DiagnosticsManager() outs = outstream.TextOutputStream() # Invoke compiler: res = zcc(src, outs, diag, dumpir=args.dumpir, do_optimize=args.optimize, pack_dir=args.package_dir) if not res: diag.printErrors(src) return 1 if args.dumpasm: outs.dump() code_bytes = outs.sections['code'].to_bytes() #print('bytes:', code_bytes) if args.output: output_filename = args.output else: output_filename = 'b.output' with open(output_filename, 'wb') as f: f.write(code_bytes) if args.hexfile: logging.info('Creating hexfile') hf = hexfile.HexFile() hf.addRegion(0x08000000, code_bytes) hf.save(args.hexfile) return 0 if __name__ == '__main__': arguments = parser.parse_args() sys.exit(main(arguments))