Main Page | Namespace List | Class Hierarchy | Alphabetical List | Class List | File List | Class Members | File Members

/users/u3/mtikir/PMaCInstrumentor_v1601/tools/CountAllBlocks.h

Go to the documentation of this file.
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     /********* Data Section Extension ****************/
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 /* _CountAllBlocks_h_ */

Generated on Mon Jan 28 11:08:33 2008 for PMaCInstrumentor by doxygen 1.3.5