def visit_Assignment(self,node): lv = self.inFunctionDispatch(node.lvalue) rv = self.inFunctionDispatch(node.rvalue) self.assertNonVoid(lv) self.assertNonVoid(rv) if type(lv.type) == types.Array: raise Exception('cannot assign to an array') if rv.lval: rv = self.genDeref(rv) if not lv.type.strictTypeMatch(rv.type): rv = operatorgen.genCast(self.curBasicBlock,rv,lv.type) if not lv.lval: raise Exception("attemping to assign to a non lvalue!") if node.op in ['+=','-=' ,'/=','^=','|=','&=','*=','%=']: result = operatorgen.genBinop(self.curBasicBlock,node.op[0],lv,rv) else: if node.op != '=' : raise Exception("Bug - unknown assignment op %s" % node.op) result = rv self.curBasicBlock.append(ir.Store(lv.reg,result.reg)) return result
def visit_Decl(self,decl): t = types.parseTypeDecl(self.typeTab,decl.type) isstaticvar = 'static' in decl.storage if self.isGlobalScope() or isstaticvar: sym = GlobalSym(decl.name,t) if type(decl.type) != c_ast.FuncDecl: self.module.addZeroInitData(4,label=decl.name) else: sym = LocalSym(decl.name,t) self.symTab.addSymbol(sym) if not self.isGlobalScope() and not isstaticvar: if decl.init: if type(decl.type) == c_ast.ArrayDecl: raise Exception("cannot currently handle Array initializers") elif type(decl.type) == c_ast.PtrDecl: raise Exception("cannot currently handle Pointer initializers") initializer = self.inFunctionDispatch(decl.init) self.assertNonVoid(initializer) if not t.strictTypeMatch(initializer.type): initializer = operatorgen.genCast(self.curBasicBlock,initializer,t) v = ir.Pointer() op = ir.LoadLocalAddr(v,sym) self.curBasicBlock.append(op) if initializer.lval: initializer = self.genDeref(initializer) op = ir.Store(v,initializer.reg) self.curBasicBlock.append(op)
def visit_Return(self,ret): #print("XXXXXX",self.curBasicBlock) if ret.expr == None: if type(self.curFunctionType.rettype) != types.Void: raise Exception("returning void in a non void function") retop = ir.Ret() else: val = self.inFunctionDispatch(ret.expr) self.assertNonVoid(val) if not val.type.strictTypeMatch(self.curFunctionType.rettype): val = operatorgen.genCast(self.curBasicBlock,val,self.curFunctionType.rettype) if val.lval: val = self.genDeref(val) retop = ir.Ret(val.reg) #print ("ret in %s" % self.curBasicBlock) self.curBasicBlock.append(retop)
def visit_Cast(self,cast): totype = types.parseTypeDecl(self.typeTab,cast.to_type) return operatorgen.genCast(self.curBasicBlock,self.inFunctionDispatch(cast.expr),totype)