public inbox for binutils@sourceware.org
 help / color / mirror / Atom feed
* [patch] new sh relocs
@ 2003-08-15 20:51 DJ Delorie
  2003-08-16  5:19 ` Ian Lance Taylor
  0 siblings, 1 reply; 13+ messages in thread
From: DJ Delorie @ 2003-08-15 20:51 UTC (permalink / raw)
  To: binutils


Renesas has asked us to implement more of the "official" relocations.
Unfortunately, we had some GNU reloc extensions in those numbers, so I
had to move some of them to the reserved slots.  Note that nearly all
reloc values from 1 to 127 are used by SH, so we should expect more of
this type of thing in the future.  They also define bit 7 of the type
to mean something, so in reality, they've used up all the relocations.

I've hooked up the DIR16 and DIR8 relocs so they can be used and
tested with gas, but the rest are effectively untestable at this time
(I assume they're for interlinkability with the SHC compiler).

2003-08-15  DJ Delorie  <dj@redhat.com>

	* sh.h (R_SH_SWITCH8, R_SH_GNU_VTINHERIT, R_SH_GNU_VTENTRY,
	R_SH_LOOP_START,R_SH_LOOP_END): Move to "reserved" spaces.
	(R_SH_DIR16, R_SH_DIR8, R_SH_DIR8UL, R_SH_DIR8UW, R_SH_DIR8U,
	R_SH_DIR8SW, R_SH_DIR8S, R_SH_DIR4UL, R_SH_DIR4UW, R_SH_DIR4U,
	R_SH_PSHA, R_SH_PSHL): New.

2003-08-15  DJ Delorie  <dj@redhat.com>

	* elf32-sh.c (sh_elf_howto_table): R_SH_SWITCH8,
	R_SH_GNU_VTINHERIT, R_SH_GNU_VTENTRY,
	R_SH_LOOP_START,R_SH_LOOP_END moved to "reserved" spaces,
	R_SH_DIR16, R_SH_DIR8, R_SH_DIR8UL, R_SH_DIR8UW, R_SH_DIR8U,
	R_SH_DIR8SW, R_SH_DIR8S, R_SH_DIR4UL, R_SH_DIR4UW, R_SH_DIR4U,
	R_SH_PSHA, R_SH_PSHL added.
	(sh_reloc_map): Add R_SH_DIR16 and R_SH_DIR8.
	(sh_elf_relocate_section): Support new relocs.


Index: include/elf/sh.h
===================================================================
RCS file: /cvs/uberbaum/./include/elf/sh.h,v
retrieving revision 1.14
diff -p -2 -r1.14  include/elf/sh.h
*** include/elf/sh.h	3 Mar 2003 21:03:58 -0000	1.14
--- include/elf/sh.h	15 Aug 2003 20:48:05 -0000
***************
*** 84,89 ****
  
  /* Relocations.  */
! /* Relocations 25ff are GNU extensions.
!    25..33 are used for relaxation and use the same constants as COFF uses.  */
  START_RELOC_NUMBERS (elf_sh_reloc_type)
    RELOC_NUMBER (R_SH_NONE, 0)
--- 84,89 ----
  
  /* Relocations.  */
! /* Relocations 10-32 and 128-255 are GNU extensions.
!    25..32 and 10 are used for relaxation.  */
  START_RELOC_NUMBERS (elf_sh_reloc_type)
    RELOC_NUMBER (R_SH_NONE, 0)
*************** START_RELOC_NUMBERS (elf_sh_reloc_type)
*** 97,101 ****
    RELOC_NUMBER (R_SH_DIR8W, 8)
    RELOC_NUMBER (R_SH_DIR8L, 9)
!   FAKE_RELOC (R_SH_FIRST_INVALID_RELOC, 10)
    FAKE_RELOC (R_SH_LAST_INVALID_RELOC, 24)
    RELOC_NUMBER (R_SH_SWITCH16, 25)
--- 97,106 ----
    RELOC_NUMBER (R_SH_DIR8W, 8)
    RELOC_NUMBER (R_SH_DIR8L, 9)
!   RELOC_NUMBER (R_SH_SWITCH8, 10)
!   RELOC_NUMBER (R_SH_GNU_VTINHERIT, 11)
!   RELOC_NUMBER (R_SH_GNU_VTENTRY, 12)
!   RELOC_NUMBER (R_SH_LOOP_START, 13)
!   RELOC_NUMBER (R_SH_LOOP_END, 14)
!   FAKE_RELOC (R_SH_FIRST_INVALID_RELOC, 15)
    FAKE_RELOC (R_SH_LAST_INVALID_RELOC, 24)
    RELOC_NUMBER (R_SH_SWITCH16, 25)
*************** START_RELOC_NUMBERS (elf_sh_reloc_type)
*** 107,117 ****
    RELOC_NUMBER (R_SH_DATA, 31)
    RELOC_NUMBER (R_SH_LABEL, 32)
!   RELOC_NUMBER (R_SH_SWITCH8, 33)
!   RELOC_NUMBER (R_SH_GNU_VTINHERIT, 34)
!   RELOC_NUMBER (R_SH_GNU_VTENTRY, 35)
!   RELOC_NUMBER (R_SH_LOOP_START, 36)
!   RELOC_NUMBER (R_SH_LOOP_END, 37)
!   FAKE_RELOC (R_SH_FIRST_INVALID_RELOC_2, 38)
!   FAKE_RELOC (R_SH_LAST_INVALID_RELOC_2, 44)
    RELOC_NUMBER (R_SH_DIR5U, 45)
    RELOC_NUMBER (R_SH_DIR6U, 46)
--- 112,127 ----
    RELOC_NUMBER (R_SH_DATA, 31)
    RELOC_NUMBER (R_SH_LABEL, 32)
!   RELOC_NUMBER (R_SH_DIR16, 33)
!   RELOC_NUMBER (R_SH_DIR8, 34)
!   RELOC_NUMBER (R_SH_DIR8UL, 35)
!   RELOC_NUMBER (R_SH_DIR8UW, 36)
!   RELOC_NUMBER (R_SH_DIR8U, 37)
!   RELOC_NUMBER (R_SH_DIR8SW, 38)
!   RELOC_NUMBER (R_SH_DIR8S, 39)
!   RELOC_NUMBER (R_SH_DIR4UL, 40)
!   RELOC_NUMBER (R_SH_DIR4UW, 41)
!   RELOC_NUMBER (R_SH_DIR4U, 42)
!   RELOC_NUMBER (R_SH_PSHA, 43)
!   RELOC_NUMBER (R_SH_PSHL, 44)
    RELOC_NUMBER (R_SH_DIR5U, 45)
    RELOC_NUMBER (R_SH_DIR6U, 46)
*************** START_RELOC_NUMBERS (elf_sh_reloc_type)
*** 121,125 ****
    RELOC_NUMBER (R_SH_DIR10SL, 50)
    RELOC_NUMBER (R_SH_DIR10SQ, 51)
!   FAKE_RELOC (R_SH_FIRST_INVALID_RELOC_3, 52)
    FAKE_RELOC (R_SH_LAST_INVALID_RELOC_3, 143)
    RELOC_NUMBER (R_SH_TLS_GD_32, 144)
--- 131,138 ----
    RELOC_NUMBER (R_SH_DIR10SL, 50)
    RELOC_NUMBER (R_SH_DIR10SQ, 51)
!   FAKE_RELOC (R_SH_FIRST_INVALID_RELOC_2, 52)
!   FAKE_RELOC (R_SH_LAST_INVALID_RELOC_2, 52)
!   RELOC_NUMBER (R_SH_DIR16S, 53)
!   FAKE_RELOC (R_SH_FIRST_INVALID_RELOC_3, 54)
    FAKE_RELOC (R_SH_LAST_INVALID_RELOC_3, 143)
    RELOC_NUMBER (R_SH_TLS_GD_32, 144)
Index: bfd/elf32-sh.c
===================================================================
RCS file: /cvs/uberbaum/./bfd/elf32-sh.c,v
retrieving revision 1.90
diff -p -2 -r1.90  bfd/elf32-sh.c
*** bfd/elf32-sh.c	11 Aug 2003 14:26:10 -0000	1.90
--- bfd/elf32-sh.c	15 Aug 2003 20:48:06 -0000
*************** static reloc_howto_type sh_elf_howto_tab
*** 277,285 ****
  	 TRUE),			/* pcrel_offset */
  
!   EMPTY_HOWTO (10),
!   EMPTY_HOWTO (11),
!   EMPTY_HOWTO (12),
!   EMPTY_HOWTO (13),
!   EMPTY_HOWTO (14),
    EMPTY_HOWTO (15),
    EMPTY_HOWTO (16),
--- 277,357 ----
  	 TRUE),			/* pcrel_offset */
  
!   /* An 8 bit switch table entry.  This is generated for an expression
!      such as ``.word L1 - L2''.  The offset holds the difference
!      between the reloc address and L2.  */
!   HOWTO (R_SH_SWITCH8,		/* type */
! 	 0,			/* rightshift */
! 	 0,			/* size (0 = byte, 1 = short, 2 = long) */
! 	 8,			/* bitsize */
! 	 FALSE,			/* pc_relative */
! 	 0,			/* bitpos */
! 	 complain_overflow_unsigned, /* complain_on_overflow */
! 	 sh_elf_ignore_reloc,	/* special_function */
! 	 "R_SH_SWITCH8",	/* name */
! 	 FALSE,			/* partial_inplace */
! 	 0,			/* src_mask */
! 	 0,			/* dst_mask */
! 	 TRUE),			/* pcrel_offset */
! 
!   /* GNU extension to record C++ vtable hierarchy */
!   HOWTO (R_SH_GNU_VTINHERIT, /* type */
! 	 0,			/* rightshift */
! 	 2,			/* size (0 = byte, 1 = short, 2 = long) */
! 	 0,			/* bitsize */
! 	 FALSE,			/* pc_relative */
! 	 0,			/* bitpos */
! 	 complain_overflow_dont, /* complain_on_overflow */
! 	 NULL,			/* special_function */
! 	 "R_SH_GNU_VTINHERIT", /* name */
! 	 FALSE,			/* partial_inplace */
! 	 0,			/* src_mask */
! 	 0,			/* dst_mask */
! 	 FALSE),		/* pcrel_offset */
! 
!   /* GNU extension to record C++ vtable member usage */
!   HOWTO (R_SH_GNU_VTENTRY,     /* type */
! 	 0,			/* rightshift */
! 	 2,			/* size (0 = byte, 1 = short, 2 = long) */
! 	 0,			/* bitsize */
! 	 FALSE,			/* pc_relative */
! 	 0,			/* bitpos */
! 	 complain_overflow_dont, /* complain_on_overflow */
! 	 _bfd_elf_rel_vtable_reloc_fn,	/* special_function */
! 	 "R_SH_GNU_VTENTRY",   /* name */
! 	 FALSE,			/* partial_inplace */
! 	 0,			/* src_mask */
! 	 0,			/* dst_mask */
! 	 FALSE),		/* pcrel_offset */
! 
!   /* 8 bit PC relative divided by 2 - but specified in a very odd way.  */
!   HOWTO (R_SH_LOOP_START,	/* type */
! 	 1,			/* rightshift */
! 	 1,			/* size (0 = byte, 1 = short, 2 = long) */
! 	 8,			/* bitsize */
! 	 FALSE,			/* pc_relative */
! 	 0,			/* bitpos */
! 	 complain_overflow_signed, /* complain_on_overflow */
! 	 sh_elf_ignore_reloc,	/* special_function */
! 	 "R_SH_LOOP_START",	/* name */
! 	 TRUE,			/* partial_inplace */
! 	 0xff,			/* src_mask */
! 	 0xff,			/* dst_mask */
! 	 TRUE),			/* pcrel_offset */
! 
!   /* 8 bit PC relative divided by 2 - but specified in a very odd way.  */
!   HOWTO (R_SH_LOOP_END,		/* type */
! 	 1,			/* rightshift */
! 	 1,			/* size (0 = byte, 1 = short, 2 = long) */
! 	 8,			/* bitsize */
! 	 FALSE,			/* pc_relative */
! 	 0,			/* bitpos */
! 	 complain_overflow_signed, /* complain_on_overflow */
! 	 sh_elf_ignore_reloc,	/* special_function */
! 	 "R_SH_LOOP_END",	/* name */
! 	 TRUE,			/* partial_inplace */
! 	 0xff,			/* src_mask */
! 	 0xff,			/* dst_mask */
! 	 TRUE),			/* pcrel_offset */
! 
    EMPTY_HOWTO (15),
    EMPTY_HOWTO (16),
*************** static reloc_howto_type sh_elf_howto_tab
*** 435,443 ****
  	 TRUE),			/* pcrel_offset */
  
!   /* An 8 bit switch table entry.  This is generated for an expression
!      such as ``.word L1 - L2''.  The offset holds the difference
!      between the reloc address and L2.  */
!   HOWTO (R_SH_SWITCH8,		/* type */
  	 0,			/* rightshift */
  	 0,			/* size (0 = byte, 1 = short, 2 = long) */
  	 8,			/* bitsize */
--- 507,541 ----
  	 TRUE),			/* pcrel_offset */
  
!   /* The next 12 are only supported via linking in SHC-generated objects.  */
!   HOWTO (R_SH_DIR16,		/* type */
  	 0,			/* rightshift */
+ 	 1,			/* size (0 = byte, 1 = short, 2 = long) */
+ 	 16,			/* bitsize */
+ 	 FALSE,			/* pc_relative */
+ 	 0,			/* bitpos */
+ 	 complain_overflow_dont, /* complain_on_overflow */
+ 	 bfd_elf_generic_reloc,	/* special_function */
+ 	 "R_SH_DIR16",		/* name */
+ 	 FALSE,			/* partial_inplace */
+ 	 0,			/* src_mask */
+ 	 0xffff,		/* dst_mask */
+ 	 FALSE),		/* pcrel_offset */
+ 
+   HOWTO (R_SH_DIR8,		/* type */
+ 	 0,			/* rightshift */
+ 	 0,			/* size (0 = byte, 1 = short, 2 = long) */
+ 	 8,			/* bitsize */
+ 	 FALSE,			/* pc_relative */
+ 	 0,			/* bitpos */
+ 	 complain_overflow_dont, /* complain_on_overflow */
+ 	 bfd_elf_generic_reloc,	/* special_function */
+ 	 "R_SH_DIR8",		/* name */
+ 	 FALSE,			/* partial_inplace */
+ 	 0,			/* src_mask */
+ 	 0xff,			/* dst_mask */
+ 	 FALSE),		/* pcrel_offset */
+ 
+   HOWTO (R_SH_DIR8UL,		/* type */
+ 	 2,			/* rightshift */
  	 0,			/* size (0 = byte, 1 = short, 2 = long) */
  	 8,			/* bitsize */
*************** static reloc_howto_type sh_elf_howto_tab
*** 445,522 ****
  	 0,			/* bitpos */
  	 complain_overflow_unsigned, /* complain_on_overflow */
! 	 sh_elf_ignore_reloc,	/* special_function */
! 	 "R_SH_SWITCH8",	/* name */
  	 FALSE,			/* partial_inplace */
  	 0,			/* src_mask */
! 	 0,			/* dst_mask */
! 	 TRUE),			/* pcrel_offset */
  
!   /* GNU extension to record C++ vtable hierarchy */
!   HOWTO (R_SH_GNU_VTINHERIT, /* type */
! 	 0,			/* rightshift */
! 	 2,			/* size (0 = byte, 1 = short, 2 = long) */
! 	 0,			/* bitsize */
  	 FALSE,			/* pc_relative */
  	 0,			/* bitpos */
! 	 complain_overflow_dont, /* complain_on_overflow */
! 	 NULL,			/* special_function */
! 	 "R_SH_GNU_VTINHERIT", /* name */
  	 FALSE,			/* partial_inplace */
  	 0,			/* src_mask */
! 	 0,			/* dst_mask */
  	 FALSE),		/* pcrel_offset */
  
!   /* GNU extension to record C++ vtable member usage */
!   HOWTO (R_SH_GNU_VTENTRY,     /* type */
  	 0,			/* rightshift */
! 	 2,			/* size (0 = byte, 1 = short, 2 = long) */
! 	 0,			/* bitsize */
  	 FALSE,			/* pc_relative */
  	 0,			/* bitpos */
! 	 complain_overflow_dont, /* complain_on_overflow */
! 	 _bfd_elf_rel_vtable_reloc_fn,	/* special_function */
! 	 "R_SH_GNU_VTENTRY",   /* name */
  	 FALSE,			/* partial_inplace */
  	 0,			/* src_mask */
! 	 0,			/* dst_mask */
  	 FALSE),		/* pcrel_offset */
  
!   /* 8 bit PC relative divided by 2 - but specified in a very odd way.  */
!   HOWTO (R_SH_LOOP_START,	/* type */
  	 1,			/* rightshift */
! 	 1,			/* size (0 = byte, 1 = short, 2 = long) */
  	 8,			/* bitsize */
  	 FALSE,			/* pc_relative */
  	 0,			/* bitpos */
  	 complain_overflow_signed, /* complain_on_overflow */
! 	 sh_elf_ignore_reloc,	/* special_function */
! 	 "R_SH_LOOP_START",	/* name */
! 	 TRUE,			/* partial_inplace */
! 	 0xff,			/* src_mask */
  	 0xff,			/* dst_mask */
! 	 TRUE),			/* pcrel_offset */
  
!   /* 8 bit PC relative divided by 2 - but specified in a very odd way.  */
!   HOWTO (R_SH_LOOP_END,		/* type */
! 	 1,			/* rightshift */
! 	 1,			/* size (0 = byte, 1 = short, 2 = long) */
  	 8,			/* bitsize */
  	 FALSE,			/* pc_relative */
  	 0,			/* bitpos */
  	 complain_overflow_signed, /* complain_on_overflow */
! 	 sh_elf_ignore_reloc,	/* special_function */
! 	 "R_SH_LOOP_END",	/* name */
! 	 TRUE,			/* partial_inplace */
! 	 0xff,			/* src_mask */
  	 0xff,			/* dst_mask */
! 	 TRUE),			/* pcrel_offset */
  
!   EMPTY_HOWTO (38),
!   EMPTY_HOWTO (39),
!   EMPTY_HOWTO (40),
!   EMPTY_HOWTO (41),
!   EMPTY_HOWTO (42),
!   EMPTY_HOWTO (43),
!   EMPTY_HOWTO (44),
  
  #ifdef INCLUDE_SHMEDIA
--- 543,678 ----
  	 0,			/* bitpos */
  	 complain_overflow_unsigned, /* complain_on_overflow */
! 	 bfd_elf_generic_reloc,	/* special_function */
! 	 "R_SH_DIR8UL",		/* name */
  	 FALSE,			/* partial_inplace */
  	 0,			/* src_mask */
! 	 0xff,			/* dst_mask */
! 	 FALSE),		/* pcrel_offset */
  
!   HOWTO (R_SH_DIR8UW,		/* type */
! 	 1,			/* rightshift */
! 	 0,			/* size (0 = byte, 1 = short, 2 = long) */
! 	 8,			/* bitsize */
  	 FALSE,			/* pc_relative */
  	 0,			/* bitpos */
! 	 complain_overflow_unsigned, /* complain_on_overflow */
! 	 bfd_elf_generic_reloc,	/* special_function */
! 	 "R_SH_DIR8UW",		/* name */
  	 FALSE,			/* partial_inplace */
  	 0,			/* src_mask */
! 	 0xff,			/* dst_mask */
  	 FALSE),		/* pcrel_offset */
  
!   HOWTO (R_SH_DIR8U,		/* type */
  	 0,			/* rightshift */
! 	 0,			/* size (0 = byte, 1 = short, 2 = long) */
! 	 8,			/* bitsize */
  	 FALSE,			/* pc_relative */
  	 0,			/* bitpos */
! 	 complain_overflow_unsigned, /* complain_on_overflow */
! 	 bfd_elf_generic_reloc,	/* special_function */
! 	 "R_SH_DIR8U",		/* name */
  	 FALSE,			/* partial_inplace */
  	 0,			/* src_mask */
! 	 0xff,			/* dst_mask */
  	 FALSE),		/* pcrel_offset */
  
!   HOWTO (R_SH_DIR8SW,		/* type */
  	 1,			/* rightshift */
! 	 0,			/* size (0 = byte, 1 = short, 2 = long) */
  	 8,			/* bitsize */
  	 FALSE,			/* pc_relative */
  	 0,			/* bitpos */
  	 complain_overflow_signed, /* complain_on_overflow */
! 	 bfd_elf_generic_reloc,	/* special_function */
! 	 "R_SH_DIR8SW",		/* name */
! 	 FALSE,			/* partial_inplace */
! 	 0,			/* src_mask */
  	 0xff,			/* dst_mask */
! 	 FALSE),		/* pcrel_offset */
  
!   HOWTO (R_SH_DIR8S,		/* type */
! 	 0,			/* rightshift */
! 	 0,			/* size (0 = byte, 1 = short, 2 = long) */
  	 8,			/* bitsize */
  	 FALSE,			/* pc_relative */
  	 0,			/* bitpos */
  	 complain_overflow_signed, /* complain_on_overflow */
! 	 bfd_elf_generic_reloc,	/* special_function */
! 	 "R_SH_DIR8S",		/* name */
! 	 FALSE,			/* partial_inplace */
! 	 0,			/* src_mask */
  	 0xff,			/* dst_mask */
! 	 FALSE),		/* pcrel_offset */
! 
!   HOWTO (R_SH_DIR4UL,		/* type */
! 	 2,			/* rightshift */
! 	 0,			/* size (0 = byte, 1 = short, 2 = long) */
! 	 4,			/* bitsize */
! 	 FALSE,			/* pc_relative */
! 	 0,			/* bitpos */
! 	 complain_overflow_unsigned, /* complain_on_overflow */
! 	 bfd_elf_generic_reloc,	/* special_function */
! 	 "R_SH_DIR4UL",		/* name */
! 	 FALSE,			/* partial_inplace */
! 	 0,			/* src_mask */
! 	 0x0f,			/* dst_mask */
! 	 FALSE),		/* pcrel_offset */
! 
!   HOWTO (R_SH_DIR4UW,		/* type */
! 	 1,			/* rightshift */
! 	 0,			/* size (0 = byte, 1 = short, 2 = long) */
! 	 4,			/* bitsize */
! 	 FALSE,			/* pc_relative */
! 	 0,			/* bitpos */
! 	 complain_overflow_unsigned, /* complain_on_overflow */
! 	 bfd_elf_generic_reloc,	/* special_function */
! 	 "R_SH_DIR4UW",		/* name */
! 	 FALSE,			/* partial_inplace */
! 	 0,			/* src_mask */
! 	 0x0f,			/* dst_mask */
! 	 FALSE),		/* pcrel_offset */
! 
!   HOWTO (R_SH_DIR4U,		/* type */
! 	 0,			/* rightshift */
! 	 0,			/* size (0 = byte, 1 = short, 2 = long) */
! 	 4,			/* bitsize */
! 	 FALSE,			/* pc_relative */
! 	 0,			/* bitpos */
! 	 complain_overflow_unsigned, /* complain_on_overflow */
! 	 bfd_elf_generic_reloc,	/* special_function */
! 	 "R_SH_DIR4U",		/* name */
! 	 FALSE,			/* partial_inplace */
! 	 0,			/* src_mask */
! 	 0x0f,			/* dst_mask */
! 	 FALSE),		/* pcrel_offset */
! 
!   HOWTO (R_SH_PSHA,		/* type */
! 	 0,			/* rightshift */
! 	 1,			/* size (0 = byte, 1 = short, 2 = long) */
! 	 7,			/* bitsize */
! 	 FALSE,			/* pc_relative */
! 	 4,			/* bitpos */
! 	 complain_overflow_signed, /* complain_on_overflow */
! 	 bfd_elf_generic_reloc,	/* special_function */
! 	 "R_SH_PSHA",		/* name */
! 	 FALSE,			/* partial_inplace */
! 	 0,			/* src_mask */
! 	 0x0f,			/* dst_mask */
! 	 FALSE),		/* pcrel_offset */
  
!   HOWTO (R_SH_PSHL,		/* type */
! 	 0,			/* rightshift */
! 	 1,			/* size (0 = byte, 1 = short, 2 = long) */
! 	 7,			/* bitsize */
! 	 FALSE,			/* pc_relative */
! 	 4,			/* bitpos */
! 	 complain_overflow_signed, /* complain_on_overflow */
! 	 bfd_elf_generic_reloc,	/* special_function */
! 	 "R_SH_PSHL",		/* name */
! 	 FALSE,			/* partial_inplace */
! 	 0,			/* src_mask */
! 	 0x0f,			/* dst_mask */
! 	 FALSE),		/* pcrel_offset */
  
  #ifdef INCLUDE_SHMEDIA
*************** static reloc_howto_type sh_elf_howto_tab
*** 637,641 ****
  
    EMPTY_HOWTO (52),
!   EMPTY_HOWTO (53),
    EMPTY_HOWTO (54),
    EMPTY_HOWTO (55),
--- 793,811 ----
  
    EMPTY_HOWTO (52),
! 
!   HOWTO (R_SH_DIR16S,		/* type */
! 	 0,			/* rightshift */
! 	 1,			/* size (0 = byte, 1 = short, 2 = long) */
! 	 16,			/* bitsize */
! 	 FALSE,			/* pc_relative */
! 	 0,			/* bitpos */
! 	 complain_overflow_signed, /* complain_on_overflow */
! 	 bfd_elf_generic_reloc,	/* special_function */
! 	 "R_SH_DIR16S",		/* name */
! 	 FALSE,			/* partial_inplace */
! 	 0,			/* src_mask */
! 	 0xffff,		/* dst_mask */
! 	 FALSE),		/* pcrel_offset */
! 
    EMPTY_HOWTO (54),
    EMPTY_HOWTO (55),
*************** static const struct elf_reloc_map sh_rel
*** 1862,1865 ****
--- 2032,2037 ----
    { BFD_RELOC_NONE, R_SH_NONE },
    { BFD_RELOC_32, R_SH_DIR32 },
+   { BFD_RELOC_16, R_SH_DIR16 },
+   { BFD_RELOC_8, R_SH_DIR8 },
    { BFD_RELOC_CTOR, R_SH_DIR32 },
    { BFD_RELOC_32_PCREL, R_SH_REL32 },
*************** sh_elf_relocate_section (bfd *output_bfd
*** 4547,4552 ****
        /* Many of the relocs are only used for relaxing, and are
  	 handled entirely by the relaxation code.  */
!       if (r_type > (int) R_SH_LAST_INVALID_RELOC
! 	  && r_type < (int) R_SH_LOOP_START)
  	continue;
        if (r_type == (int) R_SH_NONE)
--- 4719,4727 ----
        /* Many of the relocs are only used for relaxing, and are
  	 handled entirely by the relaxation code.  */
!       if (r_type >= (int) R_SH_SWITCH16
! 	  && r_type <= (int) R_SH_LABEL)
! 	continue;
!       if (r_type >= (int) R_SH_SWITCH8
! 	  && r_type <= (int) R_SH_GNU_VTINHERIT)
  	continue;
        if (r_type == (int) R_SH_NONE)
*************** sh_elf_relocate_section (bfd *output_bfd
*** 4840,4843 ****
--- 5015,5082 ----
  	  bfd_set_error (bfd_error_bad_value);
  	  return FALSE;
+ 
+ 	case R_SH_DIR16:
+ 	case R_SH_DIR8:
+ 	case R_SH_DIR8U:
+ 	case R_SH_DIR8S:
+ 	case R_SH_DIR4U:
+ 	  goto final_link_relocate;
+ 
+ 	case R_SH_DIR8UL:
+ 	case R_SH_DIR4UL:
+ 	  if (relocation & 3)
+ 	    {
+ 	      ((*_bfd_error_handler)
+ 	       (_("%s: 0x%lx: fatal: unaligned %s relocation 0x%lx"),
+ 		bfd_archive_filename (input_section->owner),
+ 		(unsigned long) rel->r_offset, howto->name, 
+ 		(unsigned long)relocation));
+ 	      bfd_set_error (bfd_error_bad_value);
+ 	      return FALSE;
+ 	    }
+ 	  goto final_link_relocate;
+ 
+ 	case R_SH_DIR8UW:
+ 	case R_SH_DIR8SW:
+ 	case R_SH_DIR4UW:
+ 	  if (relocation & 1)
+ 	    {
+ 	      ((*_bfd_error_handler)
+ 	       (_("%s: 0x%lx: fatal: unaligned %s relocation 0x%lx"),
+ 		bfd_archive_filename (input_section->owner),
+ 		(unsigned long) rel->r_offset, howto->name, 
+ 		(unsigned long)relocation));
+ 	      bfd_set_error (bfd_error_bad_value);
+ 	      return FALSE;
+ 	    }
+ 	  goto final_link_relocate;
+ 
+ 	case R_SH_PSHA:
+ 	  if ((signed int)relocation < -32
+ 	      || (signed int)relocation > 32)
+ 	    {
+ 	      ((*_bfd_error_handler)
+ 	       (_("%s: 0x%lx: fatal: R_SH_PSHA relocation %d not in range -32..32"),
+ 		bfd_archive_filename (input_section->owner),
+ 		(unsigned long) rel->r_offset,
+ 		(unsigned long)relocation));
+ 	      bfd_set_error (bfd_error_bad_value);
+ 	      return FALSE;
+ 	    }
+ 	  goto final_link_relocate;
+ 
+ 	case R_SH_PSHL:
+ 	  if ((signed int)relocation < -16
+ 	      || (signed int)relocation > 16)
+ 	    {
+ 	      ((*_bfd_error_handler)
+ 	       (_("%s: 0x%lx: fatal: R_SH_PSHL relocation %d not in range -32..32"),
+ 		bfd_archive_filename (input_section->owner),
+ 		(unsigned long) rel->r_offset,
+ 		(unsigned long)relocation));
+ 	      bfd_set_error (bfd_error_bad_value);
+ 	      return FALSE;
+ 	    }
+ 	  goto final_link_relocate;
  
  	case R_SH_DIR32:

^ permalink raw reply	[flat|nested] 13+ messages in thread

end of thread, other threads:[~2003-09-24  2:28 UTC | newest]

Thread overview: 13+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2003-08-15 20:51 [patch] new sh relocs DJ Delorie
2003-08-16  5:19 ` Ian Lance Taylor
2003-08-16 13:38   ` DJ Delorie
2003-08-16 13:55     ` Alan Modra
2003-08-16 14:04       ` DJ Delorie
2003-08-16 15:21         ` Alexandre Oliva
2003-08-16 15:21       ` Alexandre Oliva
2003-08-25 18:37         ` DJ Delorie
2003-09-06  0:07         ` DJ Delorie
2003-09-06  6:59           ` Nick Clifton
2003-09-10  7:56           ` Alexandre Oliva
2003-09-10 16:45             ` DJ Delorie
2003-09-24  2:28             ` DJ Delorie

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).