Hi Kyrill, > This restriction should be documented in invoke.texi IMO. > I also think it would be more user friendly to warn them about the > incompatibility if an explicit -moutline-atomics option is passed. > It’s okay though to silently turn off the implicit default-on option though.
I've updated the documentation for -mcmodel=large so it's a little closer to reality. I've also added the same check as for other incompatible options like -fPIC - this means with explicit use of outline atomics you get an error immediately instead of an unclear linker error. Cheers, Wilco v2: Update docs, report incompatible use of -mcmodel=large and outline atomics. Outline atomics is not designed to be used with -mcmodel=large, so disable it automatically if the large code model is used. Report incompatible explicit use of outline atomics with large model. Update documentation. gcc: PR target/112465 * config/aarch64/aarch64.cc (aarch64_override_options_after_change_1): Turn off outline atomics with -mcmodel=large. (initialize_aarch64_code_model): Report incompatible use of large model and outline atomics. * doc/invoke.texi (-mcmodel=large): Update description. --- diff --git a/gcc/config/aarch64/aarch64.cc b/gcc/config/aarch64/aarch64.cc index fe76730b0a7c8a2baaae24152e13d82a12d5d0a3..8bf0c011309d1f603137556006297dae5f009a47 100644 --- a/gcc/config/aarch64/aarch64.cc +++ b/gcc/config/aarch64/aarch64.cc @@ -18563,6 +18563,10 @@ aarch64_override_options_after_change_1 (struct gcc_options *opts) intermediary step for the former. */ if (flag_mlow_precision_sqrt) flag_mrecip_low_precision_sqrt = true; + + /* Turn off outline atomics with -mcmodel=large. */ + if (aarch64_cmodel == AARCH64_CMODEL_LARGE) + opts->x_aarch64_flag_outline_atomics = 0; } /* 'Unpack' up the internal tuning structs and update the options @@ -19150,6 +19154,8 @@ initialize_aarch64_code_model (struct gcc_options *opts) opts->x_flag_pic > 1 ? "PIC" : "pic"); if (opts->x_aarch64_abi == AARCH64_ABI_ILP32) sorry ("code model %qs not supported in ilp32 mode", "large"); + if (opts->x_aarch64_flag_outline_atomics == 1) + sorry ("code model %qs does not support %<-moutline-atomics%>", "large"); break; case AARCH64_CMODEL_TINY_PIC: case AARCH64_CMODEL_SMALL_PIC: diff --git a/gcc/doc/invoke.texi b/gcc/doc/invoke.texi index bad49a017cc1bb0922eba9f0b2db80166d409cd7..7352da7724a60efdbdbb6b743b1f7fef258f4bc8 100644 --- a/gcc/doc/invoke.texi +++ b/gcc/doc/invoke.texi @@ -21512,10 +21512,12 @@ dynamically linked. This is the default code model. @opindex mcmodel=large @item -mcmodel=large -Generate code for the large code model. This makes no assumptions about -addresses and sizes of sections. Programs can be statically linked only. The +Generate code for the large code model. This allows large .bss and .data +sections, however .text and .rodata must still be < 2GiB in total. Position +independent code or statically linked libraries are not supported. The @option{-mcmodel=large} option is incompatible with @option{-mabi=ilp32}, -@option{-fpic} and @option{-fPIC}. +@option{-fpie}, @option{-fPIE}, @option{-fpic}, @option{-fPIC}, +@option{-static}, @option{-moutline-atomics}. @item -mtp=@var{name} @opindex mtp