m68k.opt (mxgot): New option.
authorJoseph Myers <joseph@codesourcery.com>
Wed, 4 Jun 2008 12:17:50 +0000 (13:17 +0100)
committerJoseph Myers <jsm28@gcc.gnu.org>
Wed, 4 Jun 2008 12:17:50 +0000 (13:17 +0100)
2008-06-04  Joseph Myers  <joseph@codesourcery.com>
            Maxim Kuvyrkov  <maxim@codesourcery.com>

* config/m68k/m68k.opt (mxgot): New option.
* config/m68k/m68k.c (legitimize_pic_address): Handle -mxgot.
(m68k_output_addr_const_extra): New.
* config/m68k/m68k.h (OUTPUT_ADDR_CONST_EXTRA): New.
* config/m68k/m68k-protos.h (m68k_output_addr_const_extra): Declare.
* config/m68k/m68k.md (UNSPEC_GOTOFF): Define.
* doc/invoke.texi (M680x0 Options): Document -mxgot.

testsuite:
2008-06-04  Joseph Myers  <joseph@codesourcery.com>
            Maxim Kuvyrkov  <maxim@codesourcery.com>

* gcc.target/m68k/xgot-1.c: New test.

Co-Authored-By: Maxim Kuvyrkov <maxim@codesourcery.com>
From-SVN: r136355

gcc/ChangeLog
gcc/config/m68k/m68k-protos.h
gcc/config/m68k/m68k.c
gcc/config/m68k/m68k.h
gcc/config/m68k/m68k.md
gcc/config/m68k/m68k.opt
gcc/doc/invoke.texi
gcc/testsuite/ChangeLog
gcc/testsuite/gcc.target/m68k/xgot-1.c [new file with mode: 0644]

index 0cb236d63111d5609b6f4575d45f7bae9aa0aff6..e7e91d7bb150535f6a46dc4a4d38c03b938544b0 100644 (file)
@@ -1,3 +1,14 @@
+2008-06-04  Joseph Myers  <joseph@codesourcery.com>
+            Maxim Kuvyrkov  <maxim@codesourcery.com>
+
+       * config/m68k/m68k.opt (mxgot): New option.
+       * config/m68k/m68k.c (legitimize_pic_address): Handle -mxgot.
+       (m68k_output_addr_const_extra): New.
+       * config/m68k/m68k.h (OUTPUT_ADDR_CONST_EXTRA): New.
+       * config/m68k/m68k-protos.h (m68k_output_addr_const_extra): Declare.
+       * config/m68k/m68k.md (UNSPEC_GOTOFF): Define.
+       * doc/invoke.texi (M680x0 Options): Document -mxgot.
+
 2008-06-04  Richard Guenther  <rguenther@suse.de>
 
        * tree-ssa-structalias.c (handle_ptr_arith): Correctly handle
index 33025f8f34ac0d27e14f3ace936d9a2a151c7cf8..596d4ec8e034119e5fcc00ee22092e6e49c544b4 100644 (file)
@@ -50,6 +50,7 @@ extern bool strict_low_part_peephole_ok (enum machine_mode mode, rtx first_insn,
 extern int standard_68881_constant_p (rtx);
 extern void print_operand_address (FILE *, rtx);
 extern void print_operand (FILE *, rtx, int);
+extern bool m68k_output_addr_const_extra (FILE *, rtx);
 extern void notice_update_cc (rtx, rtx);
 extern bool m68k_legitimate_base_reg_p (rtx, bool);
 extern bool m68k_legitimate_index_reg_p (rtx, bool);
index 52a60da06640d208739c7aa22c6004e2a15c81bc..a1437d29c366e6e61116c4cdbd5fb818e744cb40 100644 (file)
@@ -2059,9 +2059,30 @@ legitimize_pic_address (rtx orig, enum machine_mode mode ATTRIBUTE_UNUSED,
     {
       gcc_assert (reg);
 
-      pic_ref = gen_rtx_MEM (Pmode,
-                            gen_rtx_PLUS (Pmode,
-                                          pic_offset_table_rtx, orig));
+      if (TARGET_COLDFIRE && TARGET_XGOT)
+       /* When compiling with -mxgot switch the code for the above
+          example will look like this:
+
+          movel a5, a0
+          addl _foo@GOT, a0
+          movel a0@, a0
+          movel #12345, a0@  */
+       {
+         rtx pic_offset;
+
+         /* Wrap ORIG in UNSPEC_GOTOFF to tip m68k_output_addr_const_extra
+            to put @GOT after reference.  */
+         pic_offset = gen_rtx_UNSPEC (Pmode, gen_rtvec (1, orig),
+                                      UNSPEC_GOTOFF);
+         pic_offset = gen_rtx_CONST (Pmode, pic_offset);
+         emit_move_insn (reg, pic_offset);
+         emit_insn (gen_addsi3 (reg, reg, pic_offset_table_rtx));
+         pic_ref = gen_rtx_MEM (Pmode, reg);
+       }
+      else
+       pic_ref = gen_rtx_MEM (Pmode,
+                              gen_rtx_PLUS (Pmode,
+                                            pic_offset_table_rtx, orig));
       crtl->uses_pic_offset_table = 1;
       MEM_READONLY_P (pic_ref) = 1;
       emit_move_insn (reg, pic_ref);
@@ -3869,6 +3890,20 @@ print_operand (FILE *file, rtx op, int letter)
     }
 }
 
+/* m68k implementation of OUTPUT_ADDR_CONST_EXTRA.  */
+
+bool
+m68k_output_addr_const_extra (FILE *file, rtx x)
+{
+  if (GET_CODE (x) != UNSPEC || XINT (x, 1) != UNSPEC_GOTOFF)
+    return false;
+
+  output_addr_const (file, XVECEXP (x, 0, 0));
+  /* ??? What is the non-MOTOROLA syntax?  */
+  fputs ("@GOT", file);
+  return true;
+}
+
 \f
 /* A C compound statement to output to stdio stream STREAM the
    assembler syntax for an instruction operand that is a memory
index 521ad84971650e691bf1f49921baafe3e69a7ea2..7a68595a3345742555f46627c3ba1ebe061196f7 100644 (file)
@@ -1079,6 +1079,12 @@ do { if (cc_prev_status.flags & CC_IN_68881)                     \
 
 #define PRINT_OPERAND_ADDRESS(FILE, ADDR) print_operand_address (FILE, ADDR)
 
+#define OUTPUT_ADDR_CONST_EXTRA(FILE, X, FAIL)         \
+do {                                                   \
+  if (! m68k_output_addr_const_extra (FILE, (X)))      \
+    goto FAIL;                                         \
+} while (0);
+
 /* Values used in the MICROARCH argument to M68K_DEVICE.  */
 enum uarch_type
 {
index 56c459e68b0c5dd359ff2f2b428a26fb74bc4dc0..9effb344ec5ea0f96cd153cc474b7bcd40b374c5 100644 (file)
    (UNSPEC_GOT 3)
    (UNSPEC_IB 4)
    (UNSPEC_TIE 5)
+   (UNSPEC_GOTOFF 6)
   ])
 
 ;; UNSPEC_VOLATILE usage:
index 23a3c09c6c520065d5a1c3be25d09a612271ffd0..bc0fb2c9939bffab223a8999c30eda6ef21244d1 100644 (file)
@@ -178,3 +178,7 @@ Do not use unaligned memory references
 mtune=
 Target RejectNegative Joined
 Tune for the specified target CPU or architecture
+
+mxgot
+Target Report Mask(XGOT)
+Support more than 8192 GOT entries on ColdFire
index 6dbd19ea2f9ef79737e4a06ad9f1ebf394b11a51..ece9d9d5fc0e65eae9817828d94544cd286ad0bc 100644 (file)
@@ -607,7 +607,8 @@ Objective-C and Objective-C++ Dialects}.
 -mnobitfield  -mrtd  -mno-rtd  -mdiv  -mno-div  -mshort @gol
 -mno-short  -mhard-float  -m68881  -msoft-float  -mpcrel @gol
 -malign-int  -mstrict-align  -msep-data  -mno-sep-data @gol
--mshared-library-id=n  -mid-shared-library  -mno-id-shared-library}
+-mshared-library-id=n  -mid-shared-library  -mno-id-shared-library @gol
+-mxgot -mno-xgot}
 
 @emph{M68hc1x Options}
 @gccoptlist{-m6811  -m6812  -m68hc11  -m68hc12   -m68hcs12 @gol
@@ -11776,6 +11777,38 @@ compiled.  Specifying a value of 0 will generate more compact code, specifying
 other values will force the allocation of that number to the current
 library but is no more space or time efficient than omitting this option.
 
+@item -mxgot
+@itemx -mno-xgot
+@opindex mxgot
+@opindex mno-xgot
+When generating position-independent code for ColdFire, generate code
+that works if the GOT has more than 8192 entries.  This code is
+larger and slower than code generated without this option.  On M680x0
+processors, this option is not needed; @option{-fPIC} suffices.
+
+GCC normally uses a single instruction to load values from the GOT@.
+While this is relatively efficient, it only works if the GOT
+is smaller than about 64k.  Anything larger causes the linker
+to report an error such as:
+
+@cindex relocation truncated to fit (ColdFire)
+@smallexample
+relocation truncated to fit: R_68K_GOT16O foobar
+@end smallexample
+
+If this happens, you should recompile your code with @option{-mxgot}.
+It should then work with very large GOTs.  However, code generated with
+@option{-mxgot} is less efficient, since it takes 4 instructions to fetch
+the value of a global symbol.
+
+Note that some linkers, including newer versions of the GNU linker,
+can create multiple GOTs and sort GOT entries.  If you have such a linker,
+you should only need to use @option{-mxgot} when compiling a single
+object file that accesses more than 8192 GOT entries.  Very few do.
+
+These options have no effect unless GCC is generating
+position-independent code.
+
 @end table
 
 @node M68hc1x Options
index d43613a3a06ebb51e11e6eea8b2b11ff0a695237..a2f746c8198ef5981f99ea7b3fc6a4174a6a8ee6 100644 (file)
@@ -1,3 +1,8 @@
+2008-06-04  Joseph Myers  <joseph@codesourcery.com>
+            Maxim Kuvyrkov  <maxim@codesourcery.com>
+
+       * gcc.target/m68k/xgot-1.c: New test.
+
 2008-06-04  Richard Guenther  <rguenther@suse.de>
 
        * gcc.c-torture/execute/20080604-1.c: New testcase.
diff --git a/gcc/testsuite/gcc.target/m68k/xgot-1.c b/gcc/testsuite/gcc.target/m68k/xgot-1.c
new file mode 100644 (file)
index 0000000..f7dd6c9
--- /dev/null
@@ -0,0 +1,11 @@
+/* { dg-do compile } */
+/* { dg-options "-fpic -mxgot" } */
+/* { dg-final { scan-assembler "foo@GOT,\%\[ad\]\[0-7\]" } } */
+
+extern int foo;
+
+int
+bar (void)
+{
+  return foo;
+}