]> git.ipfire.org Git - thirdparty/gcc.git/commitdiff
backport: aarch64-protos.h (aarch64_classify_symbol): Fixup prototype.
authorTejas Belagod <tejas.belagod@arm.com>
Tue, 28 Apr 2015 16:24:36 +0000 (17:24 +0100)
committerTejas Belagod <belagod@gcc.gnu.org>
Tue, 28 Apr 2015 16:24:36 +0000 (17:24 +0100)
2015-04-28  Tejas Belagod  <tejas.belagod@arm.com>

        Backport from Mainline
        2014-11-20  Tejas Belagod  <tejas.belagod@arm.com>

        * config/aarch64/aarch64-protos.h (aarch64_classify_symbol):
        Fixup prototype.
        * config/aarch64/aarch64.c (aarch64_expand_mov_immediate,
        aarch64_cannot_force_const_mem, aarch64_classify_address,
        aarch64_classify_symbolic_expression): Fixup call to
        aarch64_classify_symbol.
        (aarch64_classify_symbol): Add range-checking for
        symbol + offset addressing for tiny and small models.

        Backport from mainline
        2014-11-20  Tejas Belagod  <tejas.belagod@arm.com>

        * gcc.target/aarch64/symbol-range.c: New.
        * gcc.target/aarch64/symbol-range-tiny.c: New.

From-SVN: r222534

gcc/ChangeLog
gcc/config/aarch64/aarch64-protos.h
gcc/config/aarch64/aarch64.c
gcc/testsuite/ChangeLog
gcc/testsuite/gcc.target/aarch64/symbol-range-tiny.c [new file with mode: 0644]
gcc/testsuite/gcc.target/aarch64/symbol-range.c [new file with mode: 0644]

index 31f084d1c6c868c5341f6a8e9c0cd0c17c3130dc..dfc4425b399cc92a06855b4aac0e7afc1bd5bb0e 100644 (file)
@@ -1,3 +1,17 @@
+2015-04-28  Tejas Belagod  <tejas.belagod@arm.com>
+
+       Backport from Mainline
+       2014-11-20  Tejas Belagod  <tejas.belagod@arm.com>
+
+       * config/aarch64/aarch64-protos.h (aarch64_classify_symbol):
+       Fixup prototype.
+       * config/aarch64/aarch64.c (aarch64_expand_mov_immediate,
+       aarch64_cannot_force_const_mem, aarch64_classify_address,
+       aarch64_classify_symbolic_expression): Fixup call to
+       aarch64_classify_symbol.
+       (aarch64_classify_symbol): Add range-checking for
+       symbol + offset addressing for tiny and small models.
+
 2015-04-24  Michael Meissner  <meissner@linux.vnet.ibm.com>
 
        Backport from mainline
index bef58bf711949342e0cc103febd5311ae8d97585..11132118bf1567659ac3b9ba7f1d0995cacebeb7 100644 (file)
@@ -195,7 +195,7 @@ bool aarch64_uimm12_shift (HOST_WIDE_INT);
 const char *aarch64_output_casesi (rtx *);
 const char *aarch64_rewrite_selected_cpu (const char *name);
 
-enum aarch64_symbol_type aarch64_classify_symbol (rtx,
+enum aarch64_symbol_type aarch64_classify_symbol (rtx, rtx,
                                                  enum aarch64_symbol_context);
 enum aarch64_symbol_type aarch64_classify_tls_symbol (rtx);
 enum reg_class aarch64_regno_regclass (unsigned);
index 408d8cb7797a935ec2a9b1474ba9d47808184efb..c0296fa2aa2d01fb4064c989c3f56bfc75ba394c 100644 (file)
@@ -919,7 +919,7 @@ aarch64_expand_mov_immediate (rtx dest, rtx imm)
         before we start classifying the symbol.  */
       split_const (imm, &base, &offset);
 
-      sty = aarch64_classify_symbol (base, SYMBOL_CONTEXT_ADR);
+      sty = aarch64_classify_symbol (base, offset, SYMBOL_CONTEXT_ADR);
       switch (sty)
        {
        case SYMBOL_FORCE_TO_MEM:
@@ -2787,7 +2787,7 @@ aarch64_cannot_force_const_mem (enum machine_mode mode ATTRIBUTE_UNUSED, rtx x)
   split_const (x, &base, &offset);
   if (GET_CODE (base) == SYMBOL_REF || GET_CODE (base) == LABEL_REF)
     {
-      if (aarch64_classify_symbol (base, SYMBOL_CONTEXT_ADR)
+      if (aarch64_classify_symbol (base, offset, SYMBOL_CONTEXT_ADR)
          != SYMBOL_FORCE_TO_MEM)
        return true;
       else
@@ -3186,7 +3186,7 @@ aarch64_classify_address (struct aarch64_address_info *info,
          rtx sym, offs;
          split_const (info->offset, &sym, &offs);
          if (GET_CODE (sym) == SYMBOL_REF
-             && (aarch64_classify_symbol (sym, SYMBOL_CONTEXT_MEM)
+             && (aarch64_classify_symbol (sym, offs, SYMBOL_CONTEXT_MEM)
                  == SYMBOL_SMALL_ABSOLUTE))
            {
              /* The symbol and offset must be aligned to the access size.  */
@@ -3243,7 +3243,7 @@ aarch64_classify_symbolic_expression (rtx x,
   rtx offset;
 
   split_const (x, &x, &offset);
-  return aarch64_classify_symbol (x, context);
+  return aarch64_classify_symbol (x, offset, context);
 }
 
 
@@ -5374,7 +5374,7 @@ aarch64_classify_tls_symbol (rtx x)
    LABEL_REF X in context CONTEXT.  */
 
 enum aarch64_symbol_type
-aarch64_classify_symbol (rtx x,
+aarch64_classify_symbol (rtx x, rtx offset,
                         enum aarch64_symbol_context context ATTRIBUTE_UNUSED)
 {
   if (GET_CODE (x) == LABEL_REF)
@@ -5408,12 +5408,25 @@ aarch64_classify_symbol (rtx x,
       switch (aarch64_cmodel)
        {
        case AARCH64_CMODEL_TINY:
-         if (SYMBOL_REF_WEAK (x))
+         /* When we retreive symbol + offset address, we have to make sure
+            the offset does not cause overflow of the final address.  But
+            we have no way of knowing the address of symbol at compile time
+            so we can't accurately say if the distance between the PC and
+            symbol + offset is outside the addressible range of +/-1M in the
+            TINY code model.  So we rely on images not being greater than
+            1M and cap the offset at 1M and anything beyond 1M will have to
+            be loaded using an alternative mechanism.  */
+         if (SYMBOL_REF_WEAK (x)
+             || INTVAL (offset) < -1048575 || INTVAL (offset) > 1048575)
            return SYMBOL_FORCE_TO_MEM;
          return SYMBOL_TINY_ABSOLUTE;
 
        case AARCH64_CMODEL_SMALL:
-         if (SYMBOL_REF_WEAK (x))
+         /* Same reasoning as the tiny code model, but the offset cap here is
+            4G.  */
+         if (SYMBOL_REF_WEAK (x)
+             || INTVAL (offset) < (HOST_WIDE_INT) -4294967263
+             || INTVAL (offset) > (HOST_WIDE_INT) 4294967264)
            return SYMBOL_FORCE_TO_MEM;
          return SYMBOL_SMALL_ABSOLUTE;
 
index cfbbe5f5c95251f167d9e064597d785a9fb114a0..09d3521ea7f66868f3b91605761e1a9a9d80b56c 100644 (file)
@@ -1,3 +1,11 @@
+2015-04-28  Tejas Belagod  <tejas.belagod@arm.com>
+
+       Backport from mainline
+       2014-11-20  Tejas Belagod  <tejas.belagod@arm.com>
+
+       * gcc.target/aarch64/symbol-range.c: New.
+       * gcc.target/aarch64/symbol-range-tiny.c: New.
+
 2015-04-24  Bill Schmidt  <wschmidt@linux.vnet.ibm.com>
 
        Backport from mainline r222362
diff --git a/gcc/testsuite/gcc.target/aarch64/symbol-range-tiny.c b/gcc/testsuite/gcc.target/aarch64/symbol-range-tiny.c
new file mode 100644 (file)
index 0000000..d7d2039
--- /dev/null
@@ -0,0 +1,13 @@
+/* { dg-do compile } */
+/* { dg-options "-O3 -save-temps -mcmodel=tiny" } */
+
+int fixed_regs[0x00200000];
+
+int
+foo()
+{
+  return fixed_regs[0x00080000];
+}
+
+/* { dg-final { scan-assembler-not "adr\tx\[0-9\]+, fixed_regs\\\+" } } */
+/* { dg-final {cleanup-saved-temps } } */
diff --git a/gcc/testsuite/gcc.target/aarch64/symbol-range.c b/gcc/testsuite/gcc.target/aarch64/symbol-range.c
new file mode 100644 (file)
index 0000000..f999bb3
--- /dev/null
@@ -0,0 +1,13 @@
+/* { dg-do compile } */
+/* { dg-options "-O3 -save-temps -mcmodel=small" } */
+
+int fixed_regs[0x200000000ULL];
+
+int
+foo()
+{
+  return fixed_regs[0x100000000ULL];
+}
+
+/* { dg-final { scan-assembler-not "adrp\tx\[0-9\]+, fixed_regs\\\+" } } */
+/* { dg-final {cleanup-saved-temps } } */