Make -Zfixed-x18
into a target modifier by Darksonn · Pull Request #140661 · rust-lang/rust (original) (raw)
As part of #136966, the -Zfixed-x18
flag should be turned into a target modifier. This is a blocker to stabilization of the flag. The flag was originally added in #124655 and the MCP for its addition is MCP#748.
On some aarch64 targets, the x18 register is used as a temporary caller-saved register by default. When the -Zfixed-x18
flag is passed, this is turned off so that the compiler doesn't use the x18 register. This allows end-users to use the x18 register for other purposes. For example, by accessing it with inline asm you can use the register as a very efficient thread-local variable. Another common use-case is to store the stack pointer needed by the shadow-call-stack sanitizer. There are also some aarch64 targets where not using x18 is the default – in those cases the flag is a no-op.
Note that this flag does not on its own cause an ABI mismatch. What actually causes an ABI mismatch is when you have different compilation units that disagree on what it should be used for. But having a CU that uses it and another CU that doesn't normally isn't enough to trigger an ABI problem. However, we still consider the flag to be a target modifier in all cases, since it is assumed that you are passing the flag because you intend to assign some other meaning to the register. Rejecting all flag mismatches even if not all are unsound is consistent with RFC#3716. See the headings "not all mismatches are unsound" and "cases that are not caught" for additional discussion of this.
On aarch64 targets where -Zfixed-x18
is not a no-op, it is an error to pass -Zsanitizer=shadow-call-stack
without also passing -Zfixed-x18
.