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]

New Sanyo Stormy16 relocations


We added 2 relocations to the stormy16 port that haven't been submitted
yet. This is the patch which implements them. 

We're providing 16 bit HI and LO offsets which get used like this:


        mov.w rx,#@hi(label)
        mov.w rx,#@lo(label)


Sanyo has been happy with the patch for a number of months now.

Is this OK? I don't have write permission, so someone else will have to
check it in.

Thanks

Andrew


	* bfd/elf32-xstormy16.c (xstormy16_elf_howto): Add R_XSTORMY16_LO16
	and R_XSTORMY16_HI16) howto entries.
	(xstormy16_reloc_map): Map R_XSTORMY16_{LO,HI}16 to BFD_RELOC_{LO,HI}16.
	(xstormy16_info_to_howto_rela): Use R_XSTORMY16_GNU_VTINHERIT to 
	determine the start of the second reloc table.
	* cgen/cpu/xstormy16.cpu (imm16): Call handler immediate16.
	* cgen/cpu/xstormy16.opc (parse_small_immediate): Return on '@'.
	(parse_immediate16): Handle immediate16 values, which now include
	@hi(label) and @lo(label)
	* gas/config/tc-xstormy16.c (md_cgen_lookup_reloc): If a relocation 
	has already been set up, use it.
	* include/elf/xstormy16.h (START_RELOC_NUMBERS) Add relocation numbers
	for R_XSTORMY16_LO16 and R_XSTORMY16_HI16.


Index: cgen/cpu/xstormy16.cpu
===================================================================
RCS file: /cvs/src/src/cgen/cpu/xstormy16.cpu,v
retrieving revision 1.4
diff -c -p -r1.4 xstormy16.cpu
*** cgen/cpu/xstormy16.cpu	25 Nov 2002 21:14:16 -0000	1.4
--- cgen/cpu/xstormy16.cpu	4 Dec 2002 22:33:48 -0000
***************
*** 268,274 ****
  (dnop imm12 "12 bit signed immediate" () h-sint f-imm12)
  
  (dnf f-imm16 "16 bit" (SIGN-OPT) 16 16)
! (dnop imm16 "16 bit immediate" () h-uint f-imm16)
  
  (dnf f-lmem8  "8 bit unsigned low memory" (ABS-ADDR) 8 8)
  (define-operand 
--- 268,281 ----
  (dnop imm12 "12 bit signed immediate" () h-sint f-imm12)
  
  (dnf f-imm16 "16 bit" (SIGN-OPT) 16 16)
! (define-operand
!   (name imm16)
!   (comment "16 bit immediate")
!   (attrs)
!   (type h-uint)
!   (index f-imm16) 
!   (handlers (parse "immediate16"))
! )
  
  (dnf f-lmem8  "8 bit unsigned low memory" (ABS-ADDR) 8 8)
  (define-operand 
Index: cgen/cpu/xstormy16.opc
===================================================================
RCS file: /cvs/src/src/cgen/cpu/xstormy16.opc,v
retrieving revision 1.2
diff -c -p -r1.2 xstormy16.opc
*** cgen/cpu/xstormy16.opc	2 Dec 2002 21:53:53 -0000	1.2
--- cgen/cpu/xstormy16.opc	4 Dec 2002 22:33:48 -0000
*************** parse_small_immediate (cd, strp, opindex
*** 91,96 ****
--- 91,99 ----
    enum cgen_parse_operand_result result;
    const char *errmsg;
  
+   if (**strp == '@')
+     return _("No relocation for small immediate");
+ 
    errmsg = (* cd->parse_operand_fn)
      (cd, CGEN_PARSE_OPERAND_INTEGER, strp, opindex, BFD_RELOC_NONE,
       &result, &value);
*************** parse_small_immediate (cd, strp, opindex
*** 103,107 ****
--- 106,158 ----
  
    *valuep = value;
    return NULL;
+ }
+ 
+ /* Literal scan be either a normal literal, a @hi() or @lo relocation. */
+    
+ static const char *
+ parse_immediate16 (cd, strp, opindex, valuep)
+      CGEN_CPU_DESC cd;
+      const char **strp;
+      int opindex;
+      unsigned long *valuep;
+ {
+   const char *errmsg;
+   enum cgen_parse_operand_result result;
+   bfd_reloc_code_real_type code = BFD_RELOC_NONE;
+   bfd_vma value;
+ 
+   if (strncmp (*strp, "@hi(", 4) == 0)
+     {
+       *strp += 4;
+       code = BFD_RELOC_HI16;
+     }
+   else
+   if (strncmp (*strp, "@lo(", 4) == 0)
+     {
+       *strp += 4;
+       code = BFD_RELOC_LO16;
+     }
+ 
+   if (code == BFD_RELOC_NONE)
+     errmsg = cgen_parse_unsigned_integer (cd, strp, opindex, valuep);
+   else
+     {
+       errmsg = cgen_parse_address (cd, strp, opindex, code, &result, &value);
+       if ((errmsg == NULL) &&
+ 	  (result != CGEN_PARSE_OPERAND_RESULT_QUEUED))
+ 	errmsg = _("Operand is not a symbol");
+ 
+       *valuep = value;
+       if ((code == BFD_RELOC_HI16 || code == BFD_RELOC_LO16)
+ 	  && **strp == ')')        
+ 	*strp += 1;
+       else
+         {
+ 	  errmsg = _("Syntax error: No trailing ')'");
+ 	  return errmsg;
+ 	}
+     }
+   return errmsg;
  }
  /* -- */
Index: include/elf/xstormy16.h
===================================================================
RCS file: /cvs/src/src/include/elf/xstormy16.h,v
retrieving revision 1.1
diff -c -p -r1.1 xstormy16.h
*** include/elf/xstormy16.h	8 Dec 2001 03:46:03 -0000	1.1
--- include/elf/xstormy16.h	4 Dec 2002 22:33:48 -0000
*************** START_RELOC_NUMBERS (elf_xstormy16_reloc
*** 37,42 ****
--- 37,45 ----
    RELOC_NUMBER (R_XSTORMY16_24, 8)
    RELOC_NUMBER (R_XSTORMY16_FPTR16, 9)
  
+   RELOC_NUMBER (R_XSTORMY16_LO16, 10)
+   RELOC_NUMBER (R_XSTORMY16_HI16, 11)
+ 
    RELOC_NUMBER (R_XSTORMY16_GNU_VTINHERIT, 128)
    RELOC_NUMBER (R_XSTORMY16_GNU_VTENTRY, 129)
  END_RELOC_NUMBERS (R_XSTORMY16_max)
Index: bfd/elf32-xstormy16.c
===================================================================
RCS file: /cvs/src/src/bfd/elf32-xstormy16.c,v
retrieving revision 1.13
diff -c -p -r1.13 elf32-xstormy16.c
*** bfd/elf32-xstormy16.c	30 Nov 2002 08:39:38 -0000	1.13
--- bfd/elf32-xstormy16.c	4 Dec 2002 22:33:49 -0000
*************** static reloc_howto_type xstormy16_elf_ho
*** 208,213 ****
--- 208,243 ----
  	 0,			/* src_mask */
  	 0xffffffff,		/* dst_mask */
  	 FALSE),		/* pcrel_offset */
+ 
+   /* Low order 16 bit value of a high memory address.  */
+   HOWTO (R_XSTORMY16_LO16,	/* 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_XSTORMY16_LO16",	/* name */
+ 	 FALSE,			/* partial_inplace */
+ 	 0,			/* src_mask */
+ 	 0xffffffff,		/* dst_mask */
+ 	 FALSE),		/* pcrel_offset */
+ 
+   /* High order 16 bit value of a high memory address.  */
+   HOWTO (R_XSTORMY16_HI16,	/* type */
+ 	 16,			/* 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_XSTORMY16_HI16",	/* name */
+ 	 FALSE,			/* partial_inplace */
+ 	 0,			/* src_mask */
+ 	 0xffffffff,		/* dst_mask */
+ 	 FALSE),		/* pcrel_offset */
  };
  
  static reloc_howto_type xstormy16_elf_howto_table2 [] =
*************** static const reloc_map xstormy16_reloc_m
*** 265,270 ****
--- 295,302 ----
    { BFD_RELOC_XSTORMY16_REL_12,     R_XSTORMY16_REL_12,        xstormy16_elf_howto_table },
    { BFD_RELOC_XSTORMY16_24,	    R_XSTORMY16_24,            xstormy16_elf_howto_table },
    { BFD_RELOC_XSTORMY16_FPTR16,	    R_XSTORMY16_FPTR16,        xstormy16_elf_howto_table },
+   { BFD_RELOC_LO16,                 R_XSTORMY16_LO16,          xstormy16_elf_howto_table },
+   { BFD_RELOC_HI16,                 R_XSTORMY16_HI16,          xstormy16_elf_howto_table },
    { BFD_RELOC_VTABLE_INHERIT,       R_XSTORMY16_GNU_VTINHERIT, xstormy16_elf_howto_table2 },
    { BFD_RELOC_VTABLE_ENTRY,         R_XSTORMY16_GNU_VTENTRY,   xstormy16_elf_howto_table2 },
  };
*************** xstormy16_info_to_howto_rela (abfd, cach
*** 300,306 ****
  {
    unsigned int r_type = ELF32_R_TYPE (dst->r_info);
  
!   if (r_type <= (unsigned int) R_XSTORMY16_FPTR16)
      cache_ptr->howto = &xstormy16_elf_howto_table [r_type];
    else if (r_type - R_XSTORMY16_GNU_VTINHERIT
  	   <= (unsigned int) R_XSTORMY16_GNU_VTENTRY)
--- 332,338 ----
  {
    unsigned int r_type = ELF32_R_TYPE (dst->r_info);
  
!   if (r_type <= (unsigned int) R_XSTORMY16_HI16)
      cache_ptr->howto = &xstormy16_elf_howto_table [r_type];
    else if (r_type - R_XSTORMY16_GNU_VTINHERIT
  	   <= (unsigned int) R_XSTORMY16_GNU_VTENTRY)
Index: gas/config/tc-xstormy16.c
===================================================================
RCS file: /cvs/src/src/gas/config/tc-xstormy16.c,v
retrieving revision 1.5
diff -c -p -r1.5 tc-xstormy16.c
*** gas/config/tc-xstormy16.c	30 Nov 2002 08:39:44 -0000	1.5
--- gas/config/tc-xstormy16.c	4 Dec 2002 22:33:50 -0000
*************** md_cgen_lookup_reloc (insn, operand, fix
*** 340,346 ****
--- 340,349 ----
        return fixP->fx_pcrel ? BFD_RELOC_8_PCREL : BFD_RELOC_8;
  
      case XSTORMY16_OPERAND_IMM16:
+       /* This might have been processed at parse time.  */
        fixP->fx_where += 2;
+       if (fixP->fx_cgen.opinfo && fixP->fx_cgen.opinfo != BFD_RELOC_NONE)
+ 	return fixP->fx_cgen.opinfo;
        return fixP->fx_pcrel ? BFD_RELOC_16_PCREL : BFD_RELOC_16;
  
      case XSTORMY16_OPERAND_ABS24:


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