00001 #ifndef _CountAllBlocks_h_
00002 #define _CountAllBlocks_h_
00003
00004 #include <Generate.h>
00005
00006 class CountAllBlocks : public XCoffFileGen {
00007 protected:
00008 static char* staticPrintExtension;
00009 uint32_t libraryFunctionCount;
00010
00011 BasicBlock** blocksToInstrument;
00012 BasicBlock* terminationBlock;
00013 uint32_t numOfBlocksFiltered;
00014
00015
00016
00017 uint64_t extendedBeginAddr;
00018
00019 uint64_t execTOCAddress;
00020 uint32_t tocXorUpdateVal;
00021 uint32_t tocDistUpdateVal;
00022
00023 uint64_t libraryFunctionStubAddrLocs[4];
00024 uint64_t libraryFuncStubAddrs[4];
00025
00026 uint64_t saveAddressCondReg;
00027 uint64_t saveAddressFPCondReg;
00028
00029 uint64_t saveAddressLinkReg;
00030 uint64_t saveAddressCtrReg;
00031 uint64_t saveAddressExpReg;
00032
00033 uint64_t saveAddressGprRegs;
00034 uint64_t saveAddressFprRegs;
00035
00036 uint64_t dataBufferAddress;
00037
00038 uint64_t commentAddress;
00039 char* sharedLibraryInfoStr;
00040
00041
00042
00043 public:
00044 CountAllBlocks(XCoffFile* xcoff,char* extension,uint32_t phaseNo);
00045 virtual ~CountAllBlocks() { }
00046
00047 void selectInstrumentationPoints(char* blockFile);
00048
00049 uint32_t maxByteCountPerInst() { return 32 * sizeof(uint32_t); }
00050 uint32_t byteCountForInst(uint32_t instPointIdx,uint64_t instStubAddress,TextSection* textSect);
00051 uint32_t generateCodeForInst(uint32_t instPointIdx,uint64_t instStubAddress,TextSection* textSect,
00052 BaseGen* gen,uint32_t genBufferOffset);
00053 uint32_t bytesPerBufferEntry() { return sizeof(uint64_t); }
00054 uint32_t howManyBufferEntry() { return 1; }
00055 bool filterBlockForInst(BasicBlock* bb);
00056 char* getSharedLibFuncName(uint32_t i){
00057 ASSERT(i < getNumOfSharedLibFuncs());
00058 return "MetaSim_endFuncCall_Freq";
00059 }
00060 char* getGenClassName() { return "CountAllBlocks"; }
00061 uint32_t spaceForBlockInfo() { return 0; }
00062 void getSharedLibraryPathAndObj(char** path,char** name,char** obj);
00063
00064 void initializeReservedData(DataSection* dataSect,BaseGen* gen);
00065 void reserveDataForInstrumentation();
00066
00067 int32_t getDataOffsetForInst(uint32_t idx){
00068 return (int32_t)(dataBufferAddress - execTOCAddress - tocDistUpdateVal);
00069 }
00070
00071 uint32_t getNumOfSharedLibFuncs() { return libraryFunctionCount; }
00072 uint32_t byteCountForSharedLibFuncWrappers() { return (getNumOfSharedLibFuncs() * 100 * sizeof(uint32_t)); }
00073 void setAddrOfSharedLibFuncWrapper(uint32_t i,uint64_t addr) { ASSERT(i<libraryFunctionCount) ; libraryFuncStubAddrs[i] = addr; }
00074
00075 int32_t getGPRSaveOffset(uint32_t reg){
00076 return (int32_t)(saveAddressGprRegs + (sizeof(uint64_t)*reg) - execTOCAddress - tocDistUpdateVal);
00077 }
00078 int32_t getFPRSaveOffset(uint32_t reg){
00079 return (int32_t)(saveAddressFprRegs + (sizeof(uint64_t)*reg) - execTOCAddress - tocDistUpdateVal);
00080 }
00081 int32_t getCRSaveOffset(){
00082 return (int32_t)(saveAddressCondReg - execTOCAddress - tocDistUpdateVal);
00083 }
00084 int32_t getFPSCRSaveOffset(){
00085 return (int32_t)(saveAddressFPCondReg - execTOCAddress - tocDistUpdateVal);
00086 }
00087 int32_t getEXRSaveOffset(){
00088 return (int32_t)(saveAddressExpReg - execTOCAddress - tocDistUpdateVal);
00089 }
00090 int32_t getCTRSaveOffset(){
00091 return (int32_t)(saveAddressCtrReg - execTOCAddress - tocDistUpdateVal);
00092 }
00093 int32_t getLNKSaveOffset(){
00094 return (int32_t)(saveAddressLinkReg - execTOCAddress - tocDistUpdateVal);
00095 }
00096 BasicBlock** getInstBlocks() { return blocksToInstrument; }
00097
00098 void updateTOCRegister(Instruction* insnBuffer,uint32_t* insnIndex);
00099 void saveCTRRegister(Instruction* insnBuffer,uint32_t* insnIndex,uint32_t reg);
00100 void restCTRRegister(Instruction* insnBuffer,uint32_t* insnIndex,uint32_t reg);
00101 void saveEXRRegister(Instruction* insnBuffer,uint32_t* insnIndex,uint32_t reg);
00102 void restEXRRegister(Instruction* insnBuffer,uint32_t* insnIndex,uint32_t reg);
00103 void saveFPSCRRegister(Instruction* insnBuffer,uint32_t* insnIndex,uint32_t reg);
00104 void restFPSCRRegister(Instruction* insnBuffer,uint32_t* insnIndex,uint32_t reg);
00105 void saveCRRegister(Instruction* insnBuffer,uint32_t* insnIndex,uint32_t reg);
00106 void restCRRegister(Instruction* insnBuffer,uint32_t* insnIndex,uint32_t reg);
00107 void saveLNKRegister(Instruction* insnBuffer,uint32_t* insnIndex,uint32_t reg);
00108 void restLNKRegister(Instruction* insnBuffer,uint32_t* insnIndex,uint32_t reg);
00109 void generateFuncCallFull(Instruction* insnBuffer,uint32_t* insnIndex,uint32_t reg,
00110 uint64_t stubAddr,uint64_t funcAddr);
00111
00112 uint64_t getSharedLibFuncAddrLocation(uint32_t i){
00113 ASSERT(i < getNumOfSharedLibFuncs());
00114 return libraryFunctionStubAddrLocs[i];
00115 }
00116
00117 BasicBlock* findTerminationBlock();
00118 uint32_t generateSharedLibFuncWrapper(uint32_t libFuncIdx,uint64_t funcCallAddr,
00119 uint32_t genBufferOffset,BaseGen* gen);
00120 int32_t getCommentAddressOffset(){
00121 return (int32_t)(commentAddress - execTOCAddress - tocDistUpdateVal);
00122 }
00123 void verify(uint32_t written) {}
00124 void printInstrumentationPoints();
00125 };
00126
00127 #endif