summaryrefslogtreecommitdiff
path: root/lib/Profile/ProfileDataReader.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'lib/Profile/ProfileDataReader.cpp')
-rw-r--r--lib/Profile/ProfileDataReader.cpp167
1 files changed, 0 insertions, 167 deletions
diff --git a/lib/Profile/ProfileDataReader.cpp b/lib/Profile/ProfileDataReader.cpp
deleted file mode 100644
index e679d9eec0..0000000000
--- a/lib/Profile/ProfileDataReader.cpp
+++ /dev/null
@@ -1,167 +0,0 @@
-//=-- ProfileDataReader.cpp - Instrumented profiling reader -----------------=//
-//
-// The LLVM Compiler Infrastructure
-//
-// This file is distributed under the University of Illinois Open Source
-// License. See LICENSE.TXT for details.
-//
-//===----------------------------------------------------------------------===//
-//
-// This file contains support for reading profiling data for clang's
-// instrumentation based PGO and coverage.
-//
-//===----------------------------------------------------------------------===//
-
-#include "llvm/Profile/ProfileDataReader.h"
-#include "llvm/Profile/ProfileData.h"
-#include "llvm/Support/Endian.h"
-
-#include <cassert>
-
-using namespace llvm;
-
-error_code ProfileDataReader::create(
- std::string Path, std::unique_ptr<ProfileDataReader> &Result) {
- std::unique_ptr<MemoryBuffer> Buffer;
- if (error_code EC = MemoryBuffer::getFileOrSTDIN(Path, Buffer))
- return EC;
-
- if (Buffer->getBufferSize() > std::numeric_limits<unsigned>::max())
- return profiledata_error::too_large;
-
- Result.reset(new ProfileDataReader(Buffer));
- if (error_code EC = Result->readIndex())
- return EC;
- return profiledata_error::success;
-}
-
-class llvm::ProfileDataCursor {
- const char *Start;
- const char *Next;
- const char *End;
-
- error_code skip(unsigned bytes) {
- if (Next + bytes > End)
- return profiledata_error::malformed;
- Next += bytes;
- return profiledata_error::success;
- }
-
- template <typename T>
- error_code read(T &Result) {
- typedef support::detail::packed_endian_specific_integral
- <T, support::little, support::unaligned> Endian_t;
- const char *Prev = Next;
- if (error_code EC = skip(sizeof(T)))
- return EC;
- Result = *reinterpret_cast<const Endian_t*>(Prev);
- return profiledata_error::success;
- }
-public:
- ProfileDataCursor(const MemoryBuffer *Buf)
- : Start(Buf->getBufferStart()), Next(Start), End(Buf->getBufferEnd()) {}
- bool offsetReached(size_t Offset) { return Start + Offset <= Next; }
- bool offsetInBounds(size_t Offset) { return Start + Offset < End; }
-
- error_code skipToOffset(size_t Offset) {
- if (!offsetInBounds(Offset))
- return profiledata_error::malformed;
- Next = Start + Offset;
- return profiledata_error::success;
- }
-
- error_code skip32() { return skip(4); }
- error_code skip64() { return skip(8); }
- error_code read32(uint32_t &Result) { return read<uint32_t>(Result); }
- error_code read64(uint64_t &Result) { return read<uint64_t>(Result); }
-
- error_code readChars(StringRef &Result, uint32_t Len) {
- error_code EC;
- const char *Prev = Next;
- if (error_code EC = skip(Len))
- return EC;
- Result = StringRef(Prev, Len);
- return profiledata_error::success;
- }
- error_code readString(StringRef &Result) {
- uint32_t Len;
- if (error_code EC = read32(Len))
- return EC;
- return readChars(Result, Len);
- }
-};
-
-error_code ProfileDataReader::readIndex() {
- ProfileDataCursor Cursor(DataBuffer.get());
- error_code EC;
- StringRef Magic;
- uint32_t Version, IndexEnd, DataStart;
-
- if ((EC = Cursor.readChars(Magic, 4)))
- return EC;
- if (StringRef(PROFILEDATA_MAGIC, 4) != Magic)
- return profiledata_error::bad_magic;
- if ((EC = Cursor.read32(Version)))
- return EC;
- if (Version != PROFILEDATA_VERSION)
- return profiledata_error::unsupported_version;
- if ((EC = Cursor.read32(IndexEnd)))
- return EC;
- if ((EC = Cursor.skip32()))
- return EC;
- if ((EC = Cursor.read64(MaxFunctionCount)))
- return EC;
-
- DataStart = IndexEnd + (sizeof(uint64_t) - IndexEnd % sizeof(uint64_t));
- while (!Cursor.offsetReached(IndexEnd)) {
- StringRef FuncName;
- uint32_t Offset, TotalOffset;
- if ((EC = Cursor.readString(FuncName)))
- return EC;
- if ((EC = Cursor.read32(Offset)))
- return EC;
- TotalOffset = DataStart + Offset;
- if (!Cursor.offsetInBounds(TotalOffset))
- return profiledata_error::truncated;
- DataOffsets[FuncName] = TotalOffset;
- }
-
- return profiledata_error::success;
-}
-
-error_code ProfileDataReader::findFunctionCounts(StringRef FuncName,
- uint64_t &FunctionHash,
- ProfileDataCursor &Cursor) {
- error_code EC;
- // Find the relevant section of the pgo-data file.
- const auto &OffsetIter = DataOffsets.find(FuncName);
- if (OffsetIter == DataOffsets.end())
- return profiledata_error::unknown_function;
- // Go there and read the function data
- if ((EC = Cursor.skipToOffset(OffsetIter->getValue())))
- return EC;
- if ((EC = Cursor.read64(FunctionHash)))
- return EC;
- return profiledata_error::success;
-}
-
-error_code ProfileDataReader::getFunctionCounts(StringRef FuncName,
- uint64_t &FunctionHash,
- std::vector<uint64_t> &Counts) {
- ProfileDataCursor Cursor(DataBuffer.get());
- error_code EC;
- if ((EC = findFunctionCounts(FuncName, FunctionHash, Cursor)))
- return EC;
-
- uint64_t NumCounters;
- if ((EC = Cursor.read64(NumCounters)))
- return EC;
- for (uint64_t I = 0; I < NumCounters; ++I) {
- uint64_t Count;
- if ((EC = Cursor.read64(Count)))
- return EC;
- Counts.push_back(Count);
- }
-
- return profiledata_error::success;
-}