Mercurial > lcfOS
changeset 107:1544e7a4aa98
Improvements
author | Windel Bouwman |
---|---|
date | Tue, 01 Jan 2013 17:16:05 +0100 |
parents | f2d980eef509 |
children | 8267ba1dbce3 |
files | python/ppci/core/asmwriter.py python/ppci/core/llvmtype.py python/ppci/core/module.py python/ppci/core/symboltable.py python/ppci/frontends/__init__.py python/ppci/frontends/ks/irgenerator.py python/ppci/frontends/ks/nodes.py python/zcc.py |
diffstat | 8 files changed, 65 insertions(+), 21 deletions(-) [+] |
line wrap: on
line diff
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/python/ppci/core/asmwriter.py Tue Jan 01 17:16:05 2013 +0100 @@ -0,0 +1,40 @@ + +from . import llvmtype +#typeNames[VoidType] = 'void' + +class AsmWriter: + def __init__(self): + self.typeNames = {} + self.typeNames[llvmtype.typeID.Void] = 'void' + def printModule(self, module): + if module.Identifier: + print('; ModuleID = {0}'.format(module.Identifier)) + # + # Print functions: + for f in module.Functions: + self.printFunction(f) + def printFunction(self, f): + # TODO: if definition: + + t = self.strType(f.ReturnType.tid) + args = '()' + print('define {0} {1}{2}'.format(t, f.name, args)) + print('{') + + for bb in f.BasicBlocks: + print(bb) + + print('}') + + def strType(self, t): + return self.typeNames[t] + + def printBasicBlock(self, bb): + if bb.Name: + # print label + print('{0}:'.format(bb.Name)) + for instr in bb.Instructions: + self.printInstruction(instr) + def printInstruction(self, i): + pass +
--- a/python/ppci/core/llvmtype.py Mon Dec 31 18:26:56 2012 +0100 +++ b/python/ppci/core/llvmtype.py Tue Jan 01 17:16:05 2013 +0100 @@ -7,6 +7,7 @@ class llvmType: def __init__(self, context, tid): self.context = context + self.tid = tid class IntegerType(llvmType): def __init__(self, context, bits):
--- a/python/ppci/core/module.py Mon Dec 31 18:26:56 2012 +0100 +++ b/python/ppci/core/module.py Tue Jan 01 17:16:05 2013 +0100 @@ -1,4 +1,3 @@ - from .value import Value from .symboltable import SymbolTable @@ -6,8 +5,8 @@ """ Main container for a piece of code. Contains globals and functions. """ - def __init__(self): - self.identifier = None + def __init__(self, identifier=None): + self.identifier = identifier self.functions = [] # Do functions come out of symbol table? self.globals_ = [] # TODO: are globals in symbol table? self.symtable = SymbolTable()
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/python/ppci/core/symboltable.py Tue Jan 01 17:16:05 2013 +0100 @@ -0,0 +1,7 @@ + +class SymbolTable: + """ Holds a table of symbols for a module or function """ + def __init__(self): + self.symbols = {} + +
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/python/ppci/frontends/__init__.py Tue Jan 01 17:16:05 2013 +0100 @@ -0,0 +1,4 @@ +# File to make this directory a package. + +from .ks import KsFrontend +
--- a/python/ppci/frontends/ks/irgenerator.py Mon Dec 31 18:26:56 2012 +0100 +++ b/python/ppci/frontends/ks/irgenerator.py Tue Jan 01 17:16:05 2013 +0100 @@ -75,23 +75,8 @@ # Get a register to store the integer value else: Error('Cannot load variable type {0}'.format(node.typ)) - - elif isinstance(node, Relop): - # Create a boolean from operands - # TODO create an alternative for expressions used as conditions. - self.genexprcode(node.a) - self.genexprcode(node.b) - - if node.a.typ.isType(integer): - self.freereg(node.b) - else: - Error('Relop not implemented for {0}'.format(node.a.typ)) - elif type(node) is Constant: print('TODO: constant') - - elif type(node) is ProcedureCall: - Error('TODO: proc call') else: Error('Cannot generate expression code for: {0}'.format(node)) @@ -99,8 +84,16 @@ """ Code generation function for AST nodes """ if isinstance(node, Module): # TODO: recurse! + + print(node.symtable) + node.symtable.printTable() + funcs = node.symtable.getAllLocal(Procedure) + for f in funcs: + print('function', f) + ftype = f.typ.coreType() + ftype = core.FunctionType(retType) - self.mod = core.Module() + self.mod = core.Module(node.name) # Create a function called init for this module: ftype = core.FunctionType(self.context.VoidType, []) func = core.Function(ftype, "init", self.mod)
--- a/python/ppci/frontends/ks/nodes.py Mon Dec 31 18:26:56 2012 +0100 +++ b/python/ppci/frontends/ks/nodes.py Tue Jan 01 17:16:05 2013 +0100 @@ -129,6 +129,8 @@ self.returntype = returntype def __repr__(self): return '[PROCTYPE {0} RET {1}]'.format(self.parameters, self.returntype) + def coreType(self): + return None class DefinedType(Type): def __init__(self, name, typ):