diff options
author | Dimitry Andric <dim@FreeBSD.org> | 2019-10-23 17:51:42 +0000 |
---|---|---|
committer | Dimitry Andric <dim@FreeBSD.org> | 2019-10-23 17:51:42 +0000 |
commit | 1d5ae1026e831016fc29fd927877c86af904481f (patch) | |
tree | 2cdfd12620fcfa5d9e4a0389f85368e8e36f63f9 /lib/XRay | |
parent | e6d1592492a3a379186bfb02bd0f4eda0669c0d5 (diff) |
Notes
Diffstat (limited to 'lib/XRay')
-rw-r--r-- | lib/XRay/FDRRecordProducer.cpp | 37 | ||||
-rw-r--r-- | lib/XRay/FileHeaderReader.cpp | 14 | ||||
-rw-r--r-- | lib/XRay/InstrumentationMap.cpp | 17 | ||||
-rw-r--r-- | lib/XRay/Profile.cpp | 10 | ||||
-rw-r--r-- | lib/XRay/RecordInitializer.cpp | 202 | ||||
-rw-r--r-- | lib/XRay/Trace.cpp | 43 |
6 files changed, 175 insertions, 148 deletions
diff --git a/lib/XRay/FDRRecordProducer.cpp b/lib/XRay/FDRRecordProducer.cpp index 452bc6c55fb8..479b710444be 100644 --- a/lib/XRay/FDRRecordProducer.cpp +++ b/lib/XRay/FDRRecordProducer.cpp @@ -40,32 +40,32 @@ metadataRecordType(const XRayFileHeader &Header, uint8_t T) { "Invalid metadata record type: %d", T); switch (T) { case MetadataRecordKinds::NewBufferKind: - return make_unique<NewBufferRecord>(); + return std::make_unique<NewBufferRecord>(); case MetadataRecordKinds::EndOfBufferKind: if (Header.Version >= 2) return createStringError( std::make_error_code(std::errc::executable_format_error), "End of buffer records are no longer supported starting version " "2 of the log."); - return make_unique<EndBufferRecord>(); + return std::make_unique<EndBufferRecord>(); case MetadataRecordKinds::NewCPUIdKind: - return make_unique<NewCPUIDRecord>(); + return std::make_unique<NewCPUIDRecord>(); case MetadataRecordKinds::TSCWrapKind: - return make_unique<TSCWrapRecord>(); + return std::make_unique<TSCWrapRecord>(); case MetadataRecordKinds::WalltimeMarkerKind: - return make_unique<WallclockRecord>(); + return std::make_unique<WallclockRecord>(); case MetadataRecordKinds::CustomEventMarkerKind: if (Header.Version >= 5) - return make_unique<CustomEventRecordV5>(); - return make_unique<CustomEventRecord>(); + return std::make_unique<CustomEventRecordV5>(); + return std::make_unique<CustomEventRecord>(); case MetadataRecordKinds::CallArgumentKind: - return make_unique<CallArgRecord>(); + return std::make_unique<CallArgRecord>(); case MetadataRecordKinds::BufferExtentsKind: - return make_unique<BufferExtents>(); + return std::make_unique<BufferExtents>(); case MetadataRecordKinds::TypedEventMarkerKind: - return make_unique<TypedEventRecord>(); + return std::make_unique<TypedEventRecord>(); case MetadataRecordKinds::PidKind: - return make_unique<PIDRecord>(); + return std::make_unique<PIDRecord>(); case MetadataRecordKinds::EnumEndMarker: llvm_unreachable("Invalid MetadataRecordKind"); } @@ -89,7 +89,7 @@ FileBasedRecordProducer::findNextBufferExtent() { if (OffsetPtr == PreReadOffset) return createStringError( std::make_error_code(std::errc::executable_format_error), - "Failed reading one byte from offset %d.", OffsetPtr); + "Failed reading one byte from offset %" PRId64 ".", OffsetPtr); if (isMetadataIntroducer(FirstByte)) { auto LoadedType = FirstByte >> 1; @@ -130,7 +130,7 @@ Expected<std::unique_ptr<Record>> FileBasedRecordProducer::produce() { R = std::move(BufferExtentsOrError.get()); assert(R != nullptr); assert(isa<BufferExtents>(R.get())); - auto BE = dyn_cast<BufferExtents>(R.get()); + auto BE = cast<BufferExtents>(R.get()); CurrentBufferBytes = BE->size(); return std::move(R); } @@ -151,7 +151,7 @@ Expected<std::unique_ptr<Record>> FileBasedRecordProducer::produce() { if (OffsetPtr == PreReadOffset) return createStringError( std::make_error_code(std::errc::executable_format_error), - "Failed reading one byte from offset %d.", OffsetPtr); + "Failed reading one byte from offset %" PRId64 ".", OffsetPtr); // For metadata records, handle especially here. if (isMetadataIntroducer(FirstByte)) { @@ -162,11 +162,12 @@ Expected<std::unique_ptr<Record>> FileBasedRecordProducer::produce() { MetadataRecordOrErr.takeError(), createStringError( std::make_error_code(std::errc::executable_format_error), - "Encountered an unsupported metadata record (%d) at offset %d.", + "Encountered an unsupported metadata record (%d) " + "at offset %" PRId64 ".", LoadedType, PreReadOffset)); R = std::move(MetadataRecordOrErr.get()); } else { - R = llvm::make_unique<FunctionRecord>(); + R = std::make_unique<FunctionRecord>(); } RecordInitializer RI(E, OffsetPtr); @@ -182,8 +183,8 @@ Expected<std::unique_ptr<Record>> FileBasedRecordProducer::produce() { if (OffsetPtr - PreReadOffset > CurrentBufferBytes) return createStringError( std::make_error_code(std::errc::executable_format_error), - "Buffer over-read at offset %d (over-read by %d bytes); Record Type " - "= %s.", + "Buffer over-read at offset %" PRId64 " (over-read by %" PRId64 + " bytes); Record Type = %s.", OffsetPtr, (OffsetPtr - PreReadOffset) - CurrentBufferBytes, Record::kindToString(R->getRecordType()).data()); diff --git a/lib/XRay/FileHeaderReader.cpp b/lib/XRay/FileHeaderReader.cpp index 3fb021906a6f..6b6daf9deba5 100644 --- a/lib/XRay/FileHeaderReader.cpp +++ b/lib/XRay/FileHeaderReader.cpp @@ -12,7 +12,7 @@ namespace xray { // Populates the FileHeader reference by reading the first 32 bytes of the file. Expected<XRayFileHeader> readBinaryFormatHeader(DataExtractor &HeaderExtractor, - uint32_t &OffsetPtr) { + uint64_t &OffsetPtr) { // FIXME: Maybe deduce whether the data is little or big-endian using some // magic bytes in the beginning of the file? @@ -30,21 +30,24 @@ Expected<XRayFileHeader> readBinaryFormatHeader(DataExtractor &HeaderExtractor, if (OffsetPtr == PreReadOffset) return createStringError( std::make_error_code(std::errc::invalid_argument), - "Failed reading version from file header at offset %d.", OffsetPtr); + "Failed reading version from file header at offset %" PRId64 ".", + OffsetPtr); PreReadOffset = OffsetPtr; FileHeader.Type = HeaderExtractor.getU16(&OffsetPtr); if (OffsetPtr == PreReadOffset) return createStringError( std::make_error_code(std::errc::invalid_argument), - "Failed reading file type from file header at offset %d.", OffsetPtr); + "Failed reading file type from file header at offset %" PRId64 ".", + OffsetPtr); PreReadOffset = OffsetPtr; uint32_t Bitfield = HeaderExtractor.getU32(&OffsetPtr); if (OffsetPtr == PreReadOffset) return createStringError( std::make_error_code(std::errc::invalid_argument), - "Failed reading flag bits from file header at offset %d.", OffsetPtr); + "Failed reading flag bits from file header at offset %" PRId64 ".", + OffsetPtr); FileHeader.ConstantTSC = Bitfield & 1uL; FileHeader.NonstopTSC = Bitfield & 1uL << 1; @@ -53,7 +56,8 @@ Expected<XRayFileHeader> readBinaryFormatHeader(DataExtractor &HeaderExtractor, if (OffsetPtr == PreReadOffset) return createStringError( std::make_error_code(std::errc::invalid_argument), - "Failed reading cycle frequency from file header at offset %d.", + "Failed reading cycle frequency from file header at offset %" PRId64 + ".", OffsetPtr); std::memcpy(&FileHeader.FreeFormData, diff --git a/lib/XRay/InstrumentationMap.cpp b/lib/XRay/InstrumentationMap.cpp index fe5e941f7ea6..7453613c7038 100644 --- a/lib/XRay/InstrumentationMap.cpp +++ b/lib/XRay/InstrumentationMap.cpp @@ -67,10 +67,11 @@ loadObj(StringRef Filename, object::OwningBinary<object::ObjectFile> &ObjFile, StringRef Contents = ""; const auto &Sections = ObjFile.getBinary()->sections(); auto I = llvm::find_if(Sections, [&](object::SectionRef Section) { - StringRef Name = ""; - if (Section.getName(Name)) - return false; - return Name == "xray_instr_map"; + Expected<StringRef> NameOrErr = Section.getName(); + if (NameOrErr) + return *NameOrErr == "xray_instr_map"; + consumeError(NameOrErr.takeError()); + return false; }); if (I == Sections.end()) @@ -118,7 +119,7 @@ loadObj(StringRef Filename, object::OwningBinary<object::ObjectFile> &ObjFile, "an XRay sled entry in ELF64."), std::make_error_code(std::errc::executable_format_error)); - auto RelocateOrElse = [&](uint32_t Offset, uint64_t Address) { + auto RelocateOrElse = [&](uint64_t Offset, uint64_t Address) { if (!Address) { uint64_t A = I->getAddress() + C - Contents.bytes_begin() + Offset; RelocMap::const_iterator R = Relocs.find(A); @@ -136,10 +137,10 @@ loadObj(StringRef Filename, object::OwningBinary<object::ObjectFile> &ObjFile, 8); Sleds.push_back({}); auto &Entry = Sleds.back(); - uint32_t OffsetPtr = 0; - uint32_t AddrOff = OffsetPtr; + uint64_t OffsetPtr = 0; + uint64_t AddrOff = OffsetPtr; Entry.Address = RelocateOrElse(AddrOff, Extractor.getU64(&OffsetPtr)); - uint32_t FuncOff = OffsetPtr; + uint64_t FuncOff = OffsetPtr; Entry.Function = RelocateOrElse(FuncOff, Extractor.getU64(&OffsetPtr)); auto Kind = Extractor.getU8(&OffsetPtr); static constexpr SledEntry::FunctionKinds Kinds[] = { diff --git a/lib/XRay/Profile.cpp b/lib/XRay/Profile.cpp index e34b182f2e02..c1a43632b600 100644 --- a/lib/XRay/Profile.cpp +++ b/lib/XRay/Profile.cpp @@ -49,9 +49,9 @@ struct BlockHeader { }; static Expected<BlockHeader> readBlockHeader(DataExtractor &Extractor, - uint32_t &Offset) { + uint64_t &Offset) { BlockHeader H; - uint32_t CurrentOffset = Offset; + uint64_t CurrentOffset = Offset; H.Size = Extractor.getU32(&Offset); if (Offset == CurrentOffset) return make_error<StringError>( @@ -76,7 +76,7 @@ static Expected<BlockHeader> readBlockHeader(DataExtractor &Extractor, } static Expected<std::vector<Profile::FuncID>> readPath(DataExtractor &Extractor, - uint32_t &Offset) { + uint64_t &Offset) { // We're reading a sequence of int32_t's until we find a 0. std::vector<Profile::FuncID> Path; auto CurrentOffset = Offset; @@ -94,7 +94,7 @@ static Expected<std::vector<Profile::FuncID>> readPath(DataExtractor &Extractor, } static Expected<Profile::Data> readData(DataExtractor &Extractor, - uint32_t &Offset) { + uint64_t &Offset) { // We expect a certain number of elements for Data: // - A 64-bit CallCount // - A 64-bit CumulativeLocalTime counter @@ -280,7 +280,7 @@ Expected<Profile> loadProfile(StringRef Filename) { StringRef Data(MappedFile.data(), MappedFile.size()); Profile P; - uint32_t Offset = 0; + uint64_t Offset = 0; DataExtractor Extractor(Data, true, 8); // For each block we get from the file: diff --git a/lib/XRay/RecordInitializer.cpp b/lib/XRay/RecordInitializer.cpp index 78163031a8cc..68ab3db06208 100644 --- a/lib/XRay/RecordInitializer.cpp +++ b/lib/XRay/RecordInitializer.cpp @@ -12,15 +12,15 @@ namespace xray { Error RecordInitializer::visit(BufferExtents &R) { if (!E.isValidOffsetForDataOfSize(OffsetPtr, sizeof(uint64_t))) - return createStringError(std::make_error_code(std::errc::bad_address), - "Invalid offset for a buffer extent (%d).", - OffsetPtr); + return createStringError( + std::make_error_code(std::errc::bad_address), + "Invalid offset for a buffer extent (%" PRId64 ").", OffsetPtr); auto PreReadOffset = OffsetPtr; R.Size = E.getU64(&OffsetPtr); if (PreReadOffset == OffsetPtr) return createStringError(std::make_error_code(std::errc::invalid_argument), - "Cannot read buffer extent at offset %d.", + "Cannot read buffer extent at offset %" PRId64 ".", OffsetPtr); OffsetPtr += MetadataRecord::kMetadataBodySize - (OffsetPtr - PreReadOffset); @@ -30,23 +30,25 @@ Error RecordInitializer::visit(BufferExtents &R) { Error RecordInitializer::visit(WallclockRecord &R) { if (!E.isValidOffsetForDataOfSize(OffsetPtr, MetadataRecord::kMetadataBodySize)) - return createStringError(std::make_error_code(std::errc::bad_address), - "Invalid offset for a wallclock record (%d).", - OffsetPtr); + return createStringError( + std::make_error_code(std::errc::bad_address), + "Invalid offset for a wallclock record (%" PRId64 ").", OffsetPtr); auto BeginOffset = OffsetPtr; auto PreReadOffset = OffsetPtr; R.Seconds = E.getU64(&OffsetPtr); if (OffsetPtr == PreReadOffset) return createStringError( std::make_error_code(std::errc::invalid_argument), - "Cannot read wall clock 'seconds' field at offset %d.", OffsetPtr); + "Cannot read wall clock 'seconds' field at offset %" PRId64 ".", + OffsetPtr); PreReadOffset = OffsetPtr; R.Nanos = E.getU32(&OffsetPtr); if (OffsetPtr == PreReadOffset) return createStringError( std::make_error_code(std::errc::invalid_argument), - "Cannot read wall clock 'nanos' field at offset %d.", OffsetPtr); + "Cannot read wall clock 'nanos' field at offset %" PRId64 ".", + OffsetPtr); // Align to metadata record size boundary. assert(OffsetPtr - BeginOffset <= MetadataRecord::kMetadataBodySize); @@ -57,21 +59,23 @@ Error RecordInitializer::visit(WallclockRecord &R) { Error RecordInitializer::visit(NewCPUIDRecord &R) { if (!E.isValidOffsetForDataOfSize(OffsetPtr, MetadataRecord::kMetadataBodySize)) - return createStringError(std::make_error_code(std::errc::bad_address), - "Invalid offset for a new cpu id record (%d).", - OffsetPtr); + return createStringError( + std::make_error_code(std::errc::bad_address), + "Invalid offset for a new cpu id record (%" PRId64 ").", OffsetPtr); auto BeginOffset = OffsetPtr; auto PreReadOffset = OffsetPtr; R.CPUId = E.getU16(&OffsetPtr); if (OffsetPtr == PreReadOffset) return createStringError(std::make_error_code(std::errc::invalid_argument), - "Cannot read CPU id at offset %d.", OffsetPtr); + "Cannot read CPU id at offset %" PRId64 ".", + OffsetPtr); PreReadOffset = OffsetPtr; R.TSC = E.getU64(&OffsetPtr); if (OffsetPtr == PreReadOffset) return createStringError(std::make_error_code(std::errc::invalid_argument), - "Cannot read CPU TSC at offset %d.", OffsetPtr); + "Cannot read CPU TSC at offset %" PRId64 ".", + OffsetPtr); OffsetPtr += MetadataRecord::kMetadataBodySize - (OffsetPtr - BeginOffset); return Error::success(); @@ -80,16 +84,16 @@ Error RecordInitializer::visit(NewCPUIDRecord &R) { Error RecordInitializer::visit(TSCWrapRecord &R) { if (!E.isValidOffsetForDataOfSize(OffsetPtr, MetadataRecord::kMetadataBodySize)) - return createStringError(std::make_error_code(std::errc::bad_address), - "Invalid offset for a new TSC wrap record (%d).", - OffsetPtr); + return createStringError( + std::make_error_code(std::errc::bad_address), + "Invalid offset for a new TSC wrap record (%" PRId64 ").", OffsetPtr); auto PreReadOffset = OffsetPtr; R.BaseTSC = E.getU64(&OffsetPtr); if (PreReadOffset == OffsetPtr) - return createStringError(std::make_error_code(std::errc::invalid_argument), - "Cannot read TSC wrap record at offset %d.", - OffsetPtr); + return createStringError( + std::make_error_code(std::errc::invalid_argument), + "Cannot read TSC wrap record at offset %" PRId64 ".", OffsetPtr); OffsetPtr += MetadataRecord::kMetadataBodySize - (OffsetPtr - PreReadOffset); return Error::success(); @@ -98,9 +102,9 @@ Error RecordInitializer::visit(TSCWrapRecord &R) { Error RecordInitializer::visit(CustomEventRecord &R) { if (!E.isValidOffsetForDataOfSize(OffsetPtr, MetadataRecord::kMetadataBodySize)) - return createStringError(std::make_error_code(std::errc::bad_address), - "Invalid offset for a custom event record (%d).", - OffsetPtr); + return createStringError( + std::make_error_code(std::errc::bad_address), + "Invalid offset for a custom event record (%" PRId64 ").", OffsetPtr); auto BeginOffset = OffsetPtr; auto PreReadOffset = OffsetPtr; @@ -108,20 +112,22 @@ Error RecordInitializer::visit(CustomEventRecord &R) { if (PreReadOffset == OffsetPtr) return createStringError( std::make_error_code(std::errc::invalid_argument), - "Cannot read a custom event record size field offset %d.", OffsetPtr); + "Cannot read a custom event record size field offset %" PRId64 ".", + OffsetPtr); if (R.Size <= 0) return createStringError( std::make_error_code(std::errc::bad_address), - "Invalid size for custom event (size = %d) at offset %d.", R.Size, - OffsetPtr); + "Invalid size for custom event (size = %d) at offset %" PRId64 ".", + R.Size, OffsetPtr); PreReadOffset = OffsetPtr; R.TSC = E.getU64(&OffsetPtr); if (PreReadOffset == OffsetPtr) return createStringError( std::make_error_code(std::errc::invalid_argument), - "Cannot read a custom event TSC field at offset %d.", OffsetPtr); + "Cannot read a custom event TSC field at offset %" PRId64 ".", + OffsetPtr); // For version 4 onwards, of the FDR log, we want to also capture the CPU ID // of the custom event. @@ -131,7 +137,7 @@ Error RecordInitializer::visit(CustomEventRecord &R) { if (PreReadOffset == OffsetPtr) return createStringError( std::make_error_code(std::errc::invalid_argument), - "Missing CPU field at offset %d", OffsetPtr); + "Missing CPU field at offset %" PRId64 ".", OffsetPtr); } assert(OffsetPtr > BeginOffset && @@ -142,8 +148,8 @@ Error RecordInitializer::visit(CustomEventRecord &R) { if (!E.isValidOffsetForDataOfSize(OffsetPtr, R.Size)) return createStringError( std::make_error_code(std::errc::bad_address), - "Cannot read %d bytes of custom event data from offset %d.", R.Size, - OffsetPtr); + "Cannot read %d bytes of custom event data from offset %" PRId64 ".", + R.Size, OffsetPtr); std::vector<uint8_t> Buffer; Buffer.resize(R.Size); @@ -151,15 +157,15 @@ Error RecordInitializer::visit(CustomEventRecord &R) { if (E.getU8(&OffsetPtr, Buffer.data(), R.Size) != Buffer.data()) return createStringError( std::make_error_code(std::errc::invalid_argument), - "Failed reading data into buffer of size %d at offset %d.", R.Size, - OffsetPtr); + "Failed reading data into buffer of size %d at offset %" PRId64 ".", + R.Size, OffsetPtr); assert(OffsetPtr >= PreReadOffset); if (OffsetPtr - PreReadOffset != static_cast<uint32_t>(R.Size)) return createStringError( std::make_error_code(std::errc::invalid_argument), - "Failed reading enough bytes for the custom event payload -- read %d " - "expecting %d bytes at offset %d.", + "Failed reading enough bytes for the custom event payload -- read " + "%" PRId64 " expecting %d bytes at offset %" PRId64 ".", OffsetPtr - PreReadOffset, R.Size, PreReadOffset); R.Data.assign(Buffer.begin(), Buffer.end()); @@ -169,9 +175,9 @@ Error RecordInitializer::visit(CustomEventRecord &R) { Error RecordInitializer::visit(CustomEventRecordV5 &R) { if (!E.isValidOffsetForDataOfSize(OffsetPtr, MetadataRecord::kMetadataBodySize)) - return createStringError(std::make_error_code(std::errc::bad_address), - "Invalid offset for a custom event record (%d).", - OffsetPtr); + return createStringError( + std::make_error_code(std::errc::bad_address), + "Invalid offset for a custom event record (%" PRId64 ").", OffsetPtr); auto BeginOffset = OffsetPtr; auto PreReadOffset = OffsetPtr; @@ -180,20 +186,22 @@ Error RecordInitializer::visit(CustomEventRecordV5 &R) { if (PreReadOffset == OffsetPtr) return createStringError( std::make_error_code(std::errc::invalid_argument), - "Cannot read a custom event record size field offset %d.", OffsetPtr); + "Cannot read a custom event record size field offset %" PRId64 ".", + OffsetPtr); if (R.Size <= 0) return createStringError( std::make_error_code(std::errc::bad_address), - "Invalid size for custom event (size = %d) at offset %d.", R.Size, - OffsetPtr); + "Invalid size for custom event (size = %d) at offset %" PRId64 ".", + R.Size, OffsetPtr); PreReadOffset = OffsetPtr; R.Delta = E.getSigned(&OffsetPtr, sizeof(int32_t)); if (PreReadOffset == OffsetPtr) return createStringError( std::make_error_code(std::errc::invalid_argument), - "Cannot read a custom event record TSC delta field at offset %d.", + "Cannot read a custom event record TSC delta field at offset " + "%" PRId64 ".", OffsetPtr); assert(OffsetPtr > BeginOffset && @@ -204,8 +212,8 @@ Error RecordInitializer::visit(CustomEventRecordV5 &R) { if (!E.isValidOffsetForDataOfSize(OffsetPtr, R.Size)) return createStringError( std::make_error_code(std::errc::bad_address), - "Cannot read %d bytes of custom event data from offset %d.", R.Size, - OffsetPtr); + "Cannot read %d bytes of custom event data from offset %" PRId64 ".", + R.Size, OffsetPtr); std::vector<uint8_t> Buffer; Buffer.resize(R.Size); @@ -213,15 +221,15 @@ Error RecordInitializer::visit(CustomEventRecordV5 &R) { if (E.getU8(&OffsetPtr, Buffer.data(), R.Size) != Buffer.data()) return createStringError( std::make_error_code(std::errc::invalid_argument), - "Failed reading data into buffer of size %d at offset %d.", R.Size, - OffsetPtr); + "Failed reading data into buffer of size %d at offset %" PRId64 ".", + R.Size, OffsetPtr); assert(OffsetPtr >= PreReadOffset); if (OffsetPtr - PreReadOffset != static_cast<uint32_t>(R.Size)) return createStringError( std::make_error_code(std::errc::invalid_argument), - "Failed reading enough bytes for the custom event payload -- read %d " - "expecting %d bytes at offset %d.", + "Failed reading enough bytes for the custom event payload -- read " + "%" PRId64 " expecting %d bytes at offset %" PRId64 ".", OffsetPtr - PreReadOffset, R.Size, PreReadOffset); R.Data.assign(Buffer.begin(), Buffer.end()); @@ -231,9 +239,9 @@ Error RecordInitializer::visit(CustomEventRecordV5 &R) { Error RecordInitializer::visit(TypedEventRecord &R) { if (!E.isValidOffsetForDataOfSize(OffsetPtr, MetadataRecord::kMetadataBodySize)) - return createStringError(std::make_error_code(std::errc::bad_address), - "Invalid offset for a typed event record (%d).", - OffsetPtr); + return createStringError( + std::make_error_code(std::errc::bad_address), + "Invalid offset for a typed event record (%" PRId64 ").", OffsetPtr); auto BeginOffset = OffsetPtr; auto PreReadOffset = OffsetPtr; @@ -242,20 +250,22 @@ Error RecordInitializer::visit(TypedEventRecord &R) { if (PreReadOffset == OffsetPtr) return createStringError( std::make_error_code(std::errc::invalid_argument), - "Cannot read a typed event record size field offset %d.", OffsetPtr); + "Cannot read a typed event record size field offset %" PRId64 ".", + OffsetPtr); if (R.Size <= 0) return createStringError( std::make_error_code(std::errc::bad_address), - "Invalid size for typed event (size = %d) at offset %d.", R.Size, - OffsetPtr); + "Invalid size for typed event (size = %d) at offset %" PRId64 ".", + R.Size, OffsetPtr); PreReadOffset = OffsetPtr; R.Delta = E.getSigned(&OffsetPtr, sizeof(int32_t)); if (PreReadOffset == OffsetPtr) return createStringError( std::make_error_code(std::errc::invalid_argument), - "Cannot read a typed event record TSC delta field at offset %d.", + "Cannot read a typed event record TSC delta field at offset " + "%" PRId64 ".", OffsetPtr); PreReadOffset = OffsetPtr; @@ -263,7 +273,8 @@ Error RecordInitializer::visit(TypedEventRecord &R) { if (PreReadOffset == OffsetPtr) return createStringError( std::make_error_code(std::errc::invalid_argument), - "Cannot read a typed event record type field at offset %d.", OffsetPtr); + "Cannot read a typed event record type field at offset %" PRId64 ".", + OffsetPtr); assert(OffsetPtr > BeginOffset && OffsetPtr - BeginOffset <= MetadataRecord::kMetadataBodySize); @@ -273,8 +284,8 @@ Error RecordInitializer::visit(TypedEventRecord &R) { if (!E.isValidOffsetForDataOfSize(OffsetPtr, R.Size)) return createStringError( std::make_error_code(std::errc::bad_address), - "Cannot read %d bytes of custom event data from offset %d.", R.Size, - OffsetPtr); + "Cannot read %d bytes of custom event data from offset %" PRId64 ".", + R.Size, OffsetPtr); std::vector<uint8_t> Buffer; Buffer.resize(R.Size); @@ -282,15 +293,15 @@ Error RecordInitializer::visit(TypedEventRecord &R) { if (E.getU8(&OffsetPtr, Buffer.data(), R.Size) != Buffer.data()) return createStringError( std::make_error_code(std::errc::invalid_argument), - "Failed reading data into buffer of size %d at offset %d.", R.Size, - OffsetPtr); + "Failed reading data into buffer of size %d at offset %" PRId64 ".", + R.Size, OffsetPtr); assert(OffsetPtr >= PreReadOffset); if (OffsetPtr - PreReadOffset != static_cast<uint32_t>(R.Size)) return createStringError( std::make_error_code(std::errc::invalid_argument), - "Failed reading enough bytes for the typed event payload -- read %d " - "expecting %d bytes at offset %d.", + "Failed reading enough bytes for the typed event payload -- read " + "%" PRId64 " expecting %d bytes at offset %" PRId64 ".", OffsetPtr - PreReadOffset, R.Size, PreReadOffset); R.Data.assign(Buffer.begin(), Buffer.end()); @@ -300,16 +311,17 @@ Error RecordInitializer::visit(TypedEventRecord &R) { Error RecordInitializer::visit(CallArgRecord &R) { if (!E.isValidOffsetForDataOfSize(OffsetPtr, MetadataRecord::kMetadataBodySize)) - return createStringError(std::make_error_code(std::errc::bad_address), - "Invalid offset for a call argument record (%d).", - OffsetPtr); + return createStringError( + std::make_error_code(std::errc::bad_address), + "Invalid offset for a call argument record (%" PRId64 ").", + OffsetPtr); auto PreReadOffset = OffsetPtr; R.Arg = E.getU64(&OffsetPtr); if (PreReadOffset == OffsetPtr) - return createStringError(std::make_error_code(std::errc::invalid_argument), - "Cannot read a call arg record at offset %d.", - OffsetPtr); + return createStringError( + std::make_error_code(std::errc::invalid_argument), + "Cannot read a call arg record at offset %" PRId64 ".", OffsetPtr); OffsetPtr += MetadataRecord::kMetadataBodySize - (OffsetPtr - PreReadOffset); return Error::success(); @@ -318,16 +330,16 @@ Error RecordInitializer::visit(CallArgRecord &R) { Error RecordInitializer::visit(PIDRecord &R) { if (!E.isValidOffsetForDataOfSize(OffsetPtr, MetadataRecord::kMetadataBodySize)) - return createStringError(std::make_error_code(std::errc::bad_address), - "Invalid offset for a process ID record (%d).", - OffsetPtr); + return createStringError( + std::make_error_code(std::errc::bad_address), + "Invalid offset for a process ID record (%" PRId64 ").", OffsetPtr); auto PreReadOffset = OffsetPtr; R.PID = E.getSigned(&OffsetPtr, 4); if (PreReadOffset == OffsetPtr) - return createStringError(std::make_error_code(std::errc::invalid_argument), - "Cannot read a process ID record at offset %d.", - OffsetPtr); + return createStringError( + std::make_error_code(std::errc::invalid_argument), + "Cannot read a process ID record at offset %" PRId64 ".", OffsetPtr); OffsetPtr += MetadataRecord::kMetadataBodySize - (OffsetPtr - PreReadOffset); return Error::success(); @@ -336,16 +348,16 @@ Error RecordInitializer::visit(PIDRecord &R) { Error RecordInitializer::visit(NewBufferRecord &R) { if (!E.isValidOffsetForDataOfSize(OffsetPtr, MetadataRecord::kMetadataBodySize)) - return createStringError(std::make_error_code(std::errc::bad_address), - "Invalid offset for a new buffer record (%d).", - OffsetPtr); + return createStringError( + std::make_error_code(std::errc::bad_address), + "Invalid offset for a new buffer record (%" PRId64 ").", OffsetPtr); auto PreReadOffset = OffsetPtr; R.TID = E.getSigned(&OffsetPtr, sizeof(int32_t)); if (PreReadOffset == OffsetPtr) - return createStringError(std::make_error_code(std::errc::invalid_argument), - "Cannot read a new buffer record at offset %d.", - OffsetPtr); + return createStringError( + std::make_error_code(std::errc::invalid_argument), + "Cannot read a new buffer record at offset %" PRId64 ".", OffsetPtr); OffsetPtr += MetadataRecord::kMetadataBodySize - (OffsetPtr - PreReadOffset); return Error::success(); @@ -354,9 +366,10 @@ Error RecordInitializer::visit(NewBufferRecord &R) { Error RecordInitializer::visit(EndBufferRecord &R) { if (!E.isValidOffsetForDataOfSize(OffsetPtr, MetadataRecord::kMetadataBodySize)) - return createStringError(std::make_error_code(std::errc::bad_address), - "Invalid offset for an end-of-buffer record (%d).", - OffsetPtr); + return createStringError( + std::make_error_code(std::errc::bad_address), + "Invalid offset for an end-of-buffer record (%" PRId64 ").", + OffsetPtr); OffsetPtr += MetadataRecord::kMetadataBodySize; return Error::success(); @@ -373,17 +386,17 @@ Error RecordInitializer::visit(FunctionRecord &R) { // if (OffsetPtr == 0 || !E.isValidOffsetForDataOfSize( --OffsetPtr, FunctionRecord::kFunctionRecordSize)) - return createStringError(std::make_error_code(std::errc::bad_address), - "Invalid offset for a function record (%d).", - OffsetPtr); + return createStringError( + std::make_error_code(std::errc::bad_address), + "Invalid offset for a function record (%" PRId64 ").", OffsetPtr); auto BeginOffset = OffsetPtr; auto PreReadOffset = BeginOffset; uint32_t Buffer = E.getU32(&OffsetPtr); if (PreReadOffset == OffsetPtr) - return createStringError(std::make_error_code(std::errc::bad_address), - "Cannot read function id field from offset %d.", - OffsetPtr); + return createStringError( + std::make_error_code(std::errc::bad_address), + "Cannot read function id field from offset %" PRId64 ".", OffsetPtr); // To get the function record type, we shift the buffer one to the right // (truncating the function record indicator) then take the three bits @@ -397,18 +410,19 @@ Error RecordInitializer::visit(FunctionRecord &R) { R.Kind = static_cast<RecordTypes>(FunctionType); break; default: - return createStringError(std::make_error_code(std::errc::invalid_argument), - "Unknown function record type '%d' at offset %d.", - FunctionType, BeginOffset); + return createStringError( + std::make_error_code(std::errc::invalid_argument), + "Unknown function record type '%d' at offset %" PRId64 ".", + FunctionType, BeginOffset); } R.FuncId = Buffer >> 4; PreReadOffset = OffsetPtr; R.Delta = E.getU32(&OffsetPtr); if (OffsetPtr == PreReadOffset) - return createStringError(std::make_error_code(std::errc::invalid_argument), - "Failed reading TSC delta from offset %d.", - OffsetPtr); + return createStringError( + std::make_error_code(std::errc::invalid_argument), + "Failed reading TSC delta from offset %" PRId64 ".", OffsetPtr); assert(FunctionRecord::kFunctionRecordSize == (OffsetPtr - BeginOffset)); return Error::success(); } diff --git a/lib/XRay/Trace.cpp b/lib/XRay/Trace.cpp index b9b67c561c66..4f107e1059cc 100644 --- a/lib/XRay/Trace.cpp +++ b/lib/XRay/Trace.cpp @@ -47,7 +47,7 @@ Error loadNaiveFormatLog(StringRef Data, bool IsLittleEndian, std::make_error_code(std::errc::invalid_argument)); DataExtractor Reader(Data, IsLittleEndian, 8); - uint32_t OffsetPtr = 0; + uint64_t OffsetPtr = 0; auto FileHeaderOrError = readBinaryFormatHeader(Reader, OffsetPtr); if (!FileHeaderOrError) return FileHeaderOrError.takeError(); @@ -67,13 +67,14 @@ Error loadNaiveFormatLog(StringRef Data, bool IsLittleEndian, if (!Reader.isValidOffsetForDataOfSize(OffsetPtr, 32)) return createStringError( std::make_error_code(std::errc::executable_format_error), - "Not enough bytes to read a full record at offset %d.", OffsetPtr); + "Not enough bytes to read a full record at offset %" PRId64 ".", + OffsetPtr); auto PreReadOffset = OffsetPtr; auto RecordType = Reader.getU16(&OffsetPtr); if (OffsetPtr == PreReadOffset) return createStringError( std::make_error_code(std::errc::executable_format_error), - "Failed reading record type at offset %d.", OffsetPtr); + "Failed reading record type at offset %" PRId64 ".", OffsetPtr); switch (RecordType) { case 0: { // Normal records. @@ -86,14 +87,15 @@ Error loadNaiveFormatLog(StringRef Data, bool IsLittleEndian, if (OffsetPtr == PreReadOffset) return createStringError( std::make_error_code(std::errc::executable_format_error), - "Failed reading CPU field at offset %d.", OffsetPtr); + "Failed reading CPU field at offset %" PRId64 ".", OffsetPtr); PreReadOffset = OffsetPtr; auto Type = Reader.getU8(&OffsetPtr); if (OffsetPtr == PreReadOffset) return createStringError( std::make_error_code(std::errc::executable_format_error), - "Failed reading record type field at offset %d.", OffsetPtr); + "Failed reading record type field at offset %" PRId64 ".", + OffsetPtr); switch (Type) { case 0: @@ -111,7 +113,7 @@ Error loadNaiveFormatLog(StringRef Data, bool IsLittleEndian, default: return createStringError( std::make_error_code(std::errc::executable_format_error), - "Unknown record type '%d' at offset %d.", Type, OffsetPtr); + "Unknown record type '%d' at offset %" PRId64 ".", Type, OffsetPtr); } PreReadOffset = OffsetPtr; @@ -119,28 +121,29 @@ Error loadNaiveFormatLog(StringRef Data, bool IsLittleEndian, if (OffsetPtr == PreReadOffset) return createStringError( std::make_error_code(std::errc::executable_format_error), - "Failed reading function id field at offset %d.", OffsetPtr); + "Failed reading function id field at offset %" PRId64 ".", + OffsetPtr); PreReadOffset = OffsetPtr; Record.TSC = Reader.getU64(&OffsetPtr); if (OffsetPtr == PreReadOffset) return createStringError( std::make_error_code(std::errc::executable_format_error), - "Failed reading TSC field at offset %d.", OffsetPtr); + "Failed reading TSC field at offset %" PRId64 ".", OffsetPtr); PreReadOffset = OffsetPtr; Record.TId = Reader.getU32(&OffsetPtr); if (OffsetPtr == PreReadOffset) return createStringError( std::make_error_code(std::errc::executable_format_error), - "Failed reading thread id field at offset %d.", OffsetPtr); + "Failed reading thread id field at offset %" PRId64 ".", OffsetPtr); PreReadOffset = OffsetPtr; Record.PId = Reader.getU32(&OffsetPtr); if (OffsetPtr == PreReadOffset) return createStringError( std::make_error_code(std::errc::executable_format_error), - "Failed reading process id at offset %d.", OffsetPtr); + "Failed reading process id at offset %" PRId64 ".", OffsetPtr); break; } @@ -155,21 +158,23 @@ Error loadNaiveFormatLog(StringRef Data, bool IsLittleEndian, if (OffsetPtr == PreReadOffset) return createStringError( std::make_error_code(std::errc::executable_format_error), - "Failed reading function id field at offset %d.", OffsetPtr); + "Failed reading function id field at offset %" PRId64 ".", + OffsetPtr); PreReadOffset = OffsetPtr; auto TId = Reader.getU32(&OffsetPtr); if (OffsetPtr == PreReadOffset) return createStringError( std::make_error_code(std::errc::executable_format_error), - "Failed reading thread id field at offset %d.", OffsetPtr); + "Failed reading thread id field at offset %" PRId64 ".", OffsetPtr); PreReadOffset = OffsetPtr; auto PId = Reader.getU32(&OffsetPtr); if (OffsetPtr == PreReadOffset) return createStringError( std::make_error_code(std::errc::executable_format_error), - "Failed reading process id field at offset %d.", OffsetPtr); + "Failed reading process id field at offset %" PRId64 ".", + OffsetPtr); // Make a check for versions above 3 for the Pid field if (Record.FuncId != FuncId || Record.TId != TId || @@ -178,7 +183,7 @@ Error loadNaiveFormatLog(StringRef Data, bool IsLittleEndian, std::make_error_code(std::errc::executable_format_error), "Corrupted log, found arg payload following non-matching " "function+thread record. Record for function %d != %d at offset " - "%d", + "%" PRId64 ".", Record.FuncId, FuncId, OffsetPtr); PreReadOffset = OffsetPtr; @@ -186,7 +191,8 @@ Error loadNaiveFormatLog(StringRef Data, bool IsLittleEndian, if (OffsetPtr == PreReadOffset) return createStringError( std::make_error_code(std::errc::executable_format_error), - "Failed reading argument payload at offset %d.", OffsetPtr); + "Failed reading argument payload at offset %" PRId64 ".", + OffsetPtr); Record.CallArgs.push_back(Arg); break; @@ -194,7 +200,8 @@ Error loadNaiveFormatLog(StringRef Data, bool IsLittleEndian, default: return createStringError( std::make_error_code(std::errc::executable_format_error), - "Unknown record type '%d' at offset %d.", RecordType, OffsetPtr); + "Unknown record type '%d' at offset %" PRId64 ".", RecordType, + OffsetPtr); } // Advance the offset pointer enough bytes to align to 32-byte records for // basic mode logs. @@ -265,7 +272,7 @@ Error loadFDRLog(StringRef Data, bool IsLittleEndian, "Not enough bytes for an XRay FDR log."); DataExtractor DE(Data, IsLittleEndian, 8); - uint32_t OffsetPtr = 0; + uint64_t OffsetPtr = 0; auto FileHeaderOrError = readBinaryFormatHeader(DE, OffsetPtr); if (!FileHeaderOrError) return FileHeaderOrError.takeError(); @@ -424,7 +431,7 @@ Expected<Trace> llvm::xray::loadTrace(const DataExtractor &DE, bool Sort) { // Only if we can't load either the binary or the YAML format will we yield an // error. DataExtractor HeaderExtractor(DE.getData(), DE.isLittleEndian(), 8); - uint32_t OffsetPtr = 0; + uint64_t OffsetPtr = 0; uint16_t Version = HeaderExtractor.getU16(&OffsetPtr); uint16_t Type = HeaderExtractor.getU16(&OffsetPtr); |