Esempio n. 1
0
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;
}