mirror of
https://github.com/RPCS3/llvm.git
synced 2026-01-31 01:25:19 +01:00
This patch uses one bit in profile version to differentiate Clang instrumentation and IR level instrumentation profiles. PGOInstrumenation generates a COMDAT variable __llvm_profile_raw_version so that the compiler runtime can set the right profile kind. For Maco-O platform, we generate the variable as linkonce_odr linkage as COMDAT is not supported. PGOInstrumenation now checks this bit to make sure it's an IR level instrumentation profile. The patch was submitted as r260164 but reverted due to a Darwin test breakage. Original Differential Revision: http://reviews.llvm.org/D15540 Differential Revision: http://reviews.llvm.org/D17020 git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@260385 91177308-0d34-0410-b5e6-96231b3b80d8
82 lines
2.7 KiB
C++
82 lines
2.7 KiB
C++
//=-- InstrProfWriter.h - Instrumented profiling writer -----------*- C++ -*-=//
|
|
//
|
|
// 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 writing profiling data for instrumentation
|
|
// based PGO and coverage.
|
|
//
|
|
//===----------------------------------------------------------------------===//
|
|
|
|
#ifndef LLVM_PROFILEDATA_INSTRPROFWRITER_H
|
|
#define LLVM_PROFILEDATA_INSTRPROFWRITER_H
|
|
|
|
#include "llvm/ADT/DenseMap.h"
|
|
#include "llvm/ProfileData/InstrProf.h"
|
|
#include "llvm/Support/DataTypes.h"
|
|
#include "llvm/Support/MemoryBuffer.h"
|
|
#include "llvm/Support/raw_ostream.h"
|
|
|
|
namespace llvm {
|
|
|
|
/// Writer for instrumentation based profile data.
|
|
class ProfOStream;
|
|
class InstrProfRecordWriterTrait;
|
|
|
|
class InstrProfWriter {
|
|
public:
|
|
typedef SmallDenseMap<uint64_t, InstrProfRecord, 1> ProfilingData;
|
|
enum ProfKind { PF_Unknown = 0, PF_FE, PF_IRLevel };
|
|
|
|
private:
|
|
bool Sparse;
|
|
StringMap<ProfilingData> FunctionData;
|
|
ProfKind ProfileKind;
|
|
// Use raw pointer here for the incomplete type object.
|
|
InstrProfRecordWriterTrait *InfoObj;
|
|
|
|
public:
|
|
InstrProfWriter(bool Sparse = false);
|
|
~InstrProfWriter();
|
|
|
|
/// Add function counts for the given function. If there are already counts
|
|
/// for this function and the hash and number of counts match, each counter is
|
|
/// summed. Optionally scale counts by \p Weight.
|
|
std::error_code addRecord(InstrProfRecord &&I, uint64_t Weight = 1);
|
|
/// Write the profile to \c OS
|
|
void write(raw_fd_ostream &OS);
|
|
/// Write the profile in text format to \c OS
|
|
void writeText(raw_fd_ostream &OS);
|
|
/// Write \c Record in text format to \c OS
|
|
static void writeRecordInText(const InstrProfRecord &Record,
|
|
InstrProfSymtab &Symtab, raw_fd_ostream &OS);
|
|
/// Write the profile, returning the raw data. For testing.
|
|
std::unique_ptr<MemoryBuffer> writeBuffer();
|
|
|
|
/// Set the ProfileKind. Report error if mixing FE and IR level profiles.
|
|
std::error_code setIsIRLevelProfile(bool IsIRLevel) {
|
|
if (ProfileKind == PF_Unknown) {
|
|
ProfileKind = IsIRLevel ? PF_IRLevel: PF_FE;
|
|
return instrprof_error::success;
|
|
}
|
|
return (IsIRLevel == (ProfileKind == PF_IRLevel)) ?
|
|
instrprof_error::success : instrprof_error::unsupported_version;
|
|
}
|
|
|
|
// Internal interface for testing purpose only.
|
|
void setValueProfDataEndianness(support::endianness Endianness);
|
|
void setOutputSparse(bool Sparse);
|
|
|
|
private:
|
|
bool shouldEncodeData(const ProfilingData &PD);
|
|
void writeImpl(ProfOStream &OS);
|
|
};
|
|
|
|
} // end namespace llvm
|
|
|
|
#endif
|