Windows Control Flow Guard (CFG) has two different "mechanisms" or "patterns": * Dispatch: the caller calls into the CFG function, which both checks the target callee and then calls it. * Check: the caller calls the CFG function which only checks the target callee and then must separately call the callee. LLVM has followed MSVC's pattern for selecting the mechanism based on the target architecture. These defaults in MSVC are based on tests for performance: Dispatch produces a smaller code size, whereas Check is more friendly to branch predictors. It is possible, however, for a given workload, call pattern or target CPU that someone may want to select a different mechanism to use for their code. This change adds a new Clang and CC1 flag to force a CFG mechanism: `-fwin-cfg-mechanism`. This can be set to `automatic` (lets LLVM choose a mechanism), `force-dispatch` or `force-check`. Also adds the support for the equivalent MSVC flag `/d2guardcfgdispatch`. NOTE: Arm64EC only supports the check mechanism. It should be noted that MSVC emits the "dispatch" name for the call checker (for legacy reasons) but uses the check mechanism.
12 KiB
12 KiB