mirror of
https://github.com/RPCS3/llvm-mirror.git
synced 2024-11-22 10:42:39 +01:00
[profile] Add binary id into profiles
This patch adds binary id into profiles to easily associate binaries with the corresponding profiles. There is an RFC that discusses the motivation, design and implementation in more detail: https://lists.llvm.org/pipermail/llvm-dev/2021-June/151154.html Differential Revision: https://reviews.llvm.org/D102039
This commit is contained in:
parent
03b82baf95
commit
4e540995b1
@ -1103,6 +1103,7 @@ namespace RawInstrProf {
|
|||||||
// raw header.
|
// raw header.
|
||||||
// Version 5: Bit 60 of FuncHash is reserved for the flag for the context
|
// Version 5: Bit 60 of FuncHash is reserved for the flag for the context
|
||||||
// sensitive records.
|
// sensitive records.
|
||||||
|
// Version 6: Added binary id.
|
||||||
const uint64_t Version = INSTR_PROF_RAW_VERSION;
|
const uint64_t Version = INSTR_PROF_RAW_VERSION;
|
||||||
|
|
||||||
template <class IntPtrT> inline uint64_t getMagic();
|
template <class IntPtrT> inline uint64_t getMagic();
|
||||||
|
@ -137,6 +137,7 @@ INSTR_PROF_RAW_HEADER(uint64_t, NamesSize, NamesSize)
|
|||||||
INSTR_PROF_RAW_HEADER(uint64_t, CountersDelta, (uintptr_t)CountersBegin)
|
INSTR_PROF_RAW_HEADER(uint64_t, CountersDelta, (uintptr_t)CountersBegin)
|
||||||
INSTR_PROF_RAW_HEADER(uint64_t, NamesDelta, (uintptr_t)NamesBegin)
|
INSTR_PROF_RAW_HEADER(uint64_t, NamesDelta, (uintptr_t)NamesBegin)
|
||||||
INSTR_PROF_RAW_HEADER(uint64_t, ValueKindLast, IPVK_Last)
|
INSTR_PROF_RAW_HEADER(uint64_t, ValueKindLast, IPVK_Last)
|
||||||
|
INSTR_PROF_RAW_HEADER(uint64_t, BinaryIdsSize, __llvm_write_binary_ids(NULL))
|
||||||
#undef INSTR_PROF_RAW_HEADER
|
#undef INSTR_PROF_RAW_HEADER
|
||||||
/* INSTR_PROF_RAW_HEADER end */
|
/* INSTR_PROF_RAW_HEADER end */
|
||||||
|
|
||||||
@ -645,7 +646,7 @@ serializeValueProfDataFrom(ValueProfRecordClosure *Closure,
|
|||||||
(uint64_t)'f' << 16 | (uint64_t)'R' << 8 | (uint64_t)129
|
(uint64_t)'f' << 16 | (uint64_t)'R' << 8 | (uint64_t)129
|
||||||
|
|
||||||
/* Raw profile format version (start from 1). */
|
/* Raw profile format version (start from 1). */
|
||||||
#define INSTR_PROF_RAW_VERSION 5
|
#define INSTR_PROF_RAW_VERSION 6
|
||||||
/* Indexed profile format version (start from 1). */
|
/* Indexed profile format version (start from 1). */
|
||||||
#define INSTR_PROF_INDEX_VERSION 7
|
#define INSTR_PROF_INDEX_VERSION 7
|
||||||
/* Coverage mapping format version (start from 0). */
|
/* Coverage mapping format version (start from 0). */
|
||||||
|
@ -82,6 +82,9 @@ public:
|
|||||||
/// Read a single record.
|
/// Read a single record.
|
||||||
virtual Error readNextRecord(NamedInstrProfRecord &Record) = 0;
|
virtual Error readNextRecord(NamedInstrProfRecord &Record) = 0;
|
||||||
|
|
||||||
|
/// Print binary ids on stream OS.
|
||||||
|
virtual Error printBinaryIds(raw_ostream &OS) { return success(); };
|
||||||
|
|
||||||
/// Iterator over profile data.
|
/// Iterator over profile data.
|
||||||
InstrProfIterator begin() { return InstrProfIterator(this); }
|
InstrProfIterator begin() { return InstrProfIterator(this); }
|
||||||
InstrProfIterator end() { return InstrProfIterator(); }
|
InstrProfIterator end() { return InstrProfIterator(); }
|
||||||
@ -222,6 +225,9 @@ private:
|
|||||||
uint32_t ValueKindLast;
|
uint32_t ValueKindLast;
|
||||||
uint32_t CurValueDataSize;
|
uint32_t CurValueDataSize;
|
||||||
|
|
||||||
|
uint64_t BinaryIdsSize;
|
||||||
|
const uint8_t *BinaryIdsStart;
|
||||||
|
|
||||||
public:
|
public:
|
||||||
RawInstrProfReader(std::unique_ptr<MemoryBuffer> DataBuffer)
|
RawInstrProfReader(std::unique_ptr<MemoryBuffer> DataBuffer)
|
||||||
: DataBuffer(std::move(DataBuffer)) {}
|
: DataBuffer(std::move(DataBuffer)) {}
|
||||||
@ -231,6 +237,7 @@ public:
|
|||||||
static bool hasFormat(const MemoryBuffer &DataBuffer);
|
static bool hasFormat(const MemoryBuffer &DataBuffer);
|
||||||
Error readHeader() override;
|
Error readHeader() override;
|
||||||
Error readNextRecord(NamedInstrProfRecord &Record) override;
|
Error readNextRecord(NamedInstrProfRecord &Record) override;
|
||||||
|
Error printBinaryIds(raw_ostream &OS) override;
|
||||||
|
|
||||||
bool isIRLevelProfile() const override {
|
bool isIRLevelProfile() const override {
|
||||||
return (Version & VARIANT_MASK_IR_PROF) != 0;
|
return (Version & VARIANT_MASK_IR_PROF) != 0;
|
||||||
|
@ -24,8 +24,8 @@
|
|||||||
#include "llvm/Support/Error.h"
|
#include "llvm/Support/Error.h"
|
||||||
#include "llvm/Support/ErrorOr.h"
|
#include "llvm/Support/ErrorOr.h"
|
||||||
#include "llvm/Support/MemoryBuffer.h"
|
#include "llvm/Support/MemoryBuffer.h"
|
||||||
#include "llvm/Support/SymbolRemappingReader.h"
|
|
||||||
#include "llvm/Support/SwapByteOrder.h"
|
#include "llvm/Support/SwapByteOrder.h"
|
||||||
|
#include "llvm/Support/SymbolRemappingReader.h"
|
||||||
#include <algorithm>
|
#include <algorithm>
|
||||||
#include <cctype>
|
#include <cctype>
|
||||||
#include <cstddef>
|
#include <cstddef>
|
||||||
@ -374,11 +374,13 @@ Error RawInstrProfReader<IntPtrT>::readHeader(
|
|||||||
auto PaddingBytesAfterCounters = swap(Header.PaddingBytesAfterCounters);
|
auto PaddingBytesAfterCounters = swap(Header.PaddingBytesAfterCounters);
|
||||||
NamesSize = swap(Header.NamesSize);
|
NamesSize = swap(Header.NamesSize);
|
||||||
ValueKindLast = swap(Header.ValueKindLast);
|
ValueKindLast = swap(Header.ValueKindLast);
|
||||||
|
BinaryIdsSize = swap(Header.BinaryIdsSize);
|
||||||
|
|
||||||
auto DataSizeInBytes = DataSize * sizeof(RawInstrProf::ProfileData<IntPtrT>);
|
auto DataSizeInBytes = DataSize * sizeof(RawInstrProf::ProfileData<IntPtrT>);
|
||||||
auto PaddingSize = getNumPaddingBytes(NamesSize);
|
auto PaddingSize = getNumPaddingBytes(NamesSize);
|
||||||
|
|
||||||
ptrdiff_t DataOffset = sizeof(RawInstrProf::Header);
|
// Profile data starts after profile header and binary ids if exist.
|
||||||
|
ptrdiff_t DataOffset = sizeof(RawInstrProf::Header) + BinaryIdsSize;
|
||||||
ptrdiff_t CountersOffset =
|
ptrdiff_t CountersOffset =
|
||||||
DataOffset + DataSizeInBytes + PaddingBytesBeforeCounters;
|
DataOffset + DataSizeInBytes + PaddingBytesBeforeCounters;
|
||||||
ptrdiff_t NamesOffset = CountersOffset + (sizeof(uint64_t) * CountersSize) +
|
ptrdiff_t NamesOffset = CountersOffset + (sizeof(uint64_t) * CountersSize) +
|
||||||
@ -392,6 +394,10 @@ Error RawInstrProfReader<IntPtrT>::readHeader(
|
|||||||
Data = reinterpret_cast<const RawInstrProf::ProfileData<IntPtrT> *>(
|
Data = reinterpret_cast<const RawInstrProf::ProfileData<IntPtrT> *>(
|
||||||
Start + DataOffset);
|
Start + DataOffset);
|
||||||
DataEnd = Data + DataSize;
|
DataEnd = Data + DataSize;
|
||||||
|
|
||||||
|
// Binary ids start just after the header.
|
||||||
|
BinaryIdsStart =
|
||||||
|
reinterpret_cast<const uint8_t *>(&Header) + sizeof(RawInstrProf::Header);
|
||||||
CountersStart = reinterpret_cast<const uint64_t *>(Start + CountersOffset);
|
CountersStart = reinterpret_cast<const uint64_t *>(Start + CountersOffset);
|
||||||
NamesStart = Start + NamesOffset;
|
NamesStart = Start + NamesOffset;
|
||||||
ValueDataStart = reinterpret_cast<const uint8_t *>(Start + ValueDataOffset);
|
ValueDataStart = reinterpret_cast<const uint8_t *>(Start + ValueDataOffset);
|
||||||
@ -506,6 +512,33 @@ Error RawInstrProfReader<IntPtrT>::readNextRecord(NamedInstrProfRecord &Record)
|
|||||||
return success();
|
return success();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
template <class IntPtrT>
|
||||||
|
Error RawInstrProfReader<IntPtrT>::printBinaryIds(raw_ostream &OS) {
|
||||||
|
if (BinaryIdsSize == 0)
|
||||||
|
return success();
|
||||||
|
|
||||||
|
OS << "Binary IDs: \n";
|
||||||
|
const uint8_t *BI = BinaryIdsStart;
|
||||||
|
while (BI < BinaryIdsStart + BinaryIdsSize) {
|
||||||
|
uint64_t BinaryIdLen = swap(*reinterpret_cast<const uint64_t *>(BI));
|
||||||
|
// Increment by binary id length data type size.
|
||||||
|
BI += sizeof(BinaryIdLen);
|
||||||
|
if (BI > (const uint8_t *)DataBuffer->getBufferEnd())
|
||||||
|
return make_error<InstrProfError>(instrprof_error::malformed);
|
||||||
|
|
||||||
|
for (uint64_t I = 0; I < BinaryIdLen; I++)
|
||||||
|
OS << format("%02x", BI[I]);
|
||||||
|
OS << "\n";
|
||||||
|
|
||||||
|
// Increment by binary id data length.
|
||||||
|
BI += BinaryIdLen;
|
||||||
|
if (BI > (const uint8_t *)DataBuffer->getBufferEnd())
|
||||||
|
return make_error<InstrProfError>(instrprof_error::malformed);
|
||||||
|
}
|
||||||
|
|
||||||
|
return success();
|
||||||
|
}
|
||||||
|
|
||||||
namespace llvm {
|
namespace llvm {
|
||||||
|
|
||||||
template class RawInstrProfReader<uint32_t>;
|
template class RawInstrProfReader<uint32_t>;
|
||||||
|
Binary file not shown.
Binary file not shown.
@ -14,7 +14,7 @@ RUN: llvm-profdata show %p/Inputs/c-general.profraw -o - --function=switches | F
|
|||||||
|
|
||||||
SWITCHES-LABEL: Counters:
|
SWITCHES-LABEL: Counters:
|
||||||
SWITCHES-NEXT: switches:
|
SWITCHES-NEXT: switches:
|
||||||
SWITCHES-NEXT: Hash: 0xa50a07f391ae4be5
|
SWITCHES-NEXT: Hash: 0x0099a0c98383683e
|
||||||
SWITCHES-NEXT: Counters: 19
|
SWITCHES-NEXT: Counters: 19
|
||||||
SWITCHES-NEXT: Function count: 1
|
SWITCHES-NEXT: Function count: 1
|
||||||
SWITCHES-LABEL: Functions shown: 1
|
SWITCHES-LABEL: Functions shown: 1
|
||||||
|
@ -8,9 +8,10 @@
|
|||||||
// INSTR_PROF_RAW_HEADER(uint64_t, CountersDelta, (uintptr_t)CountersBegin)
|
// INSTR_PROF_RAW_HEADER(uint64_t, CountersDelta, (uintptr_t)CountersBegin)
|
||||||
// INSTR_PROF_RAW_HEADER(uint64_t, NamesDelta, (uintptr_t)NamesBegin)
|
// INSTR_PROF_RAW_HEADER(uint64_t, NamesDelta, (uintptr_t)NamesBegin)
|
||||||
// INSTR_PROF_RAW_HEADER(uint64_t, ValueKindLast, IPVK_Last)
|
// INSTR_PROF_RAW_HEADER(uint64_t, ValueKindLast, IPVK_Last)
|
||||||
|
// INSTR_PROF_RAW_HEADER(uint64_t, BinaryIdsSize, __llvm_write_binary_ids(NULL))
|
||||||
|
|
||||||
RUN: printf '\201rforpl\377' > %t.profraw
|
RUN: printf '\201rforpl\377' > %t.profraw
|
||||||
RUN: printf '\5\0\0\0\0\0\0\0' >> %t.profraw
|
RUN: printf '\6\0\0\0\0\0\0\0' >> %t.profraw
|
||||||
RUN: printf '\1\0\0\0\0\0\0\0' >> %t.profraw
|
RUN: printf '\1\0\0\0\0\0\0\0' >> %t.profraw
|
||||||
RUN: printf '\0\0\0\0\0\0\0\0' >> %t.profraw
|
RUN: printf '\0\0\0\0\0\0\0\0' >> %t.profraw
|
||||||
RUN: printf '\2\0\0\0\0\0\0\0' >> %t.profraw
|
RUN: printf '\2\0\0\0\0\0\0\0' >> %t.profraw
|
||||||
@ -19,6 +20,7 @@ RUN: printf '\10\0\0\0\0\0\0\0' >> %t.profraw
|
|||||||
RUN: printf '\0\0\6\0\1\0\0\0' >> %t.profraw
|
RUN: printf '\0\0\6\0\1\0\0\0' >> %t.profraw
|
||||||
RUN: printf '\0\0\6\0\2\0\0\0' >> %t.profraw
|
RUN: printf '\0\0\6\0\2\0\0\0' >> %t.profraw
|
||||||
RUN: printf '\0\0\0\0\0\0\0\0' >> %t.profraw
|
RUN: printf '\0\0\0\0\0\0\0\0' >> %t.profraw
|
||||||
|
RUN: printf '\0\0\0\0\0\0\0\0' >> %t.profraw
|
||||||
|
|
||||||
// Data Section
|
// Data Section
|
||||||
//
|
//
|
||||||
|
@ -1,5 +1,5 @@
|
|||||||
RUN: printf '\377lprofR\201' > %t
|
RUN: printf '\377lprofR\201' > %t
|
||||||
RUN: printf '\0\0\0\0\0\0\0\5' >> %t
|
RUN: printf '\0\0\0\0\0\0\0\6' >> %t
|
||||||
RUN: printf '\0\0\0\0\0\0\0\2' >> %t
|
RUN: printf '\0\0\0\0\0\0\0\2' >> %t
|
||||||
RUN: printf '\0\0\0\0\0\0\0\0' >> %t
|
RUN: printf '\0\0\0\0\0\0\0\0' >> %t
|
||||||
RUN: printf '\0\0\0\0\0\0\0\3' >> %t
|
RUN: printf '\0\0\0\0\0\0\0\3' >> %t
|
||||||
@ -8,6 +8,7 @@ RUN: printf '\0\0\0\0\0\0\0\20' >> %t
|
|||||||
RUN: printf '\0\0\0\0\1\0\0\0' >> %t
|
RUN: printf '\0\0\0\0\1\0\0\0' >> %t
|
||||||
RUN: printf '\0\0\0\0\2\0\0\0' >> %t
|
RUN: printf '\0\0\0\0\2\0\0\0' >> %t
|
||||||
RUN: printf '\0\0\0\0\0\0\0\0' >> %t
|
RUN: printf '\0\0\0\0\0\0\0\0' >> %t
|
||||||
|
RUN: printf '\0\0\0\0\0\0\0\0' >> %t
|
||||||
|
|
||||||
RUN: printf '\134\370\302\114\333\030\275\254' >> %t
|
RUN: printf '\134\370\302\114\333\030\275\254' >> %t
|
||||||
RUN: printf '\0\0\0\0\0\0\0\1' >> %t
|
RUN: printf '\0\0\0\0\0\0\0\1' >> %t
|
||||||
|
@ -1,5 +1,5 @@
|
|||||||
RUN: printf '\201Rforpl\377' > %t
|
RUN: printf '\201Rforpl\377' > %t
|
||||||
RUN: printf '\5\0\0\0\0\0\0\0' >> %t
|
RUN: printf '\6\0\0\0\0\0\0\0' >> %t
|
||||||
RUN: printf '\2\0\0\0\0\0\0\0' >> %t
|
RUN: printf '\2\0\0\0\0\0\0\0' >> %t
|
||||||
RUN: printf '\0\0\0\0\0\0\0\0' >> %t
|
RUN: printf '\0\0\0\0\0\0\0\0' >> %t
|
||||||
RUN: printf '\3\0\0\0\0\0\0\0' >> %t
|
RUN: printf '\3\0\0\0\0\0\0\0' >> %t
|
||||||
@ -8,6 +8,7 @@ RUN: printf '\20\0\0\0\0\0\0\0' >> %t
|
|||||||
RUN: printf '\0\0\0\1\0\0\0\0' >> %t
|
RUN: printf '\0\0\0\1\0\0\0\0' >> %t
|
||||||
RUN: printf '\0\0\0\2\0\0\0\0' >> %t
|
RUN: printf '\0\0\0\2\0\0\0\0' >> %t
|
||||||
RUN: printf '\0\0\0\0\0\0\0\0' >> %t
|
RUN: printf '\0\0\0\0\0\0\0\0' >> %t
|
||||||
|
RUN: printf '\0\0\0\0\0\0\0\0' >> %t
|
||||||
|
|
||||||
RUN: printf '\254\275\030\333\114\302\370\134' >> %t
|
RUN: printf '\254\275\030\333\114\302\370\134' >> %t
|
||||||
RUN: printf '\1\0\0\0\0\0\0\0' >> %t
|
RUN: printf '\1\0\0\0\0\0\0\0' >> %t
|
||||||
|
@ -1,5 +1,5 @@
|
|||||||
RUN: printf '\377lprofr\201' > %t
|
RUN: printf '\377lprofr\201' > %t
|
||||||
RUN: printf '\0\0\0\0\0\0\0\5' >> %t
|
RUN: printf '\0\0\0\0\0\0\0\6' >> %t
|
||||||
RUN: printf '\0\0\0\0\0\0\0\2' >> %t
|
RUN: printf '\0\0\0\0\0\0\0\2' >> %t
|
||||||
RUN: printf '\0\0\0\0\0\0\0\0' >> %t
|
RUN: printf '\0\0\0\0\0\0\0\0' >> %t
|
||||||
RUN: printf '\0\0\0\0\0\0\0\3' >> %t
|
RUN: printf '\0\0\0\0\0\0\0\3' >> %t
|
||||||
@ -8,6 +8,7 @@ RUN: printf '\0\0\0\0\0\0\0\20' >> %t
|
|||||||
RUN: printf '\0\0\0\1\0\4\0\0' >> %t
|
RUN: printf '\0\0\0\1\0\4\0\0' >> %t
|
||||||
RUN: printf '\0\0\0\2\0\4\0\0' >> %t
|
RUN: printf '\0\0\0\2\0\4\0\0' >> %t
|
||||||
RUN: printf '\0\0\0\0\0\0\0\0' >> %t
|
RUN: printf '\0\0\0\0\0\0\0\0' >> %t
|
||||||
|
RUN: printf '\0\0\0\0\0\0\0\0' >> %t
|
||||||
|
|
||||||
RUN: printf '\134\370\302\114\333\030\275\254' >> %t
|
RUN: printf '\134\370\302\114\333\030\275\254' >> %t
|
||||||
RUN: printf '\0\0\0\0\0\0\0\1' >> %t
|
RUN: printf '\0\0\0\0\0\0\0\1' >> %t
|
||||||
|
@ -1,5 +1,5 @@
|
|||||||
RUN: printf '\201rforpl\377' > %t
|
RUN: printf '\201rforpl\377' > %t
|
||||||
RUN: printf '\5\0\0\0\0\0\0\0' >> %t
|
RUN: printf '\6\0\0\0\0\0\0\0' >> %t
|
||||||
RUN: printf '\2\0\0\0\0\0\0\0' >> %t
|
RUN: printf '\2\0\0\0\0\0\0\0' >> %t
|
||||||
RUN: printf '\0\0\0\0\0\0\0\0' >> %t
|
RUN: printf '\0\0\0\0\0\0\0\0' >> %t
|
||||||
RUN: printf '\3\0\0\0\0\0\0\0' >> %t
|
RUN: printf '\3\0\0\0\0\0\0\0' >> %t
|
||||||
@ -8,6 +8,7 @@ RUN: printf '\20\0\0\0\0\0\0\0' >> %t
|
|||||||
RUN: printf '\0\0\4\0\1\0\0\0' >> %t
|
RUN: printf '\0\0\4\0\1\0\0\0' >> %t
|
||||||
RUN: printf '\0\0\4\0\2\0\0\0' >> %t
|
RUN: printf '\0\0\4\0\2\0\0\0' >> %t
|
||||||
RUN: printf '\0\0\0\0\0\0\0\0' >> %t
|
RUN: printf '\0\0\0\0\0\0\0\0' >> %t
|
||||||
|
RUN: printf '\0\0\0\0\0\0\0\0' >> %t
|
||||||
|
|
||||||
RUN: printf '\254\275\030\333\114\302\370\134' >> %t
|
RUN: printf '\254\275\030\333\114\302\370\134' >> %t
|
||||||
RUN: printf '\1\0\0\0\0\0\0\0' >> %t
|
RUN: printf '\1\0\0\0\0\0\0\0' >> %t
|
||||||
|
@ -1,5 +1,5 @@
|
|||||||
RUN: printf '\201rforpl\377' > %t-foo.profraw
|
RUN: printf '\201rforpl\377' > %t-foo.profraw
|
||||||
RUN: printf '\5\0\0\0\0\0\0\0' >> %t-foo.profraw
|
RUN: printf '\6\0\0\0\0\0\0\0' >> %t-foo.profraw
|
||||||
RUN: printf '\1\0\0\0\0\0\0\0' >> %t-foo.profraw
|
RUN: printf '\1\0\0\0\0\0\0\0' >> %t-foo.profraw
|
||||||
RUN: printf '\0\0\0\0\0\0\0\0' >> %t-foo.profraw
|
RUN: printf '\0\0\0\0\0\0\0\0' >> %t-foo.profraw
|
||||||
RUN: printf '\1\0\0\0\0\0\0\0' >> %t-foo.profraw
|
RUN: printf '\1\0\0\0\0\0\0\0' >> %t-foo.profraw
|
||||||
@ -8,6 +8,7 @@ RUN: printf '\10\0\0\0\0\0\0\0' >> %t-foo.profraw
|
|||||||
RUN: printf '\0\0\4\0\1\0\0\0' >> %t-foo.profraw
|
RUN: printf '\0\0\4\0\1\0\0\0' >> %t-foo.profraw
|
||||||
RUN: printf '\0\0\4\0\2\0\0\0' >> %t-foo.profraw
|
RUN: printf '\0\0\4\0\2\0\0\0' >> %t-foo.profraw
|
||||||
RUN: printf '\0\0\0\0\0\0\0\0' >> %t-foo.profraw
|
RUN: printf '\0\0\0\0\0\0\0\0' >> %t-foo.profraw
|
||||||
|
RUN: printf '\0\0\0\0\0\0\0\0' >> %t-foo.profraw
|
||||||
|
|
||||||
RUN: printf '\254\275\030\333\114\302\370\134' >> %t-foo.profraw
|
RUN: printf '\254\275\030\333\114\302\370\134' >> %t-foo.profraw
|
||||||
RUN: printf '\1\0\0\0\0\0\0\0' >> %t-foo.profraw
|
RUN: printf '\1\0\0\0\0\0\0\0' >> %t-foo.profraw
|
||||||
@ -20,7 +21,7 @@ RUN: printf '\023\0\0\0\0\0\0\0' >> %t-foo.profraw
|
|||||||
RUN: printf '\3\0foo\0\0\0' >> %t-foo.profraw
|
RUN: printf '\3\0foo\0\0\0' >> %t-foo.profraw
|
||||||
|
|
||||||
RUN: printf '\201rforpl\377' > %t-bar.profraw
|
RUN: printf '\201rforpl\377' > %t-bar.profraw
|
||||||
RUN: printf '\5\0\0\0\0\0\0\0' >> %t-bar.profraw
|
RUN: printf '\6\0\0\0\0\0\0\0' >> %t-bar.profraw
|
||||||
RUN: printf '\1\0\0\0\0\0\0\0' >> %t-bar.profraw
|
RUN: printf '\1\0\0\0\0\0\0\0' >> %t-bar.profraw
|
||||||
RUN: printf '\0\0\0\0\0\0\0\0' >> %t-bar.profraw
|
RUN: printf '\0\0\0\0\0\0\0\0' >> %t-bar.profraw
|
||||||
RUN: printf '\2\0\0\0\0\0\0\0' >> %t-bar.profraw
|
RUN: printf '\2\0\0\0\0\0\0\0' >> %t-bar.profraw
|
||||||
@ -29,6 +30,7 @@ RUN: printf '\10\0\0\0\0\0\0\0' >> %t-bar.profraw
|
|||||||
RUN: printf '\0\0\6\0\1\0\0\0' >> %t-bar.profraw
|
RUN: printf '\0\0\6\0\1\0\0\0' >> %t-bar.profraw
|
||||||
RUN: printf '\0\0\6\0\2\0\0\0' >> %t-bar.profraw
|
RUN: printf '\0\0\6\0\2\0\0\0' >> %t-bar.profraw
|
||||||
RUN: printf '\0\0\0\0\0\0\0\0' >> %t-bar.profraw
|
RUN: printf '\0\0\0\0\0\0\0\0' >> %t-bar.profraw
|
||||||
|
RUN: printf '\0\0\0\0\0\0\0\0' >> %t-bar.profraw
|
||||||
|
|
||||||
RUN: printf '\067\265\035\031\112\165\023\344' >> %t-bar.profraw
|
RUN: printf '\067\265\035\031\112\165\023\344' >> %t-bar.profraw
|
||||||
RUN: printf '\02\0\0\0\0\0\0\0' >> %t-bar.profraw
|
RUN: printf '\02\0\0\0\0\0\0\0' >> %t-bar.profraw
|
||||||
|
@ -2069,7 +2069,7 @@ static int showInstrProfile(const std::string &Filename, bool ShowCounts,
|
|||||||
bool ShowAllFunctions, bool ShowCS,
|
bool ShowAllFunctions, bool ShowCS,
|
||||||
uint64_t ValueCutoff, bool OnlyListBelow,
|
uint64_t ValueCutoff, bool OnlyListBelow,
|
||||||
const std::string &ShowFunction, bool TextFormat,
|
const std::string &ShowFunction, bool TextFormat,
|
||||||
raw_fd_ostream &OS) {
|
bool ShowBinaryIds, raw_fd_ostream &OS) {
|
||||||
auto ReaderOrErr = InstrProfReader::create(Filename);
|
auto ReaderOrErr = InstrProfReader::create(Filename);
|
||||||
std::vector<uint32_t> Cutoffs = std::move(DetailedSummaryCutoffs);
|
std::vector<uint32_t> Cutoffs = std::move(DetailedSummaryCutoffs);
|
||||||
if (ShowDetailedSummary && Cutoffs.empty()) {
|
if (ShowDetailedSummary && Cutoffs.empty()) {
|
||||||
@ -2251,6 +2251,11 @@ static int showInstrProfile(const std::string &Filename, bool ShowCounts,
|
|||||||
OS << "Total count: " << PS->getTotalCount() << "\n";
|
OS << "Total count: " << PS->getTotalCount() << "\n";
|
||||||
PS->printDetailedSummary(OS);
|
PS->printDetailedSummary(OS);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (ShowBinaryIds)
|
||||||
|
if (Error E = Reader->printBinaryIds(OS))
|
||||||
|
exitWithError(std::move(E), Filename);
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -2501,6 +2506,8 @@ static int show_main(int argc, const char *argv[]) {
|
|||||||
cl::desc("Show the information of each section in the sample profile. "
|
cl::desc("Show the information of each section in the sample profile. "
|
||||||
"The flag is only usable when the sample profile is in "
|
"The flag is only usable when the sample profile is in "
|
||||||
"extbinary format"));
|
"extbinary format"));
|
||||||
|
cl::opt<bool> ShowBinaryIds("binary-ids", cl::init(false),
|
||||||
|
cl::desc("Show binary ids in the profile. "));
|
||||||
|
|
||||||
cl::ParseCommandLineOptions(argc, argv, "LLVM profile data summary\n");
|
cl::ParseCommandLineOptions(argc, argv, "LLVM profile data summary\n");
|
||||||
|
|
||||||
@ -2519,11 +2526,11 @@ static int show_main(int argc, const char *argv[]) {
|
|||||||
WithColor::warning() << "-function argument ignored: showing all functions\n";
|
WithColor::warning() << "-function argument ignored: showing all functions\n";
|
||||||
|
|
||||||
if (ProfileKind == instr)
|
if (ProfileKind == instr)
|
||||||
return showInstrProfile(Filename, ShowCounts, TopNFunctions,
|
return showInstrProfile(
|
||||||
ShowIndirectCallTargets, ShowMemOPSizes,
|
Filename, ShowCounts, TopNFunctions, ShowIndirectCallTargets,
|
||||||
ShowDetailedSummary, DetailedSummaryCutoffs,
|
ShowMemOPSizes, ShowDetailedSummary, DetailedSummaryCutoffs,
|
||||||
ShowAllFunctions, ShowCS, ValueCutoff,
|
ShowAllFunctions, ShowCS, ValueCutoff, OnlyListBelow, ShowFunction,
|
||||||
OnlyListBelow, ShowFunction, TextFormat, OS);
|
TextFormat, ShowBinaryIds, OS);
|
||||||
else
|
else
|
||||||
return showSampleProfile(Filename, ShowCounts, ShowAllFunctions,
|
return showSampleProfile(Filename, ShowCounts, ShowAllFunctions,
|
||||||
ShowDetailedSummary, ShowFunction,
|
ShowDetailedSummary, ShowFunction,
|
||||||
|
Loading…
Reference in New Issue
Block a user