aboutsummaryrefslogtreecommitdiff
path: root/gcc
diff options
context:
space:
mode:
authorClaudiu Zissulescu <claziss@synopsys.com>2017-09-01 13:43:17 +0200
committerClaudiu Zissulescu <claziss@gcc.gnu.org>2017-09-01 13:43:17 +0200
commit7cfbf676bdb8783e2818995ddd436a442b4dae75 (patch)
tree9c1a5c6698bec6a78ba2568a6606ffd5c2ca82e5 /gcc
parentd2e05fcbdafc26ab0c2babf2b3065d177f71305b (diff)
downloadgcc-7cfbf676bdb8783e2818995ddd436a442b4dae75.zip
gcc-7cfbf676bdb8783e2818995ddd436a442b4dae75.tar.gz
gcc-7cfbf676bdb8783e2818995ddd436a442b4dae75.tar.bz2
[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 <claziss@synopsys.com> * 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 <claziss@synopsys.com> * gcc.target/arc/pr9001184797.c: New test. From-SVN: r251586
Diffstat (limited to 'gcc')
-rw-r--r--gcc/ChangeLog5
-rw-r--r--gcc/config/arc/arc.c24
-rw-r--r--gcc/testsuite/ChangeLog4
-rw-r--r--gcc/testsuite/gcc.target/arc/pr9001184797.c19
4 files changed, 52 insertions, 0 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog
index 288c2a0..70e5aed 100644
--- a/gcc/ChangeLog
+++ b/gcc/ChangeLog
@@ -1,3 +1,8 @@
+2017-09-01 Claudiu Zissulescu <claziss@synopsys.com>
+
+ * config/arc/arc.c (arc_use_anchors_for_symbol_p): New function.
+ (TARGET_USE_ANCHORS_FOR_SYMBOL_P): Define.
+
2017-08-31 Olivier Hainque <hainque@adacore.com>
* config.gcc (powerpc-wrs-vxworks|vxworksae|vxworksmils): Now
diff --git a/gcc/config/arc/arc.c b/gcc/config/arc/arc.c
index bc73a59..5410d6b 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 5600d2c..f38f866 100644
--- a/gcc/testsuite/ChangeLog
+++ b/gcc/testsuite/ChangeLog
@@ -1,3 +1,7 @@
+2017-09-01 Claudiu Zissulescu <claziss@synopsys.com>
+
+ * gcc.target/arc/pr9001184797.c: New test.
+
2017-09-01 Jakub Jelinek <jakub@redhat.com>
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 0000000..e76c676
--- /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;
+}