This is the mail archive of the binutils@sources.redhat.com mailing list for the binutils project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]
Other format: [Raw text]

Re: [mips patch RFC] removal of gas embedded-pic support code


>At Thu, 29 Apr 2004 02:46:46 +0000 (UTC), "Thiemo Seufer" wrote:
>> I think it is ok.
>
>Thanks for looking it over.
>
>I've checked it in.  I *really* hope it really doesn't break
>anything.  8-)
>
>
>chris

Chris,

woops.  your recent patch seem to have broke building of the compiler on
linux.  The problem occurs when building for libgcc/./_divdi3.o

gas fails with:
Error: operation combines symbols in different segments

as it is trying to assemble this piece of .s code generated from gcc.

        .section        .eh_frame,"aw",@progbits
$Lframe1:
        .4byte  $LECIE1-$LSCIE1
$LSCIE1:
        .4byte  0x0
        .byte   0x1
        .ascii  "zR\000"
        .uleb128 0x1
        .sleb128 4
        .byte   0x1f
        .uleb128 0x1
        .byte   0x1b
        .byte   0xc
        .uleb128 0x1d
        .uleb128 0x0
        .align  2
$LECIE1:
$LSFDE1:
        .4byte  $LEFDE1-$LASFDE1
$LASFDE1:
        .4byte  $LASFDE1-$Lframe1
        .4byte  $LFB42-.		**
        .4byte  $LFE42-$LFB42
        .uleb128 0x0

** $LFB42 is from the text section of divdi3.

I've reverted back the necessary changes to your patch, so that it now
works with the above.

David.



Index: bfd/ChangeLog
===================================================================
RCS file: /cvsroot/gcc/src-cvs/src/bfd/ChangeLog,v
retrieving revision 1.2535
diff -u -r1.2535 ChangeLog
--- bfd/ChangeLog	3 May 2004 14:52:01 -0000	1.2535
+++ bfd/ChangeLog	5 May 2004 17:38:51 -0000
@@ -1,3 +1,15 @@
+2004-05-05  David Ung  <davidu@mips.com>
+
+	* elfxx-mips.c (mips_elf_calculate_relocation): Put back cases for
+	R_MIPS_PC32 and R_MIPS_PC64. 
+
+	* elf32-mips.c: Put back elf_mips_gnu_pcrel64 and
+	elf_mips_gnu_pcrel32. 
+	(bfd_elf32_bfd_reloc_type_lookup): Put back cases for
+	BFD_RELOC_64_PCREL and BFD_RELOC_32_PCREL.
+	(mips_elf32_rtype_to_howto): Put back cases for R_MIPS_PC32 and
+	R_MIPS_PC64. 
+
 2004-05-03  Alan Modra  <amodra@bigpond.net.au>
 
 	* elf.c (_bfd_elf_rela_local_sym): Set kept_section for excluded
Index: bfd/elf32-mips.c
===================================================================
RCS file: /cvsroot/gcc/src-cvs/src/bfd/elf32-mips.c,v
retrieving revision 1.175
diff -u -r1.175 elf32-mips.c
--- bfd/elf32-mips.c	24 Apr 2004 22:07:13 -0000	1.175
+++ bfd/elf32-mips.c	5 May 2004 17:38:51 -0000
@@ -615,6 +615,38 @@
 	 0xffff,		/* dst_mask */
 	 TRUE);			/* pcrel_offset */
 
+/* 64 bit pc-relative.  */
+static reloc_howto_type elf_mips_gnu_pcrel64 =
+  HOWTO (R_MIPS_PC64,		/* type */
+	 0,			/* rightshift */
+	 4,			/* size (0 = byte, 1 = short, 2 = long) */
+	 64,			/* bitsize */
+	 TRUE,			/* pc_relative */
+	 0,			/* bitpos */
+	 complain_overflow_signed, /* complain_on_overflow */
+	 _bfd_mips_elf_generic_reloc, /* special_function */
+	 "R_MIPS_PC64",		/* name */
+	 TRUE,			/* partial_inplace */
+	 MINUS_ONE,		/* src_mask */
+	 MINUS_ONE,		/* dst_mask */
+	 TRUE);			/* pcrel_offset */
+
+/* 32 bit pc-relative.  */
+static reloc_howto_type elf_mips_gnu_pcrel32 =
+  HOWTO (R_MIPS_PC32,		/* type */
+	 0,			/* rightshift */
+	 2,			/* size (0 = byte, 1 = short, 2 = long) */
+	 32,			/* bitsize */
+	 TRUE,			/* pc_relative */
+	 0,			/* bitpos */
+	 complain_overflow_signed, /* complain_on_overflow */
+	 _bfd_mips_elf_generic_reloc, /* special_function */
+	 "R_MIPS_PC32",		/* name */
+	 TRUE,			/* partial_inplace */
+	 0xffffffff,		/* src_mask */
+	 0xffffffff,		/* dst_mask */
+	 TRUE);			/* pcrel_offset */
+
 /* GNU extension to record C++ vtable hierarchy */
 static reloc_howto_type elf_mips_gnu_vtinherit_howto =
   HOWTO (R_MIPS_GNU_VTINHERIT,	/* type */
@@ -1071,6 +1103,10 @@
       return &elf_mips_gnu_vtentry_howto;
     case BFD_RELOC_16_PCREL_S2:
       return &elf_mips_gnu_rel16_s2;
+    case BFD_RELOC_64_PCREL:
+      return &elf_mips_gnu_pcrel64;
+    case BFD_RELOC_32_PCREL:
+      return &elf_mips_gnu_pcrel32;
     }
 }
 
@@ -1092,6 +1128,10 @@
       return &elf_mips_gnu_vtentry_howto;
     case R_MIPS_GNU_REL16_S2:
       return &elf_mips_gnu_rel16_s2;
+    case R_MIPS_PC64:
+      return &elf_mips_gnu_pcrel64;
+    case R_MIPS_PC32:
+      return &elf_mips_gnu_pcrel32;
     default:
       BFD_ASSERT (r_type < (unsigned int) R_MIPS_max);
       return &elf_mips_howto_table_rel[r_type];
Index: bfd/elfxx-mips.c
===================================================================
RCS file: /cvsroot/gcc/src-cvs/src/bfd/elfxx-mips.c,v
retrieving revision 1.100
diff -u -r1.100 elfxx-mips.c
--- bfd/elfxx-mips.c	24 Apr 2004 22:07:13 -0000	1.100
+++ bfd/elfxx-mips.c	5 May 2004 17:38:51 -0000
@@ -3335,6 +3335,12 @@
       value &= howto->dst_mask;
       break;
 
+    case R_MIPS_PC32:
+    case R_MIPS_PC64:
+      value = symbol + addend - p;
+      value &= howto->dst_mask;
+      break;
+
     case R_MIPS_GNU_REL16_S2:
       value = symbol + _bfd_mips_elf_sign_extend (addend, 18) - p;
       overflowed_p = mips_elf_overflow_p (value, 18);
Index: gas/ChangeLog
===================================================================
RCS file: /cvsroot/gcc/src-cvs/src/gas/ChangeLog,v
retrieving revision 1.2114
diff -u -r1.2114 ChangeLog
--- gas/ChangeLog	29 Apr 2004 05:14:20 -0000	1.2114
+++ gas/ChangeLog	5 May 2004 17:38:51 -0000
@@ -1,3 +1,9 @@
+2004-05-05  David Ung  <davidu@mips.com>
+
+	* config/tc-mips.c (md_apply_fix3): Revert last change.
+	(tc_gen_reloc): Put back pc rel handling.
+	* config/tc-mips.h: Defines DIFF_EXPR_OK.
+
 2004-04-28  Chris Demetriou  <cgd@broadcom.com>
 
 	* config/tc-mips.c (HAVE_32BIT_ADDRESSES, append_insn, macro_build)
Index: gas/config/tc-mips.c
===================================================================
RCS file: /cvsroot/gcc/src-cvs/src/gas/config/tc-mips.c,v
retrieving revision 1.263
diff -u -r1.263 tc-mips.c
--- gas/config/tc-mips.c	29 Apr 2004 05:14:21 -0000	1.263
+++ gas/config/tc-mips.c	5 May 2004 17:38:51 -0000
@@ -10861,8 +10861,7 @@
   buf = (bfd_byte *) (fixP->fx_frag->fr_literal + fixP->fx_where);
 
   /* We are not done if this is a composite relocation to set up gp. 
*/
-  assert (! fixP->fx_pcrel);
-  if (fixP->fx_addsy == NULL
+  if (fixP->fx_addsy == NULL && ! fixP->fx_pcrel
       && !(fixP->fx_r_type == BFD_RELOC_MIPS_SUB
 	   || (fixP->fx_r_type == BFD_RELOC_64
 	       && (previous_fx_r_type == BFD_RELOC_GPREL32
@@ -12723,8 +12722,27 @@
   *reloc->sym_ptr_ptr = symbol_get_bfdsym (fixp->fx_addsy);
   reloc->address = fixp->fx_frag->fr_address + fixp->fx_where;
 
-  assert (! fixp->fx_pcrel);
-  reloc->addend = fixp->fx_addnumber;
+  if (fixp->fx_pcrel)
+    {
+      bfd_vma pcrel_address;
+
+      pcrel_address = reloc->address;
+
+      if (OUTPUT_FLAVOR == bfd_target_elf_flavour)
+	{
+	  /* At this point, fx_addnumber is "symbol offset - pcrel_address".
+	     Relocations want only the symbol offset.  */
+	  reloc->addend = fixp->fx_addnumber + pcrel_address;
+	}
+      else
+	{
+	  /* A gruesome hack which is a result of the gruesome gas reloc
+	     handling.  */
+	  reloc->addend = pcrel_address;
+	}
+    }
+  else
+    reloc->addend = fixp->fx_addnumber;
 
   /* Since the old MIPS ELF ABI uses Rel instead of Rela, encode the
vtable
      entry to be used in the relocation's section offset.  */
@@ -12735,6 +12753,34 @@
     }
 
   code = fixp->fx_r_type;
+  if (fixp->fx_pcrel)
+    {
+      switch (code)
+	{
+	case BFD_RELOC_8:
+	  code = BFD_RELOC_8_PCREL;
+	  break;
+	case BFD_RELOC_16:
+	  code = BFD_RELOC_16_PCREL;
+	  break;
+	case BFD_RELOC_32:
+	  code = BFD_RELOC_32_PCREL;
+	  break;
+	case BFD_RELOC_64:
+	  code = BFD_RELOC_64_PCREL;
+	  break;
+	case BFD_RELOC_8_PCREL:
+	case BFD_RELOC_16_PCREL:
+	case BFD_RELOC_32_PCREL:
+	case BFD_RELOC_64_PCREL:
+	case BFD_RELOC_16_PCREL_S2:
+	  break;
+	default:
+	  as_bad_where (fixp->fx_file, fixp->fx_line,
+			_("Cannot make %s relocation PC relative"),
+			bfd_get_reloc_code_name (code));
+	}
+    }
 
   /* To support a PC relative reloc, we used a Cygnus extension.
      We check for that here to make sure that we don't let such a
Index: gas/config/tc-mips.h
===================================================================
RCS file: /cvsroot/gcc/src-cvs/src/gas/config/tc-mips.h,v
retrieving revision 1.35
diff -u -r1.35 tc-mips.h
--- gas/config/tc-mips.h	29 Apr 2004 05:14:22 -0000	1.35
+++ gas/config/tc-mips.h	5 May 2004 17:38:51 -0000
@@ -58,6 +58,10 @@
 
 #define MAX_MEM_FOR_RS_ALIGN_CODE  (1 + 2)
 
+/* We permit PC relative difference expressions when generating
+   embedded PIC code.  */
+#define DIFF_EXPR_OK
+
 /* Tell assembler that we have an itbl_mips.h header file to include. 
*/
 #define HAVE_ITBL_CPU
 
Index: include/elf/ChangeLog
===================================================================
RCS file: /cvsroot/gcc/src-cvs/src/include/elf/ChangeLog,v
retrieving revision 1.205
diff -u -r1.205 ChangeLog
--- include/elf/ChangeLog	24 Apr 2004 22:07:14 -0000	1.205
+++ include/elf/ChangeLog	5 May 2004 17:38:51 -0000
@@ -1,3 +1,7 @@
+2004-05-05  David Ung  <davidu@mips.com>
+
+	* mips.h: Put back R_MIPS_PC32 and R_MIPS_PC64.
+
 2004-04-24  Chris Demetriou  <cgd@broadcom.com>
 
 	* mips.h (R_MIPS_PC32, R_MIPS_PC64, R_MIPS_GNU_REL_LO16)
Index: include/elf/mips.h
===================================================================
RCS file: /cvsroot/gcc/src-cvs/src/include/elf/mips.h,v
retrieving revision 1.22
diff -u -r1.22 mips.h
--- include/elf/mips.h	24 Apr 2004 22:07:14 -0000	1.22
+++ include/elf/mips.h	5 May 2004 17:38:51 -0000
@@ -76,6 +76,8 @@
   /* These relocs are used for the mips16.  */
   RELOC_NUMBER (R_MIPS16_26, 100)
   RELOC_NUMBER (R_MIPS16_GPREL, 101)
+  RELOC_NUMBER (R_MIPS_PC32, 248)
+  RELOC_NUMBER (R_MIPS_PC64, 249)
   /* FIXME: this relocation is used internally by gas.  */
   RELOC_NUMBER (R_MIPS_GNU_REL16_S2, 250)
   /* These are GNU extensions to enable C++ vtable garbage collection. 
*/
Index: rda/lib/gdbserv-state.c
===================================================================
RCS file: /cvsroot/gcc/src-cvs/src/rda/lib/gdbserv-state.c,v
retrieving revision 1.2
diff -u -r1.2 gdbserv-state.c
--- rda/lib/gdbserv-state.c	16 Jan 2003 17:28:33 -0000	1.2
+++ rda/lib/gdbserv-state.c	5 May 2004 17:38:52 -0000
@@ -165,6 +165,7 @@
          same time as it stops itself */
       break;
     default:
+      break;
     }
 }
 



________________________________________________________________________



Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]