From 7cfbf676bdb8783e2818995ddd436a442b4dae75 Mon Sep 17 00:00:00 2001 From: Claudiu Zissulescu Date: Fri, 1 Sep 2017 13:43:17 +0200 Subject: [PATCH] [ARC] Use TARGET_USE_ANCHORS_FOR_SYMBOL_P. We don't want to use anchors for small data: the GP register acts as an anchor in that case. We also don't want to use them for PC-relative accesses, where the PC acts as an anchor. TLS symbols require special accesses as well, don't use anchors for such symbols. gcc/ 2017-04-28 Claudiu Zissulescu * config/arc/arc.c (arc_use_anchors_for_symbol_p): New function. (TARGET_USE_ANCHORS_FOR_SYMBOL_P): Define. gcc/testsuite 2017-04-28 Claudiu Zissulescu * gcc.target/arc/pr9001184797.c: New test. From-SVN: r251586 --- gcc/ChangeLog | 5 +++++ gcc/config/arc/arc.c | 24 +++++++++++++++++++++ gcc/testsuite/ChangeLog | 4 ++++ gcc/testsuite/gcc.target/arc/pr9001184797.c | 19 ++++++++++++++++ 4 files changed, 52 insertions(+) create mode 100644 gcc/testsuite/gcc.target/arc/pr9001184797.c diff --git a/gcc/ChangeLog b/gcc/ChangeLog index 288c2a0bc07..70e5aedaca5 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,8 @@ +2017-09-01 Claudiu Zissulescu + + * config/arc/arc.c (arc_use_anchors_for_symbol_p): New function. + (TARGET_USE_ANCHORS_FOR_SYMBOL_P): Define. + 2017-08-31 Olivier Hainque * config.gcc (powerpc-wrs-vxworks|vxworksae|vxworksmils): Now diff --git a/gcc/config/arc/arc.c b/gcc/config/arc/arc.c index bc73a591fa4..5410d6b8788 100644 --- a/gcc/config/arc/arc.c +++ b/gcc/config/arc/arc.c @@ -10566,6 +10566,30 @@ compact_memory_operand_p (rtx op, machine_mode mode, return false; } +/* Implement TARGET_USE_ANCHORS_FOR_SYMBOL_P. We don't want to use + anchors for small data: the GP register acts as an anchor in that + case. We also don't want to use them for PC-relative accesses, + where the PC acts as an anchor. Prohibit also TLS symbols to use + anchors. */ + +static bool +arc_use_anchors_for_symbol_p (const_rtx symbol) +{ + if (SYMBOL_REF_TLS_MODEL (symbol)) + return false; + + if (flag_pic) + return false; + + if (SYMBOL_REF_SMALL_P (symbol)) + return false; + + return default_use_anchors_for_symbol_p (symbol); +} + +#undef TARGET_USE_ANCHORS_FOR_SYMBOL_P +#define TARGET_USE_ANCHORS_FOR_SYMBOL_P arc_use_anchors_for_symbol_p + struct gcc_target targetm = TARGET_INITIALIZER; #include "gt-arc.h" diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index 5600d2c6bf9..f38f8669020 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,7 @@ +2017-09-01 Claudiu Zissulescu + + * gcc.target/arc/pr9001184797.c: New test. + 2017-09-01 Jakub Jelinek PR c/81887 diff --git a/gcc/testsuite/gcc.target/arc/pr9001184797.c b/gcc/testsuite/gcc.target/arc/pr9001184797.c new file mode 100644 index 00000000000..e76c6769042 --- /dev/null +++ b/gcc/testsuite/gcc.target/arc/pr9001184797.c @@ -0,0 +1,19 @@ +/* { dg-do compile } */ +/* { dg-require-effective-target tls } */ +/* { dg-options "-Os -w -mno-ll64" } */ + +/* This test studies the use of anchors and tls symbols. */ + +struct a b; +struct a { + long c; + long d +} e() { + static __thread struct a f; + static __thread g; + g = 5; + h(); + if (f.c) + g = g & 5; + f = b; +} -- 2.30.2