xref: /aosp_15_r20/external/executorch/shim/xplat/executorch/kernels/portable/op_registration_util.bzl (revision 523fa7a60841cd1ecfb9cc4201f1ca8b03ed023a)
1load("@fbsource//xplat/executorch/build:runtime_wrapper.bzl", "is_xplat", "runtime")
2load("@fbsource//xplat/executorch/build:selects.bzl", "selects")
3
4def get_compiler_optimization_flags():
5    # App size regressons requires this to be baktraced until I have a better solution
6    return []
7
8def op_target(name, deps = [], android_deps = [], _allow_third_party_deps = False, _aten_mode_deps = []):
9    """Registers an implementation of an operator overload group.
10
11    An operator overload group is a set of operator overloads with a common
12    operator name. That common operator name should be the base name of this
13    target.
14
15    E.g., the "add" operator overload group, named "op_add" in this target,
16    might implement:
17    - add.Tensor
18    - add_.Tensor
19    - add.out
20    - add.Scalar
21
22    If an op target would like to share a header/sources with a different op
23    target (e.g., helpers/utilities), it should declare a separate cxx_library
24    and add it as a dep.
25
26    Args:
27        name: The name of the operator overload group; e.g.,
28            "op_add". This directory must contain a source file named
29            "<name>.cpp"; e.g., "op_add.cpp".
30        deps: Optional extra deps to add to the cxx_library(). Note:
31            - op targets may not depend on other op targets, to keep the
32              dependencies manageable. If two op targets would like to share
33              code, define a separate runtime.cxx_library that they both depend
34              on.
35            - op targets may not depend on targets outside of `//executorch`.
36              This library is intended to be portable, open-sourceable, and
37              self-contained.
38        android_deps: Optional extra deps to add to fb_xplat_cxx_library()
39            under fbandroid_platform_deps when building for Android, which may
40            be outside of //executorch. Note that these will be ignored when
41            building for fbcode.
42        _allow_third_party_deps: If True, the op is allowed to depend on
43            third-party deps outside of //executorch. Should only be used by
44            targets under //executorch/kernels/optimized, which can benefit
45            from third-party optimization libraries.
46        _aten_mode_deps: List of deps to add to the cxx_library() when building
47            for ATen mode.
48    """
49
50    # Note that this doesn't actually define the target, but helps register
51    # it in a table that's used to define the target.
52    return {
53        "android_deps": android_deps,
54        "deps": deps,
55        "name": name,
56        "_allow_third_party_deps": _allow_third_party_deps,
57        "_aten_mode_deps": _aten_mode_deps,
58    }
59
60def _enforce_deps(deps, name, allow_third_party_deps):
61    """Fails if any of the deps are not allowed.
62
63    Args:
64        deps: A list of build target strings.
65        name: The name of the target; e.g., "op_add"
66        name: The name of the target with the provided deps.
67        allow_third_party_deps: If True, allows external deps on third-party
68            targets.
69    """
70    for dep in deps:
71        if dep.startswith(":op_"):
72            # op targets may not depend on other op targets, to keep the
73            # dependencies manageable. If two op targets would like to share
74            # code, define a separate runtime.cxx_library that they both depend
75            # on.
76            fail("op_target {} may not depend on other op_target {}".format(
77                name,
78                dep,
79            ))
80        if not (dep.startswith("//executorch") or dep.startswith(":")):
81            if allow_third_party_deps and ("/third-party/" in dep):
82                # Allowed exception.
83                pass
84            else:
85                # op targets may not depend on targets outside of
86                # `//executorch`. This library is intended to be portable,
87                # open-sourceable, and self-contained.
88                fail(
89                    "op_target {} may not depend on code outside of //executorch: {}".format(
90                        name,
91                        dep,
92                    ),
93                )
94
95def define_op_library(name, deps, android_deps, aten_target, _allow_third_party_deps = False):
96    """Defines a cxx_library target for the named operator overload group.
97
98    Args:
99        name: The name of the target; e.g., "op_add"
100        deps: List of deps for the target.
101        android_deps: List of fbandroid_platform_deps for the target.
102        aten_target: If True, define a "<name>_aten" target that uses
103            `:kernel_types_aten`, compatible with host PyTorch. If False, define
104            a "<name>" target that uses `:kernel_types`, compatible with the
105            embedded executorch runtime.
106        _allow_third_party_deps: If True, the op is allowed to depend on
107            third-party deps outside of //executorch. Should only be used by
108            targets under //executorch/kernels/optimized, which can benefit
109            from third-party optimization libraries.
110    """
111    selects.apply(obj = deps, function = native.partial(_enforce_deps, name = name, allow_third_party_deps = _allow_third_party_deps))
112
113    aten_suffix = "_aten" if aten_target else ""
114    runtime.cxx_library(
115        name = name + aten_suffix,
116        srcs = [
117            "{}.cpp".format(name),
118        ],
119        visibility = [
120            "//executorch/kernels/portable/test/...",
121            "//executorch/kernels/quantized/...",
122            "//executorch/kernels/optimized/test/...",
123            "//executorch/kernels/test/...",
124            "@EXECUTORCH_CLIENTS",
125        ],
126        fbandroid_platform_deps = android_deps,
127        # kernels often have helpers with no prototypes just disabling the warning here as the headers
128        # are codegend and linked in later
129        compiler_flags = select({
130                "DEFAULT": ["-Wno-missing-prototypes"],
131                "ovr_config//os:windows": [],
132            }) + (
133            # For shared library build, we don't want to expose symbols of
134            # kernel implementation (ex torch::executor::native::tanh_out)
135            # to library users. They should use kernels through registry only.
136            # With visibility=hidden, linker won't expose kernel impl symbols
137            # so it can prune unregistered kernels.
138            # Currently fbcode linkes all dependent libraries through shared
139            # library, and it blocks users like unit tests to use kernel
140            # implementation directly. So we enable this for xplat only.
141            ["-fvisibility=hidden"] if is_xplat() else []
142        ) + get_compiler_optimization_flags(),
143        deps = [
144            "//executorch/runtime/kernel:kernel_includes" + aten_suffix,
145        ] + deps,
146        # WARNING: using a deprecated API to avoid being built into a shared
147        # library. In the case of dynamically loading so library we don't want
148        # it to depend on other so libraries because that way we have to
149        # specify library directory path.
150        force_static = True,
151        # link_whole is necessary because the operators register themselves
152        # via static initializers that run at program startup.
153        # @lint-ignore BUCKLINT link_whole
154        link_whole = True,
155    )
156
157def define_op_target(name, deps, android_deps, is_aten_op, is_et_op = True, _allow_third_party_deps = False, _aten_mode_deps = []):
158    """Possibly defines cxx_library targets for the named operator group.
159
160    Args:
161        name: The base name of the target; e.g., "op_add"
162        deps: List of deps for the targets.
163        android_deps: List of fbandroid_platform_deps for the target.
164        is_aten_op: True if the operator overload group is ATen-compatible.
165        is_et_op: True if the operator overload group is ET-compatible.
166        _allow_third_party_deps: If True, the op is allowed to depend on
167            third-party deps outside of //executorch. Should only be used by
168            targets under //executorch/kernels/optimized.
169    """
170
171    # If this is a custom op, define a target that builds it with at::Tensor
172    # so that it can be imported into a host PyTorch environment for authoring.
173    if not is_aten_op:
174        define_op_library(
175            name = name,
176            deps = _aten_mode_deps if _aten_mode_deps else deps,
177            android_deps = android_deps,
178            aten_target = True,
179            _allow_third_party_deps = _allow_third_party_deps,
180        )
181
182    if is_et_op:
183        # When building in ATen mode, ATen-compatible (non-custom) operators will
184        # use the implementations provided by ATen, so we should not build the
185        # versions defined here.
186        define_op_library(
187            name = name,
188            deps = deps,
189            android_deps = android_deps,
190            aten_target = False,
191            _allow_third_party_deps = _allow_third_party_deps,
192        )
193
194# Operators that are listed in `functions.yaml`, and are thus compatible with
195# the core ATen operators. Every entry here will be backed by a cxx_library
196# target with the given name and deps.
197#
198# Note that a single target (or single .cpp file) can't mix ATen and non-ATen
199# ops, and must be split. They can, however, share common code via a library dep
200# if necessary.
201ATEN_OPS = (
202    op_target(
203        name = "op_abs",
204        deps = [
205            "//executorch/kernels/portable/cpu/util:functional_util",
206        ],
207    ),
208    op_target(
209        name = "op_acos",
210        deps = [
211            "//executorch/kernels/portable/cpu/pattern:pattern",
212        ],
213    ),
214    op_target(
215        name = "op_acosh",
216        deps = [
217            "//executorch/kernels/portable/cpu/pattern:pattern",
218        ],
219    ),
220    op_target(
221        name = "op_add",
222        deps = [
223            "//executorch/kernels/portable/cpu/util:broadcast_util",
224            "//executorch/kernels/portable/cpu/util:dtype_util",
225            "//executorch/kernels/portable/cpu/util:elementwise_util",
226            "//executorch/kernels/portable/cpu/util:kernel_ops_util",
227            ":scalar_utils",
228        ],
229    ),
230    op_target(
231        name = "op_addmm",
232        deps = [
233            "//executorch/kernels/portable/cpu/util:broadcast_util",
234            "//executorch/kernels/portable/cpu/util:dtype_util",
235            "//executorch/kernels/portable/cpu/util:elementwise_util",
236            "//executorch/kernels/portable/cpu/util:matmul_ops_util",
237            ":scalar_utils",
238            ":vec_ops",
239        ],
240    ),
241    op_target(
242        name = "op_alias_copy",
243    ),
244    op_target(
245        name = "op_amax",
246        deps = [
247            "//executorch/runtime/core/exec_aten/util:scalar_type_util",
248            "//executorch/runtime/core/exec_aten/util:tensor_util",
249            "//executorch/kernels/portable/cpu/util:reduce_util",
250        ],
251    ),
252    op_target(
253        name = "op_amin",
254        deps = [
255            "//executorch/runtime/core/exec_aten/util:scalar_type_util",
256            "//executorch/runtime/core/exec_aten/util:tensor_util",
257            "//executorch/kernels/portable/cpu/util:index_util",
258            "//executorch/kernels/portable/cpu/util:reduce_util",
259        ],
260    ),
261    op_target(
262        name = "op_any",
263        deps = [
264            "//executorch/kernels/portable/cpu/util:reduce_util",
265            "//executorch/runtime/core/exec_aten/util:tensor_util",
266        ],
267    ),
268    op_target(
269        name = "op_arange",
270        deps = [
271            "//executorch/kernels/portable/cpu/util:kernel_ops_util",
272            "//executorch/runtime/core/exec_aten/util:scalar_type_util",
273            "//executorch/runtime/core/exec_aten/util:tensor_util",
274            ":scalar_utils",
275        ],
276    ),
277    op_target(
278        name = "op_argmax",
279        deps = [
280            "//executorch/kernels/portable/cpu/util:reduce_util",
281        ],
282    ),
283    op_target(
284        name = "op_argmin",
285        deps = [
286            "//executorch/kernels/portable/cpu/util:reduce_util",
287        ],
288    ),
289    op_target(
290        name = "op_as_strided_copy",
291        deps = [
292            "//executorch/kernels/portable/cpu/util:copy_ops_util",
293        ],
294    ),
295    op_target(
296        name = "op_asin",
297        deps = [
298            "//executorch/kernels/portable/cpu/pattern:pattern",
299        ],
300    ),
301    op_target(
302        name = "op_asinh",
303        deps = [
304            "//executorch/kernels/portable/cpu/pattern:pattern",
305        ],
306    ),
307    op_target(
308        name = "op_atan",
309        deps = [
310            "//executorch/kernels/portable/cpu/pattern:pattern",
311        ],
312    ),
313    op_target(
314        name = "op_atan2",
315        deps = [
316            "//executorch/kernels/portable/cpu/util:broadcast_util",
317            "//executorch/kernels/portable/cpu/util:dtype_util",
318            "//executorch/kernels/portable/cpu/util:elementwise_util",
319        ],
320    ),
321    op_target(
322        name = "op_atanh",
323        deps = [
324            "//executorch/kernels/portable/cpu/pattern:pattern",
325        ],
326    ),
327    op_target(
328        name = "op_avg_pool2d",
329        deps = [
330            "//executorch/kernels/portable/cpu/util:kernel_ops_util",
331        ],
332    ),
333    op_target(
334        name = "op_bitwise_and",
335        deps = [
336            ":scalar_utils",
337            "//executorch/kernels/portable/cpu/pattern:bitwise_op",
338            "//executorch/kernels/portable/cpu/util:broadcast_util",
339            "//executorch/kernels/portable/cpu/util:dtype_util",
340            "//executorch/kernels/portable/cpu/util:elementwise_util",
341        ],
342    ),
343    op_target(
344        name = "op_bitwise_not",
345        deps = [
346            "//executorch/runtime/core/exec_aten/util:scalar_type_util",
347            "//executorch/runtime/core/exec_aten/util:tensor_util",
348            "//executorch/kernels/portable/cpu/util:functional_util",
349        ],
350    ),
351    op_target(
352        name = "op_bitwise_or",
353        deps = [
354            ":scalar_utils",
355            "//executorch/kernels/portable/cpu/pattern:bitwise_op",
356            "//executorch/kernels/portable/cpu/util:broadcast_util",
357            "//executorch/kernels/portable/cpu/util:dtype_util",
358            "//executorch/kernels/portable/cpu/util:elementwise_util",
359        ],
360    ),
361    op_target(
362        name = "op_bitwise_xor",
363        deps = [
364            ":scalar_utils",
365            "//executorch/kernels/portable/cpu/pattern:bitwise_op",
366            "//executorch/kernels/portable/cpu/util:broadcast_util",
367            "//executorch/kernels/portable/cpu/util:dtype_util",
368            "//executorch/kernels/portable/cpu/util:elementwise_util",
369        ],
370    ),
371    op_target(
372        name = "op_bmm",
373        deps = [
374            "//executorch/kernels/portable/cpu/util:matmul_ops_util",
375            ":vec_ops",
376        ],
377    ),
378    op_target(
379        name = "op_cat",
380        deps = [
381            "//executorch/kernels/portable/cpu/util:copy_ops_util",
382        ],
383    ),
384    op_target(
385        name = "op_cdist_forward",
386        deps = [
387            "//executorch/kernels/portable/cpu/util:broadcast_util",
388            "//executorch/kernels/portable/cpu/util:distance_util",
389        ],
390    ),
391    op_target(
392        name = "op_ceil",
393        deps = [
394            "//executorch/kernels/portable/cpu/pattern:pattern",
395        ],
396    ),
397    op_target(
398        name = "op_clamp",
399        deps = [
400            ":scalar_utils",
401            "//executorch/kernels/portable/cpu/util:broadcast_util",
402            "//executorch/kernels/portable/cpu/util:dtype_util",
403            "//executorch/kernels/portable/cpu/util:elementwise_util",
404            "//executorch/kernels/portable/cpu/util:math_util",
405        ],
406    ),
407    op_target(
408        name = "op_clone",
409    ),
410    op_target(
411        name = "op_constant_pad_nd",
412        deps = [
413            ":scalar_utils",
414            "//executorch/kernels/portable/cpu/util:kernel_ops_util",
415        ],
416    ),
417    op_target(
418        name = "op_convolution",
419        deps = [
420            "//executorch/kernels/portable/cpu/util:dtype_util",
421            "//executorch/kernels/portable/cpu/util:kernel_ops_util",
422            ":vec_ops",
423        ],
424    ),
425    op_target(
426        name = "op_convolution_backward",
427        deps = [
428            "//executorch/kernels/portable/cpu/util:kernel_ops_util",
429        ],
430    ),
431    op_target(
432        name = "op_copy",
433        deps = [
434            "//executorch/kernels/portable/cpu/util:broadcast_util",
435            "//executorch/kernels/portable/cpu/util:dtype_util",
436            "//executorch/kernels/portable/cpu/util:elementwise_util",
437            "//executorch/runtime/core/exec_aten/util:scalar_type_util",
438            "//executorch/runtime/core/exec_aten/util:tensor_util",
439            ":scalar_utils",
440        ],
441    ),
442    op_target(
443        name = "op_cos",
444        deps = [
445            "//executorch/kernels/portable/cpu/pattern:pattern",
446        ],
447    ),
448    op_target(
449        name = "op_cosh",
450        deps = [
451            "//executorch/kernels/portable/cpu/pattern:pattern",
452        ],
453    ),
454    op_target(
455        name = "op_cumsum",
456        deps = [
457            "//executorch/kernels/portable/cpu/util:dtype_util",
458            "//executorch/runtime/core/exec_aten/util:scalar_type_util",
459            "//executorch/runtime/core/exec_aten/util:tensor_util",
460            "//executorch/kernels/portable/cpu/util:kernel_ops_util",
461        ],
462    ),
463    op_target(
464        name = "op_detach_copy",
465        deps = [
466            "//executorch/runtime/core/exec_aten/util:tensor_util",
467        ],
468    ),
469    op_target(
470        name = "op_diagonal_copy",
471        deps = [
472            "//executorch/kernels/portable/cpu/util:copy_ops_util",
473        ],
474    ),
475    op_target(
476        name = "op_div",
477        deps = [
478            "//executorch/kernels/portable/cpu/util:broadcast_util",
479            "//executorch/kernels/portable/cpu/util:dtype_util",
480            "//executorch/kernels/portable/cpu/util:elementwise_util",
481            "//executorch/kernels/portable/cpu/util:math_util",
482            ":scalar_utils",
483        ],
484    ),
485    op_target(
486        name = "op_embedding",
487        deps = [
488            "//executorch/kernels/portable/cpu/util:kernel_ops_util",
489        ],
490    ),
491    op_target(
492        name = "op_eq",
493        deps = [
494            ":scalar_utils",
495            "//executorch/kernels/portable/cpu/pattern:comparison_op",
496            "//executorch/kernels/portable/cpu/util:broadcast_util",
497            "//executorch/kernels/portable/cpu/util:dtype_util",
498            "//executorch/kernels/portable/cpu/util:elementwise_util",
499        ],
500    ),
501    op_target(
502        name = "op_empty",
503    ),
504    op_target(
505        name = "op_erf",
506        deps = [
507            "//executorch/kernels/portable/cpu/pattern:pattern",
508        ],
509    ),
510    op_target(
511        name = "op_exp",
512        deps = [
513            "//executorch/kernels/portable/cpu/pattern:pattern",
514        ],
515    ),
516    op_target(
517        name = "op_expand_copy",
518        deps = [
519            "//executorch/runtime/core/exec_aten/util:scalar_type_util",
520            "//executorch/runtime/core/exec_aten/util:tensor_util",
521            "//executorch/kernels/portable/cpu/util:copy_ops_util",
522            "//executorch/kernels/portable/cpu/util:repeat_util",
523            ":scalar_utils",
524        ],
525    ),
526    op_target(
527        name = "op_expm1",
528        deps = [
529            "//executorch/kernels/portable/cpu/pattern:pattern",
530        ],
531    ),
532    op_target(
533        name = "op_fill",
534        deps = [
535            ":scalar_utils",
536            "//executorch/kernels/portable/cpu/util:functional_util",
537            "//executorch/runtime/core/exec_aten/util:scalar_type_util",
538            "//executorch/runtime/core/exec_aten/util:tensor_util",
539        ],
540    ),
541    op_target(
542        name = "op_flip",
543        deps = [
544            "//executorch/kernels/portable/cpu/util:reduce_util",
545        ],
546    ),
547    op_target(
548        name = "op_floor",
549        deps = [
550            "//executorch/kernels/portable/cpu/pattern:pattern",
551        ],
552    ),
553    op_target(
554        name = "op_floor_divide",
555        deps = [
556            "//executorch/kernels/portable/cpu/util:broadcast_util",
557            "//executorch/kernels/portable/cpu/util:dtype_util",
558            "//executorch/kernels/portable/cpu/util:elementwise_util",
559            "//executorch/kernels/portable/cpu/util:math_util",
560        ],
561    ),
562    op_target(
563        name = "op_fmod",
564        deps = [
565            ":scalar_utils",
566            "//executorch/kernels/portable/cpu/util:broadcast_util",
567            "//executorch/kernels/portable/cpu/util:dtype_util",
568            "//executorch/kernels/portable/cpu/util:elementwise_util",
569        ],
570    ),
571    op_target(
572        name = "op_full",
573        deps = [
574            "//executorch/runtime/core/exec_aten/util:scalar_type_util",
575            "//executorch/runtime/core/exec_aten/util:tensor_util",
576            ":scalar_utils",
577        ],
578    ),
579    op_target(
580        name = "op_full_like",
581        deps = [
582            "//executorch/runtime/core/exec_aten/util:scalar_type_util",
583            "//executorch/runtime/core/exec_aten/util:tensor_util",
584            ":scalar_utils",
585        ],
586    ),
587    op_target(
588        name = "op_gather",
589        deps = [
590            "//executorch/kernels/portable/cpu/util:index_util",
591        ],
592    ),
593    op_target(
594        name = "op_ge",
595        deps = [
596            ":scalar_utils",
597            "//executorch/kernels/portable/cpu/pattern:comparison_op",
598            "//executorch/kernels/portable/cpu/util:broadcast_util",
599            "//executorch/kernels/portable/cpu/util:dtype_util",
600            "//executorch/kernels/portable/cpu/util:elementwise_util",
601        ],
602    ),
603    op_target(
604        name = "op_gelu",
605        deps = [
606            ":math_constants",
607            "//executorch/kernels/portable/cpu/util:activation_ops_util",
608            "//executorch/kernels/portable/cpu/util:functional_util",
609        ],
610    ),
611    op_target(
612        name = "op_glu",
613        deps = [
614            "//executorch/kernels/portable/cpu/util:activation_ops_util",
615            "//executorch/runtime/core/exec_aten/util:scalar_type_util",
616            "//executorch/runtime/core/exec_aten/util:tensor_util",
617        ],
618    ),
619    op_target(
620        name = "op_gt",
621        deps = [
622            ":scalar_utils",
623            "//executorch/kernels/portable/cpu/pattern:comparison_op",
624            "//executorch/kernels/portable/cpu/util:broadcast_util",
625            "//executorch/kernels/portable/cpu/util:dtype_util",
626            "//executorch/kernels/portable/cpu/util:elementwise_util",
627        ],
628    ),
629    op_target(
630        name = "op_hardtanh",
631        deps = [
632            "//executorch/kernels/portable/cpu/util:functional_util",
633            "//executorch/kernels/portable/cpu/util:math_util",
634            ":scalar_utils",
635        ],
636    ),
637    op_target(
638        name = "op_index",
639        deps = [
640            "//executorch/kernels/portable/cpu/util:advanced_index_util",
641            "//executorch/kernels/portable/cpu/util:broadcast_util",
642        ],
643    ),
644    op_target(
645        name = "op_index_put",
646        deps = [
647            "//executorch/kernels/portable/cpu/util:advanced_index_util",
648            "//executorch/kernels/portable/cpu/util:broadcast_util",
649        ],
650    ),
651    op_target(
652        name = "op_index_select",
653        deps = [
654            "//executorch/kernels/portable/cpu/util:index_util",
655        ],
656    ),
657    op_target(
658        name = "op_isinf",
659        deps = [
660            "//executorch/kernels/portable/cpu/pattern:pattern",
661        ],
662    ),
663    op_target(
664        name = "op_isnan",
665        deps = [
666            "//executorch/kernels/portable/cpu/pattern:pattern",
667        ],
668    ),
669    op_target(
670        name = "op_le",
671        deps = [
672            ":scalar_utils",
673            "//executorch/kernels/portable/cpu/pattern:comparison_op",
674            "//executorch/kernels/portable/cpu/util:broadcast_util",
675            "//executorch/kernels/portable/cpu/util:dtype_util",
676            "//executorch/kernels/portable/cpu/util:elementwise_util",
677        ],
678    ),
679    op_target(
680        name = "op_leaky_relu",
681        deps = [
682            "//executorch/kernels/portable/cpu/util:functional_util",
683            ":scalar_utils",
684        ],
685    ),
686    op_target(
687        name = "op_lift_fresh_copy",
688        deps = [
689            "//executorch/runtime/core/exec_aten/util:tensor_util",
690        ],
691    ),
692    op_target(
693        name = "op_log",
694        deps = [
695            "//executorch/kernels/portable/cpu/pattern:pattern",
696        ],
697    ),
698    op_target(
699        name = "op_log10",
700        deps = [
701            "//executorch/kernels/portable/cpu/pattern:pattern",
702        ],
703    ),
704    op_target(
705        name = "op_log1p",
706        deps = [
707            "//executorch/kernels/portable/cpu/pattern:pattern",
708        ],
709    ),
710    op_target(
711        name = "op_log2",
712        deps = [
713            "//executorch/kernels/portable/cpu/pattern:pattern",
714        ],
715    ),
716    op_target(
717        name = "op_log_softmax",
718        deps = [
719            ":vec_ops",
720            "//executorch/kernels/portable/cpu/util:activation_ops_util",
721            "//executorch/kernels/portable/cpu/util:functional_util",
722            "//executorch/kernels/portable/cpu/util:reduce_util",
723        ],
724    ),
725    op_target(
726        name = "op_logical_and",
727        deps = [
728            ":scalar_utils",
729            "//executorch/kernels/portable/cpu/pattern:logical_op",
730            "//executorch/kernels/portable/cpu/util:broadcast_util",
731            "//executorch/kernels/portable/cpu/util:dtype_util",
732            "//executorch/kernels/portable/cpu/util:elementwise_util",
733        ],
734    ),
735    op_target(
736        name = "op_logical_not",
737        deps = [
738            "//executorch/runtime/core/exec_aten/util:tensor_util",
739            "//executorch/kernels/portable/cpu/util:functional_util",
740        ],
741    ),
742    op_target(
743        name = "op_logical_or",
744        deps = [
745            ":scalar_utils",
746            "//executorch/kernels/portable/cpu/pattern:logical_op",
747            "//executorch/kernels/portable/cpu/util:broadcast_util",
748            "//executorch/kernels/portable/cpu/util:dtype_util",
749            "//executorch/kernels/portable/cpu/util:elementwise_util",
750        ],
751    ),
752    op_target(
753        name = "op_logical_xor",
754        deps = [
755            ":scalar_utils",
756            "//executorch/kernels/portable/cpu/pattern:logical_op",
757            "//executorch/kernels/portable/cpu/util:broadcast_util",
758            "//executorch/kernels/portable/cpu/util:dtype_util",
759            "//executorch/kernels/portable/cpu/util:elementwise_util",
760        ],
761    ),
762    op_target(
763        name = "op_logit",
764        deps = [
765            "//executorch/kernels/portable/cpu/util:functional_util",
766        ],
767    ),
768    op_target(
769        name = "op_lt",
770        deps = [
771            ":scalar_utils",
772            "//executorch/kernels/portable/cpu/pattern:comparison_op",
773            "//executorch/kernels/portable/cpu/util:broadcast_util",
774            "//executorch/kernels/portable/cpu/util:dtype_util",
775            "//executorch/kernels/portable/cpu/util:elementwise_util",
776        ],
777    ),
778    op_target(
779        name = "op_masked_fill",
780        deps = [
781            "//executorch/kernels/portable/cpu/util:broadcast_util",
782            "//executorch/kernels/portable/cpu/util:kernel_ops_util",
783            ":scalar_utils",
784        ],
785    ),
786    op_target(
787        name = "op_masked_scatter",
788        deps = [
789            "//executorch/kernels/portable/cpu/util:broadcast_util",
790        ],
791    ),
792    op_target(
793        name = "op_masked_select",
794        deps = [
795            "//executorch/kernels/portable/cpu/util:broadcast_util",
796        ],
797    ),
798    op_target(
799        name = "op_max",
800        deps = [
801            "//executorch/kernels/portable/cpu/util:reduce_util",
802        ],
803    ),
804    op_target(
805        name = "op_maximum",
806        deps = [
807            "//executorch/kernels/portable/cpu/util:broadcast_util",
808            "//executorch/kernels/portable/cpu/util:dtype_util",
809            "//executorch/kernels/portable/cpu/util:elementwise_util",
810            "//executorch/kernels/portable/cpu/util:math_util",
811            ":scalar_utils",
812        ],
813    ),
814    op_target(
815        name = "op_max_pool2d_with_indices",
816        deps = [
817            "//executorch/kernels/portable/cpu/util:kernel_ops_util",
818        ],
819    ),
820    op_target(
821        name = "op_mean",
822        deps = [
823            "//executorch/runtime/core/exec_aten/util:scalar_type_util",
824            "//executorch/runtime/core/exec_aten/util:tensor_util",
825            "//executorch/kernels/portable/cpu/util:kernel_ops_util",
826            "//executorch/kernels/portable/cpu/util:reduce_util",
827        ],
828    ),
829    op_target(
830        name = "op_min",
831        deps = [
832            "//executorch/kernels/portable/cpu/util:reduce_util",
833        ],
834    ),
835    op_target(
836        name = "op_minimum",
837        deps = [
838            "//executorch/kernels/portable/cpu/util:broadcast_util",
839            "//executorch/kernels/portable/cpu/util:dtype_util",
840            "//executorch/kernels/portable/cpu/util:elementwise_util",
841            "//executorch/kernels/portable/cpu/util:math_util",
842            ":scalar_utils",
843        ],
844    ),
845    op_target(
846        name = "op_mm",
847        deps = [
848            "//executorch/kernels/portable/cpu/util:matmul_ops_util",
849            ":vec_ops",
850        ],
851    ),
852    op_target(
853        name = "op_mul",
854        deps = [
855            "//executorch/kernels/portable/cpu/util:broadcast_util",
856            "//executorch/kernels/portable/cpu/util:dtype_util",
857            "//executorch/kernels/portable/cpu/util:elementwise_util",
858            ":scalar_utils",
859        ],
860    ),
861    op_target(
862        name = "op_narrow_copy",
863        deps = [
864            "//executorch/kernels/portable/cpu/util:slice_util",
865        ],
866    ),
867    op_target(
868        name = "op_native_batch_norm",
869        deps = [
870            ":vec_ops",
871            "//executorch/kernels/portable/cpu/util:normalization_ops_util",
872        ],
873    ),
874    op_target(
875        name = "op_native_group_norm",
876        deps = [
877            ":vec_ops",
878            "//executorch/kernels/portable/cpu/util:normalization_ops_util",
879        ],
880    ),
881    op_target(
882        name = "op_native_layer_norm",
883        deps = [
884            ":vec_ops",
885            "//executorch/kernels/portable/cpu/util:normalization_ops_util",
886        ],
887    ),
888    op_target(
889        name = "op_ne",
890        deps = [
891            ":scalar_utils",
892            "//executorch/kernels/portable/cpu/pattern:comparison_op",
893            "//executorch/kernels/portable/cpu/util:broadcast_util",
894            "//executorch/kernels/portable/cpu/util:dtype_util",
895            "//executorch/kernels/portable/cpu/util:elementwise_util",
896        ],
897    ),
898    op_target(
899        name = "op_neg",
900        deps = [
901            "//executorch/kernels/portable/cpu/util:functional_util",
902        ],
903    ),
904    op_target(
905        name = "op_nonzero",
906        deps = [
907            ":scalar_utils",
908            "//executorch/kernels/portable/cpu/util:index_util",
909        ],
910    ),
911    op_target(
912        name = "op_ones",
913        deps = [
914            "//executorch/runtime/core/exec_aten/util:tensor_util",
915        ],
916    ),
917    op_target(
918        name = "op_pdist_forward",
919        deps = [
920            "//executorch/kernels/portable/cpu/util:distance_util",
921        ],
922    ),
923    op_target(
924        name = "op_permute_copy",
925        deps = [
926            "//executorch/kernels/portable/cpu/util:copy_ops_util",
927        ],
928    ),
929    op_target(
930        name = "op_pixel_shuffle",
931        deps = [
932            "//executorch/kernels/portable/cpu/util:copy_ops_util",
933        ],
934    ),
935    op_target(
936        name = "op_pixel_unshuffle",
937        deps = [
938            "//executorch/kernels/portable/cpu/util:copy_ops_util",
939        ],
940    ),
941    op_target(
942        name = "op_pow",
943        deps = [
944            ":scalar_utils",
945            "//executorch/kernels/portable/cpu/util:broadcast_util",
946            "//executorch/kernels/portable/cpu/util:dtype_util",
947            "//executorch/kernels/portable/cpu/util:elementwise_util",
948        ],
949    ),
950    op_target(
951        name = "op_prod",
952        deps = [
953            "//executorch/runtime/core/exec_aten/util:scalar_type_util",
954            "//executorch/runtime/core/exec_aten/util:tensor_util",
955            "//executorch/kernels/portable/cpu/util:reduce_util",
956        ],
957    ),
958    op_target(
959        name = "op_reciprocal",
960        deps = [
961            "//executorch/kernels/portable/cpu/pattern:pattern",
962        ],
963    ),
964    op_target(
965        name = "op_reflection_pad1d",
966        deps = [
967            "//executorch/kernels/portable/cpu/util:padding_util",
968        ],
969    ),
970    op_target(
971        name = "op_reflection_pad2d",
972        deps = [
973            "//executorch/kernels/portable/cpu/util:padding_util",
974        ],
975    ),
976    op_target(
977        name = "op_reflection_pad3d",
978        deps = [
979            "//executorch/kernels/portable/cpu/util:padding_util",
980        ],
981    ),
982    op_target(
983        name = "op_relu",
984        deps = [
985            "//executorch/kernels/portable/cpu/util:functional_util",
986        ],
987    ),
988    op_target(
989        name = "op_remainder",
990        deps = [
991            ":scalar_utils",
992            "//executorch/kernels/portable/cpu/util:broadcast_util",
993            "//executorch/kernels/portable/cpu/util:dtype_util",
994            "//executorch/kernels/portable/cpu/util:elementwise_util",
995            "//executorch/kernels/portable/cpu/util:math_util",
996        ],
997    ),
998    op_target(
999        name = "op_repeat",
1000        deps = [
1001            "//executorch/kernels/portable/cpu/util:repeat_util",
1002        ],
1003    ),
1004    op_target(
1005        name = "op_replication_pad1d",
1006        deps = [
1007            "//executorch/kernels/portable/cpu/util:padding_util",
1008        ],
1009    ),
1010    op_target(
1011        name = "op_replication_pad2d",
1012        deps = [
1013            "//executorch/kernels/portable/cpu/util:padding_util",
1014        ],
1015    ),
1016    op_target(
1017        name = "op_replication_pad3d",
1018        deps = [
1019            "//executorch/kernels/portable/cpu/util:padding_util",
1020        ],
1021    ),
1022    op_target(
1023        name = "op_roll",
1024    ),
1025    op_target(
1026        name = "op_round",
1027        deps = [
1028            "//executorch/kernels/portable/cpu/util:functional_util",
1029        ],
1030    ),
1031    op_target(
1032        name = "op_rsqrt",
1033        deps = [
1034            "//executorch/kernels/portable/cpu/pattern:pattern",
1035        ],
1036    ),
1037    op_target(
1038        name = "op_rsub",
1039        deps = [
1040            ":scalar_utils",
1041            "//executorch/kernels/portable/cpu/util:broadcast_util",
1042            "//executorch/kernels/portable/cpu/util:dtype_util",
1043            "//executorch/kernels/portable/cpu/util:elementwise_util",
1044        ],
1045    ),
1046    op_target(
1047        name = "op_scalar_tensor",
1048        deps = [":scalar_utils"],
1049    ),
1050    op_target(
1051        name = "op_scatter",
1052        deps = [
1053            ":scalar_utils",
1054            "//executorch/kernels/portable/cpu/util:index_util",
1055        ],
1056    ),
1057    op_target(
1058        name = "op_scatter_add",
1059        deps = [
1060            "//executorch/kernels/portable/cpu/util:index_util",
1061            "//executorch/runtime/core/exec_aten/util:scalar_type_util",
1062            "//executorch/runtime/core/exec_aten/util:tensor_util",
1063        ],
1064    ),
1065    op_target(
1066        name = "op_select_copy",
1067        deps = [
1068            "//executorch/kernels/portable/cpu/util:copy_ops_util",
1069            "//executorch/kernels/portable/cpu/util:select_copy_util",
1070        ],
1071    ),
1072    op_target(
1073        name = "op_select_scatter",
1074        deps = [
1075            "//executorch/kernels/portable/cpu/util:index_util",
1076            "//executorch/runtime/core/exec_aten/util:scalar_type_util",
1077            "//executorch/runtime/core/exec_aten/util:tensor_util",
1078        ],
1079    ),
1080    op_target(
1081        name = "op_sigmoid",
1082        deps = [
1083            "//executorch/kernels/portable/cpu/util:functional_util",
1084            "//executorch/kernels/portable/cpu/util:elementwise_util",
1085            "//executorch/kernels/portable/cpu/util:broadcast_util",
1086            "//executorch/kernels/portable/cpu/util:dtype_util",
1087        ],
1088    ),
1089    op_target(
1090        name = "op_sign",
1091        deps = [
1092            "//executorch/kernels/portable/cpu/util:functional_util",
1093        ],
1094    ),
1095    op_target(
1096        name = "op_sin",
1097        deps = [
1098            "//executorch/kernels/portable/cpu/pattern:pattern",
1099        ],
1100    ),
1101    op_target(
1102        name = "op_sinh",
1103        deps = [
1104            "//executorch/kernels/portable/cpu/pattern:pattern",
1105        ],
1106    ),
1107    op_target(
1108        name = "op_slice_copy",
1109        deps = [
1110            "//executorch/kernels/portable/cpu/util:slice_util",
1111        ],
1112    ),
1113    op_target(
1114        name = "op_slice_scatter",
1115        deps = [
1116            "//executorch/kernels/portable/cpu/util:slice_util",
1117        ],
1118    ),
1119    op_target(
1120        name = "op_softmax",
1121        deps = [
1122            ":vec_ops",
1123            "//executorch/kernels/portable/cpu/util:activation_ops_util",
1124            "//executorch/kernels/portable/cpu/util:functional_util",
1125            "//executorch/kernels/portable/cpu/util:reduce_util",
1126        ],
1127    ),
1128    op_target(
1129        name = "op_split_copy",
1130        deps = [
1131            "//executorch/kernels/portable/cpu/util:copy_ops_util",
1132        ],
1133    ),
1134    op_target(
1135        name = "op_split_with_sizes_copy",
1136        deps = [
1137            "//executorch/kernels/portable/cpu/util:broadcast_util",
1138            "//executorch/kernels/portable/cpu/util:copy_ops_util",
1139        ],
1140    ),
1141    op_target(
1142        name = "op_sqrt",
1143        deps = [
1144            "//executorch/kernels/portable/cpu/pattern:pattern",
1145        ],
1146    ),
1147    op_target(
1148        name = "op_squeeze_copy",
1149        deps = [
1150            "//executorch/kernels/portable/cpu/util:copy_ops_util",
1151        ],
1152    ),
1153    op_target(
1154        name = "op_stack",
1155        deps = [
1156            "//executorch/kernels/portable/cpu/util:copy_ops_util",
1157        ],
1158    ),
1159    op_target(
1160        name = "op_sub",
1161        deps = [
1162            ":scalar_utils",
1163            "//executorch/kernels/portable/cpu/util:broadcast_util",
1164            "//executorch/kernels/portable/cpu/util:dtype_util",
1165            "//executorch/kernels/portable/cpu/util:elementwise_util",
1166        ],
1167    ),
1168    op_target(
1169        name = "op_sum",
1170        deps = [
1171            "//executorch/runtime/core/exec_aten/util:scalar_type_util",
1172            "//executorch/runtime/core/exec_aten/util:tensor_util",
1173            "//executorch/kernels/portable/cpu/util:reduce_util",
1174        ],
1175    ),
1176    op_target(
1177        name = "op_t_copy",
1178        deps = ["//executorch/kernels/portable/cpu/util:transpose_util"],
1179    ),
1180    op_target(
1181        name = "op_tan",
1182        deps = [
1183            "//executorch/kernels/portable/cpu/pattern:pattern",
1184        ],
1185    ),
1186    op_target(
1187        name = "op_tanh",
1188        deps = [
1189            "//executorch/kernels/portable/cpu/pattern:pattern",
1190        ],
1191    ),
1192    op_target(
1193        name = "op_to_copy",
1194        deps = [
1195            "//executorch/kernels/portable/cpu/util:copy_ops_util",
1196        ],
1197    ),
1198    op_target(
1199        name = "op_topk",
1200    ),
1201    op_target(
1202        name = "op_transpose_copy",
1203        deps = ["//executorch/kernels/portable/cpu/util:transpose_util"],
1204    ),
1205    op_target(
1206        name = "op_tril",
1207        deps = [
1208            "//executorch/kernels/portable/cpu/util:copy_ops_util",
1209        ],
1210    ),
1211    op_target(
1212        name = "op_trunc",
1213        deps = [
1214            "//executorch/kernels/portable/cpu/pattern:pattern",
1215        ],
1216    ),
1217    op_target(
1218        name = "op_unbind_copy",
1219        deps = [
1220            "//executorch/kernels/portable/cpu/util:copy_ops_util",
1221        ],
1222    ),
1223    op_target(
1224        name = "op_unsqueeze_copy",
1225        deps = [
1226            "//executorch/kernels/portable/cpu/util:copy_ops_util",
1227        ],
1228    ),
1229    op_target(
1230        name = "op_var",
1231        deps = [
1232            ":scalar_utils",
1233            "//executorch/runtime/core/exec_aten/util:scalar_type_util",
1234            "//executorch/runtime/core/exec_aten/util:tensor_util",
1235            "//executorch/kernels/portable/cpu/util:reduce_util",
1236        ],
1237    ),
1238    op_target(
1239        name = "op_view_copy",
1240        deps = [
1241            "//executorch/kernels/portable/cpu/util:copy_ops_util",
1242        ],
1243    ),
1244    op_target(
1245        name = "op_where",
1246        deps = [
1247            "//executorch/kernels/portable/cpu/util:broadcast_util",
1248            "//executorch/kernels/portable/cpu/util:dtype_util",
1249            "//executorch/kernels/portable/cpu/util:elementwise_util",
1250        ],
1251    ),
1252    op_target(
1253        name = "op_zeros",
1254    ),
1255    op_target(
1256        name = "op__to_dim_order_copy",
1257        deps = [
1258            ":scalar_utils",
1259            "//executorch/kernels/portable/cpu/util:copy_ops_util",
1260        ],
1261    ),
1262)
1263
1264# Operators that are not listed in `functions.yaml` (i.e., operators listed in
1265# `custom_ops.yaml`), which are not compatible with the core ATen operators.
1266# Every entry here will be backed by a cxx_library target with the given name
1267# and deps, as well as a similar `<name>_aten` target that uses at::Tensor and
1268# related types.
1269#
1270# Note that a single target (or single .cpp file) can't mix ATen and non-ATen
1271# ops, and must be split. They can, however, share common code via a library dep
1272# if necessary.
1273CUSTOM_OPS = (
1274    op_target(
1275        name = "op_allclose",
1276    ),
1277    op_target(
1278        name = "op_linear_scratch_example",
1279    ),
1280)
1281
1282def portable_source_list():
1283    """All the source file names from //executorch/kernels/portable/cpu/"""
1284    return [op["name"] + ".cpp" for op in ATEN_OPS + CUSTOM_OPS]
1285
1286def portable_header_list():
1287    """All the header file names from //executorch/kernels/portable/cpu/"""
1288    return ["selective_build.h", "scalar_utils.h", "math_constants.h", "vec_ops.h"]
1289