5#ifndef V8_DIAGNOSTICS_ETW_JIT_METADATA_WIN_H_
6#define V8_DIAGNOSTICS_ETW_JIT_METADATA_WIN_H_
15namespace ETWJITInterface {
46template <
size_t count>
48 template <std::size_t... idx>
50 : bytes{str[idx]...}, size(
count) {}
53 template <std::size_t count1, std::size_t count2, std::size_t... idx1,
57 : bytes{s1.bytes[idx1]..., s2.bytes[idx2]...}, size(
count) {}
72template <
size_t count,
typename idx = std::make_index_sequence<count>>
78template <std::
size_t size1, std::
size_t size2>
81 auto idx1 = std::make_index_sequence<size1>();
82 auto idx2 = std::make_index_sequence<size2>();
87template <
size_t count>
88constexpr auto Field(
char const (&s)[
count], uint8_t type) {
90 const char type_arr[1] = {
static_cast<char>(
type)};
97 size_t total_size = size + 3;
98 const char header_bytes[3] = {
static_cast<char>(total_size & 0xFF),
99 static_cast<char>(total_size >> 8 & 0xFF),
111template <
typename T1>
117template <
typename T1,
typename T2,
typename... Ts>
132template <std::size_t
count,
typename... Ts>
136 auto data =
JoinBytes(name_bytes, fields);
138 auto header =
Header(data.size);
143 return EVENT_DESCRIPTOR{id,
147 EVENT_TRACE_TYPE_START,
153 UINT16
const UNALIGNED* traits,
const void* metadata,
162template <
typename... Ts>
164 const std::wstring& value,
const Ts&... rest);
165template <
typename... Ts>
167 const std::string& value,
const Ts&... rest);
168template <
typename... Ts>
170 const char* value,
const Ts&... rest);
173template <
typename T,
typename... Ts>
175 const T& value,
const Ts&... rest) {
176 EventDataDescCreate(data_descriptors, &value,
sizeof(value));
181template <
typename... Ts>
183 const std::wstring& value,
const Ts&... rest) {
184 EventDataDescCreate(data_descriptors, value.data(),
185 static_cast<ULONG
>(value.size() * 2 + 2));
189template <
typename... Ts>
191 const std::string& value,
const Ts&... rest) {
192 EventDataDescCreate(data_descriptors, value.data(),
193 static_cast<ULONG
>(value.size() + 1));
197template <
typename... Ts>
199 const char* value,
const Ts&... rest) {
200 ULONG size =
static_cast<ULONG
>(strlen(value) + 1);
201 EventDataDescCreate(data_descriptors, value, size);
207 const EVENT_DESCRIPTOR* event_descriptor,
208 EVENT_DATA_DESCRIPTOR* data_descriptor,
210 if (regHandle == 0)
return ERROR_SUCCESS;
211 return EventWriteTransfer(regHandle, event_descriptor, NULL ,
217template <
typename T,
typename... Fs>
219 const EVENT_DESCRIPTOR* event_descriptor, T* meta,
220 const Fs&... fields) {
230 LogEvent(provider->RegHandle, event_descriptor, descriptors,
base::Vector< const DirectHandle< Object > > args
constexpr uint16_t kSourceLoadEventID
constexpr uint32_t kEtwControlDisable
constexpr uint16_t kSourceDCStartEventID
const uint8_t kMetaDescriptorsCount
const uint8_t kManifestFreeChannel
constexpr unsigned char kTraceLevel
void LogEventData(const TraceLoggingHProvider provider, const EVENT_DESCRIPTOR *event_descriptor, T *meta, const Fs &... fields)
constexpr auto Field(char const (&s)[count], uint8_t type)
constexpr uint16_t kMethodLoadEventID
void SetMetaDescriptors(EVENT_DATA_DESCRIPTOR *data_descriptor, UINT16 const UNALIGNED *traits, const void *metadata, size_t size)
constexpr uint16_t kMethodDCStartEventID
constexpr uint64_t kJScriptRuntimeKeyword
constexpr auto JoinBytes(const str_bytes< size1 > &str1, const str_bytes< size2 > &str2)
constexpr auto EventMetadata(uint16_t id, uint64_t keywords)
ULONG LogEvent(uint64_t regHandle, const EVENT_DESCRIPTOR *event_descriptor, EVENT_DATA_DESCRIPTOR *data_descriptor, ULONG desc_count)
constexpr uint32_t kEtwControlCaptureState
constexpr auto MakeStrBytes(char const (&s)[count])
void SetFieldDescriptors(EVENT_DATA_DESCRIPTOR *data_descriptors)
constexpr auto JoinFields()
constexpr uint32_t kEtwControlEnable
constexpr auto Header(size_t size)
constexpr auto EventFields(char const (&name)[count], Ts... field_args)
constexpr str_bytes(char const (&str)[count], std::index_sequence< idx... >)
constexpr str_bytes(const str_bytes< count1 > &s1, std::index_sequence< idx1... >, const str_bytes< count2 > &s2, std::index_sequence< idx2... >)
#define T1(name, string, precedence)
#define T2(name, string, precedence)