From 1468b7dcde3362c19e178bb58edbee551f0b2843 Mon Sep 17 00:00:00 2001 From: Dean Michael Berris Date: Thu, 13 Sep 2018 09:25:42 +0000 Subject: [PATCH] [XRay] Bug fixes for FDR custom event and arg-logging Summary: This change has a number of fixes for FDR mode in compiler-rt along with changes to the tooling handling the traces in llvm. In the runtime, we do the following: - Advance the "last record" pointer appropriately when writing the custom event data in the log. - Add XRAY_NEVER_INSTRUMENT in the rewinding routine. - When collecting the argument of functions appropriately marked, we should not attempt to rewind them (and reset the counts of functions that can be re-wound). In the tooling, we do the following: - Remove the state logic in BlockIndexer and instead rely on the presence/absence of records to indicate blocks. - Move the verifier into a loop associated with each block. Reviewers: mboerger, eizan Subscribers: llvm-commits, hiraditya Differential Revision: https://reviews.llvm.org/D51965 git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@342122 91177308-0d34-0410-b5e6-96231b3b80d8 --- include/llvm/XRay/BlockIndexer.h | 3 --- lib/XRay/BlockIndexer.cpp | 25 ++++++------------------- lib/XRay/Trace.cpp | 3 +-- 3 files changed, 7 insertions(+), 24 deletions(-) diff --git a/include/llvm/XRay/BlockIndexer.h b/include/llvm/XRay/BlockIndexer.h index 389e5cf47f6..46a7243685f 100644 --- a/include/llvm/XRay/BlockIndexer.h +++ b/include/llvm/XRay/BlockIndexer.h @@ -39,9 +39,6 @@ public: private: Index &Indices; - enum class State : unsigned { SeekExtents, ExtentsFound, ThreadIDFound }; - - State CurrentState = State::SeekExtents; Block CurrentBlock{0, 0, nullptr, {}}; public: diff --git a/lib/XRay/BlockIndexer.cpp b/lib/XRay/BlockIndexer.cpp index e1c554aff73..98e91f7de54 100644 --- a/lib/XRay/BlockIndexer.cpp +++ b/lib/XRay/BlockIndexer.cpp @@ -16,22 +16,7 @@ namespace llvm { namespace xray { -Error BlockIndexer::visit(BufferExtents &) { - if (CurrentState == State::ThreadIDFound) { - Index::iterator It; - std::tie(It, std::ignore) = - Indices.insert({{CurrentBlock.ProcessID, CurrentBlock.ThreadID}, {}}); - It->second.push_back({CurrentBlock.ProcessID, CurrentBlock.ThreadID, - CurrentBlock.WallclockTime, - std::move(CurrentBlock.Records)}); - CurrentBlock.ProcessID = 0; - CurrentBlock.ThreadID = 0; - CurrentBlock.WallclockTime = nullptr; - CurrentBlock.Records = {}; - } - CurrentState = State::ExtentsFound; - return Error::success(); -} +Error BlockIndexer::visit(BufferExtents &) { return Error::success(); } Error BlockIndexer::visit(WallclockRecord &R) { CurrentBlock.Records.push_back(&R); @@ -66,14 +51,16 @@ Error BlockIndexer::visit(PIDRecord &R) { } Error BlockIndexer::visit(NewBufferRecord &R) { - CurrentState = State::ThreadIDFound; + if (!CurrentBlock.Records.empty()) + if (auto E = flush()) + return E; + CurrentBlock.ThreadID = R.tid(); CurrentBlock.Records.push_back(&R); return Error::success(); } Error BlockIndexer::visit(EndBufferRecord &R) { - CurrentState = State::SeekExtents; CurrentBlock.Records.push_back(&R); return Error::success(); } @@ -84,7 +71,6 @@ Error BlockIndexer::visit(FunctionRecord &R) { } Error BlockIndexer::flush() { - CurrentState = State::SeekExtents; Index::iterator It; std::tie(It, std::ignore) = Indices.insert({{CurrentBlock.ProcessID, CurrentBlock.ThreadID}, {}}); @@ -94,6 +80,7 @@ Error BlockIndexer::flush() { CurrentBlock.ProcessID = 0; CurrentBlock.ThreadID = 0; CurrentBlock.Records = {}; + CurrentBlock.WallclockTime = nullptr; return Error::success(); } diff --git a/lib/XRay/Trace.cpp b/lib/XRay/Trace.cpp index 1a04b18ad9f..15cafa51bec 100644 --- a/lib/XRay/Trace.cpp +++ b/lib/XRay/Trace.cpp @@ -289,16 +289,15 @@ Error loadFDRLog(StringRef Data, bool IsLittleEndian, // Then we verify the consistency of the blocks. { - BlockVerifier Verifier; for (auto &PTB : Index) { auto &Blocks = PTB.second; for (auto &B : Blocks) { + BlockVerifier Verifier; for (auto *R : B.Records) if (auto E = R->apply(Verifier)) return E; if (auto E = Verifier.verify()) return E; - Verifier.reset(); } } }