All frontend actions that generate code (MLIR, LLVM IR/BC,
Assembly/Object Code) are re-factored as essentially one action,
CodeGenAction, with minor specialisations. To facilate all this,
CodeGenAction is extended to hold TargetMachine and backend action
type (MLIR vs LLVM IR vs LLVM BC vs Assembly vs Object Code).
CodeGenAction is no longer a pure abstract class and the
corresponding ExecuteAction is implemented so that it covers all use
cases. All this allows a much better code re-use.
Key functionality is extracted into some helpful hooks:
- SetUpTargetMachine
- GetOutputStream
- EmitObjectCodeHelper
- EmitBCHelper
I hope that this clarifies the overall structure. I suspect that we may
need to revisit this again as the functionality grows in complexity.
Depends on D124664
Do we really need Backend_ prefix here? Seems obsolete.