OSDN Git Service

* contig/tc-sh.c (sh_local_pcrel): New.
authorKaz Kojima <kkojima@rr.iij4u.or.jp>
Thu, 3 Oct 2002 04:58:28 +0000 (04:58 +0000)
committerKaz Kojima <kkojima@rr.iij4u.or.jp>
Thu, 3 Oct 2002 04:58:28 +0000 (04:58 +0000)
(sh_force_relocation): Use sh_local_pcrel.
(md_pcrel_from_section): Check the relocation type whether it
should be resolved locally. Use S_FORCE_RELOC.
* testsuite/gas/sh/pcrel2.d: Check code also.

gas/ChangeLog
gas/config/tc-sh.c
gas/testsuite/ChangeLog
gas/testsuite/gas/sh/pcrel2.d

index 155b113..ed37bd2 100644 (file)
@@ -1,3 +1,10 @@
+2002-10-03  Kaz Kojima  <kkojima@rr.iij4u.or.jp>
+
+       * contig/tc-sh.c (sh_local_pcrel): New.
+       (sh_force_relocation): Use sh_local_pcrel.
+       (md_pcrel_from_section): Check the relocation type whether it
+       should be resolved locally. Use S_FORCE_RELOC.
+
 2002-10-01  Alan Modra  <amodra@bigpond.net.au>
 
        * config/tc-mips.h (TC_FORCE_RELOCATION_SUB_SAME): Define.
index be5e857..a2e53d5 100644 (file)
@@ -71,6 +71,7 @@ static void build_relax PARAMS ((sh_opcode_info *, sh_operand_info *));
 static char *insert_loop_bounds PARAMS ((char *, sh_operand_info *));
 static unsigned int build_Mytes
   PARAMS ((sh_opcode_info *, sh_operand_info *));
+static boolean sh_local_pcrel PARAMS ((fixS *fix));
 
 #ifdef OBJ_ELF
 static void sh_elf_cons PARAMS ((int));
@@ -3211,6 +3212,22 @@ sh_handle_align (frag)
             BFD_RELOC_SH_ALIGN);
 }
 
+/* See whether the relocation should be resolved locally.  */
+
+static boolean
+sh_local_pcrel (fix)
+     fixS *fix;
+{
+  return (! sh_relax && 
+         (fix->fx_r_type == BFD_RELOC_SH_PCDISP8BY2
+          || fix->fx_r_type == BFD_RELOC_SH_PCDISP12BY2
+          || fix->fx_r_type == BFD_RELOC_SH_PCRELIMM8BY2
+          || fix->fx_r_type == BFD_RELOC_SH_PCRELIMM8BY4
+          || fix->fx_r_type == BFD_RELOC_8_PCREL
+          || fix->fx_r_type == BFD_RELOC_SH_SWITCH16
+          || fix->fx_r_type == BFD_RELOC_SH_SWITCH32));
+}
+
 /* See whether we need to force a relocation into the output file.
    This is used to force out switch and PC relative relocations when
    relaxing.  */
@@ -3221,14 +3238,7 @@ sh_force_relocation (fix)
 {
   /* These relocations can't make it into a DSO, so no use forcing
      them for global symbols.  */
-  if (! sh_relax
-      && (fix->fx_r_type == BFD_RELOC_SH_PCDISP8BY2
-         || fix->fx_r_type == BFD_RELOC_SH_PCDISP12BY2
-         || fix->fx_r_type == BFD_RELOC_SH_PCRELIMM8BY2
-         || fix->fx_r_type == BFD_RELOC_SH_PCRELIMM8BY4
-         || fix->fx_r_type == BFD_RELOC_8_PCREL
-         || fix->fx_r_type == BFD_RELOC_SH_SWITCH16
-         || fix->fx_r_type == BFD_RELOC_SH_SWITCH32))
+  if (sh_local_pcrel (fix))
     return 0;
 
   if (fix->fx_r_type == BFD_RELOC_VTABLE_INHERIT
@@ -3684,10 +3694,9 @@ md_pcrel_from_section (fixP, sec)
      fixS *fixP;
      segT sec;
 {
-  if (fixP->fx_addsy != (symbolS *) NULL
-      && (! S_IS_DEFINED (fixP->fx_addsy)
-         || S_IS_EXTERN (fixP->fx_addsy)
-         || S_IS_WEAK (fixP->fx_addsy)
+  if (! sh_local_pcrel (fixP)
+      && fixP->fx_addsy != (symbolS *) NULL
+      && (S_FORCE_RELOC (fixP->fx_addsy)
          || S_GET_SEGMENT (fixP->fx_addsy) != sec))
     {
       /* The symbol is undefined (or is defined but not in this section,
index 1b625c5..6ba1a19 100644 (file)
@@ -1,3 +1,7 @@
+2002-10-03  Kaz Kojima  <kkojima@rr.iij4u.or.jp>
+
+       * testsuite/gas/sh/pcrel2.d: Check code also.
+
 2002-10-02  Stephen Clarke <stephen.clarke@superh.com>
 
        * gas/sh/sh64/ptc32-noexp-1.d: Adjust for changes to *ABS*
index 9b363af..60a01df 100644 (file)
@@ -1,5 +1,23 @@
 #as: -big
-#objdump: -r
+#objdump: -drj.text
 #name: PC-relative loads
 
 .*:     file format .*sh.*
+
+Disassembly of section \.text:
+
+00000000 <code>:
+   0:  8b 01           bf      6 <foo>
+   2:  d0 02           mov\.l  c <bar>,r0      ! 0x6
+   4:  90 02           mov\.w  c <bar>,r0      ! 0x0
+
+00000006 <foo>:
+   6:  af fe           bra     6 <foo>
+   8:  00 09           nop     
+   a:  00 09           nop     
+
+0000000c <bar>:
+   c:  00 00           .*[     ]*.*
+   e:  00 06           .*[     ]*.*
+  10:  00 0a           .*[     ]*.*
+  12:  0c 00           .*[     ]*.*