BFD_ASSERT (abfd->xvec->header_byteorder_big_p == false);
BFD_ASSERT (bfd_little_endian (abfd));
     nlmNAME(symbol_type) *sym;     asection **secp;     arelent *rel;{  static bfd_vma gp_value;  static bfd_vma lita_address;  struct nlm32_alpha_external_reloc ext;  bfd_vma r_vaddr;  long r_symndx;  int r_type, r_extern, r_offset, r_size;  asection *code_sec, *data_sec;  /* Read the reloc from the file.  */  if (bfd_read (&ext, sizeof ext, 1, abfd) != sizeof ext)    return false;  /* Swap in the reloc information.  */  r_vaddr = bfd_h_get_64 (abfd, (bfd_byte *) ext.r_vaddr);  r_symndx = bfd_h_get_32 (abfd, (bfd_byte *) ext.r_symndx);  BFD_ASSERT (abfd->xvec->header_byteorder_big_p == false);  r_type = ((ext.r_bits[0] & RELOC_BITS0_TYPE_LITTLE)	    >> RELOC_BITS0_TYPE_SH_LITTLE);  r_extern = (ext.r_bits[1] & RELOC_BITS1_EXTERN_LITTLE) != 0;  r_offset = ((ext.r_bits[1] & RELOC_BITS1_OFFSET_LITTLE)	      >> RELOC_BITS1_OFFSET_SH_LITTLE);  /* Ignore the reserved bits.  */  r_size = ((ext.r_bits[3] & RELOC_BITS3_SIZE_LITTLE)	    >> RELOC_BITS3_SIZE_SH_LITTLE);  /* Fill in the BFD arelent structure.  */  code_sec = bfd_get_section_by_name (abfd, NLM_CODE_NAME);  data_sec = bfd_get_section_by_name (abfd, NLM_INITIALIZED_DATA_NAME);  if (r_extern)    {      /* External relocations are only used for imports.  */      BFD_ASSERT (sym != NULL);      /* We don't need to set sym_ptr_ptr for this case.  It is set in	 nlm_canonicalize_reloc.  */      rel->sym_ptr_ptr = NULL;      rel->addend = 0;    }  else    {      /* Internal relocations are only used for local relocation	 fixups.  If they are not NW_RELOC or GPDISP or IGNORE, they	 must be against .text or .data.  */      BFD_ASSERT (r_type == ALPHA_R_NW_RELOC || sym == NULL);      if (r_type == ALPHA_R_NW_RELOC	  || r_type == ALPHA_R_GPDISP	  || r_type == ALPHA_R_IGNORE)	{	  rel->sym_ptr_ptr = bfd_abs_section_ptr->symbol_ptr_ptr;	  rel->addend = 0;	}      else if (r_symndx == ALPHA_RELOC_SECTION_TEXT)	{	  rel->sym_ptr_ptr = code_sec->symbol_ptr_ptr;	  BFD_ASSERT (bfd_get_section_vma (abfd, code_sec) == 0);	  rel->addend = 0;	}      else if (r_symndx == ALPHA_RELOC_SECTION_DATA)	{	  rel->sym_ptr_ptr = data_sec->symbol_ptr_ptr;	  rel->addend = - bfd_get_section_vma (abfd, data_sec);	}      else	{	  BFD_ASSERT (0);	  rel->sym_ptr_ptr = bfd_abs_section_ptr->symbol_ptr_ptr;	  rel->addend = 0;	}    }  /* We use the address to determine whether the reloc is in the .text     or .data section.  R_NW_RELOC relocs don't really have a section,     so we put them in .text.  */  if (r_type == ALPHA_R_NW_RELOC      || r_vaddr < bfd_section_size (abfd, code_sec))    {      *secp = code_sec;      rel->address = r_vaddr;    }  else    {      *secp = data_sec;      rel->address = r_vaddr - bfd_section_size (abfd, code_sec);    }  /* We must adjust the addend based on the type.  */  BFD_ASSERT ((r_type >= 0 && r_type <= ALPHA_R_GPVALUE)	      || r_type == ALPHA_R_NW_RELOC);  switch (r_type)    {    case ALPHA_R_BRADDR:    case ALPHA_R_SREL16:    case ALPHA_R_SREL32:    case ALPHA_R_SREL64:      /* The PC relative relocs do not seem to use the section VMA as	 a negative addend.  */      rel->addend = 0;      break;    case ALPHA_R_GPREL32:      /* Copy the gp value for this object file into the addend, to	 ensure that we are not confused by the linker.  */      if (! r_extern)	rel->addend += gp_value;      break;    case ALPHA_R_LITERAL:      BFD_ASSERT (! r_extern);      rel->addend += lita_address;      break;    case ALPHA_R_LITUSE:    case ALPHA_R_GPDISP:      /* The LITUSE and GPDISP relocs do not use a symbol, or an	 addend, but they do use a special code.  Put this code in the	 addend field.  */      rel->addend = r_symndx;      rel->sym_ptr_ptr = bfd_abs_section_ptr->symbol_ptr_ptr;      break;    case ALPHA_R_OP_STORE:      /* The STORE reloc needs the size and offset fields.  We store	 them in the addend.  */      BFD_ASSERT (r_offset < 256 && r_size < 256);      rel->addend = (r_offset << 8) + r_size;      break;    case ALPHA_R_OP_PUSH:    case ALPHA_R_OP_PSUB:    case ALPHA_R_OP_PRSHIFT:      /* The PUSH, PSUB and PRSHIFT relocs do not actually use an	 address.  I believe that the address supplied is really an	 addend.  */      rel->addend = r_vaddr;      break;    case ALPHA_R_GPVALUE:      /* Record the new gp value.  */      gp_value += r_symndx;      rel->addend = gp_value;      break;    case ALPHA_R_IGNORE:      /* If the type is ALPHA_R_IGNORE, make sure this is a reference	 to the absolute section so that the reloc is ignored.  For	 some reason the address of this reloc type is not adjusted by	 the section vma.  We record the gp value for this object file	 here, for convenience when doing the GPDISP relocation.  */      rel->sym_ptr_ptr = bfd_abs_section_ptr->symbol_ptr_ptr;      rel->address = r_vaddr;      rel->addend = gp_value;      break;    case ALPHA_R_NW_RELOC:      /* If this is SETGP, we set the addend to 0.  Otherwise we set	 the addend to the size of the .lita section (this is	 r_symndx) plus 1.  We have already set the address of the	 reloc to r_vaddr.  */      if (r_size == ALPHA_R_NW_RELOC_SETGP)	{	  gp_value = r_vaddr;	  rel->addend = 0;	}      else if (r_size == ALPHA_R_NW_RELOC_LITA)	{	  lita_address = r_vaddr;	  rel->addend = r_symndx + 1;	}      else	BFD_ASSERT (0);      rel->sym_ptr_ptr = bfd_abs_section_ptr->symbol_ptr_ptr;      break;    default:      break;    }  if (r_type == ALPHA_R_NW_RELOC)    rel->howto = &nlm32_alpha_nw_howto;  else    rel->howto = &nlm32_alpha_howto_table[r_type];  return true;}