aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorXieZhiheng <xiezhiheng@huawei.com>2020-04-21 15:09:23 +0100
committerRichard Sandiford <richard.sandiford@arm.com>2020-04-21 15:09:23 +0100
commit6c0ab626113ef20ee2986cb8a102b5394aeb888a (patch)
treeb61cc551a97dac02c1192f41958c9fbfecf8827a
parentf2c8be187e8eb061e44166ac41646285821be6a6 (diff)
downloadgcc-6c0ab626113ef20ee2986cb8a102b5394aeb888a.zip
gcc-6c0ab626113ef20ee2986cb8a102b5394aeb888a.tar.gz
gcc-6c0ab626113ef20ee2986cb8a102b5394aeb888a.tar.bz2
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.
-rw-r--r--gcc/ChangeLog7
-rw-r--r--gcc/config/aarch64/aarch64.c51
-rw-r--r--gcc/doc/invoke.texi4
-rw-r--r--gcc/testsuite/ChangeLog5
-rw-r--r--gcc/testsuite/gcc.target/aarch64/pr94577.c10
5 files changed, 53 insertions, 24 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog
index c3572ca..dc831f6 100644
--- a/gcc/ChangeLog
+++ b/gcc/ChangeLog
@@ -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
diff --git a/gcc/config/aarch64/aarch64.c b/gcc/config/aarch64/aarch64.c
index ee6a2de7..f728ac5 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 8b5cd82..d474882 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 372a89f..0de5a47 100644
--- a/gcc/testsuite/ChangeLog
+++ b/gcc/testsuite/ChangeLog
@@ -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
diff --git a/gcc/testsuite/gcc.target/aarch64/pr94577.c b/gcc/testsuite/gcc.target/aarch64/pr94577.c
new file mode 100644
index 0000000..6f2d361
--- /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 } */