From 6c0ab626113ef20ee2986cb8a102b5394aeb888a Mon Sep 17 00:00:00 2001 From: XieZhiheng Date: Tue, 21 Apr 2020 15:09:23 +0100 Subject: [PATCH] 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 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. --- gcc/ChangeLog | 7 +++ gcc/config/aarch64/aarch64.c | 51 ++++++++++++---------- gcc/doc/invoke.texi | 4 +- gcc/testsuite/ChangeLog | 5 +++ gcc/testsuite/gcc.target/aarch64/pr94577.c | 10 +++++ 5 files changed, 53 insertions(+), 24 deletions(-) create mode 100644 gcc/testsuite/gcc.target/aarch64/pr94577.c diff --git a/gcc/ChangeLog b/gcc/ChangeLog index c3572ca03bd..dc831f6725b 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,10 @@ +2020-04-21 Duan bo + + 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 PR other/94629 diff --git a/gcc/config/aarch64/aarch64.c b/gcc/config/aarch64/aarch64.c index ee6a2de77a5..f728ac530a4 100644 --- a/gcc/config/aarch64/aarch64.c +++ b/gcc/config/aarch64/aarch64.c @@ -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. */ diff --git a/gcc/doc/invoke.texi b/gcc/doc/invoke.texi index 8b5cd8246a9..d47488240cf 100644 --- a/gcc/doc/invoke.texi +++ b/gcc/doc/invoke.texi @@ -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 diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index 372a89f9578..0de5a470ec6 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,8 @@ +2020-04-21 Duan bo + + PR target/94577 + * gcc.target/aarch64/pr94577.c: New test. + 2020-04-21 Jakub Jelinek PR c/94686 diff --git a/gcc/testsuite/gcc.target/aarch64/pr94577.c b/gcc/testsuite/gcc.target/aarch64/pr94577.c new file mode 100644 index 00000000000..6f2d3612c26 --- /dev/null +++ b/gcc/testsuite/gcc.target/aarch64/pr94577.c @@ -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 } */ -- 2.30.2