# HG changeset patch # User Windel Bouwman # Date 1356974816 -3600 # Node ID f2d980eef50904c817d2b70319b3715583d91e06 # Parent 6a303f835c6dea9992e7d3169316f7a3a49dbad7 improved code generation diff -r 6a303f835c6d -r f2d980eef509 python/ide.py --- a/python/ide.py Mon Dec 31 17:35:17 2012 +0100 +++ b/python/ide.py Mon Dec 31 18:26:56 2012 +0100 @@ -10,7 +10,7 @@ # Compiler imports: from project import Project -from ppci import KsCompiler +import ppci from astviewer import AstViewer from codeeditor import CodeEdit diff -r 6a303f835c6d -r f2d980eef509 python/ppci/__init__.py --- a/python/ppci/__init__.py Mon Dec 31 17:35:17 2012 +0100 +++ b/python/ppci/__init__.py Mon Dec 31 18:26:56 2012 +0100 @@ -1,4 +1,11 @@ # File to make this directory a package. +import sys + version = '0.0.1' +# Assert python version: +if sys.version_info.major != 3: + print("Needs to be run in python version 3.x") + sys.exit(1) + diff -r 6a303f835c6d -r f2d980eef509 python/ppci/core/__init__.py --- a/python/ppci/core/__init__.py Mon Dec 31 17:35:17 2012 +0100 +++ b/python/ppci/core/__init__.py Mon Dec 31 18:26:56 2012 +0100 @@ -6,6 +6,7 @@ from .module import Module from .llvmtype import FunctionType from .context import Context +from .asmwriter import AsmWriter version='0.0.1' diff -r 6a303f835c6d -r f2d980eef509 python/ppci/core/function.py --- a/python/ppci/core/function.py Mon Dec 31 17:35:17 2012 +0100 +++ b/python/ppci/core/function.py Mon Dec 31 18:26:56 2012 +0100 @@ -10,11 +10,12 @@ self.functiontype = functiontype self.name = name self.module = module + + self.module.Functions.append(self) self.basicblocks = [] self.arguments = [] # Construct formal arguments depending on function type - BasicBlocks = property(lambda self: self.basicblocks) Arguments = property(lambda self: self.arguments) ReturnType = property(lambda self: self.functiontype.returnType) diff -r 6a303f835c6d -r f2d980eef509 python/ppci/core/llvmtype.py --- a/python/ppci/core/llvmtype.py Mon Dec 31 17:35:17 2012 +0100 +++ b/python/ppci/core/llvmtype.py Mon Dec 31 18:26:56 2012 +0100 @@ -17,5 +17,6 @@ def __init__(self, resultType, parameterTypes): super().__init__(resultType.context, typeID.Function) self.resultType = resultType + self.returnType = resultType self.parameterTypes = parameterTypes diff -r 6a303f835c6d -r f2d980eef509 python/ppci/core/module.py --- a/python/ppci/core/module.py Mon Dec 31 17:35:17 2012 +0100 +++ b/python/ppci/core/module.py Mon Dec 31 18:26:56 2012 +0100 @@ -7,10 +7,12 @@ Main container for a piece of code. Contains globals and functions. """ def __init__(self): - self.functions = [] - self.globals_ = [] + self.identifier = None + self.functions = [] # Do functions come out of symbol table? + self.globals_ = [] # TODO: are globals in symbol table? self.symtable = SymbolTable() Globals = property(lambda self: self.globals_) Functions = property(lambda self: self.functions) + Identifier = property(lambda self: self.identifier) diff -r 6a303f835c6d -r f2d980eef509 python/ppci/frontends/ks/__init__.py --- a/python/ppci/frontends/ks/__init__.py Mon Dec 31 17:35:17 2012 +0100 +++ b/python/ppci/frontends/ks/__init__.py Mon Dec 31 18:26:56 2012 +0100 @@ -21,7 +21,7 @@ self.ast = ast # Generate ir (a core.Module): - ir = KsIrGenerator().generateIr(context, ast) + ir = KsIrGenerator().generateIr(self.context, ast) return ir diff -r 6a303f835c6d -r f2d980eef509 python/ppci/frontends/ks/irgenerator.py --- a/python/ppci/frontends/ks/irgenerator.py Mon Dec 31 17:35:17 2012 +0100 +++ b/python/ppci/frontends/ks/irgenerator.py Mon Dec 31 18:26:56 2012 +0100 @@ -42,13 +42,9 @@ elif type(node) is Unop: if node.op == 'INTTOREAL': self.genexprcode(node.a) - node.reg = node.a.reg - # TODO use 'FILD' instruction - freg = 12 code.append('Unop inttoreal TODO') elif node.op == 'ABS': if isType(node.typ, real): - code = [0xD9, 0xE1] # st(0) = fabs st(0) Error('ABS error integer') elif isType(node.typ, integer): code = [] diff -r 6a303f835c6d -r f2d980eef509 python/ppci/frontends/ks/parser.py --- a/python/ppci/frontends/ks/parser.py Mon Dec 31 17:35:17 2012 +0100 +++ b/python/ppci/frontends/ks/parser.py Mon Dec 31 18:26:56 2012 +0100 @@ -1,7 +1,3 @@ -""" - This module parses source code into an abstract syntax tree (AST) -""" - from .symboltable import SymbolTable from .nodes import * from ...core.errors import CompilerException, Error @@ -10,6 +6,7 @@ from .lexer import tokenize class KsParser: + """ This module parses source code into an abstract syntax tree (AST) """ def __init__(self, source): """ provide the parser with the tokens iterator from the lexer. """ self.tokens = tokenize(source) # Lexical stage diff -r 6a303f835c6d -r f2d980eef509 python/tests/testcode.c --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/python/tests/testcode.c Mon Dec 31 18:26:56 2012 +0100 @@ -0,0 +1,9 @@ + +int Calculate(int a, int b, int c) +{ + int d, e; + d = a + b; + e = d * c - a; + return a + b + c + d + e; +} + diff -r 6a303f835c6d -r f2d980eef509 python/zcc.py --- a/python/zcc.py Mon Dec 31 17:35:17 2012 +0100 +++ b/python/zcc.py Mon Dec 31 18:26:56 2012 +0100 @@ -1,7 +1,7 @@ #!/usr/bin/python import sys, os, argparse -from ppci import core +from ppci import core, frontends parser = argparse.ArgumentParser(description='K# to bitcode compiler') parser.add_argument('source', type=str, help='the source file to build') @@ -13,19 +13,30 @@ except IOError: print('Failed to load {0}'.format(args.source)) sys.exit(1) - +print('stage 1: Parsing') # Create a context and a frontend: context = core.Context() -frontend = core.frontends.ks.KsFrontend(context) +frontend = frontends.KsFrontend(context) try: module = frontend.compilesource(src) except core.CompilerException as e: print(e) - sys.exit(2) + lines = src.split(os.linesep) + row = e.row + col = e.col + line = lines[row - 1] + print('{0}:{1}'.format(row, line)) + print(' ' * col + '^') + raise + #sys.exit(2) # optionally run passes here: # TODO +print('stage 3: Code generation') +asmWriter = core.AsmWriter() +asmWriter.printModule(module) + # Generate code: bitcodeWriter = core.BitcodeWriter() with open(args.source + '.bc', 'wb') as f: