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 <cinttypes> 12*523fa7a6SAndroid Build Coastguard Worker #include <cstdint> 13*523fa7a6SAndroid Build Coastguard Worker 14*523fa7a6SAndroid Build Coastguard Worker #include <executorch/runtime/core/data_loader.h> 15*523fa7a6SAndroid Build Coastguard Worker #include <executorch/runtime/core/error.h> 16*523fa7a6SAndroid Build Coastguard Worker #include <executorch/runtime/core/event_tracer.h> 17*523fa7a6SAndroid Build Coastguard Worker #include <executorch/runtime/core/freeable_buffer.h> 18*523fa7a6SAndroid Build Coastguard Worker #include <executorch/runtime/core/result.h> 19*523fa7a6SAndroid Build Coastguard Worker #include <executorch/runtime/executor/memory_manager.h> 20*523fa7a6SAndroid Build Coastguard Worker #include <executorch/runtime/executor/method.h> 21*523fa7a6SAndroid Build Coastguard Worker #include <executorch/runtime/executor/method_meta.h> 22*523fa7a6SAndroid Build Coastguard Worker #include <executorch/runtime/platform/compiler.h> 23*523fa7a6SAndroid Build Coastguard Worker 24*523fa7a6SAndroid Build Coastguard Worker // Forward declare flatbuffer types. This is a public header and must not 25*523fa7a6SAndroid Build Coastguard Worker // include the generated flatbuffer header. 26*523fa7a6SAndroid Build Coastguard Worker namespace executorch_flatbuffer { 27*523fa7a6SAndroid Build Coastguard Worker struct Program; 28*523fa7a6SAndroid Build Coastguard Worker } // namespace executorch_flatbuffer 29*523fa7a6SAndroid Build Coastguard Worker 30*523fa7a6SAndroid Build Coastguard Worker namespace executorch { 31*523fa7a6SAndroid Build Coastguard Worker namespace runtime { 32*523fa7a6SAndroid Build Coastguard Worker 33*523fa7a6SAndroid Build Coastguard Worker namespace testing { 34*523fa7a6SAndroid Build Coastguard Worker // Provides test access to private Program methods. 35*523fa7a6SAndroid Build Coastguard Worker class ProgramTestFriend; 36*523fa7a6SAndroid Build Coastguard Worker } // namespace testing 37*523fa7a6SAndroid Build Coastguard Worker 38*523fa7a6SAndroid Build Coastguard Worker namespace deserialization { 39*523fa7a6SAndroid Build Coastguard Worker // Provides Tensor deserializaiton access to private Program methods. 40*523fa7a6SAndroid Build Coastguard Worker class TensorParser; 41*523fa7a6SAndroid Build Coastguard Worker } // namespace deserialization 42*523fa7a6SAndroid Build Coastguard Worker 43*523fa7a6SAndroid Build Coastguard Worker /** 44*523fa7a6SAndroid Build Coastguard Worker * A deserialized ExecuTorch program binary. 45*523fa7a6SAndroid Build Coastguard Worker */ 46*523fa7a6SAndroid Build Coastguard Worker class Program final { 47*523fa7a6SAndroid Build Coastguard Worker public: 48*523fa7a6SAndroid Build Coastguard Worker /** 49*523fa7a6SAndroid Build Coastguard Worker * Types of validation that the Program can do before parsing the data. 50*523fa7a6SAndroid Build Coastguard Worker */ 51*523fa7a6SAndroid Build Coastguard Worker enum class Verification : uint8_t { 52*523fa7a6SAndroid Build Coastguard Worker /** 53*523fa7a6SAndroid Build Coastguard Worker * Do minimal verification of the data, ensuring that the header appears 54*523fa7a6SAndroid Build Coastguard Worker * correct. 55*523fa7a6SAndroid Build Coastguard Worker * 56*523fa7a6SAndroid Build Coastguard Worker * Has minimal runtime overhead. 57*523fa7a6SAndroid Build Coastguard Worker */ 58*523fa7a6SAndroid Build Coastguard Worker Minimal, 59*523fa7a6SAndroid Build Coastguard Worker /** 60*523fa7a6SAndroid Build Coastguard Worker * Do full verification of the data, ensuring that internal pointers are 61*523fa7a6SAndroid Build Coastguard Worker * self-consistent and that the data has not been truncated or obviously 62*523fa7a6SAndroid Build Coastguard Worker * corrupted. May not catch all types of corruption, but should guard 63*523fa7a6SAndroid Build Coastguard Worker * against illegal memory operations during parsing. 64*523fa7a6SAndroid Build Coastguard Worker * 65*523fa7a6SAndroid Build Coastguard Worker * Will have higher runtime overhead, scaling with the complexity of the 66*523fa7a6SAndroid Build Coastguard Worker * proram data. 67*523fa7a6SAndroid Build Coastguard Worker */ 68*523fa7a6SAndroid Build Coastguard Worker InternalConsistency, 69*523fa7a6SAndroid Build Coastguard Worker }; 70*523fa7a6SAndroid Build Coastguard Worker 71*523fa7a6SAndroid Build Coastguard Worker /** 72*523fa7a6SAndroid Build Coastguard Worker * Loads a Program from the provided loader. The Program will hold a pointer 73*523fa7a6SAndroid Build Coastguard Worker * to the loader, which must outlive the returned Program instance. 74*523fa7a6SAndroid Build Coastguard Worker * 75*523fa7a6SAndroid Build Coastguard Worker * @param[in] loader The source to load program data from. The Program will 76*523fa7a6SAndroid Build Coastguard Worker * hold a pointer to this loader, which must outlive the returned Program 77*523fa7a6SAndroid Build Coastguard Worker * instance. 78*523fa7a6SAndroid Build Coastguard Worker * @param[in] verification The type of verification to do before returning 79*523fa7a6SAndroid Build Coastguard Worker * success. 80*523fa7a6SAndroid Build Coastguard Worker */ 81*523fa7a6SAndroid Build Coastguard Worker ET_NODISCARD static Result<Program> load( 82*523fa7a6SAndroid Build Coastguard Worker DataLoader* loader, 83*523fa7a6SAndroid Build Coastguard Worker Verification verification = Verification::Minimal); 84*523fa7a6SAndroid Build Coastguard Worker 85*523fa7a6SAndroid Build Coastguard Worker /// DEPRECATED: Use the lowercase `load()` instead. 86*523fa7a6SAndroid Build Coastguard Worker ET_DEPRECATED ET_NODISCARD static Result<Program> Load( 87*523fa7a6SAndroid Build Coastguard Worker DataLoader* loader, 88*523fa7a6SAndroid Build Coastguard Worker Verification verification = Verification::Minimal) { 89*523fa7a6SAndroid Build Coastguard Worker return load(loader, verification); 90*523fa7a6SAndroid Build Coastguard Worker } 91*523fa7a6SAndroid Build Coastguard Worker 92*523fa7a6SAndroid Build Coastguard Worker // Movable, to be compatible with Result. 93*523fa7a6SAndroid Build Coastguard Worker Program(Program&&) noexcept = default; 94*523fa7a6SAndroid Build Coastguard Worker ~Program() = default; 95*523fa7a6SAndroid Build Coastguard Worker 96*523fa7a6SAndroid Build Coastguard Worker /** 97*523fa7a6SAndroid Build Coastguard Worker * Get the constant buffer inside Program with index buffer_idx. 98*523fa7a6SAndroid Build Coastguard Worker * @param[in] buffer_idx the index of the buffer in the constant_buffer. 99*523fa7a6SAndroid Build Coastguard Worker * @param[in] nbytes the number of bytes to read from the buffer. 100*523fa7a6SAndroid Build Coastguard Worker * @return The buffer with corresponding index. 101*523fa7a6SAndroid Build Coastguard Worker */ 102*523fa7a6SAndroid Build Coastguard Worker Result<const void*> get_constant_buffer_data(size_t buffer_idx, size_t nbytes) 103*523fa7a6SAndroid Build Coastguard Worker const; 104*523fa7a6SAndroid Build Coastguard Worker 105*523fa7a6SAndroid Build Coastguard Worker /** 106*523fa7a6SAndroid Build Coastguard Worker * Returns the number of methods in the program. 107*523fa7a6SAndroid Build Coastguard Worker */ 108*523fa7a6SAndroid Build Coastguard Worker size_t num_methods() const; 109*523fa7a6SAndroid Build Coastguard Worker 110*523fa7a6SAndroid Build Coastguard Worker /** 111*523fa7a6SAndroid Build Coastguard Worker * Returns the name of the method at particular index. 112*523fa7a6SAndroid Build Coastguard Worker * 113*523fa7a6SAndroid Build Coastguard Worker * @param[in] method_index The index of the method name to retrieve. Must be 114*523fa7a6SAndroid Build Coastguard Worker * less than the value returned by `num_methods()`. 115*523fa7a6SAndroid Build Coastguard Worker * 116*523fa7a6SAndroid Build Coastguard Worker * @returns The name of the requested method. The pointer is owned by the 117*523fa7a6SAndroid Build Coastguard Worker * Program, and has the same lifetime as the Program. 118*523fa7a6SAndroid Build Coastguard Worker */ 119*523fa7a6SAndroid Build Coastguard Worker Result<const char*> get_method_name(size_t method_index) const; 120*523fa7a6SAndroid Build Coastguard Worker 121*523fa7a6SAndroid Build Coastguard Worker /** 122*523fa7a6SAndroid Build Coastguard Worker * Loads the named method and prepares it for execution. 123*523fa7a6SAndroid Build Coastguard Worker * 124*523fa7a6SAndroid Build Coastguard Worker * @param[in] method_name The name of the method to load. 125*523fa7a6SAndroid Build Coastguard Worker * @param[in] memory_manager The allocators to use during initialization and 126*523fa7a6SAndroid Build Coastguard Worker * execution of the loaded method. If `memory_manager.temp_allocator()` is 127*523fa7a6SAndroid Build Coastguard Worker * null, the runtime will allocate temp memory using `et_pal_allocate()`. 128*523fa7a6SAndroid Build Coastguard Worker * @param[in] event_tracer The event tracer to use for this method run. 129*523fa7a6SAndroid Build Coastguard Worker * 130*523fa7a6SAndroid Build Coastguard Worker * @returns The loaded method on success, or an error on failure. 131*523fa7a6SAndroid Build Coastguard Worker */ 132*523fa7a6SAndroid Build Coastguard Worker Result<Method> load_method( 133*523fa7a6SAndroid Build Coastguard Worker const char* method_name, 134*523fa7a6SAndroid Build Coastguard Worker MemoryManager* memory_manager, 135*523fa7a6SAndroid Build Coastguard Worker EventTracer* event_tracer = nullptr) const; 136*523fa7a6SAndroid Build Coastguard Worker 137*523fa7a6SAndroid Build Coastguard Worker /** 138*523fa7a6SAndroid Build Coastguard Worker * Gathers metadata for the named method. 139*523fa7a6SAndroid Build Coastguard Worker * 140*523fa7a6SAndroid Build Coastguard Worker * @param[in] method_name The name of the method to get metadata for. 141*523fa7a6SAndroid Build Coastguard Worker */ 142*523fa7a6SAndroid Build Coastguard Worker Result<MethodMeta> method_meta(const char* method_name) const; 143*523fa7a6SAndroid Build Coastguard Worker 144*523fa7a6SAndroid Build Coastguard Worker /** 145*523fa7a6SAndroid Build Coastguard Worker * DEPRECATED: Get the pytree encoding string for the output. Deprecated as 146*523fa7a6SAndroid Build Coastguard Worker * this functionality will eventually move out of the core program into a 147*523fa7a6SAndroid Build Coastguard Worker * higher level structure, but that does not exist at this time. 148*523fa7a6SAndroid Build Coastguard Worker * @param[in] method_name The name of the method to get the encoding for. 149*523fa7a6SAndroid Build Coastguard Worker * 150*523fa7a6SAndroid Build Coastguard Worker * @return The pytree encoding string for the output 151*523fa7a6SAndroid Build Coastguard Worker */ 152*523fa7a6SAndroid Build Coastguard Worker ET_DEPRECATED Result<const char*> get_output_flattening_encoding( 153*523fa7a6SAndroid Build Coastguard Worker const char* method_name = "forward") const; 154*523fa7a6SAndroid Build Coastguard Worker 155*523fa7a6SAndroid Build Coastguard Worker /** 156*523fa7a6SAndroid Build Coastguard Worker * Describes the presence of an ExecuTorch program header. 157*523fa7a6SAndroid Build Coastguard Worker */ 158*523fa7a6SAndroid Build Coastguard Worker enum HeaderStatus { 159*523fa7a6SAndroid Build Coastguard Worker /** 160*523fa7a6SAndroid Build Coastguard Worker * An ExecuTorch program header is present, and its version is compatible 161*523fa7a6SAndroid Build Coastguard Worker * with this version of the runtime. 162*523fa7a6SAndroid Build Coastguard Worker */ 163*523fa7a6SAndroid Build Coastguard Worker CompatibleVersion, 164*523fa7a6SAndroid Build Coastguard Worker 165*523fa7a6SAndroid Build Coastguard Worker /** 166*523fa7a6SAndroid Build Coastguard Worker * An ExecuTorch program header is present, but its version is not 167*523fa7a6SAndroid Build Coastguard Worker * compatible with this version of the runtime. 168*523fa7a6SAndroid Build Coastguard Worker */ 169*523fa7a6SAndroid Build Coastguard Worker IncompatibleVersion, 170*523fa7a6SAndroid Build Coastguard Worker 171*523fa7a6SAndroid Build Coastguard Worker /** 172*523fa7a6SAndroid Build Coastguard Worker * An ExecuTorch program header is not present. 173*523fa7a6SAndroid Build Coastguard Worker */ 174*523fa7a6SAndroid Build Coastguard Worker NotPresent, 175*523fa7a6SAndroid Build Coastguard Worker 176*523fa7a6SAndroid Build Coastguard Worker /** 177*523fa7a6SAndroid Build Coastguard Worker * The data provided was too short to find the program header. 178*523fa7a6SAndroid Build Coastguard Worker */ 179*523fa7a6SAndroid Build Coastguard Worker ShortData, 180*523fa7a6SAndroid Build Coastguard Worker }; 181*523fa7a6SAndroid Build Coastguard Worker 182*523fa7a6SAndroid Build Coastguard Worker /** 183*523fa7a6SAndroid Build Coastguard Worker * The minimum number of bytes necessary for calls to `check_header`. 184*523fa7a6SAndroid Build Coastguard Worker */ 185*523fa7a6SAndroid Build Coastguard Worker static constexpr size_t kMinHeadBytes = 64; 186*523fa7a6SAndroid Build Coastguard Worker 187*523fa7a6SAndroid Build Coastguard Worker /** 188*523fa7a6SAndroid Build Coastguard Worker * Looks for an ExecuTorch program header in the provided data. 189*523fa7a6SAndroid Build Coastguard Worker * 190*523fa7a6SAndroid Build Coastguard Worker * @param[in] data The data from the beginning of a file that might contain 191*523fa7a6SAndroid Build Coastguard Worker * an ExecuTorch program. 192*523fa7a6SAndroid Build Coastguard Worker * @param[in] size The size of `data` in bytes. Must be >= `kMinHeadBytes`. 193*523fa7a6SAndroid Build Coastguard Worker * 194*523fa7a6SAndroid Build Coastguard Worker * @returns A value describing the presence of a header in the data. 195*523fa7a6SAndroid Build Coastguard Worker */ 196*523fa7a6SAndroid Build Coastguard Worker static HeaderStatus check_header(const void* data, size_t size); 197*523fa7a6SAndroid Build Coastguard Worker 198*523fa7a6SAndroid Build Coastguard Worker private: 199*523fa7a6SAndroid Build Coastguard Worker // Let some classes call these private methods. 200*523fa7a6SAndroid Build Coastguard Worker friend class BackendDelegate; 201*523fa7a6SAndroid Build Coastguard Worker friend class Executor; 202*523fa7a6SAndroid Build Coastguard Worker friend class Method; 203*523fa7a6SAndroid Build Coastguard Worker friend class deserialization::TensorParser; 204*523fa7a6SAndroid Build Coastguard Worker friend class testing::ProgramTestFriend; 205*523fa7a6SAndroid Build Coastguard Worker get_internal_program()206*523fa7a6SAndroid Build Coastguard Worker const executorch_flatbuffer::Program* get_internal_program() const { 207*523fa7a6SAndroid Build Coastguard Worker return internal_program_; 208*523fa7a6SAndroid Build Coastguard Worker } 209*523fa7a6SAndroid Build Coastguard Worker 210*523fa7a6SAndroid Build Coastguard Worker // Used by Method to look up entries in the delegate data table. 211*523fa7a6SAndroid Build Coastguard Worker Error get_backend_delegate_data( 212*523fa7a6SAndroid Build Coastguard Worker size_t index, 213*523fa7a6SAndroid Build Coastguard Worker const void** out_data, 214*523fa7a6SAndroid Build Coastguard Worker size_t* out_size) const; 215*523fa7a6SAndroid Build Coastguard Worker 216*523fa7a6SAndroid Build Coastguard Worker /** 217*523fa7a6SAndroid Build Coastguard Worker * Loads a segment by index. 218*523fa7a6SAndroid Build Coastguard Worker * 219*523fa7a6SAndroid Build Coastguard Worker * @param[in] segment_info Struct containing an index to load from the 220*523fa7a6SAndroid Build Coastguard Worker * Program.segments list. The other fields of the struct, such as 221*523fa7a6SAndroid Build Coastguard Worker * `segment_type` and `descriptor`, need to also be correct. 222*523fa7a6SAndroid Build Coastguard Worker * 223*523fa7a6SAndroid Build Coastguard Worker * @returns The data as a FreeableBuffer, if the index is valid. 224*523fa7a6SAndroid Build Coastguard Worker * @retval Error::NotFound The program does not contain any segments or the 225*523fa7a6SAndroid Build Coastguard Worker * index is out of range. 226*523fa7a6SAndroid Build Coastguard Worker * @returns Other errors depending on the implementation of 227*523fa7a6SAndroid Build Coastguard Worker * DataLoader: The Program.segment table is inconsistent, or the 228*523fa7a6SAndroid Build Coastguard Worker * data cannot be accessed. 229*523fa7a6SAndroid Build Coastguard Worker */ 230*523fa7a6SAndroid Build Coastguard Worker ET_NODISCARD Result<FreeableBuffer> LoadSegment( 231*523fa7a6SAndroid Build Coastguard Worker const DataLoader::SegmentInfo& segment_info) const; 232*523fa7a6SAndroid Build Coastguard Worker 233*523fa7a6SAndroid Build Coastguard Worker /** 234*523fa7a6SAndroid Build Coastguard Worker * Loads a portion of a mutable segment into the provided buffer. 235*523fa7a6SAndroid Build Coastguard Worker * 236*523fa7a6SAndroid Build Coastguard Worker * @param[in] mutable_data_segments_index The index into the 237*523fa7a6SAndroid Build Coastguard Worker * mutable_data_segments_array. 238*523fa7a6SAndroid Build Coastguard Worker * @param[in] offset_index The index into the segment's offsets array. 239*523fa7a6SAndroid Build Coastguard Worker * @param[in] size The number of bytes to load. 240*523fa7a6SAndroid Build Coastguard Worker * @param[in] buffer The buffer to load data into. Must point to at least 241*523fa7a6SAndroid Build Coastguard Worker * `size` bytes of memory. 242*523fa7a6SAndroid Build Coastguard Worker * 243*523fa7a6SAndroid Build Coastguard Worker * @returns An error code on if the load was successful. 244*523fa7a6SAndroid Build Coastguard Worker * @retval Error::Ok The load was successful. 245*523fa7a6SAndroid Build Coastguard Worker * @retval Error::NotFound The program does not contain any segments or the 246*523fa7a6SAndroid Build Coastguard Worker * indices are out of range. 247*523fa7a6SAndroid Build Coastguard Worker * @returns Other errors depending on the implementation of 248*523fa7a6SAndroid Build Coastguard Worker * DataLoader: The Program.segment table is inconsistent, or the 249*523fa7a6SAndroid Build Coastguard Worker * data cannot be accessed. 250*523fa7a6SAndroid Build Coastguard Worker */ 251*523fa7a6SAndroid Build Coastguard Worker ET_NODISCARD Error load_mutable_subsegment_into( 252*523fa7a6SAndroid Build Coastguard Worker size_t mutable_data_segments_index, 253*523fa7a6SAndroid Build Coastguard Worker size_t offset_index, 254*523fa7a6SAndroid Build Coastguard Worker size_t size, 255*523fa7a6SAndroid Build Coastguard Worker void* buffer) const; 256*523fa7a6SAndroid Build Coastguard Worker 257*523fa7a6SAndroid Build Coastguard Worker private: Program(DataLoader * loader,size_t segment_base_offset,FreeableBuffer && program_data,const executorch_flatbuffer::Program * internal_program,FreeableBuffer && constant_segment_data)258*523fa7a6SAndroid Build Coastguard Worker Program( 259*523fa7a6SAndroid Build Coastguard Worker DataLoader* loader, 260*523fa7a6SAndroid Build Coastguard Worker size_t segment_base_offset, 261*523fa7a6SAndroid Build Coastguard Worker FreeableBuffer&& program_data, 262*523fa7a6SAndroid Build Coastguard Worker const executorch_flatbuffer::Program* internal_program, 263*523fa7a6SAndroid Build Coastguard Worker FreeableBuffer&& constant_segment_data) 264*523fa7a6SAndroid Build Coastguard Worker : program_data_(std::move(program_data)), 265*523fa7a6SAndroid Build Coastguard Worker // Don't need the loader if there are no segments. 266*523fa7a6SAndroid Build Coastguard Worker loader_(segment_base_offset > 0 ? loader : nullptr), 267*523fa7a6SAndroid Build Coastguard Worker internal_program_(internal_program), 268*523fa7a6SAndroid Build Coastguard Worker segment_base_offset_(segment_base_offset), 269*523fa7a6SAndroid Build Coastguard Worker constant_segment_data_(std::move(constant_segment_data)) {} 270*523fa7a6SAndroid Build Coastguard Worker 271*523fa7a6SAndroid Build Coastguard Worker // Not copyable or assignable. 272*523fa7a6SAndroid Build Coastguard Worker Program(const Program& rhs) = delete; 273*523fa7a6SAndroid Build Coastguard Worker Program& operator=(Program&& rhs) noexcept = delete; 274*523fa7a6SAndroid Build Coastguard Worker Program& operator=(const Program& rhs) = delete; 275*523fa7a6SAndroid Build Coastguard Worker 276*523fa7a6SAndroid Build Coastguard Worker /// The serialized program data. Tensors will point directly into this buffer. 277*523fa7a6SAndroid Build Coastguard Worker FreeableBuffer program_data_; 278*523fa7a6SAndroid Build Coastguard Worker 279*523fa7a6SAndroid Build Coastguard Worker /// Used to load segment data. Null if there are no segments. 280*523fa7a6SAndroid Build Coastguard Worker DataLoader* loader_; 281*523fa7a6SAndroid Build Coastguard Worker 282*523fa7a6SAndroid Build Coastguard Worker /// The flatbuffer representation of the program. Must not be exposed to 283*523fa7a6SAndroid Build Coastguard Worker /// users. 284*523fa7a6SAndroid Build Coastguard Worker const executorch_flatbuffer::Program* internal_program_; 285*523fa7a6SAndroid Build Coastguard Worker 286*523fa7a6SAndroid Build Coastguard Worker /// The offset to the first segment, in bytes. If zero, no segments should 287*523fa7a6SAndroid Build Coastguard Worker /// be present in internal_program_. 288*523fa7a6SAndroid Build Coastguard Worker size_t segment_base_offset_; 289*523fa7a6SAndroid Build Coastguard Worker 290*523fa7a6SAndroid Build Coastguard Worker /// Constant segment data. 291*523fa7a6SAndroid Build Coastguard Worker FreeableBuffer constant_segment_data_; 292*523fa7a6SAndroid Build Coastguard Worker }; 293*523fa7a6SAndroid Build Coastguard Worker 294*523fa7a6SAndroid Build Coastguard Worker } // namespace runtime 295*523fa7a6SAndroid Build Coastguard Worker } // namespace executorch 296*523fa7a6SAndroid Build Coastguard Worker 297*523fa7a6SAndroid Build Coastguard Worker namespace torch { 298*523fa7a6SAndroid Build Coastguard Worker namespace executor { 299*523fa7a6SAndroid Build Coastguard Worker // TODO(T197294990): Remove these deprecated aliases once all users have moved 300*523fa7a6SAndroid Build Coastguard Worker // to the new `::executorch` namespaces. 301*523fa7a6SAndroid Build Coastguard Worker using ::executorch::runtime::Program; 302*523fa7a6SAndroid Build Coastguard Worker } // namespace executor 303*523fa7a6SAndroid Build Coastguard Worker } // namespace torch 304