Files
clang-r547379/include/llvm/ExecutionEngine/Orc/Shared/PerfSharedStructs.h
Ryan Prichard 6024e5c395 Update prebuilt Clang to r547379 (20.0.0).
clang 20.0.0 (based on r547379) from build 12806354.

Bug: http://b/379133546
Test: N/A
Change-Id: I2eb8938af55d809de674be63cb30cf27e801862b

Upstream-Commit: ad834e67b1105d15ef907f6255d4c96e8e733f57
2025-11-26 14:59:46 -05:00

233 lines
7.9 KiB
C++

//===--- PerfSharedStructs.h --- RPC Structs for perf support ---*- C++ -*-===//
//
// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
// See https://llvm.org/LICENSE.txt for license information.
// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
//
//===----------------------------------------------------------------------===//
//
// Structs and serialization to share perf-related information
//
//===----------------------------------------------------------------------===//
#ifndef LLVM_EXECUTIONENGINE_ORC_SHARED_PERFSHAREDSTRUCTS_H
#define LLVM_EXECUTIONENGINE_ORC_SHARED_PERFSHAREDSTRUCTS_H
#include "llvm/ExecutionEngine/Orc/Shared/SimplePackedSerialization.h"
namespace llvm {
namespace orc {
// The following are POD struct definitions from the perf jit specification
enum class PerfJITRecordType {
JIT_CODE_LOAD = 0,
JIT_CODE_MOVE = 1, // not emitted, code isn't moved
JIT_CODE_DEBUG_INFO = 2,
JIT_CODE_CLOSE = 3, // not emitted, unnecessary
JIT_CODE_UNWINDING_INFO = 4, // not emitted
JIT_CODE_MAX
};
struct PerfJITRecordPrefix {
PerfJITRecordType Id; // record type identifier, uint32_t
uint32_t TotalSize;
};
struct PerfJITCodeLoadRecord {
PerfJITRecordPrefix Prefix;
uint32_t Pid;
uint32_t Tid;
uint64_t Vma;
uint64_t CodeAddr;
uint64_t CodeSize;
uint64_t CodeIndex;
std::string Name;
};
struct PerfJITDebugEntry {
uint64_t Addr;
uint32_t Lineno; // source line number starting at 1
uint32_t Discrim; // column discriminator, 0 is default
std::string Name;
};
struct PerfJITDebugInfoRecord {
PerfJITRecordPrefix Prefix;
uint64_t CodeAddr;
std::vector<PerfJITDebugEntry> Entries;
};
struct PerfJITCodeUnwindingInfoRecord {
PerfJITRecordPrefix Prefix;
uint64_t UnwindDataSize;
uint64_t EHFrameHdrSize;
uint64_t MappedSize;
// Union, one will always be 0/"", the other has data
uint64_t EHFrameHdrAddr;
std::string EHFrameHdr;
uint64_t EHFrameAddr;
// size is UnwindDataSize - EHFrameHdrSize
};
// Batch vehicle for minimizing RPC calls for perf jit records
struct PerfJITRecordBatch {
std::vector<PerfJITDebugInfoRecord> DebugInfoRecords;
std::vector<PerfJITCodeLoadRecord> CodeLoadRecords;
// only valid if record size > 0
PerfJITCodeUnwindingInfoRecord UnwindingRecord;
};
// SPS traits for Records
namespace shared {
using SPSPerfJITRecordPrefix = SPSTuple<uint32_t, uint32_t>;
template <>
class SPSSerializationTraits<SPSPerfJITRecordPrefix, PerfJITRecordPrefix> {
public:
static size_t size(const PerfJITRecordPrefix &Val) {
return SPSPerfJITRecordPrefix::AsArgList::size(
static_cast<uint32_t>(Val.Id), Val.TotalSize);
}
static bool deserialize(SPSInputBuffer &IB, PerfJITRecordPrefix &Val) {
uint32_t Id;
if (!SPSPerfJITRecordPrefix::AsArgList::deserialize(IB, Id, Val.TotalSize))
return false;
Val.Id = static_cast<PerfJITRecordType>(Id);
return true;
}
static bool serialize(SPSOutputBuffer &OB, const PerfJITRecordPrefix &Val) {
return SPSPerfJITRecordPrefix::AsArgList::serialize(
OB, static_cast<uint32_t>(Val.Id), Val.TotalSize);
}
};
using SPSPerfJITCodeLoadRecord =
SPSTuple<SPSPerfJITRecordPrefix, uint32_t, uint32_t, uint64_t, uint64_t,
uint64_t, uint64_t, SPSString>;
template <>
class SPSSerializationTraits<SPSPerfJITCodeLoadRecord, PerfJITCodeLoadRecord> {
public:
static size_t size(const PerfJITCodeLoadRecord &Val) {
return SPSPerfJITCodeLoadRecord::AsArgList::size(
Val.Prefix, Val.Pid, Val.Tid, Val.Vma, Val.CodeAddr, Val.CodeSize,
Val.CodeIndex, Val.Name);
}
static bool deserialize(SPSInputBuffer &IB, PerfJITCodeLoadRecord &Val) {
return SPSPerfJITCodeLoadRecord::AsArgList::deserialize(
IB, Val.Prefix, Val.Pid, Val.Tid, Val.Vma, Val.CodeAddr, Val.CodeSize,
Val.CodeIndex, Val.Name);
}
static bool serialize(SPSOutputBuffer &OB, const PerfJITCodeLoadRecord &Val) {
return SPSPerfJITCodeLoadRecord::AsArgList::serialize(
OB, Val.Prefix, Val.Pid, Val.Tid, Val.Vma, Val.CodeAddr, Val.CodeSize,
Val.CodeIndex, Val.Name);
}
};
using SPSPerfJITDebugEntry = SPSTuple<uint64_t, uint32_t, uint32_t, SPSString>;
template <>
class SPSSerializationTraits<SPSPerfJITDebugEntry, PerfJITDebugEntry> {
public:
static size_t size(const PerfJITDebugEntry &Val) {
return SPSPerfJITDebugEntry::AsArgList::size(Val.Addr, Val.Lineno,
Val.Discrim, Val.Name);
}
static bool deserialize(SPSInputBuffer &IB, PerfJITDebugEntry &Val) {
return SPSPerfJITDebugEntry::AsArgList::deserialize(
IB, Val.Addr, Val.Lineno, Val.Discrim, Val.Name);
}
static bool serialize(SPSOutputBuffer &OB, const PerfJITDebugEntry &Val) {
return SPSPerfJITDebugEntry::AsArgList::serialize(OB, Val.Addr, Val.Lineno,
Val.Discrim, Val.Name);
}
};
using SPSPerfJITDebugInfoRecord = SPSTuple<SPSPerfJITRecordPrefix, uint64_t,
SPSSequence<SPSPerfJITDebugEntry>>;
template <>
class SPSSerializationTraits<SPSPerfJITDebugInfoRecord,
PerfJITDebugInfoRecord> {
public:
static size_t size(const PerfJITDebugInfoRecord &Val) {
return SPSPerfJITDebugInfoRecord::AsArgList::size(Val.Prefix, Val.CodeAddr,
Val.Entries);
}
static bool deserialize(SPSInputBuffer &IB, PerfJITDebugInfoRecord &Val) {
return SPSPerfJITDebugInfoRecord::AsArgList::deserialize(
IB, Val.Prefix, Val.CodeAddr, Val.Entries);
}
static bool serialize(SPSOutputBuffer &OB,
const PerfJITDebugInfoRecord &Val) {
return SPSPerfJITDebugInfoRecord::AsArgList::serialize(
OB, Val.Prefix, Val.CodeAddr, Val.Entries);
}
};
using SPSPerfJITCodeUnwindingInfoRecord =
SPSTuple<SPSPerfJITRecordPrefix, uint64_t, uint64_t, uint64_t, uint64_t,
SPSString, uint64_t>;
template <>
class SPSSerializationTraits<SPSPerfJITCodeUnwindingInfoRecord,
PerfJITCodeUnwindingInfoRecord> {
public:
static size_t size(const PerfJITCodeUnwindingInfoRecord &Val) {
return SPSPerfJITCodeUnwindingInfoRecord::AsArgList::size(
Val.Prefix, Val.UnwindDataSize, Val.EHFrameHdrSize, Val.MappedSize,
Val.EHFrameHdrAddr, Val.EHFrameHdr, Val.EHFrameAddr);
}
static bool deserialize(SPSInputBuffer &IB,
PerfJITCodeUnwindingInfoRecord &Val) {
return SPSPerfJITCodeUnwindingInfoRecord::AsArgList::deserialize(
IB, Val.Prefix, Val.UnwindDataSize, Val.EHFrameHdrSize, Val.MappedSize,
Val.EHFrameHdrAddr, Val.EHFrameHdr, Val.EHFrameAddr);
}
static bool serialize(SPSOutputBuffer &OB,
const PerfJITCodeUnwindingInfoRecord &Val) {
return SPSPerfJITCodeUnwindingInfoRecord::AsArgList::serialize(
OB, Val.Prefix, Val.UnwindDataSize, Val.EHFrameHdrSize, Val.MappedSize,
Val.EHFrameHdrAddr, Val.EHFrameHdr, Val.EHFrameAddr);
}
};
using SPSPerfJITRecordBatch = SPSTuple<SPSSequence<SPSPerfJITCodeLoadRecord>,
SPSSequence<SPSPerfJITDebugInfoRecord>,
SPSPerfJITCodeUnwindingInfoRecord>;
template <>
class SPSSerializationTraits<SPSPerfJITRecordBatch, PerfJITRecordBatch> {
public:
static size_t size(const PerfJITRecordBatch &Val) {
return SPSPerfJITRecordBatch::AsArgList::size(
Val.CodeLoadRecords, Val.DebugInfoRecords, Val.UnwindingRecord);
}
static bool deserialize(SPSInputBuffer &IB, PerfJITRecordBatch &Val) {
return SPSPerfJITRecordBatch::AsArgList::deserialize(
IB, Val.CodeLoadRecords, Val.DebugInfoRecords, Val.UnwindingRecord);
}
static bool serialize(SPSOutputBuffer &OB, const PerfJITRecordBatch &Val) {
return SPSPerfJITRecordBatch::AsArgList::serialize(
OB, Val.CodeLoadRecords, Val.DebugInfoRecords, Val.UnwindingRecord);
}
};
} // namespace shared
} // namespace orc
} // namespace llvm
#endif