[torchgen] Move Executorch codegen logic into torchgen (#90806)
## Codegen entry point
Main logic and Executorch codegen entry: `gen_executorch.py`.
`RegisterCodegenUnboxedKernels.cpp`:
```cpp
register_operators({
Operator(
"aten::add.out",
[](EValue** stack) {
EValue& self = *stack[0];
EValue& other = *stack[1];
EValue& alpha = *stack[2];
EValue& out = *stack[3];
const at::Tensor & self_base = self.to<at::Tensor>();
const at::Tensor & other_base = other.to<at::Tensor>();
const at::Scalar & alpha_base = alpha.to<at::Scalar>();
at::Tensor & out_base = out.to<at::Tensor>();
EXECUTORCH_SCOPE_PROF("native_call_add.out");
torch::executor::aten::add_outf(self_base, other_base, alpha_base, out_base);
})
);
```
`Functions.h`:
```cpp
namespace torch {
namespace executor {
namespace aten {
// aten::add_outf(Tensor self, Tensor other, Scalar alpha, *, Tensor(a!) out) -> Tensor(a!)
TORCH_API inline at::Tensor & add_outf(const at::Tensor & self, const at::Tensor & other, at::Scalar alpha, at::Tensor & out) {
return at::add_outf(self, other, alpha, out);
}
} // namespace aten
} // namespace executor
} // namespace torch
```
* Unit tests: `test_executorch_gen.py`
CI job in next PR.
Pull Request resolved: https://github.com/pytorch/pytorch/pull/90806
Approved by: https://github.com/ezyang