OpenCores
URL https://opencores.org/ocsvn/open8_urisc/open8_urisc/trunk

Subversion Repositories open8_urisc

[/] [open8_urisc/] [trunk/] [gnu/] [binutils/] [bfd/] [elf32-s390.c] - Diff between revs 163 and 166

Go to most recent revision | Show entire file | Details | Blame | View Log

Rev 163 Rev 166
Line 2860... Line 2860...
                          contents + rel->r_offset);
                          contents + rel->r_offset);
            }
            }
          continue;
          continue;
 
 
        case R_390_TLS_LDO32:
        case R_390_TLS_LDO32:
          if (info->shared)
          if (info->shared || (input_section->flags & SEC_DEBUGGING))
            relocation -= dtpoff_base (info);
            relocation -= dtpoff_base (info);
          else
          else
            /* When converting LDO to LE, we must negate.  */
            /* When converting LDO to LE, we must negate.  */
            relocation = -tpoff (info, relocation);
            relocation = -tpoff (info, relocation);
          break;
          break;
Line 2917... Line 2917...
            {
            {
              unsigned int insn;
              unsigned int insn;
 
 
              insn = bfd_get_32 (input_bfd, contents + rel->r_offset);
              insn = bfd_get_32 (input_bfd, contents + rel->r_offset);
              if ((insn & 0xff000fff) != 0x4d000000 &&
              if ((insn & 0xff000fff) != 0x4d000000 &&
                  (insn & 0xffff0000) != 0xc0e50000)
                  (insn & 0xffff0000) != 0xc0e50000 &&
 
                  (insn & 0xff000000) != 0x0d000000)
                invalid_tls_insn (input_bfd, input_section, rel);
                invalid_tls_insn (input_bfd, input_section, rel);
              if (!info->shared && (h == NULL || h->dynindx == -1))
              if (!info->shared && (h == NULL || h->dynindx == -1))
                {
                {
                  if ((insn & 0xff000000) == 0x4d000000)
                  if ((insn & 0xff000000) == 0x0d000000)
 
                    {
 
                      /* GD->LE transition.
 
                         basr rx, ry -> nopr r7 */
 
                      insn = 0x07070000 | (insn & 0xffff);
 
                    }
 
                  else if ((insn & 0xff000000) == 0x4d000000)
                    {
                    {
                      /* GD->LE transition.
                      /* GD->LE transition.
                         bas %r14,0(%rx,%r13) -> bc 0,0  */
                         bas %r14,0(%rx,%r13) -> bc 0,0  */
                      insn = 0x47000000;
                      insn = 0x47000000;
                    }
                    }
                  else
                  else
                    {
                    {
                      /* GD->LE transition.
                      /* GD->LE transition.
                         brasl %r14,_tls_get_addr@plt -> brcl 0,.  */
                         brasl %r14,_tls_get_offset@plt -> brcl 0,.  */
                      insn = 0xc0040000;
                      insn = 0xc0040000;
                      bfd_put_16 (output_bfd, 0x0000,
                      bfd_put_16 (output_bfd, 0x0000,
                                  contents + rel->r_offset + 4);
                                  contents + rel->r_offset + 4);
                    }
                    }
                }
                }
              else
              else
                {
                {
 
                  /* If basr is used in the pic case to invoke
 
                     _tls_get_offset, something went wrong before.  */
 
                  if ((insn & 0xff000000) == 0x0d000000)
 
                    invalid_tls_insn (input_bfd, input_section, rel);
 
 
                  if ((insn & 0xff000000) == 0x4d000000)
                  if ((insn & 0xff000000) == 0x4d000000)
                    {
                    {
                      /* GD->IE transition.
                      /* GD->IE transition.
                         bas %r14,0(%rx,%r13) -> l %r2,0(%r2,%r12)  */
                         bas %r14,0(%rx,%r13) -> l %r2,0(%r2,%r12)  */
                      insn = 0x5822c000;
                      insn = 0x5822c000;
Line 2964... Line 2976...
                {
                {
                  unsigned int insn;
                  unsigned int insn;
 
 
                  insn = bfd_get_32 (input_bfd, contents + rel->r_offset);
                  insn = bfd_get_32 (input_bfd, contents + rel->r_offset);
                  if ((insn & 0xff000fff) != 0x4d000000 &&
                  if ((insn & 0xff000fff) != 0x4d000000 &&
                      (insn & 0xffff0000) != 0xc0e50000)
                      (insn & 0xffff0000) != 0xc0e50000 &&
 
                      (insn & 0xff000000) != 0x0d000000)
                    invalid_tls_insn (input_bfd, input_section, rel);
                    invalid_tls_insn (input_bfd, input_section, rel);
                  if ((insn & 0xff000000) == 0x4d000000)
 
 
                  if ((insn & 0xff000000) == 0x0d000000)
 
                    {
 
                      /* LD->LE transition.
 
                         basr rx, ry -> nopr r7 */
 
                      insn = 0x07070000 | (insn & 0xffff);
 
                    }
 
                  else if ((insn & 0xff000000) == 0x4d000000)
                    {
                    {
                      /* LD->LE transition.
                      /* LD->LE transition.
                         bas %r14,0(%rx,%r13) -> bc 0,0  */
                         bas %r14,0(%rx,%r13) -> bc 0,0  */
                      insn = 0x47000000;
                      insn = 0x47000000;
                    }
                    }
                  else
                  else
                    {
                    {
                      /* LD->LE transition.
                      /* LD->LE transition.
                         brasl %r14,__tls_get_addr@plt -> brcl 0,. */
                         brasl %r14,__tls_get_offset@plt -> brcl 0,. */
                      insn = 0xc0040000;
                      insn = 0xc0040000;
                      bfd_put_16 (output_bfd, 0x0000,
                      bfd_put_16 (output_bfd, 0x0000,
                                  contents + rel->r_offset + 4);
                                  contents + rel->r_offset + 4);
                    }
                    }
                  bfd_put_32 (output_bfd, insn, contents + rel->r_offset);
                  bfd_put_32 (output_bfd, insn, contents + rel->r_offset);

powered by: WebSVN 2.1.0

© copyright 1999-2024 OpenCores.org, equivalent to Oliscience, all rights reserved. OpenCores®, registered trademark.