package de.fuberlin.projectF.CodeGenerator; import java.util.HashMap; import java.util.List; import de.fuberlin.projectF.CodeGenerator.model.Array; import de.fuberlin.projectF.CodeGenerator.model.ArrayPointer; import de.fuberlin.projectF.CodeGenerator.model.MMXRegisterAddress; import de.fuberlin.projectF.CodeGenerator.model.Record; import de.fuberlin.projectF.CodeGenerator.model.Reference; import de.fuberlin.projectF.CodeGenerator.model.RegisterAddress; import de.fuberlin.projectF.CodeGenerator.model.StackAddress; import de.fuberlin.projectF.CodeGenerator.model.Variable; public class MemoryManager { HashMap<String, MemoryContext> contexts; HashMap<String, Variable> globalReferences; MemoryContext current; public MemoryManager() { contexts = new HashMap<String, MemoryContext>(); globalReferences = new HashMap<String, Variable>(); } public void addGlobalVar(String name) { Variable tmp; if (current != null) { tmp = new Variable(current.getName() + "." + name, 0); } else { tmp = new Variable("main." + name, 0); } globalReferences.put(tmp.getName(), tmp); } public void addGlobalVar(Variable var) { globalReferences.put(var.getName(), var); } public String getContextName() { if (current != null) return current.getName(); return "main"; } public void addMMXRegVar(String name, String type, MMXRegisterAddress reg) { current.addMMXRegVar(name, type, reg); } public void addRegVar(String name, String type, RegisterAddress reg) { current.addRegVar(name, type, reg); } public void addStackVar(String name, String type, int stackAddress) { current.addStackVar(name, type, stackAddress); } public ArrayPointer contArrayPtr(String name, String lastPtr, String offset, String value) { return current.contArrayPtr(name, lastPtr, offset, value); } public void freeMMXRegister(MMXRegisterAddress tmp) { current.freeMMXRegister(tmp); } public void freeRegister(RegisterAddress k) { current.freeRegister(k); } public String getAddress(String name) { if (current != null) { if (globalReferences.containsKey(current.getName() + "." + name)) return globalReferences.get(current.getName() + "." + name) .getName(); return current.get(name).getAddress(); } else { if (globalReferences.containsKey("main." + name)) return globalReferences.get("main." + name).getName(); return null; } } public String getAddress(String name, int offset) { return current.get(name).getAddress(offset); } public MMXRegisterAddress getFreeMMXRegister() { return current.getFreeMMXRegister(); } public RegisterAddress getFreeRegister() { return current.getFreeRegister(); } public List<Variable> getMMXRegVariables() { return current.getMMXRegVariables(); } public List<Variable> getRegVariables() { return current.getRegVariables(); } public boolean inMMXReg(String name) { if (globalReferences.containsKey(name)) return false; return current.inMMXReg(name); } public boolean inReg(String name, int regNumber) { if (globalReferences.containsKey(name)) return false; return current.inReg(name, regNumber); } public void MMXRegToStack(Variable var) { current.MMXRegToStack(var); } public Array newArray(String name, String type, int length) { return current.newArray(name, type, length); } public Record newRecord(Record rec) { return current.newRecord(rec); } public ArrayPointer newArrayPtr(String name, String arr, String offset, RegisterAddress reg) { return current.newArrayPtr(name, arr, offset, reg); } public void newContext(String name) { contexts.put(name, new MemoryContext(name)); } public void newRecordPtr(String target, String op1, String op2) { current.newRecordPtr(target, op1, op2); } public void newReference(String name, String var) { if (globalReferences.containsKey(current.getName() + "." + var)) globalReferences.put(current.getName() + "." + name, globalReferences.get(current.getName() + "." + var)); else current.newReference(name, var); } public Variable newStackVar(String name, String type) { return current.newStackVar(name, type); } public boolean onStack(String name) { if (globalReferences.containsKey(name)) return false; return current.onStack(name); } public StackAddress regToStack(Variable var) { return current.regToStack(var); } public void setContext(String name) { current = contexts.get(name); } public Array getArray(String name) { return current.getArray(name); } public HashMap<RegisterAddress, Reference> getUsedRegisters() { return current.getUsedRegisters(); } public RegisterAddress getRegister(int i) { return current.getRegister(i); } public MMXRegisterAddress getMMXRegister(int i) { return current.getMMXRegister(i); } public boolean isFree(int i) { return current.isFree(i); } public HashMap<MMXRegisterAddress, Variable> getUsedMMXRegisters() { return current.getUsedMMXRegisters(); } public StackAddress mmxRegToStack(Variable var) { return current.mmxRegToStack(var); } public void freeArrayPointer(String target) { current.freeArrayPointer(target); } }