* reloc.c (BFD_RELOC_RL78_CODE): Add.
authorDJ Delorie <dj@redhat.com>
Wed, 27 Feb 2013 21:39:20 +0000 (21:39 +0000)
committerDJ Delorie <dj@redhat.com>
Wed, 27 Feb 2013 21:39:20 +0000 (21:39 +0000)
* libbfd.h: Regenerate.
* bfd-in2.h: Regenerate.
* elf32-rl78.c (rl78_elf_relocate_section): Handle weak code
references in compuated relocs.

* config/tc-rl78.c (reloc_function): Add %code -> BFD_RELOC_RL78_CODE.
(rl78_op): Handle %code().
(rl78_cons_fix_new): Likewise, but ignore for 20-bit operands.
(tc_gen_reloc): Likwise; convert to a computed reloc.
(md_apply_fix): Likewise.

bfd/ChangeLog
bfd/bfd-in2.h
bfd/elf32-rl78.c
bfd/libbfd.h
bfd/reloc.c
gas/ChangeLog
gas/config/tc-rl78.c

index 50f742dc5c71e3f3bc0e1b5fcf0fba9fefe079a1..27746f20f21dbdd08f8744864d3db0effbb6531a 100644 (file)
@@ -1,3 +1,11 @@
+2013-02-27  DJ Delorie  <dj@redhat.com>
+
+       * reloc.c (BFD_RELOC_RL78_CODE): Add.
+       * libbfd.h: Regenerate.
+       * bfd-in2.h: Regenerate.
+       * elf32-rl78.c (rl78_elf_relocate_section): Handle weak code
+       references in compuated relocs.
+
 2013-02-26  Anthony Green  <green@moxielogic.com>
 
        * config.bfd: Extend moxie-rtems target triplet name support.
index 6dfd17fa9b0fc1089d9da25e712ab367f8f19b0d..524e97e78b0e2156fb6ae96470f8a411645938e1 100644 (file)
@@ -4239,6 +4239,7 @@ in .byte hlo8(symbol)  */
   BFD_RELOC_RL78_HI16,
   BFD_RELOC_RL78_HI8,
   BFD_RELOC_RL78_LO16,
+  BFD_RELOC_RL78_CODE,
 
 /* Renesas RX Relocations.  */
   BFD_RELOC_RX_NEG8,
index 3a46c6bd092f76453e77d30a0f22c8b25da3a9cf..ea9a0760d58ca570687fc7b10a2397689244ae0b 100644 (file)
@@ -778,6 +778,8 @@ rl78_elf_relocate_section
                               + sec->output_section->vma
                               + sec->output_offset
                               + rel->r_addend);
+             else if (h->root.type == bfd_link_hash_undefweak)
+               RL78_STACK_PUSH (0);
              else
                _bfd_error_handler (_("Warning: RL78_SYM reloc with an unknown symbol"));
            }
index bcd76a0f2aa7a70dba2a94574221938b3b3bc1dc..857d1ea3b720bef11d79768973a037be0a2cb4b3 100644 (file)
@@ -1970,6 +1970,7 @@ static const char *const bfd_reloc_code_real_names[] = { "@@uninitialized@@",
   "BFD_RELOC_RL78_HI16",
   "BFD_RELOC_RL78_HI8",
   "BFD_RELOC_RL78_LO16",
+  "BFD_RELOC_RL78_CODE",
   "BFD_RELOC_RX_NEG8",
   "BFD_RELOC_RX_NEG16",
   "BFD_RELOC_RX_NEG24",
index 626c818b091f94110e33019040cc94c3cf4d6b21..b59ca00e971211b64717d16584921801fdbe0566 100644 (file)
@@ -4560,6 +4560,8 @@ ENUMX
   BFD_RELOC_RL78_HI8
 ENUMX
   BFD_RELOC_RL78_LO16
+ENUMX
+  BFD_RELOC_RL78_CODE
 ENUMDOC
   Renesas RL78 Relocations.
 
index 0014922e89f377256cd9f013d3200d79f130f623..a7f4709870ff52715eb76937a175c7a2126dbf05 100644 (file)
@@ -1,3 +1,11 @@
+2013-02-27  DJ Delorie  <dj@redhat.com>
+
+       * config/tc-rl78.c (reloc_function): Add %code -> BFD_RELOC_RL78_CODE.
+       (rl78_op): Handle %code().
+       (rl78_cons_fix_new): Likewise, but ignore for 20-bit operands.
+       (tc_gen_reloc): Likwise; convert to a computed reloc.
+       (md_apply_fix): Likewise.
+
 2013-02-25  Kaushik Phatak  <Kaushik.Phatak@kpitcummins.com>
 
        * config/rl78-parse.y: Fix encoding of DIVWU insn.
index bd964dc163003d9222a04c0499230ac3eee68d45..77a19bb50771227f2077647a260ddb9abcdfb9b4 100644 (file)
@@ -194,6 +194,9 @@ rl78_op (expressionS exp, int nbytes, int type)
     }
   else
     {
+      if (nbytes > 2
+         && exp.X_md == BFD_RELOC_RL78_CODE)
+       exp.X_md = 0;
       rl78_op_fixup (exp, rl78_bytes.n_ops * 8, nbytes * 8, type);
       memset (rl78_bytes.ops + rl78_bytes.n_ops, 0, nbytes);
       rl78_bytes.n_ops += nbytes;
@@ -337,6 +340,7 @@ static struct
 }
 reloc_functions[] =
 {
+  { "code", BFD_RELOC_RL78_CODE },
   { "lo16", BFD_RELOC_RL78_LO16 },
   { "hi16", BFD_RELOC_RL78_HI16 },
   { "hi8",  BFD_RELOC_RL78_HI8 },
@@ -556,6 +560,10 @@ rl78_cons_fix_new (fragS * frag,
 
   switch (exp->X_md)
     {
+    case BFD_RELOC_RL78_CODE:
+      if (size == 2)
+       type = exp->X_md;
+      break;
     case BFD_RELOC_RL78_LO16:
     case BFD_RELOC_RL78_HI16:
       if (size != 2)
@@ -665,6 +673,11 @@ tc_gen_reloc (asection * seg ATTRIBUTE_UNUSED, fixS * fixp)
       OP (ABS32);
       break;
 
+    case BFD_RELOC_RL78_CODE:
+      SYM0 ();
+      OP (ABS16);
+      break;
+
     case BFD_RELOC_RL78_LO16:
       SYM0 ();
       OPIMM (0xffff);
@@ -771,6 +784,7 @@ md_apply_fix (struct fix * f ATTRIBUTE_UNUSED,
 
     case BFD_RELOC_16:
     case BFD_RELOC_16_PCREL:
+    case BFD_RELOC_RL78_CODE:
       op[0] = val;
       op[1] = val >> 8;
       break;