Regarding 3), it is unclear whether you ask wrt by writing a) your own backend or b) regarding an existing backend.
a) yes, obviously / usually you can generate whatever you want if you implement it in your backend. b) which backend? those. calling ARM is already an indirect branch (for example, the bl instruction), while the X86 CALL has side effects on the H86 HW (i.e., saving the return address, as well as non-functional side effects, such as support for predicting column branches) and therefore cannot be simply replaced by an indirect call without emulating what CALL would do. AFAIK CALL emulation using indirect branches is not part of the X86 LLVM backend.
source share