diff options
author | Dean Michael Berris <dberris@google.com> | 2017-09-18 06:08:46 +0000 |
---|---|---|
committer | Dean Michael Berris <dberris@google.com> | 2017-09-18 06:08:46 +0000 |
commit | 0f84a7d355bb547efb950a473fce0bc55f3b1415 (patch) | |
tree | ff4336d57cafa42b5773d6fa985f69a29f9e4b86 /llvm/lib/XRay/Trace.cpp | |
parent | 7f10a34d88c5e8c9e2a3dbd13f19c1bf760736e3 (diff) | |
download | bcm5719-llvm-0f84a7d355bb547efb950a473fce0bc55f3b1415.tar.gz bcm5719-llvm-0f84a7d355bb547efb950a473fce0bc55f3b1415.zip |
[XRay][tools] Support tail-call exits before we write them in the runtime
Summary:
This change adds support for explicit tail-exit records to be written by
the XRay runtime. This lets us differentiate the tail exit
records/events in the log, and allows us to treat those exit events
especially in the future. For now we allow printing those out in YAML
(and reading them in).
Reviewers: kpw, pelikan
Subscribers: llvm-commits
Differential Revision: https://reviews.llvm.org/D37964
llvm-svn: 313514
Diffstat (limited to 'llvm/lib/XRay/Trace.cpp')
-rw-r--r-- | llvm/lib/XRay/Trace.cpp | 16 |
1 files changed, 10 insertions, 6 deletions
diff --git a/llvm/lib/XRay/Trace.cpp b/llvm/lib/XRay/Trace.cpp index 6b7a3a18e36..131c7807b1b 100644 --- a/llvm/lib/XRay/Trace.cpp +++ b/llvm/lib/XRay/Trace.cpp @@ -48,7 +48,7 @@ Error readBinaryFormatHeader(StringRef Data, XRayFileHeader &FileHeader) { FileHeader.NonstopTSC = Bitfield & 1uL << 1; FileHeader.CycleFrequency = HeaderExtractor.getU64(&OffsetPtr); std::memcpy(&FileHeader.FreeFormData, Data.bytes_begin() + OffsetPtr, 16); - if (FileHeader.Version != 1) + if (FileHeader.Version != 1 && FileHeader.Version != 2) return make_error<StringError>( Twine("Unsupported XRay file version: ") + Twine(FileHeader.Version), std::make_error_code(std::errc::invalid_argument)); @@ -94,6 +94,9 @@ Error loadNaiveFormatLog(StringRef Data, XRayFileHeader &FileHeader, case 1: Record.Type = RecordTypes::EXIT; break; + case 2: + Record.Type = RecordTypes::TAIL_EXIT; + break; default: return make_error<StringError>( Twine("Unknown record type '") + Twine(int{Type}) + "'", @@ -320,9 +323,11 @@ Error processFDRFunctionRecord(FDRState &State, uint8_t RecordFirstByte, Record.Type = RecordTypes::ENTER; break; case static_cast<uint8_t>(RecordTypes::EXIT): - case 2: // TAIL_EXIT is not yet defined in RecordTypes. Record.Type = RecordTypes::EXIT; break; + case static_cast<uint8_t>(RecordTypes::TAIL_EXIT): + Record.Type = RecordTypes::TAIL_EXIT; + break; default: // Cast to an unsigned integer to not interpret the record type as a char. return make_error<StringError>( @@ -443,7 +448,7 @@ Error loadFDRLog(StringRef Data, XRayFileHeader &FileHeader, // Having iterated over everything we've been given, we've either consumed // everything and ended up in the end state, or were told to skip the rest. bool Finished = State.Expects == FDRState::Token::SCAN_TO_END_OF_THREAD_BUF && - State.CurrentBufferSize == State.CurrentBufferConsumed; + State.CurrentBufferSize == State.CurrentBufferConsumed; if (State.Expects != FDRState::Token::NEW_BUFFER_RECORD_OR_EOF && !Finished) return make_error<StringError>( Twine("Encountered EOF with unexpected state expectation ") + @@ -534,9 +539,8 @@ Expected<Trace> llvm::xray::loadTraceFile(StringRef Filename, bool Sort) { enum BinaryFormatType { NAIVE_FORMAT = 0, FLIGHT_DATA_RECORDER_FORMAT = 1 }; Trace T; - if (Version == 1 && Type == NAIVE_FORMAT) { - if (auto E = - loadNaiveFormatLog(Data, T.FileHeader, T.Records)) + if (Type == NAIVE_FORMAT && (Version == 1 || Version == 2)) { + if (auto E = loadNaiveFormatLog(Data, T.FileHeader, T.Records)) return std::move(E); } else if (Version == 1 && Type == FLIGHT_DATA_RECORDER_FORMAT) { if (auto E = loadFDRLog(Data, T.FileHeader, T.Records)) |