Adding a New BOLT Backend

A new BOLT backend should follow LLVM's policy for adding a new target. New BOLT targets are experimental and are not built by default.

Most target-specific work should be isolated in an MCPlusBuilder implementation under bolt/lib/Target/<Target>, together with platform-specific relocation handling in bolt/lib/Core/Relocation.cpp.

Changes to common infrastructure, particularly MCPlusBuilder, must be separate from the target changes and land first. Such changes require thorough tests and must state their processing-time and peak-memory impact on existing targets. Measurements should use large binaries, including at least Clang itself.

A backend does not need to implement every MCPlusBuilder interface initially. However, omitted interfaces must be checked against their callers. Analyses and passes that depend on missing functionality, such as stack frame analysis or register liveness, must remain disabled.

BOLT passes are not cleanly partitioned into common and target-specific code. Enable them for a new target only after auditing their target assumptions and proving them stable with target-specific and end-to-end tests. Otherwise, keep them disabled.

RISC targets generally need the LongJmp pass for branch relaxation. This requires correct branch-range checks and short- and long-jump construction, with tests covering range boundaries, calls, tail calls, and linker relaxation.

The initial backend should include focused tests for instruction analysis, relocations, CFG construction, rewriting, and each enabled pass. Validation must include rewriting and executing large real-world binaries, with Clang as the minimum large-binary test.