00001 #ifndef _CommonMethods_h_
00002 #define _CommonMethods_h_
00003
00004 #include <Generate.h>
00005
00006 class CommonMethods : 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 uint64_t extraBlockInfoAddress;
00042
00043
00044
00045 char* sharedLibraryPath;
00046
00047 bool enableExtendedPrint;
00048
00049 CommonMethods(XCoffFile* xcoff,char* extension,uint32_t phaseNo,uint32_t callCount,char* inpFile);
00050
00051 public:
00052 virtual ~CommonMethods() {}
00053
00054 BasicBlock* findTerminationBlock();
00055
00056 uint32_t getNumOfSharedLibFuncs() { return libraryFunctionCount; }
00057 uint32_t byteCountForSharedLibFuncWrappers() { return (getNumOfSharedLibFuncs() * 100 * sizeof(uint32_t)); }
00058 void setAddrOfSharedLibFuncWrapper(uint32_t i,uint64_t addr) { ASSERT(i<libraryFunctionCount) ; libraryFuncStubAddrs[i] = addr; }
00059
00060
00061 uint32_t generateSharedLibFuncWrapper(uint32_t libFuncIdx,uint64_t funcCallAddr,
00062 uint32_t genBufferOffset,BaseGen* gen);
00063 uint64_t getSharedLibFuncAddrLocation(uint32_t i){
00064 ASSERT(i < getNumOfSharedLibFuncs());
00065 return libraryFunctionStubAddrLocs[i];
00066 }
00067 int32_t getDataOffsetForInst(uint32_t idx){
00068 return (int32_t)(dataBufferAddress + (bytesPerBufferEntry()*idx) - execTOCAddress - tocDistUpdateVal);
00069 }
00070 int32_t getCommentAddressOffset(){
00071 return (int32_t)(commentAddress - execTOCAddress - tocDistUpdateVal);
00072 }
00073 void verify(uint32_t written) {}
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 printInstrumentationPoints();
00099 void reserveDataForInstrumentation();
00100
00101 virtual uint32_t bytesPerBufferEntry() { __SHOULD_NOT_ARRIVE; return 0; }
00102 virtual uint32_t howManyBufferEntry() { __SHOULD_NOT_ARRIVE; return 0; }
00103 virtual bool filterBlockForInst(BasicBlock* bb) { __SHOULD_NOT_ARRIVE; return false; }
00104 virtual uint32_t spaceForBlockInfo() { __SHOULD_NOT_ARRIVE; return 0; }
00105
00106 void updateTOCRegister(Instruction* insnBuffer,uint32_t* insnIndex);
00107 void saveCTRRegister(Instruction* insnBuffer,uint32_t* insnIndex,uint32_t reg);
00108 void restCTRRegister(Instruction* insnBuffer,uint32_t* insnIndex,uint32_t reg);
00109 void saveEXRRegister(Instruction* insnBuffer,uint32_t* insnIndex,uint32_t reg);
00110 void restEXRRegister(Instruction* insnBuffer,uint32_t* insnIndex,uint32_t reg);
00111 void saveFPSCRRegister(Instruction* insnBuffer,uint32_t* insnIndex,uint32_t reg);
00112 void restFPSCRRegister(Instruction* insnBuffer,uint32_t* insnIndex,uint32_t reg);
00113 void saveCRRegister(Instruction* insnBuffer,uint32_t* insnIndex,uint32_t reg);
00114 void restCRRegister(Instruction* insnBuffer,uint32_t* insnIndex,uint32_t reg);
00115 void saveLNKRegister(Instruction* insnBuffer,uint32_t* insnIndex,uint32_t reg);
00116 void restLNKRegister(Instruction* insnBuffer,uint32_t* insnIndex,uint32_t reg);
00117 void generateFuncCallFull(Instruction* insnBuffer,uint32_t* insnIndex,uint32_t reg,
00118 uint64_t stubAddr,uint64_t funcAddr);
00119
00120 virtual char* additionalInfoToPrint() { return "<no additional info>"; }
00121
00122 void setExtendedPrint(bool flg) { enableExtendedPrint = flg; }
00123 bool isExtendedPrint() { return enableExtendedPrint; }
00124 };
00125
00126 #endif