CodeBlock* FunctionEntry::codeGen() { if(body()!=NULL){ CodeBlock* func_block = new CodeBlock(); func_block->setStartLabel(func_start_); func_block->append(body()->codeGen()); const SymTab* st = this->symTab(); if(st!=NULL){ for(SymTab::const_iterator i = st->begin(); i != st->end(); ++i){ if((*i)->kind()==SymTabEntry::Kind::VARIABLE_KIND){ VariableEntry* ve = (VariableEntry*) (*i); if(ve->varKind()!=VariableEntry::VarKind::PARAM_VAR){ func_block->append(ve->codeGen()); } } } } CodeBlock* func_end = new CodeBlock(); //Loads label from memory ICode lab_addr(ICode::ICodeType::ADD,&MemoryMgr::basePointerRegister(),new Value(returnLabel(),Type::TypeTag::UINT),&mem_reg_); ICode load_lab(ICode::ICodeType::LDI,&mem_reg_,&label_reg_); ICode ret_jmp(ICode::ICodeType::JMPI,&label_reg_); func_end->append(lab_addr); func_end->append(load_lab); func_end->append(ret_jmp); func_block->append(func_end); return func_block; } return NULL; }