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