1*523fa7a6SAndroid Build Coastguard Worker /* 2*523fa7a6SAndroid Build Coastguard Worker * Copyright (c) Meta Platforms, Inc. and affiliates. 3*523fa7a6SAndroid Build Coastguard Worker * All rights reserved. 4*523fa7a6SAndroid Build Coastguard Worker * 5*523fa7a6SAndroid Build Coastguard Worker * This source code is licensed under the BSD-style license found in the 6*523fa7a6SAndroid Build Coastguard Worker * LICENSE file in the root directory of this source tree. 7*523fa7a6SAndroid Build Coastguard Worker */ 8*523fa7a6SAndroid Build Coastguard Worker 9*523fa7a6SAndroid Build Coastguard Worker #pragma once 10*523fa7a6SAndroid Build Coastguard Worker 11*523fa7a6SAndroid Build Coastguard Worker #include <stdint.h> 12*523fa7a6SAndroid Build Coastguard Worker #include <stdlib.h> 13*523fa7a6SAndroid Build Coastguard Worker #include <string.h> 14*523fa7a6SAndroid Build Coastguard Worker 15*523fa7a6SAndroid Build Coastguard Worker namespace executorch { 16*523fa7a6SAndroid Build Coastguard Worker namespace runtime { 17*523fa7a6SAndroid Build Coastguard Worker 18*523fa7a6SAndroid Build Coastguard Worker // Version string used to check for compatibility with post-processing 19*523fa7a6SAndroid Build Coastguard Worker // tool 20*523fa7a6SAndroid Build Coastguard Worker #define ET_PROF_VER 0x00000001 21*523fa7a6SAndroid Build Coastguard Worker 22*523fa7a6SAndroid Build Coastguard Worker // By default we support profiling upto 1024 perf events. Build 23*523fa7a6SAndroid Build Coastguard Worker // targets can override this to increase the profiling buffer size 24*523fa7a6SAndroid Build Coastguard Worker // during compilation. 25*523fa7a6SAndroid Build Coastguard Worker #ifndef MAX_PROFILE_EVENTS 26*523fa7a6SAndroid Build Coastguard Worker #define MAX_PROFILE_EVENTS 1024 27*523fa7a6SAndroid Build Coastguard Worker #endif 28*523fa7a6SAndroid Build Coastguard Worker // By default we support profiling upto 1024 memory allocation events. 29*523fa7a6SAndroid Build Coastguard Worker // Build targets can choose to override this, which will consequently have 30*523fa7a6SAndroid Build Coastguard Worker // the effect of increasing/decreasing the profiling buffer size. 31*523fa7a6SAndroid Build Coastguard Worker #ifndef MAX_MEM_PROFILE_EVENTS 32*523fa7a6SAndroid Build Coastguard Worker #define MAX_MEM_PROFILE_EVENTS 1024 33*523fa7a6SAndroid Build Coastguard Worker #endif 34*523fa7a6SAndroid Build Coastguard Worker // By default we support profiling only upto 16 allocators. If users 35*523fa7a6SAndroid Build Coastguard Worker // have more allocators than these then they can override this during 36*523fa7a6SAndroid Build Coastguard Worker // compilation time. There will be an increase/decrease in the profiling 37*523fa7a6SAndroid Build Coastguard Worker // buffer size based on the way this value is changed. 38*523fa7a6SAndroid Build Coastguard Worker #ifndef MEM_PROFILE_MAX_ALLOCATORS 39*523fa7a6SAndroid Build Coastguard Worker #define MEM_PROFILE_MAX_ALLOCATORS 32 40*523fa7a6SAndroid Build Coastguard Worker #endif 41*523fa7a6SAndroid Build Coastguard Worker // By default we support only one profiling block. If users want to profile 42*523fa7a6SAndroid Build Coastguard Worker // something that will be iterated on multiple times then they will have to 43*523fa7a6SAndroid Build Coastguard Worker // increment this to support their use case. In post-processing the stats for 44*523fa7a6SAndroid Build Coastguard Worker // all these iterations will be consolidated. 45*523fa7a6SAndroid Build Coastguard Worker #ifndef MAX_PROFILE_BLOCKS 46*523fa7a6SAndroid Build Coastguard Worker #define MAX_PROFILE_BLOCKS 2 47*523fa7a6SAndroid Build Coastguard Worker #endif 48*523fa7a6SAndroid Build Coastguard Worker 49*523fa7a6SAndroid Build Coastguard Worker #define PROF_NAME_MAX_LEN 32 50*523fa7a6SAndroid Build Coastguard Worker 51*523fa7a6SAndroid Build Coastguard Worker typedef struct alignas(8) { 52*523fa7a6SAndroid Build Coastguard Worker union { 53*523fa7a6SAndroid Build Coastguard Worker const char* name_str; 54*523fa7a6SAndroid Build Coastguard Worker char name[PROF_NAME_MAX_LEN]; 55*523fa7a6SAndroid Build Coastguard Worker }; 56*523fa7a6SAndroid Build Coastguard Worker // chain_idx == -1 is a null value, when profile event happens out of chain 57*523fa7a6SAndroid Build Coastguard Worker // execution 58*523fa7a6SAndroid Build Coastguard Worker int32_t chain_idx; 59*523fa7a6SAndroid Build Coastguard Worker uint32_t instruction_idx; 60*523fa7a6SAndroid Build Coastguard Worker uint64_t start_time; 61*523fa7a6SAndroid Build Coastguard Worker uint64_t end_time; 62*523fa7a6SAndroid Build Coastguard Worker } prof_event_t; 63*523fa7a6SAndroid Build Coastguard Worker 64*523fa7a6SAndroid Build Coastguard Worker typedef struct alignas(8) { 65*523fa7a6SAndroid Build Coastguard Worker uint32_t allocator_id; 66*523fa7a6SAndroid Build Coastguard Worker uint32_t allocation_size; 67*523fa7a6SAndroid Build Coastguard Worker } mem_prof_event_t; 68*523fa7a6SAndroid Build Coastguard Worker 69*523fa7a6SAndroid Build Coastguard Worker typedef struct alignas(8) { 70*523fa7a6SAndroid Build Coastguard Worker char name[PROF_NAME_MAX_LEN]; 71*523fa7a6SAndroid Build Coastguard Worker uint64_t allocator_id; 72*523fa7a6SAndroid Build Coastguard Worker } prof_allocator_t; 73*523fa7a6SAndroid Build Coastguard Worker 74*523fa7a6SAndroid Build Coastguard Worker typedef struct alignas(8) { 75*523fa7a6SAndroid Build Coastguard Worker uint8_t* prof_data; 76*523fa7a6SAndroid Build Coastguard Worker uint32_t num_bytes; 77*523fa7a6SAndroid Build Coastguard Worker uint32_t num_blocks; 78*523fa7a6SAndroid Build Coastguard Worker } prof_result_t; 79*523fa7a6SAndroid Build Coastguard Worker 80*523fa7a6SAndroid Build Coastguard Worker typedef struct alignas(8) { 81*523fa7a6SAndroid Build Coastguard Worker char name[32]; 82*523fa7a6SAndroid Build Coastguard Worker uint32_t prof_ver; 83*523fa7a6SAndroid Build Coastguard Worker uint32_t max_prof_entries; 84*523fa7a6SAndroid Build Coastguard Worker uint32_t prof_entries; 85*523fa7a6SAndroid Build Coastguard Worker uint32_t max_allocator_entries; 86*523fa7a6SAndroid Build Coastguard Worker uint32_t allocator_entries; 87*523fa7a6SAndroid Build Coastguard Worker uint32_t max_mem_prof_entries; 88*523fa7a6SAndroid Build Coastguard Worker uint32_t mem_prof_entries; 89*523fa7a6SAndroid Build Coastguard Worker } prof_header_t; 90*523fa7a6SAndroid Build Coastguard Worker 91*523fa7a6SAndroid Build Coastguard Worker /* 92*523fa7a6SAndroid Build Coastguard Worker This is what the layout of the profiling buffer looks like. 93*523fa7a6SAndroid Build Coastguard Worker --------------------------------------- 94*523fa7a6SAndroid Build Coastguard Worker | Profiling header | 95*523fa7a6SAndroid Build Coastguard Worker --------------------------------------- 96*523fa7a6SAndroid Build Coastguard Worker | Profile events (Perf events) | 97*523fa7a6SAndroid Build Coastguard Worker --------------------------------------- 98*523fa7a6SAndroid Build Coastguard Worker | Memory allocators info | 99*523fa7a6SAndroid Build Coastguard Worker --------------------------------------- 100*523fa7a6SAndroid Build Coastguard Worker | Profile events (Memory allocations) | 101*523fa7a6SAndroid Build Coastguard Worker --------------------------------------- 102*523fa7a6SAndroid Build Coastguard Worker */ 103*523fa7a6SAndroid Build Coastguard Worker 104*523fa7a6SAndroid Build Coastguard Worker // offsets of the various sections in the profiling buffer 105*523fa7a6SAndroid Build Coastguard Worker // Total size required for profiling buffer 106*523fa7a6SAndroid Build Coastguard Worker constexpr uint32_t prof_buf_size = sizeof(prof_header_t) + 107*523fa7a6SAndroid Build Coastguard Worker sizeof(prof_event_t) * MAX_PROFILE_EVENTS + 108*523fa7a6SAndroid Build Coastguard Worker sizeof(mem_prof_event_t) * MAX_MEM_PROFILE_EVENTS + 109*523fa7a6SAndroid Build Coastguard Worker sizeof(prof_allocator_t) * MEM_PROFILE_MAX_ALLOCATORS; 110*523fa7a6SAndroid Build Coastguard Worker 111*523fa7a6SAndroid Build Coastguard Worker constexpr size_t prof_header_offset = 0; 112*523fa7a6SAndroid Build Coastguard Worker constexpr size_t prof_events_offset = sizeof(prof_header_t); 113*523fa7a6SAndroid Build Coastguard Worker constexpr size_t prof_mem_alloc_info_offset = 114*523fa7a6SAndroid Build Coastguard Worker prof_events_offset + sizeof(prof_event_t) * MAX_PROFILE_EVENTS; 115*523fa7a6SAndroid Build Coastguard Worker constexpr size_t prof_mem_alloc_events_offset = prof_mem_alloc_info_offset + 116*523fa7a6SAndroid Build Coastguard Worker sizeof(prof_allocator_t) * MEM_PROFILE_MAX_ALLOCATORS; 117*523fa7a6SAndroid Build Coastguard Worker 118*523fa7a6SAndroid Build Coastguard Worker // Set the initial state for the profiler assuming we're using the 119*523fa7a6SAndroid Build Coastguard Worker // statically allocated buffer declared in the profiler module. 120*523fa7a6SAndroid Build Coastguard Worker void profiler_init(void); 121*523fa7a6SAndroid Build Coastguard Worker 122*523fa7a6SAndroid Build Coastguard Worker // This starts the profiling of this event and returns a token 123*523fa7a6SAndroid Build Coastguard Worker // by which this event can be referred to in the future. 124*523fa7a6SAndroid Build Coastguard Worker uint32_t begin_profiling(const char* name); 125*523fa7a6SAndroid Build Coastguard Worker 126*523fa7a6SAndroid Build Coastguard Worker // End profiling event represented by token_id 127*523fa7a6SAndroid Build Coastguard Worker void end_profiling(uint32_t token_id); 128*523fa7a6SAndroid Build Coastguard Worker 129*523fa7a6SAndroid Build Coastguard Worker // Dump profiler results, return pointer to prof event array and number of 130*523fa7a6SAndroid Build Coastguard Worker // events in it. 131*523fa7a6SAndroid Build Coastguard Worker void dump_profile_stats(prof_result_t* prof_result); 132*523fa7a6SAndroid Build Coastguard Worker 133*523fa7a6SAndroid Build Coastguard Worker void reset_profile_stats(); 134*523fa7a6SAndroid Build Coastguard Worker 135*523fa7a6SAndroid Build Coastguard Worker void track_allocation(int32_t id, uint32_t size); 136*523fa7a6SAndroid Build Coastguard Worker 137*523fa7a6SAndroid Build Coastguard Worker uint32_t track_allocator(const char* name); 138*523fa7a6SAndroid Build Coastguard Worker 139*523fa7a6SAndroid Build Coastguard Worker void profiling_create_block(const char* name); 140*523fa7a6SAndroid Build Coastguard Worker 141*523fa7a6SAndroid Build Coastguard Worker // This class enables scope based profiling where needed. Profiling 142*523fa7a6SAndroid Build Coastguard Worker // will be started when the object is created and will end when the 143*523fa7a6SAndroid Build Coastguard Worker // object goes out of scope. 144*523fa7a6SAndroid Build Coastguard Worker class ExecutorchProfiler { 145*523fa7a6SAndroid Build Coastguard Worker public: 146*523fa7a6SAndroid Build Coastguard Worker explicit ExecutorchProfiler(const char* name); 147*523fa7a6SAndroid Build Coastguard Worker 148*523fa7a6SAndroid Build Coastguard Worker ~ExecutorchProfiler(); 149*523fa7a6SAndroid Build Coastguard Worker 150*523fa7a6SAndroid Build Coastguard Worker private: 151*523fa7a6SAndroid Build Coastguard Worker uint32_t prof_tok; 152*523fa7a6SAndroid Build Coastguard Worker }; 153*523fa7a6SAndroid Build Coastguard Worker 154*523fa7a6SAndroid Build Coastguard Worker typedef struct { 155*523fa7a6SAndroid Build Coastguard Worker int32_t chain_idx; 156*523fa7a6SAndroid Build Coastguard Worker uint32_t instruction_idx; 157*523fa7a6SAndroid Build Coastguard Worker } prof_state_t; 158*523fa7a6SAndroid Build Coastguard Worker 159*523fa7a6SAndroid Build Coastguard Worker const prof_state_t& get_profile_tls_state(); 160*523fa7a6SAndroid Build Coastguard Worker 161*523fa7a6SAndroid Build Coastguard Worker void set_profile_tls_state(const prof_state_t& state); 162*523fa7a6SAndroid Build Coastguard Worker 163*523fa7a6SAndroid Build Coastguard Worker class ExecutorchProfilerInstructionScope { 164*523fa7a6SAndroid Build Coastguard Worker public: 165*523fa7a6SAndroid Build Coastguard Worker explicit ExecutorchProfilerInstructionScope(const prof_state_t& state); 166*523fa7a6SAndroid Build Coastguard Worker ~ExecutorchProfilerInstructionScope(); 167*523fa7a6SAndroid Build Coastguard Worker 168*523fa7a6SAndroid Build Coastguard Worker // ScopeGuard: non-copyable, non-movable 169*523fa7a6SAndroid Build Coastguard Worker ExecutorchProfilerInstructionScope( 170*523fa7a6SAndroid Build Coastguard Worker const ExecutorchProfilerInstructionScope&) = delete; 171*523fa7a6SAndroid Build Coastguard Worker ExecutorchProfilerInstructionScope& operator=( 172*523fa7a6SAndroid Build Coastguard Worker const ExecutorchProfilerInstructionScope&) = delete; 173*523fa7a6SAndroid Build Coastguard Worker 174*523fa7a6SAndroid Build Coastguard Worker ExecutorchProfilerInstructionScope(ExecutorchProfilerInstructionScope&&) = 175*523fa7a6SAndroid Build Coastguard Worker delete; 176*523fa7a6SAndroid Build Coastguard Worker ExecutorchProfilerInstructionScope& operator=( 177*523fa7a6SAndroid Build Coastguard Worker ExecutorchProfilerInstructionScope&&) = delete; 178*523fa7a6SAndroid Build Coastguard Worker 179*523fa7a6SAndroid Build Coastguard Worker private: 180*523fa7a6SAndroid Build Coastguard Worker prof_state_t old_state_; 181*523fa7a6SAndroid Build Coastguard Worker }; 182*523fa7a6SAndroid Build Coastguard Worker 183*523fa7a6SAndroid Build Coastguard Worker } // namespace runtime 184*523fa7a6SAndroid Build Coastguard Worker } // namespace executorch 185*523fa7a6SAndroid Build Coastguard Worker 186*523fa7a6SAndroid Build Coastguard Worker namespace torch { 187*523fa7a6SAndroid Build Coastguard Worker namespace executor { 188*523fa7a6SAndroid Build Coastguard Worker // TODO(T197294990): Remove these deprecated aliases once all users have moved 189*523fa7a6SAndroid Build Coastguard Worker // to the new `::executorch` namespaces. 190*523fa7a6SAndroid Build Coastguard Worker using ::executorch::runtime::begin_profiling; 191*523fa7a6SAndroid Build Coastguard Worker using ::executorch::runtime::dump_profile_stats; 192*523fa7a6SAndroid Build Coastguard Worker using ::executorch::runtime::end_profiling; 193*523fa7a6SAndroid Build Coastguard Worker using ::executorch::runtime::ExecutorchProfiler; 194*523fa7a6SAndroid Build Coastguard Worker using ::executorch::runtime::ExecutorchProfilerInstructionScope; 195*523fa7a6SAndroid Build Coastguard Worker using ::executorch::runtime::get_profile_tls_state; 196*523fa7a6SAndroid Build Coastguard Worker using ::executorch::runtime::mem_prof_event_t; 197*523fa7a6SAndroid Build Coastguard Worker using ::executorch::runtime::prof_allocator_t; 198*523fa7a6SAndroid Build Coastguard Worker using ::executorch::runtime::prof_buf_size; 199*523fa7a6SAndroid Build Coastguard Worker using ::executorch::runtime::prof_event_t; 200*523fa7a6SAndroid Build Coastguard Worker using ::executorch::runtime::prof_events_offset; 201*523fa7a6SAndroid Build Coastguard Worker using ::executorch::runtime::prof_header_offset; 202*523fa7a6SAndroid Build Coastguard Worker using ::executorch::runtime::prof_header_t; 203*523fa7a6SAndroid Build Coastguard Worker using ::executorch::runtime::prof_mem_alloc_events_offset; 204*523fa7a6SAndroid Build Coastguard Worker using ::executorch::runtime::prof_mem_alloc_info_offset; 205*523fa7a6SAndroid Build Coastguard Worker using ::executorch::runtime::prof_result_t; 206*523fa7a6SAndroid Build Coastguard Worker using ::executorch::runtime::prof_state_t; 207*523fa7a6SAndroid Build Coastguard Worker using ::executorch::runtime::profiler_init; 208*523fa7a6SAndroid Build Coastguard Worker using ::executorch::runtime::profiling_create_block; 209*523fa7a6SAndroid Build Coastguard Worker using ::executorch::runtime::reset_profile_stats; 210*523fa7a6SAndroid Build Coastguard Worker using ::executorch::runtime::set_profile_tls_state; 211*523fa7a6SAndroid Build Coastguard Worker using ::executorch::runtime::track_allocation; 212*523fa7a6SAndroid Build Coastguard Worker using ::executorch::runtime::track_allocator; 213*523fa7a6SAndroid Build Coastguard Worker } // namespace executor 214*523fa7a6SAndroid Build Coastguard Worker } // namespace torch 215*523fa7a6SAndroid Build Coastguard Worker 216*523fa7a6SAndroid Build Coastguard Worker #ifdef PROFILING_ENABLED 217*523fa7a6SAndroid Build Coastguard Worker 218*523fa7a6SAndroid Build Coastguard Worker #define EXECUTORCH_PROFILE_CREATE_BLOCK(name) \ 219*523fa7a6SAndroid Build Coastguard Worker ::executorch::runtime::profiling_create_block(name); 220*523fa7a6SAndroid Build Coastguard Worker 221*523fa7a6SAndroid Build Coastguard Worker // Convenience macros to begin and end profiling. These can be inserted 222*523fa7a6SAndroid Build Coastguard Worker // anywhere as it'll be ensured that for the prod builds these will 223*523fa7a6SAndroid Build Coastguard Worker // essentially be noops. 224*523fa7a6SAndroid Build Coastguard Worker #define EXECUTORCH_BEGIN_PROF(name) \ 225*523fa7a6SAndroid Build Coastguard Worker ::executorch::runtime::begin_profiling(name); 226*523fa7a6SAndroid Build Coastguard Worker 227*523fa7a6SAndroid Build Coastguard Worker #define EXECUTORCH_END_PROF(token_id) \ 228*523fa7a6SAndroid Build Coastguard Worker ::executorch::runtime::end_profiling(token_id); 229*523fa7a6SAndroid Build Coastguard Worker 230*523fa7a6SAndroid Build Coastguard Worker #define EXECUTORCH_SCOPE_PROF(name) \ 231*523fa7a6SAndroid Build Coastguard Worker ::executorch::runtime::ExecutorchProfiler profiler(name); 232*523fa7a6SAndroid Build Coastguard Worker 233*523fa7a6SAndroid Build Coastguard Worker #define EXECUTORCH_PROFILE_INSTRUCTION_SCOPE(chain_idx, instruction_idx) \ 234*523fa7a6SAndroid Build Coastguard Worker ::executorch::runtime::ExecutorchProfilerInstructionScope \ 235*523fa7a6SAndroid Build Coastguard Worker __profiler_instruction_scope({chain_idx, instruction_idx}); 236*523fa7a6SAndroid Build Coastguard Worker 237*523fa7a6SAndroid Build Coastguard Worker #define EXECUTORCH_DUMP_PROFILE_RESULTS(prof_result) \ 238*523fa7a6SAndroid Build Coastguard Worker ::executorch::runtime::dump_profile_stats(prof_result); 239*523fa7a6SAndroid Build Coastguard Worker 240*523fa7a6SAndroid Build Coastguard Worker #define EXECUTORCH_RESET_PROFILE_RESULTS() \ 241*523fa7a6SAndroid Build Coastguard Worker ::executorch::runtime::reset_profile_stats(); 242*523fa7a6SAndroid Build Coastguard Worker 243*523fa7a6SAndroid Build Coastguard Worker #define EXECUTORCH_TRACK_ALLOCATOR(name) \ 244*523fa7a6SAndroid Build Coastguard Worker ::executorch::runtime::track_allocator(name); 245*523fa7a6SAndroid Build Coastguard Worker 246*523fa7a6SAndroid Build Coastguard Worker #define EXECUTORCH_TRACK_ALLOCATION(id, size) \ 247*523fa7a6SAndroid Build Coastguard Worker ::executorch::runtime::track_allocation(id, size); 248*523fa7a6SAndroid Build Coastguard Worker 249*523fa7a6SAndroid Build Coastguard Worker #else 250*523fa7a6SAndroid Build Coastguard Worker 251*523fa7a6SAndroid Build Coastguard Worker #define EXECUTORCH_PROFILE_CREATE_BLOCK(name) \ 252*523fa7a6SAndroid Build Coastguard Worker do { \ 253*523fa7a6SAndroid Build Coastguard Worker (void)(name); \ 254*523fa7a6SAndroid Build Coastguard Worker } while (0) 255*523fa7a6SAndroid Build Coastguard Worker 256*523fa7a6SAndroid Build Coastguard Worker #define EXECUTORCH_BEGIN_PROF(name) \ 257*523fa7a6SAndroid Build Coastguard Worker {} 258*523fa7a6SAndroid Build Coastguard Worker 259*523fa7a6SAndroid Build Coastguard Worker #define EXECUTORCH_END_PROF(token_id) \ 260*523fa7a6SAndroid Build Coastguard Worker do { \ 261*523fa7a6SAndroid Build Coastguard Worker (void)(token_id); \ 262*523fa7a6SAndroid Build Coastguard Worker } while (0) 263*523fa7a6SAndroid Build Coastguard Worker 264*523fa7a6SAndroid Build Coastguard Worker #define EXECUTORCH_SCOPE_PROF(name) \ 265*523fa7a6SAndroid Build Coastguard Worker do { \ 266*523fa7a6SAndroid Build Coastguard Worker (void)(name); \ 267*523fa7a6SAndroid Build Coastguard Worker } while (0) 268*523fa7a6SAndroid Build Coastguard Worker 269*523fa7a6SAndroid Build Coastguard Worker #define EXECUTORCH_PROFILE_INSTRUCTION_SCOPE(chain_idx, instruction_idx) \ 270*523fa7a6SAndroid Build Coastguard Worker do { \ 271*523fa7a6SAndroid Build Coastguard Worker (void)(chain_idx); \ 272*523fa7a6SAndroid Build Coastguard Worker (void)(instruction_idx); \ 273*523fa7a6SAndroid Build Coastguard Worker } while (0) 274*523fa7a6SAndroid Build Coastguard Worker 275*523fa7a6SAndroid Build Coastguard Worker #define EXECUTORCH_DUMP_PROFILE_RESULTS(prof_result_test) \ 276*523fa7a6SAndroid Build Coastguard Worker memset(prof_result_test, 0, sizeof(::executorch::runtime::prof_result_t)); 277*523fa7a6SAndroid Build Coastguard Worker 278*523fa7a6SAndroid Build Coastguard Worker #define EXECUTORCH_RESET_PROFILE_RESULTS() \ 279*523fa7a6SAndroid Build Coastguard Worker {} 280*523fa7a6SAndroid Build Coastguard Worker 281*523fa7a6SAndroid Build Coastguard Worker #define EXECUTORCH_TRACK_ALLOCATOR(name) ((void)(name), -1) 282*523fa7a6SAndroid Build Coastguard Worker 283*523fa7a6SAndroid Build Coastguard Worker #define EXECUTORCH_TRACK_ALLOCATION(id, size) \ 284*523fa7a6SAndroid Build Coastguard Worker do { \ 285*523fa7a6SAndroid Build Coastguard Worker (void)(id); \ 286*523fa7a6SAndroid Build Coastguard Worker (void)(size); \ 287*523fa7a6SAndroid Build Coastguard Worker } while (0) 288*523fa7a6SAndroid Build Coastguard Worker 289*523fa7a6SAndroid Build Coastguard Worker #endif 290