////////////////////////////////////////////////////////////////////////////// //Copyright 2008 // Andrew Gacek, Steven Holte, Gopalan Nadathur, Xiaochu Qi, Zach Snow ////////////////////////////////////////////////////////////////////////////// // This file is part of Teyjus. // // // // Teyjus is free software: you can redistribute it and/or modify // // it under the terms of the GNU General Public License as published by // // the Free Software Foundation, either version 3 of the License, or // // (at your option) any later version. // // // // Teyjus is distributed in the hope that it will be useful, // // but WITHOUT ANY WARRANTY; without even the implied warranty of // // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // // GNU General Public License for more details. // // // // You should have received a copy of the GNU General Public License // // along with Teyjus. If not, see . // ////////////////////////////////////////////////////////////////////////////// #ifndef MEMORY_C #define MEMORY_C #include #include #include "error.h" #include "memory.h" #include "error.h" #include "../tables/pervasives.h" #include "../tables/pervinit.h" #include "../simulator/mctypes.h" /******************************************************************************/ /* SYSTEM MEMORY MANAGEMENT */ /******************************************************************************/ WordPtr MEM_memBeg; //starting addr of the system memory WordPtr MEM_memEnd; //end addr of the system memory WordPtr MEM_memTop; //the first usable word in the system memory WordPtr MEM_memBot; //the last usable word in the system memory /* Asking for the system memory of a given size (in word), */ /* and initialize relevant global variables. */ void MEM_memInit(unsigned int size) { MEM_memBeg = MEM_memTop = (WordPtr)EM_malloc(size * sizeof(Word)); MEM_memEnd = MEM_memBot = MEM_memBeg + (size - 1); } /* Asking the simulator (system) memory for space of a given size (in word) */ WordPtr MEM_memExtend(unsigned int size) { WordPtr rtPtr = MEM_memTop; if ((MEM_memTop + size) > MEM_memBot) EM_error(EM_OUT_OF_MEMORY); else MEM_memTop += size; return rtPtr; } /*****************************************************************************/ /* ACCESSING THE IMPLICATION GOAL TABLE */ /*****************************************************************************/ /* functions for filling in the fields of a impl table */ //#pred field (def extended) void MEM_implPutLTS(WordPtr tab, int lts) { *((int *)tab) = lts; } //ptr to find code func void MEM_implPutFC(WordPtr tab, MEM_FindCodeFnPtr fcPtr) { *((MEM_FindCodeFnPtr *)(tab + 1)) = fcPtr; } //num entries in the link tab void MEM_implPutPSTS(WordPtr tab, int tabSize){ *((int *)(tab + 2)) = tabSize;} //fill in the ith entry of the link tab //Note: index should start from 0 void MEM_implPutLT(WordPtr tab, int ind, int cst) { *((int *)(tab + 3 + ind)) = cst; } /* functions for retrieving the addresses of associated tables */ //start add of seq. of pred (link tab) MemPtr MEM_implLT(MemPtr tab) { return (tab + 3); } //start add of search tab MemPtr MEM_implPST(MemPtr tab, int lts) { return (tab + 3 + lts); } /* functions for retrieving the fields of a impl table */ //pred field (def extended) int MEM_implLTS(MemPtr tab) { return *((int *)tab); } //ptr to find code func MEM_FindCodeFnPtr MEM_implFC(MemPtr tab){return *((MEM_FindCodeFnPtr*)(tab+1));} //num entries in the link tab int MEM_implPSTS(MemPtr tab) { return *((int *)(tab + 2)); } //ith entry in the link table //Note: a) given address should be the start addr of the link table // b) index starts from 0 int MEM_implIthLT(MemPtr lt, int index) { return *((int *)(lt + index)); } /***************************************************************************** * ACCESSING THE IMPORTED MODULE TABLE * *****************************************************************************/ /* functions for filling in the fields of an import table */ /* Q: the data stored in each field in byte code: are they word or in their */ /* specific types? */ //# code segments void MEM_impPutNCSEG(WordPtr tab, int nseg) {*((int *)tab) = nseg; } //# local constants void MEM_impPutNLC(WordPtr tab, int nlc) {*((int *)(tab + 1)) = nlc; } //# pred (def extended) void MEM_impPutLTS(WordPtr tab, int lts) {*((int *)(tab + 2)) = lts; } //ptr to find code func void MEM_impPutFC(WordPtr tab, MEM_FindCodeFnPtr fcp) { *((MEM_FindCodeFnPtr *)(tab + 3)) = fcp; } //# entries in link tab void MEM_impPutPSTS(WordPtr tab, int tabSize){*((int *)(tab + 4)) = tabSize;} //link tab //Note: ind should start from 0 void MEM_impPutLT(WordPtr tab, int ind, int cst) { *((int *)(tab+5+ind)) = cst; } //loc c tab(may null) //Note 1) the input tab addr should be the starting addr of the local const tab // 2) ind should start from 0 void MEM_impPutLCT(WordPtr lcTab, int ind, int cst) { *((int *)(lcTab+ind)) = cst; } /* functions for retrieving the addresses of associated tables */ //start addr of seq. of pred names (link tab) MemPtr MEM_impLT(MemPtr tab) { return (tab + 5); } //start addr of local const tab (possible null) MemPtr MEM_impLCT(MemPtr tab, int lts) { return (tab + 5 + lts); } //start addr of search tab MemPtr MEM_impPST(MemPtr tab, int lts, int nlc) { return (tab + 5 + lts + nlc);} /* functions for retrieving the fields of a impl table */ //# code segments int MEM_impNCSEG(MemPtr tab) { return *((int *)tab); } //# local constants int MEM_impNLC(MemPtr tab) { return *((int *)(tab+1)); } //# of preds (def extended) int MEM_impLTS(MemPtr tab) { return *((int *)(tab+2)); } //ptr to find code func MEM_FindCodeFnPtr MEM_impFC(MemPtr tab){return *((MEM_FindCodeFnPtr *)(tab+3));} //# entries in pred name tab int MEM_impPSTS(MemPtr tab) { return *((int *)(tab+4)); } //ith entry in the link table //Note 1) the input tab addr should be the starting addr of the link tab // 2) ind should start from 0 int MEM_impIthLT(MemPtr lt, int ind) { return *((int *)(lt + ind)); } //ith entry in the local const table //Note 1) the input tab addr should be the starting addr of the local const tab // 2) ind should start from 0 int MEM_impIthLCT(MemPtr lct, int ind) { return *((int *)(lct + ind)); } /*****************************************************************************/ /* ACCESSING THE BOUND VARIABLE INDEXING TABLE (BRACHING TABLE) */ /*****************************************************************************/ int MEM_branchTabIndexVal(MemPtr tab, int index) //the nth index value { return *((int *)(tab + 8*index)); } CSpacePtr MEM_branchTabCodePtr(MemPtr tab, int index) //transfer addr { return *((CSpacePtr *)(tab + 8*index + 4)); } /*****************************************************************************/ /* GLOBAL MODULE TABLE */ /*****************************************************************************/ MEM_Gmt MEM_modTable; //global module table MEM_GmtEnt *MEM_findInModTable(char* name) { int i; char *myname; for (i = 0; i <= MEM_MAX_MODULES; i++) { if (myname = MEM_modTable[i].modname) if (strcmp(myname, name) == 0) return (MEM_modTable + i); } // module must have been found: failure must have been caught by the OCaml // find module function return NULL; } MEM_GmtEnt *MEM_findFreeModTableEntry() { int i; for (i = 0; i<= MEM_MAX_MODULES; i++) { if (MEM_modTable[i].modname != NULL) return (MEM_modTable + i); } // impossible to fail: failure must have been caught by the OCaml // find module function return NULL; } void MEM_removeModTableEntry(char* name) { MEM_GmtEnt *mod; mod = MEM_findInModTable(name); free(mod -> modname); mod -> modname = NULL; } MEM_GmtEnt MEM_topModule; //top module void MEM_topModuleInit() { WordPtr memTop = MEM_memTop; MEM_KstPtr kst=(MEM_KstPtr)MEM_memExtend(MEM_KST_ENTRY_SIZE*PERV_KIND_NUM); MEM_TstPtr tst=(MEM_TstPtr)MEM_memExtend(MEM_TST_ENTRY_SIZE*PERV_TY_SKEL_NUM); MEM_CstPtr cst=(MEM_CstPtr)MEM_memExtend(MEM_CST_ENTRY_SIZE*PERV_CONST_NUM); PERVINIT_copyKindDataTab(kst); PERVINIT_copyTySkelTab(tst); PERVINIT_copyConstDataTab(cst); MEM_topModule.modname = ""; MEM_topModule.addtable = NULL; MEM_topModule.kstBase = kst; MEM_topModule.tstBase = tst; MEM_topModule.cstBase = cst; MEM_topModule.modSpaceBeg = memTop; MEM_topModule.modSpaceEnd = MEM_memTop; MEM_topModule.codeSpaceBeg = NULL; MEM_topModule.codeSpaceEnd = NULL; } MEM_GmtEnt *MEM_currentModule; //current module being used #endif //MEMORY_C