[llvm-commits] CVS: llvm/lib/Reoptimizer/TraceCache/TraceCache.cpp
Anand Shukla
ashukla at cs.uiuc.edu
Thu Jul 10 13:58:07 PDT 2003
Changes in directory llvm/lib/Reoptimizer/TraceCache:
TraceCache.cpp updated: 1.13 -> 1.14
---
Log message:
Some cleanup, and some additions for new trace framework
---
Diffs of the changes:
Index: llvm/lib/Reoptimizer/TraceCache/TraceCache.cpp
diff -u llvm/lib/Reoptimizer/TraceCache/TraceCache.cpp:1.13 llvm/lib/Reoptimizer/TraceCache/TraceCache.cpp:1.14
--- llvm/lib/Reoptimizer/TraceCache/TraceCache.cpp:1.13 Thu Jun 5 16:02:07 2003
+++ llvm/lib/Reoptimizer/TraceCache/TraceCache.cpp Thu Jul 10 13:57:39 2003
@@ -19,7 +19,6 @@
#include "llvm/Reoptimizer/MemoryManager.h"
#include "llvm/Reoptimizer/TraceCache.h"
-#include "llvm/Reoptimizer/TraceCache2.h"
#include "llvm/Reoptimizer/VirtualMem.h"
#include "llvm/Reoptimizer/InstrUtils.h"
#include "llvm/Reoptimizer/GetTraceTime.h"
@@ -27,6 +26,8 @@
#include <algorithm>
#include <iostream>
+//#define GET_ALL_INFO
+
using std::cerr;
TraceCache::TraceCache(int limitSize){
@@ -62,95 +63,32 @@
vm = vmem;
}
-void TraceCache::setLimit(int n) {
- assert(isLimitSet && "can't chage limit, if not set initially");
- assert(currSize < n && "trying to set to a smaller limit than current size");
- limit = n;
-}
-
-//add an array of instructions (trace[]), whose first instruction
-//has address instrAddr in the original program
-//size of array is sz (number of instructions)
-// returns false if cannot assign space to trace
-
-//Do the following:
-//1. Insert a jump at location instrAddr with target as new trace
-bool TraceCache::addTrace(uint64_t instAddr,
- std::vector<unsigned int> &trace,
- int traceUniqId,
- std::map<int, uint64_t> &callMap,
- std::map<int, int> &branchMap){
-
- //remove trace if its already there
- if(hasTraceAddr(instAddr))
- removeTrace(instAddr);
+TraceCache::TraceCache(unsigned int memSize, VirtualMem *vmem){
+ mm = new MemoryManager(memSize);
- int sz = trace.size();
-
- while(isLimitSet && currSize+sz>limit){
- if(currSize == 0)
- return false;
-
- //erase first addr from queue
- assert(allocationOrder.size()>0 && "No entries in trace!");
- uint64_t addr = allocationOrder.front();
- allocationOrder.pop_front();
- removeTrace(addr);
- }
-
- uint64_t traceStartAddr = mm->getMemory(sz);
-
- if(traceStartAddr == 0) return false; //could not allocate space!
-
- //copy trace to the memory
- vm->copyToVM(trace, traceStartAddr);
+ isLimitSet = true; //making limit as the size of memory
+ currSize = 0;
+ limit = mm->getMemSize();
- traces[instAddr] = traceStartAddr;
- traceId[traceUniqId] = traceStartAddr;
- reverseTraceId[instAddr] = traceUniqId;
- traceSize[instAddr] = sz;
- reverseMap[traceStartAddr] = instAddr;
- currSize += sz;
-
- //add instAddr to queue
- allocationOrder.push_back(instAddr);
-
- //copy the first few instructions of the trace in the original code
- //and write a jump instruction in its place
- traceInstructions[instAddr].push_back(vm->readInstrFrmVm(instAddr));
- traceInstructions[instAddr].push_back(vm->readInstrFrmVm(instAddr+4));
-
-#ifdef GET_TRACE_TIME
- //two more: to accomodate call instruction and get time!
- traceInstructions[instAddr].push_back(vm->readInstrFrmVm(instAddr+8));
- traceInstructions[instAddr].push_back(vm->readInstrFrmVm(instAddr+12));
+ vm = vmem;
+}
- //write call instruction!
- vm->writeCallLLVMTime(instAddr);
- //Now write branch instruction with target as
- //traceStartAddr at the address instAddr
- vm->writeBranchInstruction(instAddr+8, traceStartAddr);
-#endif
+TraceCache::TraceCache(int (*dfunc)(int), unsigned int memSize,
+ VirtualMem *vmem){
+ mm = new MemoryManager(dfunc, memSize);
-#ifndef GET_TRACE_TIME
- vm->writeBranchInstruction(instAddr, traceStartAddr);
-#endif
-
- //now set correctly all branches
- vm->setBranches(branchMap, traceStartAddr);
-
- //set correctly all calls
- vm->setCalls(callMap, traceStartAddr);
-
- doFlush(traceStartAddr, traceStartAddr+4*sz);
- doFlush(instAddr, instAddr+4);
+ isLimitSet = true; //making limit as the size of memory
+ currSize = 0;
+ limit = mm->getMemSize();
+
+ vm = vmem;
+}
-#ifdef GET_TRACE_TIME
- doFlush(instAddr+8, instAddr+12);
-#endif
-
- return true;
+void TraceCache::setLimit(int n) {
+ assert(isLimitSet && "can't chage limit, if not set initially");
+ assert(currSize < n && "trying to set to a smaller limit than current size");
+ limit = n;
}
bool TraceCache::hasTraceInstructions(uint64_t addr){
@@ -158,6 +96,14 @@
traceInstructions[addr].size()!=0);
}
+uint64_t TraceCache::getEndAddress(uint64_t addr){
+ if(endAddress.find(addr) != endAddress.end())
+ return endAddress[addr];
+
+ return 0;
+}
+
+
unsigned int TraceCache::getAddr(uint64_t addr){
if(hasTraceInstructions(addr))
return traceInstructions[addr][0];
@@ -178,17 +124,24 @@
return traceInstructions[addr];
}
+//add an array of instructions (trace[]), whose first instruction
+//has address instrAddr in the original program
+//size of array is sz (number of instructions)
+// returns false if cannot assign space to trace
+
+////USING THIS
//Do the following:
//1. Insert a jump at location instrAddr with target as new trace
-bool TraceCache::addTrace(uint64_t instAddr,
- std::vector<unsigned int> &trace,
- int traceUniqId,
- std::map<int, uint64_t> &callMap,
- std::map<int, uint64_t> &branchMap, TraceCache2 *tr2){
+bool TraceCache::addTrace(uint64_t &instAddr,
+ uint64_t &endAddr,
+ std::vector<unsigned int> &trace,
+ uint64_t traceUniqId,
+ std::map<int, uint64_t> &callMap,
+ std::map<int, uint64_t> &branchMap, TraceCache *tr2){
//remove trace if its already there
- //if(hasTraceAddr(instAddr))
- //removeTrace(instAddr);
+ if(hasTraceAddr(instAddr))
+ removeTrace(instAddr);
int sz = trace.size();
@@ -199,7 +152,7 @@
while(isLimitSet && currSize+sz>limit){
- assert(0 && "out of space");
+ //assert(0 && "out of space");
if(currSize == 0)
return false;
@@ -219,6 +172,7 @@
vm->copyToVM(trace, traceStartAddr);
traces[instAddr] = traceStartAddr;
+ endAddress[instAddr] = endAddr;
traceId[traceUniqId] = traceStartAddr;
reverseTraceId[instAddr] = traceUniqId;
traceSize[instAddr] = sz;
@@ -296,6 +250,10 @@
if(traces.find(n) == traces.end())
return;
+#ifdef GET_ALL_INFO
+ std::cerr<<"Removing-trace\t"<<(void *)n<<"\t"<<(void *)endAddress[n]<<"\n";
+#endif
+
uint64_t toRemove = traces[n];
//put back the original instruction at n
@@ -321,6 +279,7 @@
currSize -= traceSize[n];
//remove allocated spaces to n
traces.erase(n);
+ endAddress.erase(n);
traceId.erase(reverseTraceId[n]);
reverseTraceId.erase(n);
traceSize.erase(n);
@@ -332,7 +291,7 @@
bool TraceCache::addTrace(uint64_t instAddr,
std::vector<unsigned int> &trace,
- int traceUniqId,
+ uint64_t traceUniqId,
std::map<int, uint64_t> &callMap,
std::map<int, int> &branchMap,
std::vector<unsigned int> *exitStubs){
@@ -416,7 +375,7 @@
//#undef GET_TRACE_TIME
bool TraceCache::addTrace(uint64_t instAddr, int sz,
- int traceUniqId, uint64_t &addr){
+ uint64_t traceUniqId, uint64_t &addr){
//remove trace if its already there
if(hasTraceAddr(instAddr))
@@ -480,29 +439,32 @@
return true;
}
+//USING THIS
//Do the following:
//1. Insert a jump at location instrAddr with target as new trace
-bool TraceCache::addTrace(uint64_t instAddr,
+bool TraceCache::addTrace(uint64_t instAddr,
+ uint64_t endAddr,
std::vector<unsigned int> &trace,
- int traceUniqId,
+ uint64_t traceUniqId,
std::map<int, uint64_t> &callMap,
std::map<int, uint64_t> &myBranchMap,
std::map<int, int> &branchMap,
- uint64_t firstLevelTraceStartAddr){
+ uint64_t firstLevelTraceStartAddr, TraceCache *tr){
//remove trace if its already there
- //if(hasTraceAddr(instAddr))// && uniqueID(instAddrtraceUniqId))
- //removeTrace(instAddr);
+ if(hasTraceAddr(instAddr))// && uniqueID(instAddrtraceUniqId))
+ removeTrace(instAddr);
int sz = trace.size();
+
if(sz%8){
sz = sz - (sz % 8);
sz = sz + 8;
}
-
+
while(isLimitSet && currSize+sz>limit){
- assert(0 && "Can't allocate more mem!");
+ //assert(0 && "Can't allocate more mem!");
if(currSize == 0)
return false;
@@ -522,7 +484,7 @@
vm->copyToVM(trace, traceStartAddr);
traces[instAddr] = traceStartAddr;
-
+ endAddress[instAddr] = endAddr;
traceId[traceUniqId] = traceStartAddr;
reverseTraceId[instAddr] = traceUniqId;
traceSize[instAddr] = sz;
@@ -532,16 +494,22 @@
//add instAddr to queue
allocationOrder.push_back(instAddr);
- //copy the first few instructions of the trace in the original code
- //and write a jump instruction in its place
- traceInstructions[instAddr].push_back(vm->readInstrFrmVm(instAddr));
- traceInstructions[instAddr].push_back(vm->readInstrFrmVm(instAddr+4));
-
+ bool ifPushed = false;
+ if(!hasTraceInstructions(instAddr)){
+ //traceInstructions[instAddr].clear();
+ //copy the first few instructions of the trace in the original code
+ //and write a jump instruction in its place
+ traceInstructions[instAddr].push_back(vm->readInstrFrmVm(instAddr, tr));
+ //traceInstructions[instAddr].push_back(vm->readInstrFrmVm(instAddr+4));
+ ifPushed = true;
+ }
#ifdef GET_TRACE_TIME
- //two more: to accomodate call instruction and get time!
- traceInstructions[instAddr].push_back(vm->readInstrFrmVm(instAddr+8));
- traceInstructions[instAddr].push_back(vm->readInstrFrmVm(instAddr+12));
-
+ if(ifPushed){
+ //two more: to accomodate call instruction and get time!
+ traceInstructions[instAddr].push_back(vm->readInstrFrmVm(instAddr+4, tr));
+ traceInstructions[instAddr].push_back(vm->readInstrFrmVm(instAddr+8, tr));
+ ifPushed = false;
+ }
//write call instruction!
vm->writeCallLLVMTime(instAddr);
@@ -571,7 +539,7 @@
#endif
//now write branch in the level 1 tracecache
- vm->writeBranchInstruction(firstLevelTraceStartAddr+4, traceStartAddr);
+ vm->writeBranchInstruction(firstLevelTraceStartAddr, traceStartAddr);
doFlush(firstLevelTraceStartAddr+4, firstLevelTraceStartAddr+20);
return true;
@@ -590,4 +558,16 @@
return RMI->first;
abort();
-}
+}
+
+bool TraceCache::hasTraceInRange(uint64_t addr1, uint64_t addr2){
+ for(std::map<uint64_t, uint64_t>::iterator MI = traces.begin(),
+ ME = traces.end(); MI != ME; ++MI)
+ if(MI->first >= addr1 &&
+ (endAddress.find(addr1) != endAddress.end() &&
+ endAddress[addr1] <= addr2))
+ return true;
+
+ return false;
+}
+
More information about the llvm-commits
mailing list