Thank you Sandra, that looks much better.

R.

On 06/11/2025 22:41, Sandra Loosemore wrote:
> While working on other things, I noticed that the documentation for
> the -mbranch-protection= option was pretty garbled on both aarch64 and
> arm targets, with incorrect markup, too much syntax crammed into the
> option summary, and confusion about what the values "+leaf" modifier
> can apply to.  I rewrote it to list all the valid option values
> explicitly in the option description, checking this against the
> implementation.
> 
> gcc/ChangeLog
>       * doc/invoke.texi (AArch64 Options): Clean up description of
>       -mbranch-protection= argument.
>       (ARM Options): Likewise.
> ---
>  gcc/doc/invoke.texi | 52 +++++++++++++++++++++++++++++----------------
>  1 file changed, 34 insertions(+), 18 deletions(-)
> 
> diff --git a/gcc/doc/invoke.texi b/gcc/doc/invoke.texi
> index 07a21fd7fc9..de38cab887a 100644
> --- a/gcc/doc/invoke.texi
> +++ b/gcc/doc/invoke.texi
> @@ -838,8 +838,7 @@ Objective-C and Objective-C++ Dialects}.
>  -mlow-precision-recip-sqrt  -mlow-precision-sqrt  -mlow-precision-div
>  -mpc-relative-literal-loads
>  -msign-return-address=@var{scope}
> --mbranch-protection=@var{none}|@var{standard}|@var{pac-ret}[+@var{leaf}
> -+@var{b-key}]|@var{bti}|@var{gcs}
> +-mbranch-protection=@var{features}
>  -mharden-sls=@var{opts}
>  -march=@var{name}  -mcpu=@var{name}  -mtune=@var{name}
>  -moverride=@var{string}  -mverbose-cost-dump
> @@ -919,8 +918,7 @@ Objective-C and Objective-C++ Dialects}.
>  -mfix-cmse-cve-2021-35465
>  -mstack-protector-guard=@var{guard} 
> -mstack-protector-guard-offset=@var{offset}
>  -mfdpic
> --mbranch-protection=@var{none}|@var{standard}|@var{pac-ret}[+@var{leaf}]
> -[+@var{bti}]|@var{bti}[+@var{pac-ret}[+@var{leaf}]]}
> +-mbranch-protection=@var{features}}
>  
>  @emph{AVR Options} (@ref{AVR Options})
>  @gccoptlist{-mmcu=@var{mcu}  -mabsdata  -maccumulate-args  -mcvt
> @@ -22551,19 +22549,28 @@ default value is @samp{none}. This option has been 
> deprecated by
>  -mbranch-protection.
>  
>  @opindex mbranch-protection
> -@item 
> -mbranch-protection=@var{none}|@var{standard}|@var{pac-ret}[+@var{leaf}+@var{b-key}]|@var{bti}|@var{gcs}
> +@item -mbranch-protection=@var{features}
>  Select the branch protection features to use.
> +@var{features} can have one of the following forms:
> +
>  @samp{none} is the default and turns off all types of branch protection.
> +
>  @samp{standard} turns on all types of branch protection features.  If a 
> feature
>  has additional tuning options, then @samp{standard} sets it to its standard
>  level.
> -@samp{pac-ret[+@var{leaf}]} turns on return address signing to its standard
> +
> +@samp{pac-ret} turns on return address signing to its standard
>  level: signing functions that save the return address to memory (non-leaf
> -functions will practically always do this) using the a-key.  The optional
> -argument @samp{leaf} can be used to extend the signing to include leaf
> -functions.  The optional argument @samp{b-key} can be used to sign the 
> functions
> -with the B-key instead of the A-key.
> +functions practically always do this) using the A-key.
> +
> +@samp{pac-ret+leaf} extends the @samp{pac-ret} signing to include leaf
> +functions.
> +
> +@samp{pac-ret+b-key} or @samp{pac-ret+leaf+b-key} can be used to
> +sign the functions with the B-key instead of the A-key.
> +
>  @samp{bti} turns on branch target identification mechanism.
> +
>  @samp{gcs} turns on guarded control stack compatible code generation.
>  
>  @opindex mharden-sls
> @@ -25028,24 +25035,33 @@ build the Linux kernel using the same 
> (@code{arm-*-uclinuxfdpiceabi})
>  toolchain as the one used to build the userland programs.
>  
>  @opindex mbranch-protection
> -@item 
> -mbranch-protection=@var{none}|@var{standard}|@var{pac-ret}[+@var{leaf}][+@var{bti}]|@var{bti}[+@var{pac-ret}[+@var{leaf}]]
> +@item -mbranch-protection=@var{features}
> +
>  Enable branch protection features (armv8.1-m.main only).
> -@samp{none} generate code without branch protection or return address
> +
> +@var{features} can have one of the following forms:
> +
> +@samp{none} generates code without branch protection or return address
>  signing.
> -@samp{standard[+@var{leaf}]} generate code with all branch protection
> +
> +@samp{standard} generates code with all branch protection
>  features enabled at their standard level.
> -@samp{pac-ret[+@var{leaf}]} generate code with return address signing
> +
> +@samp{pac-ret} generates code with return address signing
>  set to its standard level, which is to sign all functions that save
>  the return address to memory.
> -@samp{leaf} When return address signing is enabled, also sign leaf
> +
> +@samp{pac-ret+leaf} extends the @samp{pac-ret} signing to include leaf
>  functions even if they do not write the return address to memory.
> -+@samp{bti} Add landing-pad instructions at the permitted targets of
> +
> +@samp{bti} adds landing-pad instructions at the permitted targets of
>  indirect branch instructions.
>  
> -If the @samp{+pacbti} architecture extension is not enabled, then all
> +If support for the @samp{+pacbti} architecture extension is not enabled
> +(e.g. via @option{-march=}), then all
>  branch protection and return address signing operations are
>  constrained to use only the instructions defined in the
> -architectural-NOP space. The generated code will remain
> +architectural-NOP space. The generated code remains
>  backwards-compatible with earlier versions of the architecture, but
>  the additional security can be enabled at run time on processors that
>  support the @samp{PACBTI} extension.

Reply via email to