00001 #ifndef _XCoffFileGen_h_ 00002 #define _XCoffFileGen_h_ 00003 00004 #include <Base.h> 00005 #include <BinaryFile.h> 00006 #include <Instruction.h> 00007 00008 class FileHeader; 00009 class AOutHeader; 00010 class SectHeader; 00011 class RawSection; 00012 class RelocationTable; 00013 class LineInfoTable; 00014 class SymbolTable; 00015 class StringTable; 00016 class XCoffFileGen; 00017 class TextSection; 00018 class DataSection; 00019 00020 class BasicBlock; 00021 00022 class FileHeaderGen : public BaseGen { 00023 protected: 00024 FileHeader* fileHeader; 00025 public: 00026 FileHeaderGen(FileHeader* fh) : BaseGen(XCoffClassTypes_file_header),fileHeader(fh) {} 00027 virtual ~FileHeaderGen() {} 00028 Base* getParsedBase() { return (Base*)fileHeader; } 00029 }; 00030 00031 class AOutHeaderGen : public BaseGen { 00032 protected: 00033 AOutHeader* aOutheader; 00034 public: 00035 AOutHeaderGen(AOutHeader* ah) : BaseGen(XCoffClassTypes_aout_header),aOutheader(ah) {} 00036 virtual ~AOutHeaderGen() {} 00037 Base* getParsedBase() { return (Base*)aOutheader; } 00038 }; 00039 00040 class SectHeaderGen : public BaseGen { 00041 protected: 00042 SectHeader* sectHeader; 00043 public: 00044 SectHeaderGen(SectHeader* sh) : BaseGen(XCoffClassTypes_sect_header),sectHeader(sh) {} 00045 virtual ~SectHeaderGen() {} 00046 Base* getParsedBase() { return (Base*)sectHeader; } 00047 }; 00048 00049 class RawSectionGen : public BaseGen { 00050 protected: 00051 RawSection* rawSection; 00052 public: 00053 RawSectionGen(RawSection* rs) : BaseGen(XCoffClassTypes_sect_rawdata),rawSection(rs) {} 00054 virtual ~RawSectionGen() {} 00055 uint32_t setFileOffset(uint32_t offset); 00056 Base* getParsedBase() { return (Base*)rawSection; } 00057 }; 00058 00059 class RelocationTableGen : public BaseGen { 00060 protected: 00061 RelocationTable* relocationTable; 00062 public: 00063 RelocationTableGen(RelocationTable* rt) : BaseGen(XCoffClassTypes_relocation),relocationTable(rt) {} 00064 virtual ~RelocationTableGen() {} 00065 Base* getParsedBase() { return (Base*)relocationTable; } 00066 }; 00067 00068 class LineInfoTableGen : public BaseGen { 00069 protected: 00070 LineInfoTable* lineInfoTable; 00071 public: 00072 LineInfoTableGen(LineInfoTable* li) : BaseGen(XCoffClassTypes_line_info),lineInfoTable(li) {} 00073 virtual ~LineInfoTableGen() {} 00074 Base* getParsedBase() { return (Base*)lineInfoTable; } 00075 }; 00076 00077 class SymbolTableGen : public BaseGen { 00078 protected: 00079 SymbolTable* symbolTable; 00080 public: 00081 SymbolTableGen(SymbolTable* st) : BaseGen(XCoffClassTypes_symbol_table),symbolTable(st) {} 00082 virtual ~SymbolTableGen() {} 00083 Base* getParsedBase() { return (Base*)symbolTable; } 00084 }; 00085 00086 class StringTableGen : public BaseGen { 00087 protected: 00088 StringTable* stringTable; 00089 public: 00090 StringTableGen(StringTable* st) : BaseGen(XCoffClassTypes_string_table),stringTable(st) {} 00091 virtual ~StringTableGen() {} 00092 Base* getParsedBase() { return (Base*)stringTable; } 00093 }; 00094 00095 class XCoffFileGen { 00096 protected: 00097 00098 XCoffFile* xcoffFile; 00099 00100 char* inputFileName; 00101 char* outputFileName; 00102 BinaryOutputFile binaryOutputFile; 00103 char* fileExtension; 00104 uint32_t phaseIndex; 00105 00106 FileHeaderGen* fileHeaderGen; 00107 AOutHeaderGen* aOutHeaderGen; 00108 00109 uint32_t numberOfSections; 00110 SectHeaderGen** sectHeadersGen; 00111 RawSectionGen** rawSectionsGen; 00112 RelocationTableGen** relocationTablesGen; 00113 LineInfoTableGen** lineInfoTablesGen; 00114 00115 SymbolTableGen* symbolTableGen; 00116 StringTableGen* stringTableGen; 00117 00118 uint32_t instrumentedFileSize; 00119 uint32_t numberOfInstPoints; 00120 00121 uint32_t extendedDataSize; 00122 uint32_t dataBufferEntryCount; 00123 00124 char* pathToInstLibraries; 00125 00126 void inst_step1_allocateBuffers(); 00127 void inst_step2_setFileOffsets(); 00128 void inst_step3_instrumentInBuffer(); 00129 void inst_step4_updateBSSCSectionEntries(); 00130 00131 XCoffFileGen(XCoffFile* xcoff,char* extension,uint32_t phaseNo,char* blockFile); 00132 00133 public: 00134 00135 virtual ~XCoffFileGen() { } 00136 00137 char* getFileExtension() { return fileExtension; } 00138 uint32_t getInstrumentedFileSize() { return instrumentedFileSize; } 00139 uint32_t getPhaseIndex() { return phaseIndex; } 00140 00141 uint32_t getNumberOfAllFunctions(); 00142 uint32_t getNumberOfAllBlocks(); 00143 uint32_t getNumberOfAllMemoryOps(); 00144 uint32_t getNumberOfAllFloatPOps(); 00145 uint32_t getNumberOfAllObjects(); 00146 uint32_t getAllObjects(BaseGen** arr,uint32_t s); 00147 00148 uint32_t getSymbolTableOffsetForInst(); 00149 uint32_t getRawSectionSizeForInst(uint32_t idx); 00150 uint32_t getRawSectionOffsetForInst(uint32_t idx); 00151 uint32_t getRelocOffsetForInst(uint32_t idx); 00152 uint32_t getLineInfoOffsetForInst(uint32_t idx); 00153 uint64_t getNewBSSSectionVAddressForInst(); 00154 00155 virtual void selectInstrumentationPoints(char* blockFile) { __SHOULD_NOT_ARRIVE; } 00156 virtual void printInstrumentationPoints() { __SHOULD_NOT_ARRIVE; } 00157 virtual uint32_t getNumberOfInstPoints(TextSection* textSect) { return numberOfInstPoints; } 00158 00159 uint32_t getExtendedDataSize() { return extendedDataSize; } 00160 uint32_t getDataBufferEntryCount() { return dataBufferEntryCount; } 00161 virtual int32_t getDataOffsetForInst(uint32_t idx) { __SHOULD_NOT_ARRIVE; return 0; } 00162 virtual void reserveDataForInstrumentation() { __SHOULD_NOT_ARRIVE; } 00163 00164 virtual void verify(uint32_t written) { __SHOULD_NOT_ARRIVE; } 00165 00166 virtual uint32_t getNumOfSharedLibFuncs() { __SHOULD_NOT_ARRIVE; return 0; } 00167 virtual uint32_t byteCountForSharedLibFuncWrappers() { __SHOULD_NOT_ARRIVE; return 0; } 00168 virtual uint32_t generateSharedLibFuncWrapper(uint32_t libFuncIdx,uint64_t funcCallAddr,uint32_t genBufferOffset,BaseGen* gen) { 00169 __SHOULD_NOT_ARRIVE; return 0; 00170 } 00171 virtual void setAddrOfSharedLibFuncWrapper(uint32_t i,uint64_t addr){ __SHOULD_NOT_ARRIVE; } 00172 uint32_t generateStubForAllLibraryCalls(uint32_t genBufferOffset,BaseGen* gen); 00173 virtual char* getSharedLibFuncName(uint32_t i) { __SHOULD_NOT_ARRIVE; return NULL; } 00174 virtual uint64_t getSharedLibFuncAddrLocation(uint32_t i) { __SHOULD_NOT_ARRIVE; return 0; } 00175 virtual void getSharedLibraryPathAndObj(char** path,char** name,char** obj){ __SHOULD_NOT_ARRIVE; } 00176 00177 virtual void initializeReservedData(DataSection* dataSect,BaseGen* gen) { __SHOULD_NOT_ARRIVE; } 00178 00179 virtual uint32_t maxByteCountPerInst() { __SHOULD_NOT_ARRIVE; return 0; } 00180 virtual uint32_t byteCountForInst(uint32_t instPointIdx,uint64_t instStubAddress,TextSection* textSect) { 00181 __SHOULD_NOT_ARRIVE; return 0; 00182 } 00183 virtual uint32_t generateCodeForInst(uint32_t instPointIdx,uint64_t instStubAddress,TextSection* textSect, 00184 BaseGen* gen,uint32_t genBufferOffset) { 00185 __SHOULD_NOT_ARRIVE; return 0; 00186 } 00187 00188 void instrument(); 00189 uint32_t dump(); 00190 00191 virtual char* getGenClassName() { __SHOULD_NOT_ARRIVE; return NULL; } 00192 00193 char* getPathToInstLib() { return pathToInstLibraries; } 00194 void setPathToInstLib(char* libPathTop); 00195 }; 00196 00197 #endif