aarch64: Add an error message in large code model for ilp32 [PR94577]

The option -mabi=ilp32 should not be used in large code model. An error
message is added for the option conflict.

2020-04-21  Duan bo  <duanbo3@huawei.com>

gcc/
	PR target/94577
	* config/aarch64/aarch64.c: Add an error message for option conflict.
	* doc/invoke.texi (-mcmodel=large): Mention that -mcmodel=large is
	incompatible with -fpic, -fPIC and -mabi=ilp32.

gcc/testsuite/
	PR target/94577
	* gcc.target/aarch64/pr94577.c: New test.
This commit is contained in:
XieZhiheng 2020-04-21 15:09:23 +01:00 committed by Richard Sandiford
parent f2c8be187e
commit 6c0ab62611
5 changed files with 53 additions and 24 deletions

View File

@ -1,3 +1,10 @@
2020-04-21 Duan bo <duanbo3@huawei.com>
PR target/94577
* config/aarch64/aarch64.c: Add an error message for option conflict.
* doc/invoke.texi (-mcmodel=large): Mention that -mcmodel=large is
incompatible with -fpic, -fPIC and -mabi=ilp32.
2020-04-21 Frederik Harwath <frederik@codesourcery.com>
PR other/94629

View File

@ -14777,32 +14777,37 @@ aarch64_init_expanders (void)
static void
initialize_aarch64_code_model (struct gcc_options *opts)
{
if (opts->x_flag_pic)
{
switch (opts->x_aarch64_cmodel_var)
{
case AARCH64_CMODEL_TINY:
aarch64_cmodel = AARCH64_CMODEL_TINY_PIC;
break;
case AARCH64_CMODEL_SMALL:
aarch64_cmodel = opts->x_aarch64_cmodel_var;
switch (opts->x_aarch64_cmodel_var)
{
case AARCH64_CMODEL_TINY:
if (opts->x_flag_pic)
aarch64_cmodel = AARCH64_CMODEL_TINY_PIC;
break;
case AARCH64_CMODEL_SMALL:
if (opts->x_flag_pic)
{
#ifdef HAVE_AS_SMALL_PIC_RELOCS
aarch64_cmodel = (flag_pic == 2
? AARCH64_CMODEL_SMALL_PIC
: AARCH64_CMODEL_SMALL_SPIC);
aarch64_cmodel = (flag_pic == 2
? AARCH64_CMODEL_SMALL_PIC
: AARCH64_CMODEL_SMALL_SPIC);
#else
aarch64_cmodel = AARCH64_CMODEL_SMALL_PIC;
aarch64_cmodel = AARCH64_CMODEL_SMALL_PIC;
#endif
break;
case AARCH64_CMODEL_LARGE:
sorry ("code model %qs with %<-f%s%>", "large",
opts->x_flag_pic > 1 ? "PIC" : "pic");
break;
default:
gcc_unreachable ();
}
}
else
aarch64_cmodel = opts->x_aarch64_cmodel_var;
}
break;
case AARCH64_CMODEL_LARGE:
if (opts->x_flag_pic)
sorry ("code model %qs with %<-f%s%>", "large",
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");
break;
case AARCH64_CMODEL_TINY_PIC:
case AARCH64_CMODEL_SMALL_PIC:
case AARCH64_CMODEL_SMALL_SPIC:
gcc_unreachable ();
}
}
/* Implement TARGET_OPTION_SAVE. */

View File

@ -16759,7 +16759,9 @@ dynamically linked. This is the default code model.
@item -mcmodel=large
@opindex 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.
addresses and sizes of sections. Programs can be statically linked only. The
@option{-mcmodel=large} option is incompatible with @option{-mabi=ilp32},
@option{-fpic} and @option{-fPIC}.
@item -mstrict-align
@itemx -mno-strict-align

View File

@ -1,3 +1,8 @@
2020-04-21 Duan bo <duanbo3@huawei.com>
PR target/94577
* gcc.target/aarch64/pr94577.c: New test.
2020-04-21 Jakub Jelinek <jakub@redhat.com>
PR c/94686

View File

@ -0,0 +1,10 @@
/* { dg-do compile } */
/* { dg-options "-mcmodel=large -mabi=ilp32" } */
void
foo ()
{
// Do nothing
}
/* { dg-message "sorry, unimplemented: code model 'large' not supported in ilp32 mode" "" { target *-*-* } 0 } */