Esempio n. 1
0
void FunctionEntry::memAlloc(MemoryMgr &mm){
	memory_mgr_ = MemoryMgr();

	const SymTab* st = this->symTab();
	bool p_var = true;
	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 && p_var){
					//Parameters
					ve->offSet(memory_mgr_.getNextAddress());
				} else {
					if(p_var){
						//Set control_link_ and return_address_
						returnLabel(memory_mgr_.getNextAddress());
						returnOffset(memory_mgr_.getNextAddress());
						controlLink(memory_mgr_.getNextAddress());
						p_var = false;
					}
					//Local variables declared in function
					ve->memAlloc(memory_mgr_);
				}
			}
		}
		if(p_var){
			returnLabel(memory_mgr_.getNextAddress());
			returnOffset(memory_mgr_.getNextAddress());
			controlLink(memory_mgr_.getNextAddress());
		}
	}
	if(body()!=NULL){
		body()->memAlloc(memory_mgr_);

		//Used for returning in case function reaches the end of its body without a return statement
		mem_reg_ = memory_mgr_.getNextRegister(true);
		memory_mgr_.addRegister(mem_reg_);
		label_reg_ = memory_mgr_.getNextRegister(true);
		memory_mgr_.addRegister(label_reg_);
		memory_mgr_.freeRegister(mem_reg_);
		memory_mgr_.freeRegister(label_reg_);
	}
}