So this has several parts (and take my answer with a grain of salt, I am by no means an expert in PyTorch internals).

The actual back-propagation is eventually done in torch/csrc/autograd/engine.cpp 10. There also is a python_engine.cpp in the same directory which sits between the torch/autograd python code and the engine.cpp.
The backward objects are (and can only be) instantiated in the C interface. The definitions are autogenerated during the build, they end up in torch/csrc/autograd/generated and are generated by and from the files in tools/autograd 9. There you’ll find templates C code, yaml files listing the functions to be generated and their backwards, and the actual generation code.

Best regards
Thomas