[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