#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 {
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;
InstrProfRecordWriterTrait *InfoObj;
public:
InstrProfWriter(bool Sparse = false);
~InstrProfWriter();
std::error_code addRecord(InstrProfRecord &&I, uint64_t Weight = 1);
void write(raw_fd_ostream &OS);
void writeText(raw_fd_ostream &OS);
static void writeRecordInText(const InstrProfRecord &Record,
InstrProfSymtab &Symtab, raw_fd_ostream &OS);
std::unique_ptr<MemoryBuffer> writeBuffer();
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;
}
void setValueProfDataEndianness(support::endianness Endianness);
void setOutputSparse(bool Sparse);
private:
bool shouldEncodeData(const ProfilingData &PD);
void writeImpl(ProfOStream &OS);
};
}
#endif