void TraceReaderBase::TruncateLastBlock(uint32_t num_insns) { uint32_t insns[kMaxInsnPerBB]; StaticRec static_rec; long loc = 0, prev_loc = 0; freopen(static_filename_, "r+", static_fstream_); fseek(static_fstream_, sizeof(TraceHeader), SEEK_SET); // Find the last record while (1) { prev_loc = loc; loc = ftell(static_fstream_); // We don't need to byte-swap static_rec here because we are just // reading the records until we get to the last one. int rval = fread(&static_rec, sizeof(StaticRec), 1, static_fstream_); if (rval != 1) break; ReadStaticInsns(static_rec.num_insns, insns); } if (prev_loc != 0) { fseek(static_fstream_, prev_loc, SEEK_SET); static_rec.num_insns = num_insns; // Now we need to byte-swap, but just the field that we changed. convert32(static_rec.num_insns); fwrite(&static_rec, sizeof(StaticRec), 1, static_fstream_); int fd = fileno(static_fstream_); long len = ftell(static_fstream_); len += num_insns * sizeof(uint32_t); ftruncate(fd, len); } }
void TraceReaderBase::WriteHeader(TraceHeader *header) { TraceHeader swappedHeader; freopen(static_filename_, "r+", static_fstream_); fseek(static_fstream_, 0, SEEK_SET); memcpy(&swappedHeader, header, sizeof(TraceHeader)); convert32(swappedHeader.version); convert32(swappedHeader.start_sec); convert32(swappedHeader.start_usec); convert32(swappedHeader.pdate); convert32(swappedHeader.ptime); convert64(swappedHeader.num_static_bb); convert64(swappedHeader.num_static_insn); convert64(swappedHeader.num_dynamic_bb); convert64(swappedHeader.num_dynamic_insn); convert64(swappedHeader.elapsed_usecs); fwrite(&swappedHeader, sizeof(TraceHeader), 1, static_fstream_); }
// Reads "num" instructions into the array "insns" which must be large // enough to hold the "num" instructions. // Returns the actual number of instructions read. This will usually // be "num" but may be less if end-of-file occurred. int TraceReaderBase::ReadStaticInsns(int num, uint32_t *insns) { if (num == 0) return 0; int rval = fread(insns, sizeof(uint32_t), num, static_fstream_); // Convert from little-endian, if necessary for (int ii = 0; ii < num; ++ii) convert32(insns[ii]); if (rval != num) { if (feof(static_fstream_)) { return rval; } perror(static_filename_); exit(1); } return rval; }
/*************************************************************************** Desc: This routine changed a database header to native platform format. *****************************************************************************/ void convertDbHdr( XFLM_DB_HDR * pDbHdr ) { // This routine should only be called to convert a header to native // format. flmAssert( hdrIsNonNativeFormat( pDbHdr)); convert16( &pDbHdr->ui16BlockSize); convert32( &pDbHdr->ui32DbVersion); convert64( &pDbHdr->ui64LastRflCommitID); convert32( &pDbHdr->ui32RflLastFileNumDeleted); convert32( &pDbHdr->ui32RflCurrFileNum); convert32( &pDbHdr->ui32RflLastTransOffset); convert32( &pDbHdr->ui32RflLastCPFileNum); convert32( &pDbHdr->ui32RflLastCPOffset); convert64( &pDbHdr->ui64RflLastCPTransID); convert32( &pDbHdr->ui32RflMinFileSize); convert32( &pDbHdr->ui32RflMaxFileSize); convert64( &pDbHdr->ui64CurrTransID); convert64( &pDbHdr->ui64TransCommitCnt); convert32( &pDbHdr->ui32RblEOF); convert32( &pDbHdr->ui32RblFirstCPBlkAddr); convert32( &pDbHdr->ui32FirstAvailBlkAddr); convert32( &pDbHdr->ui32FirstLFBlkAddr); convert32( &pDbHdr->ui32LogicalEOF); convert32( &pDbHdr->ui32MaxFileSize); convert64( &pDbHdr->ui64LastBackupTransID); convert32( &pDbHdr->ui32IncBackupSeqNum); convert32( &pDbHdr->ui32BlksChangedSinceBackup); convert32( &pDbHdr->ui32HdrCRC); pDbHdr->ui8IsLittleEndian = XFLM_NATIVE_IS_LITTLE_ENDIAN; }