Пример #1
0
 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
Пример #2
0
    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)
Пример #3
0
    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)
Пример #4
0
 def visit_Cast(self,cast):
     totype = types.parseTypeDecl(self.typeTab,cast.to_type)
     return operatorgen.genCast(self.curBasicBlock,self.inFunctionDispatch(cast.expr),totype)