xref: /aosp_15_r20/external/executorch/runtime/executor/program.h (revision 523fa7a60841cd1ecfb9cc4201f1ca8b03ed023a)
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