# Path: backend/module.py
# class Module(object):
#     def __init__(self):
#     def packData(self):
#     def _getNewDataLabel(self):
#     def addFunction(self,f):
#     def getFunction(self,name):
#     def __iter__(self):
#     def addZeroInitData(self,sz,label=None):
#     def addReadOnlyData(self,d,label=None):
#     def addReadWriteData(self,d,label=None):
# 
# Path: backend/function.py
# class StackSlot(object):
# class Function(object):
#     def __init__(self,size):
#     def __init__(self,name):
#     def createStackSlot(self,size):
#     def addArgumentSlot(self,ss):
#     def resolveStack(self):
#     def setEntryBlock(self,entry):
#     def stackslots(self):
#     def variables(self):
#     def variables(self, value):
#     def __iter__(self):
# 
# Path: backend/basicblock.py
# class BasicBlock(object):
#     def __init__(self):
#     def __getitem__(self,k):
#     def __setitem__(self,k,v):
#     def __delitem__(self,idx):
#     def insert(self,idx,op):
#     def prepend(self,op):
#     def append(self,op):
#     def __len__(self):
#     def __iter__(self):
#     def __repr__(self):
#     def removeInstructions(self,instructions):
#     def unsafeEnding(self):
#     def getSuccessors(self):
#     def getReachableBlocks(self):
#         def generator():
# 
# Path: backend/ir.py
# class VirtualRegister(object):
# class I32(VirtualRegister):
# class I16(VirtualRegister):
# class I8(VirtualRegister):
# class Pointer(VirtualRegister):
# class ConstantInt(object):
# class ConstantI32(ConstantInt):
# class ConstantI8(ConstantInt):
# class Instruction(object):
# class Binop(Instruction):
# class Unop(Instruction):
# class Call(Instruction):
# class LoadGlobalAddr(Instruction):
# class LoadParamAddr(Instruction):
# class LoadLocalAddr(Instruction):
# class LoadConstant(Instruction):
# class Deref(Instruction):
# class Store(Instruction):
# class Terminator(Instruction):
# class Ret(Terminator):
# class Branch(Terminator):
# class Jmp(Terminator):
# class Phi(Instruction):
# class Move(Instruction):
#     def __init__(self):
#     def isPhysical(self):
#     def __repr__(self):
#     def getSize(self):
#     def getSize(self):
#     def getSize(self):
#     def getSize(self):
#     def getSize(self):
#     def __init__(self,v):
#     def __repr__(self):
#     def __init__(self):
#     def getDagDisplayText(self):
#     def isTerminator(self):
#     def isBranch(self):
#     def swapVar(self,old,new):
#     def swapRead(self,old,new):
#     def swapAssigned(self,old,new):
#     def asm(self):
#     def getSuccessors(self):
#     def setSuccessors(self,new):
#     def swapSuccessor(self,old,new):
#     def getStackSlots(self):
#     def readsMem(self):
#     def writesMem(self):
#     def isMD(self):
#     def isMove(self):
#     def isCall(self):
#     def getClobberedRegisters(self):
#     def getPreClobberedRegisters(self):
#     def __init__(self,op,res,l,r):
#     def getDagDisplayText(self):
#     def __repr__(self):
#     def __init__(self,op,res,arg):
#     def __repr__(self):
#     def __init__(self,label):
#     def __repr__(self):
#     def isCall(self):
#     def readsMem(self):
#     def writesMem(self):
#     def __init__(self,res,sym):
#     def __repr__(self):
#     def __init__(self,res,sym):
#     def __repr__(self):
#     def __init__(self,res,sym):
#     def __repr__(self):
#     def getStackSlots(self):
#     def __init__(self,res,const):
#     def __repr__(self):
#     def __init__(self,out,p):
#     def __repr__(self):
#     def readsMem(self):
#     def __init__(self,p,val):
#     def __repr__(self):
#     def writesMem(self):
#     def isTerminator(self):
#     def getTemplateLookupStr(self):
#     def __init__(self,v=None):
#     def __repr__(self):
#     def __init__(self,v,t,f):
#     def __repr__(self):
#     def __init__(self,dest):
#     def __repr__(self):
#     def __init__(self,lhs,args):
#     def __repr__(self):
#     def __init__(self,l,r):
#     def isMove(self):
#     def __repr__(self):


from pycparser import c_ast
from backend import module
from backend import function
from backend import basicblock
from backend import ir
from valtracker import ValTracker
import types
import cstrings
import operatorgen
            self.assertNonVoid(rv)
            if rv.lval:
                rv = self.genDeref(rv)
            
            #create some new virtual registers
            constZero = lv.clone()
            
            self.curBasicBlock.append(ir.LoadConstant(constZero.reg,ir.ConstantI32(0)))
            self.curBasicBlock.append(ir.Binop('!=',result2.reg,rv.reg,constZero.reg))
            
            result2Reaching = self.curBasicBlock
            
            if self.curBasicBlock.unsafeEnding():
                self.curBasicBlock.append(ir.Jmp(next))
            
            self.curBasicBlock = next
            self.curBasicBlock.append(ir.Phi(result3.reg,[(result2.reg,result2Reaching),(result1.reg,shortCircuit)]))
            
            return result3
            
        else: # a normal binop
            rv = self.inFunctionDispatch(node.right)
            self.assertNonVoid(lv)
            self.assertNonVoid(rv)
            return operatorgen.genBinop(self.curBasicBlock,node.op,lv,rv)
    
    def visit_ID(self,node):
        
        sym = self.symTab.lookupSymbol(node.name)
        

# Path: backend/module.py
# class Module(object):
#     def __init__(self):
#     def packData(self):
#     def _getNewDataLabel(self):
#     def addFunction(self,f):
#     def getFunction(self,name):
#     def __iter__(self):
#     def addZeroInitData(self,sz,label=None):
#     def addReadOnlyData(self,d,label=None):
#     def addReadWriteData(self,d,label=None):
# 
# Path: backend/function.py
# class StackSlot(object):
# class Function(object):
#     def __init__(self,size):
#     def __init__(self,name):
#     def createStackSlot(self,size):
#     def addArgumentSlot(self,ss):
#     def resolveStack(self):
#     def setEntryBlock(self,entry):
#     def stackslots(self):
#     def variables(self):
#     def variables(self, value):
#     def __iter__(self):
# 
# Path: backend/basicblock.py
# class BasicBlock(object):
#     def __init__(self):
#     def __getitem__(self,k):
#     def __setitem__(self,k,v):
#     def __delitem__(self,idx):
#     def insert(self,idx,op):
#     def prepend(self,op):
#     def append(self,op):
#     def __len__(self):
#     def __iter__(self):
#     def __repr__(self):
#     def removeInstructions(self,instructions):
#     def unsafeEnding(self):
#     def getSuccessors(self):
#     def getReachableBlocks(self):
#         def generator():
# 
# Path: backend/ir.py
# class VirtualRegister(object):
# class I32(VirtualRegister):
# class I16(VirtualRegister):
# class I8(VirtualRegister):
# class Pointer(VirtualRegister):
# class ConstantInt(object):
# class ConstantI32(ConstantInt):
# class ConstantI8(ConstantInt):
# class Instruction(object):
# class Binop(Instruction):
# class Unop(Instruction):
# class Call(Instruction):
# class LoadGlobalAddr(Instruction):
# class LoadParamAddr(Instruction):
# class LoadLocalAddr(Instruction):
# class LoadConstant(Instruction):
# class Deref(Instruction):
# class Store(Instruction):
# class Terminator(Instruction):
# class Ret(Terminator):
# class Branch(Terminator):
# class Jmp(Terminator):
# class Phi(Instruction):
# class Move(Instruction):
#     def __init__(self):
#     def isPhysical(self):
#     def __repr__(self):
#     def getSize(self):
#     def getSize(self):
#     def getSize(self):
#     def getSize(self):
#     def getSize(self):
#     def __init__(self,v):
#     def __repr__(self):
#     def __init__(self):
#     def getDagDisplayText(self):
#     def isTerminator(self):
#     def isBranch(self):
#     def swapVar(self,old,new):
#     def swapRead(self,old,new):
#     def swapAssigned(self,old,new):
#     def asm(self):
#     def getSuccessors(self):
#     def setSuccessors(self,new):
#     def swapSuccessor(self,old,new):
#     def getStackSlots(self):
#     def readsMem(self):
#     def writesMem(self):
#     def isMD(self):
#     def isMove(self):
#     def isCall(self):
#     def getClobberedRegisters(self):
#     def getPreClobberedRegisters(self):
#     def __init__(self,op,res,l,r):
#     def getDagDisplayText(self):
#     def __repr__(self):
#     def __init__(self,op,res,arg):
#     def __repr__(self):
#     def __init__(self,label):
#     def __repr__(self):
#     def isCall(self):
#     def readsMem(self):
#     def writesMem(self):
#     def __init__(self,res,sym):
#     def __repr__(self):
#     def __init__(self,res,sym):
#     def __repr__(self):
#     def __init__(self,res,sym):
#     def __repr__(self):
#     def getStackSlots(self):
#     def __init__(self,res,const):
#     def __repr__(self):
#     def __init__(self,out,p):
#     def __repr__(self):
#     def readsMem(self):
#     def __init__(self,p,val):
#     def __repr__(self):
#     def writesMem(self):
#     def isTerminator(self):
#     def getTemplateLookupStr(self):
#     def __init__(self,v=None):
#     def __repr__(self):
#     def __init__(self,v,t,f):
#     def __repr__(self):
#     def __init__(self,dest):
#     def __repr__(self):
#     def __init__(self,lhs,args):
#     def __repr__(self):
#     def __init__(self,l,r):
#     def isMove(self):
#     def __repr__(self):


# Path: c/irgen.py
from pycparser import c_ast
from backend import module
from backend import function
from backend import basicblock
from backend import ir
from valtracker import ValTracker
import types
import cstrings
import operatorgen

            self.assertNonVoid(rv)
            if rv.lval:
                rv = self.genDeref(rv)
            
            #create some new virtual registers
            constZero = lv.clone()
            
            self.curBasicBlock.append(ir.LoadConstant(constZero.reg,ir.ConstantI32(0)))
            self.curBasicBlock.append(ir.Binop('!=',result2.reg,rv.reg,constZero.reg))
            
            result2Reaching = self.curBasicBlock
            
            if self.curBasicBlock.unsafeEnding():
                self.curBasicBlock.append(ir.Jmp(next))
            
            self.curBasicBlock = next
            self.curBasicBlock.append(ir.Phi(result3.reg,[(result2.reg,result2Reaching),(result1.reg,shortCircuit)]))
            
            return result3
            
        else: # a normal binop
            rv = self.inFunctionDispatch(node.right)
            self.assertNonVoid(lv)
            self.assertNonVoid(rv)
            return operatorgen.genBinop(self.curBasicBlock,node.op,lv,rv)
    
    def visit_ID(self,node):
        
        sym = self.symTab.lookupSymbol(node.name)
        

        reg = ir.Pointer()