# HG changeset patch # User Windel Bouwman # Date 1374525453 -7200 # Node ID 6259856841a0602653a1866049eb328fb1cf1780 # Parent 63bb40758066cd3c88bf7eb5a858c11057d0781e Remove project diff -r 63bb40758066 -r 6259856841a0 python/codegenarm.py --- a/python/codegenarm.py Mon Jul 22 17:57:25 2013 +0200 +++ b/python/codegenarm.py Mon Jul 22 22:37:33 2013 +0200 @@ -34,6 +34,7 @@ self.emit(Label('reset')) for f in ircode.Functions: + self.localVars = [] # Add global variable addresses to immediate list: for gvar in ircode.Variables: pass #self.imms.append(( @@ -87,18 +88,27 @@ self.imms.append((lname, ins.value)) self.emit(arm.str_sprel(arm.r0, arm.MemSpRel(self.addStack(ins.target)))) elif type(ins) is ir.Store: + print('STORE', ins, self.localVars) # Load value in r0: self.loadStack(arm.r0, ins.value) # store in memory: # TODO: split globals and locals?? #self.getGlobal(arm.r1, ins.location) - self.loadStack(arm.r1, ins.location) - self.emit(arm.storeimm5_ins(arm.r0, arm.MemR8Rel(arm.r1, 0))) + # Horrible hack with localVars + if ins.location in self.localVars: + print('local', ins.location) + self.emit(arm.str_sprel(arm.r0, arm.MemSpRel(self.getStack(ins.location)))) + else: + self.loadStack(arm.r1, ins.location) + self.emit(arm.storeimm5_ins(arm.r0, arm.MemR8Rel(arm.r1, 0))) elif type(ins) is ir.Load: # TODO: differ global and local?? #self.getGlobal(arm.r0, ins.location) - self.loadStack(arm.r0, ins.location) - self.emit(arm.loadimm5_ins(arm.r0, arm.MemR8Rel(arm.r0, 0))) + if ins.location in self.localVars: + self.emit(arm.ldr_sprel(arm.r0, arm.MemSpRel(self.getStack(ins.location)))) + else: + self.loadStack(arm.r0, ins.location) + self.emit(arm.loadimm5_ins(arm.r0, arm.MemR8Rel(arm.r0, 0))) # Store value on stack: self.emit(arm.str_sprel(arm.r0, arm.MemSpRel(self.addStack(ins.value)))) elif type(ins) is ir.BinaryOperator: @@ -132,6 +142,8 @@ elif type(ins) is ir.Alloc: # Local variables are added to stack self.addStack(ins.value) + self.localVars.append(ins.value) + # load address into variable: else: raise NotImplementedError('IR "{}" not covered'.format(ins)) diff -r 63bb40758066 -r 6259856841a0 python/hexfile.py --- a/python/hexfile.py Mon Jul 22 17:57:25 2013 +0200 +++ b/python/hexfile.py Mon Jul 22 22:37:33 2013 +0200 @@ -21,9 +21,9 @@ class HexFile: """ Represents an intel hexfile """ - def __init__(self, filename=None): - self.regions = [] - self.startAddress = 0 + def __init__(self): + self.regions = [] + self.startAddress = 0 def load(self, f): endOfFile = False diff -r 63bb40758066 -r 6259856841a0 python/ide.py --- a/python/ide.py Mon Jul 22 17:57:25 2013 +0200 +++ b/python/ide.py Mon Jul 22 22:37:33 2013 +0200 @@ -7,7 +7,6 @@ from PyQt4.QtGui import * # Compiler imports: -from project import Project import ppci from astviewer import AstViewer #from codeeditor import CodeEdit @@ -158,6 +157,7 @@ self.addToolBar(self.ctrlToolbar) self.ctrlToolbar.setObjectName('debugToolbar') self.devxplr.deviceSelected.connect(self.regview.mdl.setDevice) + self.ctrlToolbar.statusChange.connect(self.memview.refresh) self.devxplr.deviceSelected.connect(self.memview.setDevice) self.devxplr.deviceSelected.connect(self.ctrlToolbar.setDevice) self.ctrlToolbar.statusChange.connect(self.regview.refresh) @@ -173,12 +173,6 @@ if shortcut: a.setShortcut(shortcut) - addMenuEntry("New", self.projectMenu, self.newProject) - addMenuEntry("Open", self.projectMenu, self.openProject) - addMenuEntry("Save", self.projectMenu, self.saveProject) - addMenuEntry("Close", self.projectMenu, self.closeProject) - addMenuEntry("Build", self.projectMenu, self.buildProject, shortcut=QKeySequence('F7')) - addMenuEntry("New", self.fileMenu, self.newFile, shortcut=QKeySequence(QKeySequence.New)) addMenuEntry("Open", self.fileMenu, self.openFile, shortcut=QKeySequence(QKeySequence.Open)) addMenuEntry("Save", self.fileMenu, self.saveFile, shortcut=QKeySequence(QKeySequence.Save)) @@ -205,14 +199,6 @@ self.c3front = c3.Builder(self.diag) # File handling: - def newProject(self): - filename = QFileDialog.getSaveFileName(self, \ - "Select new projectfile", "", "lcfos Project files (*.lcp2)") - if filename: - self.project = Project() - self.project.filename = filename - self.project.save() - def newFile(self): ce = CodeEdit() ce.textChanged.connect(self.buildProject) @@ -363,8 +349,8 @@ self.buildOutput.append("Done!") if __name__ == '__main__': - app = QApplication(sys.argv) - ide = Ide() - ide.show() - app.exec_() + app = QApplication(sys.argv) + ide = Ide() + ide.show() + app.exec_() diff -r 63bb40758066 -r 6259856841a0 python/project.py --- a/python/project.py Mon Jul 22 17:57:25 2013 +0200 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,34 +0,0 @@ -""" - source project - contains: - - modules - - primitives like functions, types and variables - - other modules -""" - -import json - -class Project: - def __init__(self, filename=None): - self.name = "" - self.modules = [] - self.elements = [] - self.settings = {} - if filename: - self.load(filename) - - def load(self, filename): - """ Load the project from file """ - self.filename = filename - - with open(self.filename, 'r') as f: - d = json.load(f) - self.elements = d['elements'] - - def save(self): - if self.filename: - d = {'elements': self.elements} - print(d) - with open(self.filename, 'w') as f: - json.dump(d, f) - diff -r 63bb40758066 -r 6259856841a0 python/pyyacc.py --- a/python/pyyacc.py Mon Jul 22 17:57:25 2013 +0200 +++ b/python/pyyacc.py Mon Jul 22 22:37:33 2013 +0200 @@ -2,7 +2,6 @@ Parser generator script """ -import shelve import hashlib from ppci import Token @@ -170,17 +169,7 @@ def genParser(self): """ Generates a parser from the grammar (using a caching algorithm) """ signature = self.getSignature() - cache = shelve.open('__grammar_cache__.shelve') - # TODO: fix caching. - if ('signature1' in cache) and cache['signature'] == signature: - goto_table = cache['goto_table'] - action_table = cache['action_table'] - else: - action_table, goto_table = self.doGenerate() - cache['goto_table'] = goto_table - cache['action_table'] = action_table - cache['signature'] = signature - cache.close() + action_table, goto_table = self.doGenerate() p = LRParser(action_table, goto_table, self.start_symbol) p.grammar = self return p diff -r 63bb40758066 -r 6259856841a0 python/st-util.py --- a/python/st-util.py Mon Jul 22 17:57:25 2013 +0200 +++ b/python/st-util.py Mon Jul 22 22:37:33 2013 +0200 @@ -79,8 +79,8 @@ self.mdl.refresh() class MemoryView(QWidget): - BlockSize = 0x100 - def __init__(self): + BlockSize = 0x100 + def __init__(self): super().__init__() l = QVBoxLayout(self) l2 = QHBoxLayout() @@ -99,27 +99,32 @@ self.hexEdit = HexEdit() self.Address = 0x8000000 l.addWidget(self.hexEdit) - self.addressLine.returnPressed.connect(self.doLoad) - def doLoad(self): - txt = self.addressLine.text() - self.loadAddress(int(txt, 16)) - def getAddress(self): - txt = self.addressLine.text() - return int(txt, 16) - def doUp(self): - self.Address -= self.BlockSize - def doDown(self): - self.Address += self.BlockSize - def setAddress(self, address): - if self.device: - data = self.device.iface.read_mem32(address, self.BlockSize) - else: - data = bytearray(self.BlockSize) - self.hexEdit.bv.Data = data - self.hexEdit.bv.Offset = address - self.addressLine.setText('{0:08X}'.format(address)) - Address = property(getAddress, setAddress) - def setDevice(self, dev): + self.addressLine.returnPressed.connect(self.refresh) + + def refresh(self): + address = self.Address + if self.device: + data = self.device.iface.read_mem32(address, self.BlockSize) + else: + data = bytearray(self.BlockSize) + self.hexEdit.bv.Data = data + self.hexEdit.bv.Offset = address + + def getAddress(self): + txt = self.addressLine.text() + return int(txt, 16) + + def doUp(self): + self.Address -= self.BlockSize + + def doDown(self): + self.Address += self.BlockSize + + def setAddress(self, address): + self.addressLine.setText('{0:08X}'.format(address)) + self.refresh() + Address = property(getAddress, setAddress) + def setDevice(self, dev): self.device = dev self.Address = 0x8000000 diff -r 63bb40758066 -r 6259856841a0 python/testcg.py --- a/python/testcg.py Mon Jul 22 17:57:25 2013 +0200 +++ b/python/testcg.py Mon Jul 22 22:37:33 2013 +0200 @@ -1,22 +1,43 @@ import unittest import ppci, codegen, ir import cortexm3 as arm +import codegenarm +import outstream + +def genTestFunction(): + m = ir.Module('tst') + f = ir.Function('tst') + m.addFunction(f) + bb = ir.BasicBlock('entry') + f.addBasicBlock(bb) + return m, bb + class testCodeGeneration(unittest.TestCase): def setUp(self): self.cg = codegen.CodeGenerator(arm.armtarget) def testFunction(self): - m = ir.Module('tst') - f = ir.Function('tst') - m.addFunction(f) - bb = ir.BasicBlock('entry') - f.addBasicBlock(bb) + m, bb = genTestFunction() v = ir.Value('tst') bb.addInstruction(ir.ImmLoad(v, 123)) m.check() obj = self.cg.generate(m) self.assertTrue(obj) +class testArmCodeGeneration(unittest.TestCase): + def testStack(self): + s = outstream.OutputStream() + cg = codegenarm.ArmCodeGenerator(s) + m, bb = genTestFunction() + v = ir.Value('tst') + bb.addInstruction(ir.Alloc(v)) + v2 = ir.Value('tst2') + bb.addInstruction(ir.ImmLoad(v2, 22)) + bb.addInstruction(ir.Store(v, v2)) + m.check() + cg.generate(m) + s.dump() + if __name__ == '__main__': - unittest.main() + unittest.main() diff -r 63bb40758066 -r 6259856841a0 python/transform.py --- a/python/transform.py Mon Jul 22 17:57:25 2013 +0200 +++ b/python/transform.py Mon Jul 22 22:37:33 2013 +0200 @@ -1,4 +1,8 @@ -from ir import * +""" + Transformation to optimize IR-code +""" + +from ir import * # Standard passes: class FunctionPass: @@ -13,21 +17,25 @@ def prepare(self): pass + class BasicBlockPass(FunctionPass): - def onFunction(self, f): - for bb in f.BasicBlocks: - self.onBasicBlock(bb) - def onBasicBlock(self, bb): - """ Override this virtual method """ - raise NotImplementedError() - + def onFunction(self, f): + for bb in f.BasicBlocks: + self.onBasicBlock(bb) + + def onBasicBlock(self, bb): + """ Override this virtual method """ + raise NotImplementedError() + + class InstructionPass(BasicBlockPass): - def onBasicBlock(self, bb): - for ins in iter(bb.Instructions): - self.onInstruction(ins) - def onInstruction(self, ins): - """ Override this virtual method """ - raise NotImplementedError() + def onBasicBlock(self, bb): + for ins in iter(bb.Instructions): + self.onInstruction(ins) + + def onInstruction(self, ins): + """ Override this virtual method """ + raise NotImplementedError() # Usefull transforms: class ConstantFolder(InstructionPass): @@ -90,7 +98,8 @@ def onBasicBlock(self, bb): def instructionUsed(ins): if len(ins.defs) == 0: - # In case this instruction does not define any variables, assume it is usefull. + # In case this instruction does not define any + # variables, assume it is usefull. return True for d in ins.defs: if d.IsUsed: @@ -111,13 +120,12 @@ continue # update all references: t_new = constMap[ins.value] - print('Replace {} with {}'.format(t_old, t_new)) for use in t_old.used_by: use.replaceValue(t_old, t_new) bb.removeInstruction(ins) else: constMap[ins.value] = ins.target - + def isAllocPromotable(allocinst): # Check if alloc value is only used by load and store operations. @@ -129,6 +137,7 @@ otherUse = True return True + class CleanPass(FunctionPass): def onFunction(self, f): bbs = list(f.BasicBlocks) @@ -149,6 +158,7 @@ pred.LastInstruction.changeTarget(bb, ins.target) f.removeBasicBlock(bb) + class Mem2RegPromotor(FunctionPass): def onFunction(self, f): # TODO