1/* Alpha specific support for 64-bit ELF
2   Copyright (C) 1996-2022 Free Software Foundation, Inc.
3   Contributed by Richard Henderson <rth@tamu.edu>.
4
5   This file is part of BFD, the Binary File Descriptor library.
6
7   This program is free software; you can redistribute it and/or modify
8   it under the terms of the GNU General Public License as published by
9   the Free Software Foundation; either version 3 of the License, or
10   (at your option) any later version.
11
12   This program is distributed in the hope that it will be useful,
13   but WITHOUT ANY WARRANTY; without even the implied warranty of
14   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
15   GNU General Public License for more details.
16
17   You should have received a copy of the GNU General Public License
18   along with this program; if not, write to the Free Software
19   Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston,
20   MA 02110-1301, USA.  */
21
22
23/* We need a published ABI spec for this.  Until one comes out, don't
24   assume this'll remain unchanged forever.  */
25
26#include "sysdep.h"
27#include "bfd.h"
28#include "libbfd.h"
29#include "elf-bfd.h"
30#include "ecoff-bfd.h"
31
32#include "elf/alpha.h"
33
34#define ALPHAECOFF
35
36#define NO_COFF_RELOCS
37#define NO_COFF_SYMBOLS
38#define NO_COFF_LINENOS
39
40/* Get the ECOFF swapping routines.  Needed for the debug information.  */
41#include "coff/internal.h"
42#include "coff/sym.h"
43#include "coff/symconst.h"
44#include "coff/ecoff.h"
45#include "coff/alpha.h"
46#include "aout/ar.h"
47#include "libcoff.h"
48#include "libecoff.h"
49#define ECOFF_64
50#include "ecoffswap.h"
51
52
53/* Instruction data for plt generation and relaxation.  */
54
55#define OP_LDA		0x08U
56#define OP_LDAH		0x09U
57#define OP_LDQ		0x29U
58#define OP_BR		0x30U
59#define OP_BSR		0x34U
60
61#define INSN_LDA	(OP_LDA << 26)
62#define INSN_LDAH	(OP_LDAH << 26)
63#define INSN_LDQ	(OP_LDQ << 26)
64#define INSN_BR		(OP_BR << 26)
65
66#define INSN_ADDQ	0x40000400
67#define INSN_RDUNIQ	0x0000009e
68#define INSN_SUBQ	0x40000520
69#define INSN_S4SUBQ	0x40000560
70#define INSN_UNOP	0x2ffe0000
71
72#define INSN_JSR	0x68004000
73#define INSN_JMP	0x68000000
74#define INSN_JSR_MASK	0xfc00c000
75
76#define INSN_A(I,A)		(I | ((unsigned) A << 21))
77#define INSN_AB(I,A,B)		(INSN_A (I, A) | (B << 16))
78#define INSN_ABC(I,A,B,C)	(INSN_A (I, A) | (B << 16) | C)
79#define INSN_ABO(I,A,B,O)	(INSN_A (I, A) | (B << 16) | ((O) & 0xffff))
80#define INSN_AD(I,A,D)		(INSN_A (I, A) | (((D) >> 2) & 0x1fffff))
81
82/* PLT/GOT Stuff */
83
84/* Set by ld emulation.  Putting this into the link_info or hash structure
85   is simply working too hard.  */
86#if defined(USE_SECUREPLT) && 0 /* XXX port-alpha/57511 */
87bool elf64_alpha_use_secureplt = true;
88#else
89bool elf64_alpha_use_secureplt = false;
90#endif
91
92#define OLD_PLT_HEADER_SIZE	32
93#define OLD_PLT_ENTRY_SIZE	12
94#define NEW_PLT_HEADER_SIZE	36
95#define NEW_PLT_ENTRY_SIZE	4
96
97#define PLT_HEADER_SIZE \
98  (elf64_alpha_use_secureplt ? NEW_PLT_HEADER_SIZE : OLD_PLT_HEADER_SIZE)
99#define PLT_ENTRY_SIZE \
100  (elf64_alpha_use_secureplt ? NEW_PLT_ENTRY_SIZE : OLD_PLT_ENTRY_SIZE)
101
102/* ld --traditional-format uses this older format instead. */
103#define OLD_PLT_ENTRY_WORD1	0x279f0000	/* ldah $28, 0($31) */
104#define OLD_PLT_ENTRY_WORD2	0x239c0000	/* lda  $28, 0($28) */
105#define OLD_PLT_ENTRY_WORD3	0xc3e00000	/* br   $31, plt0   */
106
107#define MAX_GOT_SIZE		(64*1024)
108
109#define ELF_DYNAMIC_INTERPRETER "/usr/lib/ld.so"
110
111
112/* Used to implement multiple .got subsections.  */
113struct alpha_elf_got_entry
114{
115  struct alpha_elf_got_entry *next;
116
117  /* Which .got subsection?  */
118  bfd *gotobj;
119
120  /* The addend in effect for this entry.  */
121  bfd_vma addend;
122
123  /* The .got offset for this entry.  */
124  int got_offset;
125
126  /* The .plt offset for this entry.  */
127  int plt_offset;
128
129  /* How many references to this entry?  */
130  int use_count;
131
132  /* The relocation type of this entry.  */
133  unsigned char reloc_type;
134
135  /* How a LITERAL is used.  */
136  unsigned char flags;
137
138  /* Have we initialized the dynamic relocation for this entry?  */
139  unsigned char reloc_done;
140
141  /* Have we adjusted this entry for SEC_MERGE?  */
142  unsigned char reloc_xlated;
143};
144
145struct alpha_elf_reloc_entry
146{
147  struct alpha_elf_reloc_entry *next;
148
149  /* Which .reloc section? */
150  asection *srel;
151
152  /* Which section this relocation is against? */
153  asection *sec;
154
155  /* How many did we find?  */
156  unsigned long count;
157
158  /* What kind of relocation? */
159  unsigned int rtype;
160};
161
162struct alpha_elf_link_hash_entry
163{
164  struct elf_link_hash_entry root;
165
166  /* External symbol information.  */
167  EXTR esym;
168
169  /* Cumulative flags for all the .got entries.  */
170  int flags;
171
172  /* Contexts in which a literal was referenced.  */
173#define ALPHA_ELF_LINK_HASH_LU_ADDR	 0x01
174#define ALPHA_ELF_LINK_HASH_LU_MEM	 0x02
175#define ALPHA_ELF_LINK_HASH_LU_BYTE	 0x04
176#define ALPHA_ELF_LINK_HASH_LU_JSR	 0x08
177#define ALPHA_ELF_LINK_HASH_LU_TLSGD	 0x10
178#define ALPHA_ELF_LINK_HASH_LU_TLSLDM	 0x20
179#define ALPHA_ELF_LINK_HASH_LU_JSRDIRECT 0x40
180#define ALPHA_ELF_LINK_HASH_LU_PLT	 0x38
181#define ALPHA_ELF_LINK_HASH_TLS_IE	 0x80
182
183  /* Used to implement multiple .got subsections.  */
184  struct alpha_elf_got_entry *got_entries;
185
186  /* Used to count non-got, non-plt relocations for delayed sizing
187     of relocation sections.  */
188  struct alpha_elf_reloc_entry *reloc_entries;
189};
190
191/* Alpha ELF linker hash table.  */
192
193struct alpha_elf_link_hash_table
194{
195  struct elf_link_hash_table root;
196
197  /* The head of a list of .got subsections linked through
198     alpha_elf_tdata(abfd)->got_link_next.  */
199  bfd *got_list;
200
201  /* The most recent relax pass that we've seen.  The GOTs
202     should be regenerated if this doesn't match.  */
203  int relax_trip;
204};
205
206/* Look up an entry in a Alpha ELF linker hash table.  */
207
208#define alpha_elf_link_hash_lookup(table, string, create, copy, follow)	\
209  ((struct alpha_elf_link_hash_entry *)					\
210   elf_link_hash_lookup (&(table)->root, (string), (create),		\
211			 (copy), (follow)))
212
213/* Traverse a Alpha ELF linker hash table.  */
214
215#define alpha_elf_link_hash_traverse(table, func, info)			\
216  (elf_link_hash_traverse						\
217   (&(table)->root,							\
218    (bool (*) (struct elf_link_hash_entry *, void *)) (func),		\
219    (info)))
220
221/* Get the Alpha ELF linker hash table from a link_info structure.  */
222
223#define alpha_elf_hash_table(p) \
224  ((is_elf_hash_table ((p)->hash)					\
225    && elf_hash_table_id (elf_hash_table (p)) == ALPHA_ELF_DATA)	\
226   ? (struct alpha_elf_link_hash_table *) (p)->hash : NULL)
227
228/* Get the object's symbols as our own entry type.  */
229
230#define alpha_elf_sym_hashes(abfd) \
231  ((struct alpha_elf_link_hash_entry **)elf_sym_hashes(abfd))
232
233/* Should we do dynamic things to this symbol?  This differs from the
234   generic version in that we never need to consider function pointer
235   equality wrt PLT entries -- we don't create a PLT entry if a symbol's
236   address is ever taken.  */
237
238static inline bool
239alpha_elf_dynamic_symbol_p (struct elf_link_hash_entry *h,
240			    struct bfd_link_info *info)
241{
242  return _bfd_elf_dynamic_symbol_p (h, info, 0);
243}
244
245/* Create an entry in a Alpha ELF linker hash table.  */
246
247static struct bfd_hash_entry *
248elf64_alpha_link_hash_newfunc (struct bfd_hash_entry *entry,
249			       struct bfd_hash_table *table,
250			       const char *string)
251{
252  struct alpha_elf_link_hash_entry *ret =
253    (struct alpha_elf_link_hash_entry *) entry;
254
255  /* Allocate the structure if it has not already been allocated by a
256     subclass.  */
257  if (ret == (struct alpha_elf_link_hash_entry *) NULL)
258    ret = ((struct alpha_elf_link_hash_entry *)
259	   bfd_hash_allocate (table,
260			      sizeof (struct alpha_elf_link_hash_entry)));
261  if (ret == (struct alpha_elf_link_hash_entry *) NULL)
262    return (struct bfd_hash_entry *) ret;
263
264  /* Call the allocation method of the superclass.  */
265  ret = ((struct alpha_elf_link_hash_entry *)
266	 _bfd_elf_link_hash_newfunc ((struct bfd_hash_entry *) ret,
267				     table, string));
268  if (ret != (struct alpha_elf_link_hash_entry *) NULL)
269    {
270      /* Set local fields.  */
271      memset (&ret->esym, 0, sizeof (EXTR));
272      /* We use -2 as a marker to indicate that the information has
273	 not been set.  -1 means there is no associated ifd.  */
274      ret->esym.ifd = -2;
275      ret->flags = 0;
276      ret->got_entries = NULL;
277      ret->reloc_entries = NULL;
278    }
279
280  return (struct bfd_hash_entry *) ret;
281}
282
283/* Create a Alpha ELF linker hash table.  */
284
285static struct bfd_link_hash_table *
286elf64_alpha_bfd_link_hash_table_create (bfd *abfd)
287{
288  struct alpha_elf_link_hash_table *ret;
289  size_t amt = sizeof (struct alpha_elf_link_hash_table);
290
291  ret = (struct alpha_elf_link_hash_table *) bfd_zmalloc (amt);
292  if (ret == (struct alpha_elf_link_hash_table *) NULL)
293    return NULL;
294
295  if (!_bfd_elf_link_hash_table_init (&ret->root, abfd,
296				      elf64_alpha_link_hash_newfunc,
297				      sizeof (struct alpha_elf_link_hash_entry),
298				      ALPHA_ELF_DATA))
299    {
300      free (ret);
301      return NULL;
302    }
303
304  return &ret->root.root;
305}
306
307/* Alpha ELF follows MIPS ELF in using a special find_nearest_line
308   routine in order to handle the ECOFF debugging information.  */
309
310struct alpha_elf_find_line
311{
312  struct ecoff_debug_info d;
313  struct ecoff_find_line i;
314};
315
316/* We have some private fields hanging off of the elf_tdata structure.  */
317
318struct alpha_elf_obj_tdata
319{
320  struct elf_obj_tdata root;
321
322  /* For every input file, these are the got entries for that object's
323     local symbols.  */
324  struct alpha_elf_got_entry ** local_got_entries;
325
326  /* For every input file, this is the object that owns the got that
327     this input file uses.  */
328  bfd *gotobj;
329
330  /* For every got, this is a linked list through the objects using this got */
331  bfd *in_got_link_next;
332
333  /* For every got, this is a link to the next got subsegment.  */
334  bfd *got_link_next;
335
336  /* For every got, this is the section.  */
337  asection *got;
338
339  /* For every got, this is it's total number of words.  */
340  int total_got_size;
341
342  /* For every got, this is the sum of the number of words required
343     to hold all of the member object's local got.  */
344  int local_got_size;
345
346  /* Used by elf64_alpha_find_nearest_line entry point.  */
347  struct alpha_elf_find_line *find_line_info;
348
349};
350
351#define alpha_elf_tdata(abfd) \
352  ((struct alpha_elf_obj_tdata *) (abfd)->tdata.any)
353
354#define is_alpha_elf(bfd) \
355  (bfd_get_flavour (bfd) == bfd_target_elf_flavour \
356   && elf_tdata (bfd) != NULL \
357   && elf_object_id (bfd) == ALPHA_ELF_DATA)
358
359static bool
360elf64_alpha_mkobject (bfd *abfd)
361{
362  return bfd_elf_allocate_object (abfd, sizeof (struct alpha_elf_obj_tdata),
363				  ALPHA_ELF_DATA);
364}
365
366static bool
367elf64_alpha_object_p (bfd *abfd)
368{
369  /* Set the right machine number for an Alpha ELF file.  */
370  return bfd_default_set_arch_mach (abfd, bfd_arch_alpha, 0);
371}
372
373/* A relocation function which doesn't do anything.  */
374
375static bfd_reloc_status_type
376elf64_alpha_reloc_nil (bfd *abfd ATTRIBUTE_UNUSED, arelent *reloc,
377		       asymbol *sym ATTRIBUTE_UNUSED,
378		       void * data ATTRIBUTE_UNUSED, asection *sec,
379		       bfd *output_bfd, char **error_message ATTRIBUTE_UNUSED)
380{
381  if (output_bfd)
382    reloc->address += sec->output_offset;
383  return bfd_reloc_ok;
384}
385
386/* A relocation function used for an unsupported reloc.  */
387
388static bfd_reloc_status_type
389elf64_alpha_reloc_bad (bfd *abfd ATTRIBUTE_UNUSED, arelent *reloc,
390		       asymbol *sym ATTRIBUTE_UNUSED,
391		       void * data ATTRIBUTE_UNUSED, asection *sec,
392		       bfd *output_bfd, char **error_message ATTRIBUTE_UNUSED)
393{
394  if (output_bfd)
395    reloc->address += sec->output_offset;
396  return bfd_reloc_notsupported;
397}
398
399/* Do the work of the GPDISP relocation.  */
400
401static bfd_reloc_status_type
402elf64_alpha_do_reloc_gpdisp (bfd *abfd, bfd_vma gpdisp, bfd_byte *p_ldah,
403			     bfd_byte *p_lda)
404{
405  bfd_reloc_status_type ret = bfd_reloc_ok;
406  bfd_vma addend;
407  unsigned long i_ldah, i_lda;
408
409  i_ldah = bfd_get_32 (abfd, p_ldah);
410  i_lda = bfd_get_32 (abfd, p_lda);
411
412  /* Complain if the instructions are not correct.  */
413  if (((i_ldah >> 26) & 0x3f) != 0x09
414      || ((i_lda >> 26) & 0x3f) != 0x08)
415    ret = bfd_reloc_dangerous;
416
417  /* Extract the user-supplied offset, mirroring the sign extensions
418     that the instructions perform.  */
419  addend = ((i_ldah & 0xffff) << 16) | (i_lda & 0xffff);
420  addend = (addend ^ 0x80008000) - 0x80008000;
421
422  gpdisp += addend;
423
424  if ((bfd_signed_vma) gpdisp < -(bfd_signed_vma) 0x80000000
425      || (bfd_signed_vma) gpdisp >= (bfd_signed_vma) 0x7fff8000)
426    ret = bfd_reloc_overflow;
427
428  /* compensate for the sign extension again.  */
429  i_ldah = ((i_ldah & 0xffff0000)
430	    | (((gpdisp >> 16) + ((gpdisp >> 15) & 1)) & 0xffff));
431  i_lda = (i_lda & 0xffff0000) | (gpdisp & 0xffff);
432
433  bfd_put_32 (abfd, (bfd_vma) i_ldah, p_ldah);
434  bfd_put_32 (abfd, (bfd_vma) i_lda, p_lda);
435
436  return ret;
437}
438
439/* The special function for the GPDISP reloc.  */
440
441static bfd_reloc_status_type
442elf64_alpha_reloc_gpdisp (bfd *abfd, arelent *reloc_entry,
443			  asymbol *sym ATTRIBUTE_UNUSED, void * data,
444			  asection *input_section, bfd *output_bfd,
445			  char **err_msg)
446{
447  bfd_reloc_status_type ret;
448  bfd_vma gp, relocation;
449  bfd_vma high_address;
450  bfd_byte *p_ldah, *p_lda;
451
452  /* Don't do anything if we're not doing a final link.  */
453  if (output_bfd)
454    {
455      reloc_entry->address += input_section->output_offset;
456      return bfd_reloc_ok;
457    }
458
459  high_address = bfd_get_section_limit (abfd, input_section);
460  if (reloc_entry->address > high_address
461      || reloc_entry->address + reloc_entry->addend > high_address)
462    return bfd_reloc_outofrange;
463
464  /* The gp used in the portion of the output object to which this
465     input object belongs is cached on the input bfd.  */
466  gp = _bfd_get_gp_value (abfd);
467
468  relocation = (input_section->output_section->vma
469		+ input_section->output_offset
470		+ reloc_entry->address);
471
472  p_ldah = (bfd_byte *) data + reloc_entry->address;
473  p_lda = p_ldah + reloc_entry->addend;
474
475  ret = elf64_alpha_do_reloc_gpdisp (abfd, gp - relocation, p_ldah, p_lda);
476
477  /* Complain if the instructions are not correct.  */
478  if (ret == bfd_reloc_dangerous)
479    *err_msg = _("GPDISP relocation did not find ldah and lda instructions");
480
481  return ret;
482}
483
484/* In case we're on a 32-bit machine, construct a 64-bit "-1" value
485   from smaller values.  Start with zero, widen, *then* decrement.  */
486#define MINUS_ONE	(((bfd_vma)0) - 1)
487
488
489#define SKIP_HOWTO(N) \
490  HOWTO(N, 0, 0, 0, 0, 0, complain_overflow_dont, elf64_alpha_reloc_bad, 0, 0, 0, 0, 0)
491
492static reloc_howto_type elf64_alpha_howto_table[] =
493{
494  HOWTO (R_ALPHA_NONE,		/* type */
495	 0,			/* rightshift */
496	 0,			/* size */
497	 0,			/* bitsize */
498	 true,			/* pc_relative */
499	 0,			/* bitpos */
500	 complain_overflow_dont, /* complain_on_overflow */
501	 elf64_alpha_reloc_nil,	/* special_function */
502	 "NONE",		/* name */
503	 false,			/* partial_inplace */
504	 0,			/* src_mask */
505	 0,			/* dst_mask */
506	 true),			/* pcrel_offset */
507
508  /* A 32 bit reference to a symbol.  */
509  HOWTO (R_ALPHA_REFLONG,	/* type */
510	 0,			/* rightshift */
511	 4,			/* size */
512	 32,			/* bitsize */
513	 false,			/* pc_relative */
514	 0,			/* bitpos */
515	 complain_overflow_bitfield, /* complain_on_overflow */
516	 bfd_elf_generic_reloc,	/* special_function */
517	 "REFLONG",		/* name */
518	 false,			/* partial_inplace */
519	 0xffffffff,		/* src_mask */
520	 0xffffffff,		/* dst_mask */
521	 false),		/* pcrel_offset */
522
523  /* A 64 bit reference to a symbol.  */
524  HOWTO (R_ALPHA_REFQUAD,	/* type */
525	 0,			/* rightshift */
526	 8,			/* size */
527	 64,			/* bitsize */
528	 false,			/* pc_relative */
529	 0,			/* bitpos */
530	 complain_overflow_bitfield, /* complain_on_overflow */
531	 bfd_elf_generic_reloc,	/* special_function */
532	 "REFQUAD",		/* name */
533	 false,			/* partial_inplace */
534	 MINUS_ONE,		/* src_mask */
535	 MINUS_ONE,		/* dst_mask */
536	 false),		/* pcrel_offset */
537
538  /* A 32 bit GP relative offset.  This is just like REFLONG except
539     that when the value is used the value of the gp register will be
540     added in.  */
541  HOWTO (R_ALPHA_GPREL32,	/* type */
542	 0,			/* rightshift */
543	 4,			/* size */
544	 32,			/* bitsize */
545	 false,			/* pc_relative */
546	 0,			/* bitpos */
547	 complain_overflow_bitfield, /* complain_on_overflow */
548	 bfd_elf_generic_reloc,	/* special_function */
549	 "GPREL32",		/* name */
550	 false,			/* partial_inplace */
551	 0xffffffff,		/* src_mask */
552	 0xffffffff,		/* dst_mask */
553	 false),		/* pcrel_offset */
554
555  /* Used for an instruction that refers to memory off the GP register.  */
556  HOWTO (R_ALPHA_LITERAL,	/* type */
557	 0,			/* rightshift */
558	 2,			/* size */
559	 16,			/* bitsize */
560	 false,			/* pc_relative */
561	 0,			/* bitpos */
562	 complain_overflow_signed, /* complain_on_overflow */
563	 bfd_elf_generic_reloc,	/* special_function */
564	 "ELF_LITERAL",		/* name */
565	 false,			/* partial_inplace */
566	 0xffff,		/* src_mask */
567	 0xffff,		/* dst_mask */
568	 false),		/* pcrel_offset */
569
570  /* This reloc only appears immediately following an ELF_LITERAL reloc.
571     It identifies a use of the literal.  The symbol index is special:
572     1 means the literal address is in the base register of a memory
573     format instruction; 2 means the literal address is in the byte
574     offset register of a byte-manipulation instruction; 3 means the
575     literal address is in the target register of a jsr instruction.
576     This does not actually do any relocation.  */
577  HOWTO (R_ALPHA_LITUSE,	/* type */
578	 0,			/* rightshift */
579	 2,			/* size */
580	 32,			/* bitsize */
581	 false,			/* pc_relative */
582	 0,			/* bitpos */
583	 complain_overflow_dont, /* complain_on_overflow */
584	 elf64_alpha_reloc_nil,	/* special_function */
585	 "LITUSE",		/* name */
586	 false,			/* partial_inplace */
587	 0,			/* src_mask */
588	 0,			/* dst_mask */
589	 false),		/* pcrel_offset */
590
591  /* Load the gp register.  This is always used for a ldah instruction
592     which loads the upper 16 bits of the gp register.  The symbol
593     index of the GPDISP instruction is an offset in bytes to the lda
594     instruction that loads the lower 16 bits.  The value to use for
595     the relocation is the difference between the GP value and the
596     current location; the load will always be done against a register
597     holding the current address.
598
599     NOTE: Unlike ECOFF, partial in-place relocation is not done.  If
600     any offset is present in the instructions, it is an offset from
601     the register to the ldah instruction.  This lets us avoid any
602     stupid hackery like inventing a gp value to do partial relocation
603     against.  Also unlike ECOFF, we do the whole relocation off of
604     the GPDISP rather than a GPDISP_HI16/GPDISP_LO16 pair.  An odd,
605     space consuming bit, that, since all the information was present
606     in the GPDISP_HI16 reloc.  */
607  HOWTO (R_ALPHA_GPDISP,	/* type */
608	 16,			/* rightshift */
609	 4,			/* size */
610	 16,			/* bitsize */
611	 false,			/* pc_relative */
612	 0,			/* bitpos */
613	 complain_overflow_dont, /* complain_on_overflow */
614	 elf64_alpha_reloc_gpdisp, /* special_function */
615	 "GPDISP",		/* name */
616	 false,			/* partial_inplace */
617	 0xffff,		/* src_mask */
618	 0xffff,		/* dst_mask */
619	 true),			/* pcrel_offset */
620
621  /* A 21 bit branch.  */
622  HOWTO (R_ALPHA_BRADDR,	/* type */
623	 2,			/* rightshift */
624	 4,			/* size */
625	 21,			/* bitsize */
626	 true,			/* pc_relative */
627	 0,			/* bitpos */
628	 complain_overflow_signed, /* complain_on_overflow */
629	 bfd_elf_generic_reloc,	/* special_function */
630	 "BRADDR",		/* name */
631	 false,			/* partial_inplace */
632	 0x1fffff,		/* src_mask */
633	 0x1fffff,		/* dst_mask */
634	 true),			/* pcrel_offset */
635
636  /* A hint for a jump to a register.  */
637  HOWTO (R_ALPHA_HINT,		/* type */
638	 2,			/* rightshift */
639	 2,			/* size */
640	 14,			/* bitsize */
641	 true,			/* pc_relative */
642	 0,			/* bitpos */
643	 complain_overflow_dont, /* complain_on_overflow */
644	 bfd_elf_generic_reloc,	/* special_function */
645	 "HINT",		/* name */
646	 false,			/* partial_inplace */
647	 0x3fff,		/* src_mask */
648	 0x3fff,		/* dst_mask */
649	 true),			/* pcrel_offset */
650
651  /* 16 bit PC relative offset.  */
652  HOWTO (R_ALPHA_SREL16,	/* type */
653	 0,			/* rightshift */
654	 2,			/* size */
655	 16,			/* bitsize */
656	 true,			/* pc_relative */
657	 0,			/* bitpos */
658	 complain_overflow_signed, /* complain_on_overflow */
659	 bfd_elf_generic_reloc,	/* special_function */
660	 "SREL16",		/* name */
661	 false,			/* partial_inplace */
662	 0xffff,		/* src_mask */
663	 0xffff,		/* dst_mask */
664	 true),			/* pcrel_offset */
665
666  /* 32 bit PC relative offset.  */
667  HOWTO (R_ALPHA_SREL32,	/* type */
668	 0,			/* rightshift */
669	 4,			/* size */
670	 32,			/* bitsize */
671	 true,			/* pc_relative */
672	 0,			/* bitpos */
673	 complain_overflow_signed, /* complain_on_overflow */
674	 bfd_elf_generic_reloc,	/* special_function */
675	 "SREL32",		/* name */
676	 false,			/* partial_inplace */
677	 0xffffffff,		/* src_mask */
678	 0xffffffff,		/* dst_mask */
679	 true),			/* pcrel_offset */
680
681  /* A 64 bit PC relative offset.  */
682  HOWTO (R_ALPHA_SREL64,	/* type */
683	 0,			/* rightshift */
684	 8,			/* size */
685	 64,			/* bitsize */
686	 true,			/* pc_relative */
687	 0,			/* bitpos */
688	 complain_overflow_signed, /* complain_on_overflow */
689	 bfd_elf_generic_reloc,	/* special_function */
690	 "SREL64",		/* name */
691	 false,			/* partial_inplace */
692	 MINUS_ONE,		/* src_mask */
693	 MINUS_ONE,		/* dst_mask */
694	 true),			/* pcrel_offset */
695
696  /* Skip 12 - 16; deprecated ECOFF relocs.  */
697  SKIP_HOWTO (12),
698  SKIP_HOWTO (13),
699  SKIP_HOWTO (14),
700  SKIP_HOWTO (15),
701  SKIP_HOWTO (16),
702
703  /* The high 16 bits of the displacement from GP to the target.  */
704  HOWTO (R_ALPHA_GPRELHIGH,
705	 0,			/* rightshift */
706	 2,			/* size */
707	 16,			/* bitsize */
708	 false,			/* pc_relative */
709	 0,			/* bitpos */
710	 complain_overflow_signed, /* complain_on_overflow */
711	 bfd_elf_generic_reloc,	/* special_function */
712	 "GPRELHIGH",		/* name */
713	 false,			/* partial_inplace */
714	 0xffff,		/* src_mask */
715	 0xffff,		/* dst_mask */
716	 false),		/* pcrel_offset */
717
718  /* The low 16 bits of the displacement from GP to the target.  */
719  HOWTO (R_ALPHA_GPRELLOW,
720	 0,			/* rightshift */
721	 2,			/* size */
722	 16,			/* bitsize */
723	 false,			/* pc_relative */
724	 0,			/* bitpos */
725	 complain_overflow_dont, /* complain_on_overflow */
726	 bfd_elf_generic_reloc,	/* special_function */
727	 "GPRELLOW",		/* name */
728	 false,			/* partial_inplace */
729	 0xffff,		/* src_mask */
730	 0xffff,		/* dst_mask */
731	 false),		/* pcrel_offset */
732
733  /* A 16-bit displacement from the GP to the target.  */
734  HOWTO (R_ALPHA_GPREL16,
735	 0,			/* rightshift */
736	 2,			/* size */
737	 16,			/* bitsize */
738	 false,			/* pc_relative */
739	 0,			/* bitpos */
740	 complain_overflow_signed, /* complain_on_overflow */
741	 bfd_elf_generic_reloc,	/* special_function */
742	 "GPREL16",		/* name */
743	 false,			/* partial_inplace */
744	 0xffff,		/* src_mask */
745	 0xffff,		/* dst_mask */
746	 false),		/* pcrel_offset */
747
748  /* Skip 20 - 23; deprecated ECOFF relocs.  */
749  SKIP_HOWTO (20),
750  SKIP_HOWTO (21),
751  SKIP_HOWTO (22),
752  SKIP_HOWTO (23),
753
754  /* Misc ELF relocations.  */
755
756  /* A dynamic relocation to copy the target into our .dynbss section.  */
757  /* Not generated, as all Alpha objects use PIC, so it is not needed.  It
758     is present because every other ELF has one, but should not be used
759     because .dynbss is an ugly thing.  */
760  HOWTO (R_ALPHA_COPY,
761	 0,
762	 0,
763	 0,
764	 false,
765	 0,
766	 complain_overflow_dont,
767	 bfd_elf_generic_reloc,
768	 "COPY",
769	 false,
770	 0,
771	 0,
772	 true),
773
774  /* A dynamic relocation for a .got entry.  */
775  HOWTO (R_ALPHA_GLOB_DAT,
776	 0,
777	 0,
778	 0,
779	 false,
780	 0,
781	 complain_overflow_dont,
782	 bfd_elf_generic_reloc,
783	 "GLOB_DAT",
784	 false,
785	 0,
786	 0,
787	 true),
788
789  /* A dynamic relocation for a .plt entry.  */
790  HOWTO (R_ALPHA_JMP_SLOT,
791	 0,
792	 0,
793	 0,
794	 false,
795	 0,
796	 complain_overflow_dont,
797	 bfd_elf_generic_reloc,
798	 "JMP_SLOT",
799	 false,
800	 0,
801	 0,
802	 true),
803
804  /* A dynamic relocation to add the base of the DSO to a 64-bit field.  */
805  HOWTO (R_ALPHA_RELATIVE,
806	 0,
807	 0,
808	 0,
809	 false,
810	 0,
811	 complain_overflow_dont,
812	 bfd_elf_generic_reloc,
813	 "RELATIVE",
814	 false,
815	 0,
816	 0,
817	 true),
818
819  /* A 21 bit branch that adjusts for gp loads.  */
820  HOWTO (R_ALPHA_BRSGP,		/* type */
821	 2,			/* rightshift */
822	 4,			/* size */
823	 21,			/* bitsize */
824	 true,			/* pc_relative */
825	 0,			/* bitpos */
826	 complain_overflow_signed, /* complain_on_overflow */
827	 bfd_elf_generic_reloc,	/* special_function */
828	 "BRSGP",		/* name */
829	 false,			/* partial_inplace */
830	 0x1fffff,		/* src_mask */
831	 0x1fffff,		/* dst_mask */
832	 true),			/* pcrel_offset */
833
834  /* Creates a tls_index for the symbol in the got.  */
835  HOWTO (R_ALPHA_TLSGD,		/* type */
836	 0,			/* rightshift */
837	 2,			/* size */
838	 16,			/* bitsize */
839	 false,			/* pc_relative */
840	 0,			/* bitpos */
841	 complain_overflow_signed, /* complain_on_overflow */
842	 bfd_elf_generic_reloc,	/* special_function */
843	 "TLSGD",		/* name */
844	 false,			/* partial_inplace */
845	 0xffff,		/* src_mask */
846	 0xffff,		/* dst_mask */
847	 false),		/* pcrel_offset */
848
849  /* Creates a tls_index for the (current) module in the got.  */
850  HOWTO (R_ALPHA_TLSLDM,	/* type */
851	 0,			/* rightshift */
852	 2,			/* size */
853	 16,			/* bitsize */
854	 false,			/* pc_relative */
855	 0,			/* bitpos */
856	 complain_overflow_signed, /* complain_on_overflow */
857	 bfd_elf_generic_reloc,	/* special_function */
858	 "TLSLDM",		/* name */
859	 false,			/* partial_inplace */
860	 0xffff,		/* src_mask */
861	 0xffff,		/* dst_mask */
862	 false),		/* pcrel_offset */
863
864  /* A dynamic relocation for a DTP module entry.  */
865  HOWTO (R_ALPHA_DTPMOD64,	/* type */
866	 0,			/* rightshift */
867	 8,			/* size */
868	 64,			/* bitsize */
869	 false,			/* pc_relative */
870	 0,			/* bitpos */
871	 complain_overflow_bitfield, /* complain_on_overflow */
872	 bfd_elf_generic_reloc,	/* special_function */
873	 "DTPMOD64",		/* name */
874	 false,			/* partial_inplace */
875	 MINUS_ONE,		/* src_mask */
876	 MINUS_ONE,		/* dst_mask */
877	 false),		/* pcrel_offset */
878
879  /* Creates a 64-bit offset in the got for the displacement
880     from DTP to the target.  */
881  HOWTO (R_ALPHA_GOTDTPREL,	/* type */
882	 0,			/* rightshift */
883	 2,			/* size */
884	 16,			/* bitsize */
885	 false,			/* pc_relative */
886	 0,			/* bitpos */
887	 complain_overflow_signed, /* complain_on_overflow */
888	 bfd_elf_generic_reloc,	/* special_function */
889	 "GOTDTPREL",		/* name */
890	 false,			/* partial_inplace */
891	 0xffff,		/* src_mask */
892	 0xffff,		/* dst_mask */
893	 false),		/* pcrel_offset */
894
895  /* A dynamic relocation for a displacement from DTP to the target.  */
896  HOWTO (R_ALPHA_DTPREL64,	/* type */
897	 0,			/* rightshift */
898	 8,			/* size */
899	 64,			/* bitsize */
900	 false,			/* pc_relative */
901	 0,			/* bitpos */
902	 complain_overflow_bitfield, /* complain_on_overflow */
903	 bfd_elf_generic_reloc,	/* special_function */
904	 "DTPREL64",		/* name */
905	 false,			/* partial_inplace */
906	 MINUS_ONE,		/* src_mask */
907	 MINUS_ONE,		/* dst_mask */
908	 false),		/* pcrel_offset */
909
910  /* The high 16 bits of the displacement from DTP to the target.  */
911  HOWTO (R_ALPHA_DTPRELHI,	/* type */
912	 0,			/* rightshift */
913	 2,			/* size */
914	 16,			/* bitsize */
915	 false,			/* pc_relative */
916	 0,			/* bitpos */
917	 complain_overflow_signed, /* complain_on_overflow */
918	 bfd_elf_generic_reloc,	/* special_function */
919	 "DTPRELHI",		/* name */
920	 false,			/* partial_inplace */
921	 0xffff,		/* src_mask */
922	 0xffff,		/* dst_mask */
923	 false),		/* pcrel_offset */
924
925  /* The low 16 bits of the displacement from DTP to the target.  */
926  HOWTO (R_ALPHA_DTPRELLO,	/* type */
927	 0,			/* rightshift */
928	 2,			/* size */
929	 16,			/* bitsize */
930	 false,			/* pc_relative */
931	 0,			/* bitpos */
932	 complain_overflow_dont, /* complain_on_overflow */
933	 bfd_elf_generic_reloc,	/* special_function */
934	 "DTPRELLO",		/* name */
935	 false,			/* partial_inplace */
936	 0xffff,		/* src_mask */
937	 0xffff,		/* dst_mask */
938	 false),		/* pcrel_offset */
939
940  /* A 16-bit displacement from DTP to the target.  */
941  HOWTO (R_ALPHA_DTPREL16,	/* type */
942	 0,			/* rightshift */
943	 2,			/* size */
944	 16,			/* bitsize */
945	 false,			/* pc_relative */
946	 0,			/* bitpos */
947	 complain_overflow_signed, /* complain_on_overflow */
948	 bfd_elf_generic_reloc,	/* special_function */
949	 "DTPREL16",		/* name */
950	 false,			/* partial_inplace */
951	 0xffff,		/* src_mask */
952	 0xffff,		/* dst_mask */
953	 false),		/* pcrel_offset */
954
955  /* Creates a 64-bit offset in the got for the displacement
956     from TP to the target.  */
957  HOWTO (R_ALPHA_GOTTPREL,	/* type */
958	 0,			/* rightshift */
959	 2,			/* size */
960	 16,			/* bitsize */
961	 false,			/* pc_relative */
962	 0,			/* bitpos */
963	 complain_overflow_signed, /* complain_on_overflow */
964	 bfd_elf_generic_reloc,	/* special_function */
965	 "GOTTPREL",		/* name */
966	 false,			/* partial_inplace */
967	 0xffff,		/* src_mask */
968	 0xffff,		/* dst_mask */
969	 false),		/* pcrel_offset */
970
971  /* A dynamic relocation for a displacement from TP to the target.  */
972  HOWTO (R_ALPHA_TPREL64,	/* type */
973	 0,			/* rightshift */
974	 8,			/* size */
975	 64,			/* bitsize */
976	 false,			/* pc_relative */
977	 0,			/* bitpos */
978	 complain_overflow_bitfield, /* complain_on_overflow */
979	 bfd_elf_generic_reloc,	/* special_function */
980	 "TPREL64",		/* name */
981	 false,			/* partial_inplace */
982	 MINUS_ONE,		/* src_mask */
983	 MINUS_ONE,		/* dst_mask */
984	 false),		/* pcrel_offset */
985
986  /* The high 16 bits of the displacement from TP to the target.  */
987  HOWTO (R_ALPHA_TPRELHI,	/* type */
988	 0,			/* rightshift */
989	 2,			/* size */
990	 16,			/* bitsize */
991	 false,			/* pc_relative */
992	 0,			/* bitpos */
993	 complain_overflow_signed, /* complain_on_overflow */
994	 bfd_elf_generic_reloc,	/* special_function */
995	 "TPRELHI",		/* name */
996	 false,			/* partial_inplace */
997	 0xffff,		/* src_mask */
998	 0xffff,		/* dst_mask */
999	 false),		/* pcrel_offset */
1000
1001  /* The low 16 bits of the displacement from TP to the target.  */
1002  HOWTO (R_ALPHA_TPRELLO,	/* type */
1003	 0,			/* rightshift */
1004	 2,			/* size */
1005	 16,			/* bitsize */
1006	 false,			/* pc_relative */
1007	 0,			/* bitpos */
1008	 complain_overflow_dont, /* complain_on_overflow */
1009	 bfd_elf_generic_reloc,	/* special_function */
1010	 "TPRELLO",		/* name */
1011	 false,			/* partial_inplace */
1012	 0xffff,		/* src_mask */
1013	 0xffff,		/* dst_mask */
1014	 false),		/* pcrel_offset */
1015
1016  /* A 16-bit displacement from TP to the target.  */
1017  HOWTO (R_ALPHA_TPREL16,	/* type */
1018	 0,			/* rightshift */
1019	 2,			/* size */
1020	 16,			/* bitsize */
1021	 false,			/* pc_relative */
1022	 0,			/* bitpos */
1023	 complain_overflow_signed, /* complain_on_overflow */
1024	 bfd_elf_generic_reloc,	/* special_function */
1025	 "TPREL16",		/* name */
1026	 false,			/* partial_inplace */
1027	 0xffff,		/* src_mask */
1028	 0xffff,		/* dst_mask */
1029	 false),		/* pcrel_offset */
1030};
1031
1032/* A mapping from BFD reloc types to Alpha ELF reloc types.  */
1033
1034struct elf_reloc_map
1035{
1036  bfd_reloc_code_real_type bfd_reloc_val;
1037  int elf_reloc_val;
1038};
1039
1040static const struct elf_reloc_map elf64_alpha_reloc_map[] =
1041{
1042  {BFD_RELOC_NONE,			R_ALPHA_NONE},
1043  {BFD_RELOC_32,			R_ALPHA_REFLONG},
1044  {BFD_RELOC_64,			R_ALPHA_REFQUAD},
1045  {BFD_RELOC_CTOR,			R_ALPHA_REFQUAD},
1046  {BFD_RELOC_GPREL32,			R_ALPHA_GPREL32},
1047  {BFD_RELOC_ALPHA_ELF_LITERAL,		R_ALPHA_LITERAL},
1048  {BFD_RELOC_ALPHA_LITUSE,		R_ALPHA_LITUSE},
1049  {BFD_RELOC_ALPHA_GPDISP,		R_ALPHA_GPDISP},
1050  {BFD_RELOC_23_PCREL_S2,		R_ALPHA_BRADDR},
1051  {BFD_RELOC_ALPHA_HINT,		R_ALPHA_HINT},
1052  {BFD_RELOC_16_PCREL,			R_ALPHA_SREL16},
1053  {BFD_RELOC_32_PCREL,			R_ALPHA_SREL32},
1054  {BFD_RELOC_64_PCREL,			R_ALPHA_SREL64},
1055  {BFD_RELOC_ALPHA_GPREL_HI16,		R_ALPHA_GPRELHIGH},
1056  {BFD_RELOC_ALPHA_GPREL_LO16,		R_ALPHA_GPRELLOW},
1057  {BFD_RELOC_GPREL16,			R_ALPHA_GPREL16},
1058  {BFD_RELOC_ALPHA_BRSGP,		R_ALPHA_BRSGP},
1059  {BFD_RELOC_ALPHA_TLSGD,		R_ALPHA_TLSGD},
1060  {BFD_RELOC_ALPHA_TLSLDM,		R_ALPHA_TLSLDM},
1061  {BFD_RELOC_ALPHA_DTPMOD64,		R_ALPHA_DTPMOD64},
1062  {BFD_RELOC_ALPHA_GOTDTPREL16,		R_ALPHA_GOTDTPREL},
1063  {BFD_RELOC_ALPHA_DTPREL64,		R_ALPHA_DTPREL64},
1064  {BFD_RELOC_ALPHA_DTPREL_HI16,		R_ALPHA_DTPRELHI},
1065  {BFD_RELOC_ALPHA_DTPREL_LO16,		R_ALPHA_DTPRELLO},
1066  {BFD_RELOC_ALPHA_DTPREL16,		R_ALPHA_DTPREL16},
1067  {BFD_RELOC_ALPHA_GOTTPREL16,		R_ALPHA_GOTTPREL},
1068  {BFD_RELOC_ALPHA_TPREL64,		R_ALPHA_TPREL64},
1069  {BFD_RELOC_ALPHA_TPREL_HI16,		R_ALPHA_TPRELHI},
1070  {BFD_RELOC_ALPHA_TPREL_LO16,		R_ALPHA_TPRELLO},
1071  {BFD_RELOC_ALPHA_TPREL16,		R_ALPHA_TPREL16},
1072};
1073
1074/* Given a BFD reloc type, return a HOWTO structure.  */
1075
1076static reloc_howto_type *
1077elf64_alpha_bfd_reloc_type_lookup (bfd *abfd ATTRIBUTE_UNUSED,
1078				   bfd_reloc_code_real_type code)
1079{
1080  const struct elf_reloc_map *i, *e;
1081  i = e = elf64_alpha_reloc_map;
1082  e += sizeof (elf64_alpha_reloc_map) / sizeof (struct elf_reloc_map);
1083  for (; i != e; ++i)
1084    {
1085      if (i->bfd_reloc_val == code)
1086	return &elf64_alpha_howto_table[i->elf_reloc_val];
1087    }
1088  return 0;
1089}
1090
1091static reloc_howto_type *
1092elf64_alpha_bfd_reloc_name_lookup (bfd *abfd ATTRIBUTE_UNUSED,
1093				   const char *r_name)
1094{
1095  unsigned int i;
1096
1097  for (i = 0;
1098       i < (sizeof (elf64_alpha_howto_table)
1099	    / sizeof (elf64_alpha_howto_table[0]));
1100       i++)
1101    if (elf64_alpha_howto_table[i].name != NULL
1102	&& strcasecmp (elf64_alpha_howto_table[i].name, r_name) == 0)
1103      return &elf64_alpha_howto_table[i];
1104
1105  return NULL;
1106}
1107
1108/* Given an Alpha ELF reloc type, fill in an arelent structure.  */
1109
1110static bool
1111elf64_alpha_info_to_howto (bfd *abfd, arelent *cache_ptr,
1112			   Elf_Internal_Rela *dst)
1113{
1114  unsigned r_type = ELF64_R_TYPE(dst->r_info);
1115
1116  if (r_type >= R_ALPHA_max)
1117    {
1118      /* xgettext:c-format */
1119      _bfd_error_handler (_("%pB: unsupported relocation type %#x"),
1120			  abfd, r_type);
1121      bfd_set_error (bfd_error_bad_value);
1122      return false;
1123    }
1124  cache_ptr->howto = &elf64_alpha_howto_table[r_type];
1125  return true;
1126}
1127
1128/* These two relocations create a two-word entry in the got.  */
1129#define alpha_got_entry_size(r_type) \
1130  (r_type == R_ALPHA_TLSGD || r_type == R_ALPHA_TLSLDM ? 16 : 8)
1131
1132/* This is PT_TLS segment p_vaddr.  */
1133#define alpha_get_dtprel_base(info) \
1134  (elf_hash_table (info)->tls_sec->vma)
1135
1136/* Main program TLS (whose template starts at PT_TLS p_vaddr)
1137   is assigned offset round(16, PT_TLS p_align).  */
1138#define alpha_get_tprel_base(info) \
1139  (elf_hash_table (info)->tls_sec->vma					\
1140   - align_power ((bfd_vma) 16,						\
1141		  elf_hash_table (info)->tls_sec->alignment_power))
1142
1143/* Handle an Alpha specific section when reading an object file.  This
1144   is called when bfd_section_from_shdr finds a section with an unknown
1145   type.  */
1146
1147static bool
1148elf64_alpha_section_from_shdr (bfd *abfd,
1149			       Elf_Internal_Shdr *hdr,
1150			       const char *name,
1151			       int shindex)
1152{
1153  asection *newsect;
1154
1155  /* There ought to be a place to keep ELF backend specific flags, but
1156     at the moment there isn't one.  We just keep track of the
1157     sections by their name, instead.  Fortunately, the ABI gives
1158     suggested names for all the MIPS specific sections, so we will
1159     probably get away with this.  */
1160  switch (hdr->sh_type)
1161    {
1162    case SHT_ALPHA_DEBUG:
1163      if (strcmp (name, ".mdebug") != 0)
1164	return false;
1165      break;
1166    default:
1167      return false;
1168    }
1169
1170  if (! _bfd_elf_make_section_from_shdr (abfd, hdr, name, shindex))
1171    return false;
1172  newsect = hdr->bfd_section;
1173
1174  if (hdr->sh_type == SHT_ALPHA_DEBUG)
1175    {
1176      if (!bfd_set_section_flags (newsect,
1177				  bfd_section_flags (newsect) | SEC_DEBUGGING))
1178	return false;
1179    }
1180
1181  return true;
1182}
1183
1184/* Convert Alpha specific section flags to bfd internal section flags.  */
1185
1186static bool
1187elf64_alpha_section_flags (const Elf_Internal_Shdr *hdr)
1188{
1189  if (hdr->sh_flags & SHF_ALPHA_GPREL)
1190    hdr->bfd_section->flags |= SEC_SMALL_DATA;
1191
1192  return true;
1193}
1194
1195/* Set the correct type for an Alpha ELF section.  We do this by the
1196   section name, which is a hack, but ought to work.  */
1197
1198static bool
1199elf64_alpha_fake_sections (bfd *abfd, Elf_Internal_Shdr *hdr, asection *sec)
1200{
1201  register const char *name;
1202
1203  name = bfd_section_name (sec);
1204
1205  if (strcmp (name, ".mdebug") == 0)
1206    {
1207      hdr->sh_type = SHT_ALPHA_DEBUG;
1208      /* In a shared object on Irix 5.3, the .mdebug section has an
1209	 entsize of 0.  FIXME: Does this matter?  */
1210      if ((abfd->flags & DYNAMIC) != 0 )
1211	hdr->sh_entsize = 0;
1212      else
1213	hdr->sh_entsize = 1;
1214    }
1215  else if ((sec->flags & SEC_SMALL_DATA)
1216	   || strcmp (name, ".sdata") == 0
1217	   || strcmp (name, ".sbss") == 0
1218	   || strcmp (name, ".lit4") == 0
1219	   || strcmp (name, ".lit8") == 0)
1220    hdr->sh_flags |= SHF_ALPHA_GPREL;
1221
1222  return true;
1223}
1224
1225/* Hook called by the linker routine which adds symbols from an object
1226   file.  We use it to put .comm items in .sbss, and not .bss.  */
1227
1228static bool
1229elf64_alpha_add_symbol_hook (bfd *abfd, struct bfd_link_info *info,
1230			     Elf_Internal_Sym *sym,
1231			     const char **namep ATTRIBUTE_UNUSED,
1232			     flagword *flagsp ATTRIBUTE_UNUSED,
1233			     asection **secp, bfd_vma *valp)
1234{
1235  if (sym->st_shndx == SHN_COMMON
1236      && !bfd_link_relocatable (info)
1237      && sym->st_size <= elf_gp_size (abfd))
1238    {
1239      /* Common symbols less than or equal to -G nn bytes are
1240	 automatically put into .sbss.  */
1241
1242      asection *scomm = bfd_get_section_by_name (abfd, ".scommon");
1243
1244      if (scomm == NULL)
1245	{
1246	  scomm = bfd_make_section_with_flags (abfd, ".scommon",
1247					       (SEC_ALLOC
1248						| SEC_IS_COMMON
1249						| SEC_SMALL_DATA
1250						| SEC_LINKER_CREATED));
1251	  if (scomm == NULL)
1252	    return false;
1253	}
1254
1255      *secp = scomm;
1256      *valp = sym->st_size;
1257    }
1258
1259  return true;
1260}
1261
1262/* Create the .got section.  */
1263
1264static bool
1265elf64_alpha_create_got_section (bfd *abfd,
1266				struct bfd_link_info *info ATTRIBUTE_UNUSED)
1267{
1268  flagword flags;
1269  asection *s;
1270
1271  if (! is_alpha_elf (abfd))
1272    return false;
1273
1274  flags = (SEC_ALLOC | SEC_LOAD | SEC_HAS_CONTENTS | SEC_IN_MEMORY
1275	   | SEC_LINKER_CREATED);
1276  s = bfd_make_section_anyway_with_flags (abfd, ".got", flags);
1277  if (s == NULL
1278      || !bfd_set_section_alignment (s, 3))
1279    return false;
1280
1281  alpha_elf_tdata (abfd)->got = s;
1282
1283  /* Make sure the object's gotobj is set to itself so that we default
1284     to every object with its own .got.  We'll merge .gots later once
1285     we've collected each object's info.  */
1286  alpha_elf_tdata (abfd)->gotobj = abfd;
1287
1288  return true;
1289}
1290
1291/* Create all the dynamic sections.  */
1292
1293static bool
1294elf64_alpha_create_dynamic_sections (bfd *abfd, struct bfd_link_info *info)
1295{
1296  asection *s;
1297  flagword flags;
1298  struct elf_link_hash_entry *h;
1299
1300  if (! is_alpha_elf (abfd))
1301    return false;
1302
1303  /* We need to create .plt, .rela.plt, .got, and .rela.got sections.  */
1304
1305  flags = (SEC_ALLOC | SEC_LOAD | SEC_CODE | SEC_HAS_CONTENTS | SEC_IN_MEMORY
1306	   | SEC_LINKER_CREATED
1307	   | (elf64_alpha_use_secureplt ? SEC_READONLY : 0));
1308  s = bfd_make_section_anyway_with_flags (abfd, ".plt", flags);
1309  elf_hash_table (info)->splt = s;
1310  if (s == NULL || ! bfd_set_section_alignment (s, 4))
1311    return false;
1312
1313  /* Define the symbol _PROCEDURE_LINKAGE_TABLE_ at the start of the
1314     .plt section.  */
1315  h = _bfd_elf_define_linkage_sym (abfd, info, s,
1316				   "_PROCEDURE_LINKAGE_TABLE_");
1317  elf_hash_table (info)->hplt = h;
1318  if (h == NULL)
1319    return false;
1320
1321  flags = (SEC_ALLOC | SEC_LOAD | SEC_HAS_CONTENTS | SEC_IN_MEMORY
1322	   | SEC_LINKER_CREATED | SEC_READONLY);
1323  s = bfd_make_section_anyway_with_flags (abfd, ".rela.plt", flags);
1324  elf_hash_table (info)->srelplt = s;
1325  if (s == NULL || ! bfd_set_section_alignment (s, 3))
1326    return false;
1327
1328  if (elf64_alpha_use_secureplt)
1329    {
1330      flags = SEC_ALLOC | SEC_LINKER_CREATED;
1331      s = bfd_make_section_anyway_with_flags (abfd, ".got.plt", flags);
1332      elf_hash_table (info)->sgotplt = s;
1333      if (s == NULL || ! bfd_set_section_alignment (s, 3))
1334	return false;
1335    }
1336
1337  /* We may or may not have created a .got section for this object, but
1338     we definitely havn't done the rest of the work.  */
1339
1340  if (alpha_elf_tdata(abfd)->gotobj == NULL)
1341    {
1342      if (!elf64_alpha_create_got_section (abfd, info))
1343	return false;
1344    }
1345
1346  flags = (SEC_ALLOC | SEC_LOAD | SEC_HAS_CONTENTS | SEC_IN_MEMORY
1347	   | SEC_LINKER_CREATED | SEC_READONLY);
1348  s = bfd_make_section_anyway_with_flags (abfd, ".rela.got", flags);
1349  elf_hash_table (info)->srelgot = s;
1350  if (s == NULL
1351      || !bfd_set_section_alignment (s, 3))
1352    return false;
1353
1354  /* Define the symbol _GLOBAL_OFFSET_TABLE_ at the start of the
1355     dynobj's .got section.  We don't do this in the linker script
1356     because we don't want to define the symbol if we are not creating
1357     a global offset table.  */
1358  h = _bfd_elf_define_linkage_sym (abfd, info, alpha_elf_tdata(abfd)->got,
1359				   "_GLOBAL_OFFSET_TABLE_");
1360  elf_hash_table (info)->hgot = h;
1361  if (h == NULL)
1362    return false;
1363
1364  return true;
1365}
1366
1367/* Read ECOFF debugging information from a .mdebug section into a
1368   ecoff_debug_info structure.  */
1369
1370static bool
1371elf64_alpha_read_ecoff_info (bfd *abfd, asection *section,
1372			     struct ecoff_debug_info *debug)
1373{
1374  HDRR *symhdr;
1375  const struct ecoff_debug_swap *swap;
1376  char *ext_hdr = NULL;
1377
1378  swap = get_elf_backend_data (abfd)->elf_backend_ecoff_debug_swap;
1379  memset (debug, 0, sizeof (*debug));
1380
1381  ext_hdr = (char *) bfd_malloc (swap->external_hdr_size);
1382  if (ext_hdr == NULL && swap->external_hdr_size != 0)
1383    goto error_return;
1384
1385  if (! bfd_get_section_contents (abfd, section, ext_hdr, (file_ptr) 0,
1386				  swap->external_hdr_size))
1387    goto error_return;
1388
1389  symhdr = &debug->symbolic_header;
1390  (*swap->swap_hdr_in) (abfd, ext_hdr, symhdr);
1391
1392  /* The symbolic header contains absolute file offsets and sizes to
1393     read.  */
1394#define READ(ptr, offset, count, size, type)				\
1395  do									\
1396    {									\
1397      size_t amt;							\
1398      debug->ptr = NULL;						\
1399      if (symhdr->count == 0)						\
1400	break;								\
1401      if (_bfd_mul_overflow (size, symhdr->count, &amt))		\
1402	{								\
1403	  bfd_set_error (bfd_error_file_too_big);			\
1404	  goto error_return;						\
1405	}								\
1406      if (bfd_seek (abfd, symhdr->offset, SEEK_SET) != 0)		\
1407	goto error_return;						\
1408      debug->ptr = (type) _bfd_malloc_and_read (abfd, amt, amt);	\
1409      if (debug->ptr == NULL)						\
1410	goto error_return;						\
1411    } while (0)
1412
1413  READ (line, cbLineOffset, cbLine, sizeof (unsigned char), unsigned char *);
1414  READ (external_dnr, cbDnOffset, idnMax, swap->external_dnr_size, void *);
1415  READ (external_pdr, cbPdOffset, ipdMax, swap->external_pdr_size, void *);
1416  READ (external_sym, cbSymOffset, isymMax, swap->external_sym_size, void *);
1417  READ (external_opt, cbOptOffset, ioptMax, swap->external_opt_size, void *);
1418  READ (external_aux, cbAuxOffset, iauxMax, sizeof (union aux_ext),
1419	union aux_ext *);
1420  READ (ss, cbSsOffset, issMax, sizeof (char), char *);
1421  READ (ssext, cbSsExtOffset, issExtMax, sizeof (char), char *);
1422  READ (external_fdr, cbFdOffset, ifdMax, swap->external_fdr_size, void *);
1423  READ (external_rfd, cbRfdOffset, crfd, swap->external_rfd_size, void *);
1424  READ (external_ext, cbExtOffset, iextMax, swap->external_ext_size, void *);
1425#undef READ
1426
1427  debug->fdr = NULL;
1428
1429  return true;
1430
1431 error_return:
1432  free (ext_hdr);
1433  free (debug->line);
1434  free (debug->external_dnr);
1435  free (debug->external_pdr);
1436  free (debug->external_sym);
1437  free (debug->external_opt);
1438  free (debug->external_aux);
1439  free (debug->ss);
1440  free (debug->ssext);
1441  free (debug->external_fdr);
1442  free (debug->external_rfd);
1443  free (debug->external_ext);
1444  return false;
1445}
1446
1447/* Alpha ELF local labels start with '$'.  */
1448
1449static bool
1450elf64_alpha_is_local_label_name (bfd *abfd ATTRIBUTE_UNUSED, const char *name)
1451{
1452  return name[0] == '$';
1453}
1454
1455static bool
1456elf64_alpha_find_nearest_line (bfd *abfd, asymbol **symbols,
1457			       asection *section, bfd_vma offset,
1458			       const char **filename_ptr,
1459			       const char **functionname_ptr,
1460			       unsigned int *line_ptr,
1461			       unsigned int *discriminator_ptr)
1462{
1463  asection *msec;
1464
1465  if (_bfd_dwarf2_find_nearest_line (abfd, symbols, NULL, section, offset,
1466				     filename_ptr, functionname_ptr,
1467				     line_ptr, discriminator_ptr,
1468				     dwarf_debug_sections,
1469				     &elf_tdata (abfd)->dwarf2_find_line_info)
1470      == 1)
1471    return true;
1472
1473  msec = bfd_get_section_by_name (abfd, ".mdebug");
1474  if (msec != NULL)
1475    {
1476      flagword origflags;
1477      struct alpha_elf_find_line *fi;
1478      const struct ecoff_debug_swap * const swap =
1479	get_elf_backend_data (abfd)->elf_backend_ecoff_debug_swap;
1480
1481      /* If we are called during a link, alpha_elf_final_link may have
1482	 cleared the SEC_HAS_CONTENTS field.  We force it back on here
1483	 if appropriate (which it normally will be).  */
1484      origflags = msec->flags;
1485      if (elf_section_data (msec)->this_hdr.sh_type != SHT_NOBITS)
1486	msec->flags |= SEC_HAS_CONTENTS;
1487
1488      fi = alpha_elf_tdata (abfd)->find_line_info;
1489      if (fi == NULL)
1490	{
1491	  bfd_size_type external_fdr_size;
1492	  char *fraw_src;
1493	  char *fraw_end;
1494	  struct fdr *fdr_ptr;
1495	  bfd_size_type amt = sizeof (struct alpha_elf_find_line);
1496
1497	  fi = (struct alpha_elf_find_line *) bfd_zalloc (abfd, amt);
1498	  if (fi == NULL)
1499	    {
1500	      msec->flags = origflags;
1501	      return false;
1502	    }
1503
1504	  if (!elf64_alpha_read_ecoff_info (abfd, msec, &fi->d))
1505	    {
1506	      msec->flags = origflags;
1507	      return false;
1508	    }
1509
1510	  /* Swap in the FDR information.  */
1511	  amt = fi->d.symbolic_header.ifdMax * sizeof (struct fdr);
1512	  fi->d.fdr = (struct fdr *) bfd_alloc (abfd, amt);
1513	  if (fi->d.fdr == NULL)
1514	    {
1515	      msec->flags = origflags;
1516	      return false;
1517	    }
1518	  external_fdr_size = swap->external_fdr_size;
1519	  fdr_ptr = fi->d.fdr;
1520	  fraw_src = (char *) fi->d.external_fdr;
1521	  fraw_end = (fraw_src
1522		      + fi->d.symbolic_header.ifdMax * external_fdr_size);
1523	  for (; fraw_src < fraw_end; fraw_src += external_fdr_size, fdr_ptr++)
1524	    (*swap->swap_fdr_in) (abfd, fraw_src, fdr_ptr);
1525
1526	  alpha_elf_tdata (abfd)->find_line_info = fi;
1527
1528	  /* Note that we don't bother to ever free this information.
1529	     find_nearest_line is either called all the time, as in
1530	     objdump -l, so the information should be saved, or it is
1531	     rarely called, as in ld error messages, so the memory
1532	     wasted is unimportant.  Still, it would probably be a
1533	     good idea for free_cached_info to throw it away.  */
1534	}
1535
1536      if (_bfd_ecoff_locate_line (abfd, section, offset, &fi->d, swap,
1537				  &fi->i, filename_ptr, functionname_ptr,
1538				  line_ptr))
1539	{
1540	  msec->flags = origflags;
1541	  return true;
1542	}
1543
1544      msec->flags = origflags;
1545    }
1546
1547  /* Fall back on the generic ELF find_nearest_line routine.  */
1548
1549  return _bfd_elf_find_nearest_line (abfd, symbols, section, offset,
1550				     filename_ptr, functionname_ptr,
1551				     line_ptr, discriminator_ptr);
1552}
1553
1554/* Structure used to pass information to alpha_elf_output_extsym.  */
1555
1556struct extsym_info
1557{
1558  bfd *abfd;
1559  struct bfd_link_info *info;
1560  struct ecoff_debug_info *debug;
1561  const struct ecoff_debug_swap *swap;
1562  bool failed;
1563};
1564
1565static bool
1566elf64_alpha_output_extsym (struct elf_link_hash_entry *x, void * data)
1567{
1568  struct alpha_elf_link_hash_entry *h = (struct alpha_elf_link_hash_entry *) x;
1569  struct extsym_info *einfo = (struct extsym_info *) data;
1570  bool strip;
1571  asection *sec, *output_section;
1572
1573  if (h->root.indx == -2)
1574    strip = false;
1575  else if ((h->root.def_dynamic
1576	    || h->root.ref_dynamic
1577	    || h->root.root.type == bfd_link_hash_new)
1578	   && !h->root.def_regular
1579	   && !h->root.ref_regular)
1580    strip = true;
1581  else if (einfo->info->strip == strip_all
1582	   || (einfo->info->strip == strip_some
1583	       && bfd_hash_lookup (einfo->info->keep_hash,
1584				   h->root.root.root.string,
1585				   false, false) == NULL))
1586    strip = true;
1587  else
1588    strip = false;
1589
1590  if (strip)
1591    return true;
1592
1593  if (h->esym.ifd == -2)
1594    {
1595      h->esym.jmptbl = 0;
1596      h->esym.cobol_main = 0;
1597      h->esym.weakext = 0;
1598      h->esym.reserved = 0;
1599      h->esym.ifd = ifdNil;
1600      h->esym.asym.value = 0;
1601      h->esym.asym.st = stGlobal;
1602
1603      if (h->root.root.type != bfd_link_hash_defined
1604	  && h->root.root.type != bfd_link_hash_defweak)
1605	h->esym.asym.sc = scAbs;
1606      else
1607	{
1608	  const char *name;
1609
1610	  sec = h->root.root.u.def.section;
1611	  output_section = sec->output_section;
1612
1613	  /* When making a shared library and symbol h is the one from
1614	     the another shared library, OUTPUT_SECTION may be null.  */
1615	  if (output_section == NULL)
1616	    h->esym.asym.sc = scUndefined;
1617	  else
1618	    {
1619	      name = bfd_section_name (output_section);
1620
1621	      if (strcmp (name, ".text") == 0)
1622		h->esym.asym.sc = scText;
1623	      else if (strcmp (name, ".data") == 0)
1624		h->esym.asym.sc = scData;
1625	      else if (strcmp (name, ".sdata") == 0)
1626		h->esym.asym.sc = scSData;
1627	      else if (strcmp (name, ".rodata") == 0
1628		       || strcmp (name, ".rdata") == 0)
1629		h->esym.asym.sc = scRData;
1630	      else if (strcmp (name, ".bss") == 0)
1631		h->esym.asym.sc = scBss;
1632	      else if (strcmp (name, ".sbss") == 0)
1633		h->esym.asym.sc = scSBss;
1634	      else if (strcmp (name, ".init") == 0)
1635		h->esym.asym.sc = scInit;
1636	      else if (strcmp (name, ".fini") == 0)
1637		h->esym.asym.sc = scFini;
1638	      else
1639		h->esym.asym.sc = scAbs;
1640	    }
1641	}
1642
1643      h->esym.asym.reserved = 0;
1644      h->esym.asym.index = indexNil;
1645    }
1646
1647  if (h->root.root.type == bfd_link_hash_common)
1648    h->esym.asym.value = h->root.root.u.c.size;
1649  else if (h->root.root.type == bfd_link_hash_defined
1650	   || h->root.root.type == bfd_link_hash_defweak)
1651    {
1652      if (h->esym.asym.sc == scCommon)
1653	h->esym.asym.sc = scBss;
1654      else if (h->esym.asym.sc == scSCommon)
1655	h->esym.asym.sc = scSBss;
1656
1657      sec = h->root.root.u.def.section;
1658      output_section = sec->output_section;
1659      if (output_section != NULL)
1660	h->esym.asym.value = (h->root.root.u.def.value
1661			      + sec->output_offset
1662			      + output_section->vma);
1663      else
1664	h->esym.asym.value = 0;
1665    }
1666
1667  if (! bfd_ecoff_debug_one_external (einfo->abfd, einfo->debug, einfo->swap,
1668				      h->root.root.root.string,
1669				      &h->esym))
1670    {
1671      einfo->failed = true;
1672      return false;
1673    }
1674
1675  return true;
1676}
1677
1678/* Search for and possibly create a got entry.  */
1679
1680static struct alpha_elf_got_entry *
1681get_got_entry (bfd *abfd, struct alpha_elf_link_hash_entry *h,
1682	       unsigned long r_type, unsigned long r_symndx,
1683	       bfd_vma r_addend)
1684{
1685  struct alpha_elf_got_entry *gotent;
1686  struct alpha_elf_got_entry **slot;
1687
1688  if (h)
1689    slot = &h->got_entries;
1690  else
1691    {
1692      /* This is a local .got entry -- record for merge.  */
1693
1694      struct alpha_elf_got_entry **local_got_entries;
1695
1696      local_got_entries = alpha_elf_tdata(abfd)->local_got_entries;
1697      if (!local_got_entries)
1698	{
1699	  bfd_size_type size;
1700	  Elf_Internal_Shdr *symtab_hdr;
1701
1702	  symtab_hdr = &elf_tdata(abfd)->symtab_hdr;
1703	  size = symtab_hdr->sh_info;
1704	  size *= sizeof (struct alpha_elf_got_entry *);
1705
1706	  local_got_entries
1707	    = (struct alpha_elf_got_entry **) bfd_zalloc (abfd, size);
1708	  if (!local_got_entries)
1709	    return NULL;
1710
1711	  alpha_elf_tdata (abfd)->local_got_entries = local_got_entries;
1712	}
1713
1714      slot = &local_got_entries[r_symndx];
1715    }
1716
1717  for (gotent = *slot; gotent ; gotent = gotent->next)
1718    if (gotent->gotobj == abfd
1719	&& gotent->reloc_type == r_type
1720	&& gotent->addend == r_addend)
1721      break;
1722
1723  if (!gotent)
1724    {
1725      int entry_size;
1726      size_t amt;
1727
1728      amt = sizeof (struct alpha_elf_got_entry);
1729      gotent = (struct alpha_elf_got_entry *) bfd_alloc (abfd, amt);
1730      if (!gotent)
1731	return NULL;
1732
1733      gotent->gotobj = abfd;
1734      gotent->addend = r_addend;
1735      gotent->got_offset = -1;
1736      gotent->plt_offset = -1;
1737      gotent->use_count = 1;
1738      gotent->reloc_type = r_type;
1739      gotent->reloc_done = 0;
1740      gotent->reloc_xlated = 0;
1741
1742      gotent->next = *slot;
1743      *slot = gotent;
1744
1745      entry_size = alpha_got_entry_size (r_type);
1746      alpha_elf_tdata (abfd)->total_got_size += entry_size;
1747      if (!h)
1748	alpha_elf_tdata(abfd)->local_got_size += entry_size;
1749    }
1750  else
1751    gotent->use_count += 1;
1752
1753  return gotent;
1754}
1755
1756static bool
1757elf64_alpha_want_plt (struct alpha_elf_link_hash_entry *ah)
1758{
1759  return ((ah->root.type == STT_FUNC
1760	  || ah->root.root.type == bfd_link_hash_undefweak
1761	  || ah->root.root.type == bfd_link_hash_undefined)
1762	  && (ah->flags & ALPHA_ELF_LINK_HASH_LU_PLT) != 0
1763	  && (ah->flags & ~ALPHA_ELF_LINK_HASH_LU_PLT) == 0);
1764}
1765
1766/* Whether to sort relocs output by ld -r or ld --emit-relocs, by r_offset.
1767   Don't do so for code sections.  We want to keep ordering of LITERAL/LITUSE
1768   as is.  On the other hand, elf-eh-frame.c processing requires .eh_frame
1769   relocs to be sorted.  */
1770
1771static bool
1772elf64_alpha_sort_relocs_p (asection *sec)
1773{
1774  return (sec->flags & SEC_CODE) == 0;
1775}
1776
1777
1778/* Handle dynamic relocations when doing an Alpha ELF link.  */
1779
1780static bool
1781elf64_alpha_check_relocs (bfd *abfd, struct bfd_link_info *info,
1782			  asection *sec, const Elf_Internal_Rela *relocs)
1783{
1784  bfd *dynobj;
1785  asection *sreloc;
1786  Elf_Internal_Shdr *symtab_hdr;
1787  struct alpha_elf_link_hash_entry **sym_hashes;
1788  const Elf_Internal_Rela *rel, *relend;
1789
1790  if (bfd_link_relocatable (info))
1791    return true;
1792
1793  BFD_ASSERT (is_alpha_elf (abfd));
1794
1795  dynobj = elf_hash_table (info)->dynobj;
1796  if (dynobj == NULL)
1797    elf_hash_table (info)->dynobj = dynobj = abfd;
1798
1799  sreloc = NULL;
1800  symtab_hdr = &elf_symtab_hdr (abfd);
1801  sym_hashes = alpha_elf_sym_hashes (abfd);
1802
1803  relend = relocs + sec->reloc_count;
1804  for (rel = relocs; rel < relend; ++rel)
1805    {
1806      enum {
1807	NEED_GOT = 1,
1808	NEED_GOT_ENTRY = 2,
1809	NEED_DYNREL = 4
1810      };
1811
1812      unsigned long r_symndx, r_type;
1813      struct alpha_elf_link_hash_entry *h;
1814      unsigned int gotent_flags;
1815      bool maybe_dynamic;
1816      unsigned int need;
1817      bfd_vma addend;
1818
1819      r_symndx = ELF64_R_SYM (rel->r_info);
1820      if (r_symndx < symtab_hdr->sh_info)
1821	h = NULL;
1822      else
1823	{
1824	  h = sym_hashes[r_symndx - symtab_hdr->sh_info];
1825
1826	  while (h->root.root.type == bfd_link_hash_indirect
1827		 || h->root.root.type == bfd_link_hash_warning)
1828	    h = (struct alpha_elf_link_hash_entry *)h->root.root.u.i.link;
1829
1830	  /* PR15323, ref flags aren't set for references in the same
1831	     object.  */
1832	  h->root.ref_regular = 1;
1833	}
1834
1835      /* We can only get preliminary data on whether a symbol is
1836	 locally or externally defined, as not all of the input files
1837	 have yet been processed.  Do something with what we know, as
1838	 this may help reduce memory usage and processing time later.  */
1839      maybe_dynamic = false;
1840      if (h && ((bfd_link_pic (info)
1841		 && (!info->symbolic
1842		     || info->unresolved_syms_in_shared_libs == RM_IGNORE))
1843		|| !h->root.def_regular
1844		|| h->root.root.type == bfd_link_hash_defweak))
1845	maybe_dynamic = true;
1846
1847      need = 0;
1848      gotent_flags = 0;
1849      r_type = ELF64_R_TYPE (rel->r_info);
1850      addend = rel->r_addend;
1851
1852      switch (r_type)
1853	{
1854	case R_ALPHA_LITERAL:
1855	  need = NEED_GOT | NEED_GOT_ENTRY;
1856
1857	  /* Remember how this literal is used from its LITUSEs.
1858	     This will be important when it comes to decide if we can
1859	     create a .plt entry for a function symbol.  */
1860	  while (++rel < relend && ELF64_R_TYPE (rel->r_info) == R_ALPHA_LITUSE)
1861	    if (rel->r_addend >= 1 && rel->r_addend <= 6)
1862	      gotent_flags |= 1 << rel->r_addend;
1863	  --rel;
1864
1865	  /* No LITUSEs -- presumably the address is used somehow.  */
1866	  if (gotent_flags == 0)
1867	    gotent_flags = ALPHA_ELF_LINK_HASH_LU_ADDR;
1868	  break;
1869
1870	case R_ALPHA_GPDISP:
1871	case R_ALPHA_GPREL16:
1872	case R_ALPHA_GPREL32:
1873	case R_ALPHA_GPRELHIGH:
1874	case R_ALPHA_GPRELLOW:
1875	case R_ALPHA_BRSGP:
1876	  need = NEED_GOT;
1877	  break;
1878
1879	case R_ALPHA_REFLONG:
1880	case R_ALPHA_REFQUAD:
1881	  if (bfd_link_pic (info) || maybe_dynamic)
1882	    need = NEED_DYNREL;
1883	  break;
1884
1885	case R_ALPHA_TLSLDM:
1886	  /* The symbol for a TLSLDM reloc is ignored.  Collapse the
1887	     reloc to the STN_UNDEF (0) symbol so that they all match.  */
1888	  r_symndx = STN_UNDEF;
1889	  h = 0;
1890	  maybe_dynamic = false;
1891	  /* FALLTHRU */
1892
1893	case R_ALPHA_TLSGD:
1894	case R_ALPHA_GOTDTPREL:
1895	  need = NEED_GOT | NEED_GOT_ENTRY;
1896	  break;
1897
1898	case R_ALPHA_GOTTPREL:
1899	  need = NEED_GOT | NEED_GOT_ENTRY;
1900	  gotent_flags = ALPHA_ELF_LINK_HASH_TLS_IE;
1901	  if (bfd_link_pic (info))
1902	    info->flags |= DF_STATIC_TLS;
1903	  break;
1904
1905	case R_ALPHA_TPREL64:
1906	  if (bfd_link_dll (info))
1907	    {
1908	      info->flags |= DF_STATIC_TLS;
1909	      need = NEED_DYNREL;
1910	    }
1911	  else if (maybe_dynamic)
1912	    need = NEED_DYNREL;
1913	  break;
1914	}
1915
1916      if (need & NEED_GOT)
1917	{
1918	  if (alpha_elf_tdata(abfd)->gotobj == NULL)
1919	    {
1920	      if (!elf64_alpha_create_got_section (abfd, info))
1921		return false;
1922	    }
1923	}
1924
1925      if (need & NEED_GOT_ENTRY)
1926	{
1927	  struct alpha_elf_got_entry *gotent;
1928
1929	  gotent = get_got_entry (abfd, h, r_type, r_symndx, addend);
1930	  if (!gotent)
1931	    return false;
1932
1933	  if (gotent_flags)
1934	    {
1935	      gotent->flags |= gotent_flags;
1936	      if (h)
1937		{
1938		  gotent_flags |= h->flags;
1939		  h->flags = gotent_flags;
1940
1941		  /* Make a guess as to whether a .plt entry is needed.  */
1942		  /* ??? It appears that we won't make it into
1943		     adjust_dynamic_symbol for symbols that remain
1944		     totally undefined.  Copying this check here means
1945		     we can create a plt entry for them too.  */
1946		  h->root.needs_plt
1947		    = (maybe_dynamic && elf64_alpha_want_plt (h));
1948		}
1949	    }
1950	}
1951
1952      if (need & NEED_DYNREL)
1953	{
1954	  /* We need to create the section here now whether we eventually
1955	     use it or not so that it gets mapped to an output section by
1956	     the linker.  If not used, we'll kill it in size_dynamic_sections.  */
1957	  if (sreloc == NULL)
1958	    {
1959	      sreloc = _bfd_elf_make_dynamic_reloc_section
1960		(sec, dynobj, 3, abfd, /*rela?*/ true);
1961
1962	      if (sreloc == NULL)
1963		return false;
1964	    }
1965
1966	  if (h)
1967	    {
1968	      /* Since we havn't seen all of the input symbols yet, we
1969		 don't know whether we'll actually need a dynamic relocation
1970		 entry for this reloc.  So make a record of it.  Once we
1971		 find out if this thing needs dynamic relocation we'll
1972		 expand the relocation sections by the appropriate amount.  */
1973
1974	      struct alpha_elf_reloc_entry *rent;
1975
1976	      for (rent = h->reloc_entries; rent; rent = rent->next)
1977		if (rent->rtype == r_type && rent->srel == sreloc)
1978		  break;
1979
1980	      if (!rent)
1981		{
1982		  size_t amt = sizeof (struct alpha_elf_reloc_entry);
1983		  rent = (struct alpha_elf_reloc_entry *) bfd_alloc (abfd, amt);
1984		  if (!rent)
1985		    return false;
1986
1987		  rent->srel = sreloc;
1988		  rent->sec = sec;
1989		  rent->rtype = r_type;
1990		  rent->count = 1;
1991
1992		  rent->next = h->reloc_entries;
1993		  h->reloc_entries = rent;
1994		}
1995	      else
1996		rent->count++;
1997	    }
1998	  else if (bfd_link_pic (info))
1999	    {
2000	      /* If this is a shared library, and the section is to be
2001		 loaded into memory, we need a RELATIVE reloc.  */
2002	      sreloc->size += sizeof (Elf64_External_Rela);
2003	      if (sec->flags & SEC_READONLY)
2004		{
2005		  info->flags |= DF_TEXTREL;
2006		  info->callbacks->minfo
2007		    (_("%pB: dynamic relocation against `%pT' in "
2008		       "read-only section `%pA'\n"),
2009		     sec->owner, h->root.root.root.string, sec);
2010		}
2011	    }
2012	}
2013    }
2014
2015  return true;
2016}
2017
2018/* Return the section that should be marked against GC for a given
2019   relocation.  */
2020
2021static asection *
2022elf64_alpha_gc_mark_hook (asection *sec, struct bfd_link_info *info,
2023			  Elf_Internal_Rela *rel,
2024			  struct elf_link_hash_entry *h, Elf_Internal_Sym *sym)
2025{
2026  /* These relocations don't really reference a symbol.  Instead we store
2027     extra data in their addend slot.  Ignore the symbol.  */
2028  switch (ELF64_R_TYPE (rel->r_info))
2029    {
2030    case R_ALPHA_LITUSE:
2031    case R_ALPHA_GPDISP:
2032    case R_ALPHA_HINT:
2033      return NULL;
2034    }
2035
2036  return _bfd_elf_gc_mark_hook (sec, info, rel, h, sym);
2037}
2038
2039/* Adjust a symbol defined by a dynamic object and referenced by a
2040   regular object.  The current definition is in some section of the
2041   dynamic object, but we're not including those sections.  We have to
2042   change the definition to something the rest of the link can
2043   understand.  */
2044
2045static bool
2046elf64_alpha_adjust_dynamic_symbol (struct bfd_link_info *info,
2047				   struct elf_link_hash_entry *h)
2048{
2049  bfd *dynobj;
2050  asection *s;
2051  struct alpha_elf_link_hash_entry *ah;
2052
2053  dynobj = elf_hash_table(info)->dynobj;
2054  ah = (struct alpha_elf_link_hash_entry *)h;
2055
2056  /* Now that we've seen all of the input symbols, finalize our decision
2057     about whether this symbol should get a .plt entry.  Irritatingly, it
2058     is common for folk to leave undefined symbols in shared libraries,
2059     and they still expect lazy binding; accept undefined symbols in lieu
2060     of STT_FUNC.  */
2061  if (alpha_elf_dynamic_symbol_p (h, info) && elf64_alpha_want_plt (ah))
2062    {
2063      h->needs_plt = true;
2064
2065      s = elf_hash_table(info)->splt;
2066      if (!s && !elf64_alpha_create_dynamic_sections (dynobj, info))
2067	return false;
2068
2069      /* We need one plt entry per got subsection.  Delay allocation of
2070	 the actual plt entries until size_plt_section, called from
2071	 size_dynamic_sections or during relaxation.  */
2072
2073      return true;
2074    }
2075  else
2076    h->needs_plt = false;
2077
2078  /* If this is a weak symbol, and there is a real definition, the
2079     processor independent code will have arranged for us to see the
2080     real definition first, and we can just use the same value.  */
2081  if (h->is_weakalias)
2082    {
2083      struct elf_link_hash_entry *def = weakdef (h);
2084      BFD_ASSERT (def->root.type == bfd_link_hash_defined);
2085      h->root.u.def.section = def->root.u.def.section;
2086      h->root.u.def.value = def->root.u.def.value;
2087      return true;
2088    }
2089
2090  /* This is a reference to a symbol defined by a dynamic object which
2091     is not a function.  The Alpha, since it uses .got entries for all
2092     symbols even in regular objects, does not need the hackery of a
2093     .dynbss section and COPY dynamic relocations.  */
2094
2095  return true;
2096}
2097
2098/* Record STO_ALPHA_NOPV and STO_ALPHA_STD_GPLOAD.  */
2099
2100static void
2101elf64_alpha_merge_symbol_attribute (struct elf_link_hash_entry *h,
2102				    unsigned int st_other,
2103				    bool definition,
2104				    bool dynamic)
2105{
2106  if (!dynamic && definition)
2107    h->other = ((h->other & ELF_ST_VISIBILITY (-1))
2108		| (st_other & ~ELF_ST_VISIBILITY (-1)));
2109}
2110
2111/* Symbol versioning can create new symbols, and make our old symbols
2112   indirect to the new ones.  Consolidate the got and reloc information
2113   in these situations.  */
2114
2115static void
2116elf64_alpha_copy_indirect_symbol (struct bfd_link_info *info,
2117				  struct elf_link_hash_entry *dir,
2118				  struct elf_link_hash_entry *ind)
2119{
2120  struct alpha_elf_link_hash_entry *hi
2121    = (struct alpha_elf_link_hash_entry *) ind;
2122  struct alpha_elf_link_hash_entry *hs
2123    = (struct alpha_elf_link_hash_entry *) dir;
2124
2125  /* Do the merging in the superclass.  */
2126  _bfd_elf_link_hash_copy_indirect(info, dir, ind);
2127
2128  /* Merge the flags.  Whee.  */
2129  hs->flags |= hi->flags;
2130
2131  /* ??? It's unclear to me what's really supposed to happen when
2132     "merging" defweak and defined symbols, given that we don't
2133     actually throw away the defweak.  This more-or-less copies
2134     the logic related to got and plt entries in the superclass.  */
2135  if (ind->root.type != bfd_link_hash_indirect)
2136    return;
2137
2138  /* Merge the .got entries.  Cannibalize the old symbol's list in
2139     doing so, since we don't need it anymore.  */
2140
2141  if (hs->got_entries == NULL)
2142    hs->got_entries = hi->got_entries;
2143  else
2144    {
2145      struct alpha_elf_got_entry *gi, *gs, *gin, *gsh;
2146
2147      gsh = hs->got_entries;
2148      for (gi = hi->got_entries; gi ; gi = gin)
2149	{
2150	  gin = gi->next;
2151	  for (gs = gsh; gs ; gs = gs->next)
2152	    if (gi->gotobj == gs->gotobj
2153		&& gi->reloc_type == gs->reloc_type
2154		&& gi->addend == gs->addend)
2155	      {
2156		gs->use_count += gi->use_count;
2157		goto got_found;
2158	      }
2159	  gi->next = hs->got_entries;
2160	  hs->got_entries = gi;
2161	got_found:;
2162	}
2163    }
2164  hi->got_entries = NULL;
2165
2166  /* And similar for the reloc entries.  */
2167
2168  if (hs->reloc_entries == NULL)
2169    hs->reloc_entries = hi->reloc_entries;
2170  else
2171    {
2172      struct alpha_elf_reloc_entry *ri, *rs, *rin, *rsh;
2173
2174      rsh = hs->reloc_entries;
2175      for (ri = hi->reloc_entries; ri ; ri = rin)
2176	{
2177	  rin = ri->next;
2178	  for (rs = rsh; rs ; rs = rs->next)
2179	    if (ri->rtype == rs->rtype && ri->srel == rs->srel)
2180	      {
2181		rs->count += ri->count;
2182		goto found_reloc;
2183	      }
2184	  ri->next = hs->reloc_entries;
2185	  hs->reloc_entries = ri;
2186	found_reloc:;
2187	}
2188    }
2189  hi->reloc_entries = NULL;
2190}
2191
2192/* Is it possible to merge two object file's .got tables?  */
2193
2194static bool
2195elf64_alpha_can_merge_gots (bfd *a, bfd *b)
2196{
2197  int total = alpha_elf_tdata (a)->total_got_size;
2198  bfd *bsub;
2199
2200  /* Trivial quick fallout test.  */
2201  if (total + alpha_elf_tdata (b)->total_got_size <= MAX_GOT_SIZE)
2202    return true;
2203
2204  /* By their nature, local .got entries cannot be merged.  */
2205  if ((total += alpha_elf_tdata (b)->local_got_size) > MAX_GOT_SIZE)
2206    return false;
2207
2208  /* Failing the common trivial comparison, we must effectively
2209     perform the merge.  Not actually performing the merge means that
2210     we don't have to store undo information in case we fail.  */
2211  for (bsub = b; bsub ; bsub = alpha_elf_tdata (bsub)->in_got_link_next)
2212    {
2213      struct alpha_elf_link_hash_entry **hashes = alpha_elf_sym_hashes (bsub);
2214      Elf_Internal_Shdr *symtab_hdr = &elf_tdata (bsub)->symtab_hdr;
2215      int i, n;
2216
2217      n = NUM_SHDR_ENTRIES (symtab_hdr) - symtab_hdr->sh_info;
2218      for (i = 0; i < n; ++i)
2219	{
2220	  struct alpha_elf_got_entry *ae, *be;
2221	  struct alpha_elf_link_hash_entry *h;
2222
2223	  h = hashes[i];
2224	  while (h->root.root.type == bfd_link_hash_indirect
2225		 || h->root.root.type == bfd_link_hash_warning)
2226	    h = (struct alpha_elf_link_hash_entry *)h->root.root.u.i.link;
2227
2228	  for (be = h->got_entries; be ; be = be->next)
2229	    {
2230	      if (be->use_count == 0)
2231		continue;
2232	      if (be->gotobj != b)
2233		continue;
2234
2235	      for (ae = h->got_entries; ae ; ae = ae->next)
2236		if (ae->gotobj == a
2237		    && ae->reloc_type == be->reloc_type
2238		    && ae->addend == be->addend)
2239		  goto global_found;
2240
2241	      total += alpha_got_entry_size (be->reloc_type);
2242	      if (total > MAX_GOT_SIZE)
2243		return false;
2244	    global_found:;
2245	    }
2246	}
2247    }
2248
2249  return true;
2250}
2251
2252/* Actually merge two .got tables.  */
2253
2254static void
2255elf64_alpha_merge_gots (bfd *a, bfd *b)
2256{
2257  int total = alpha_elf_tdata (a)->total_got_size;
2258  bfd *bsub;
2259
2260  /* Remember local expansion.  */
2261  {
2262    int e = alpha_elf_tdata (b)->local_got_size;
2263    total += e;
2264    alpha_elf_tdata (a)->local_got_size += e;
2265  }
2266
2267  for (bsub = b; bsub ; bsub = alpha_elf_tdata (bsub)->in_got_link_next)
2268    {
2269      struct alpha_elf_got_entry **local_got_entries;
2270      struct alpha_elf_link_hash_entry **hashes;
2271      Elf_Internal_Shdr *symtab_hdr;
2272      int i, n;
2273
2274      /* Let the local .got entries know they are part of a new subsegment.  */
2275      local_got_entries = alpha_elf_tdata (bsub)->local_got_entries;
2276      if (local_got_entries)
2277	{
2278	  n = elf_tdata (bsub)->symtab_hdr.sh_info;
2279	  for (i = 0; i < n; ++i)
2280	    {
2281	      struct alpha_elf_got_entry *ent;
2282	      for (ent = local_got_entries[i]; ent; ent = ent->next)
2283		ent->gotobj = a;
2284	    }
2285	}
2286
2287      /* Merge the global .got entries.  */
2288      hashes = alpha_elf_sym_hashes (bsub);
2289      symtab_hdr = &elf_tdata (bsub)->symtab_hdr;
2290
2291      n = NUM_SHDR_ENTRIES (symtab_hdr) - symtab_hdr->sh_info;
2292      for (i = 0; i < n; ++i)
2293	{
2294	  struct alpha_elf_got_entry *ae, *be, **pbe, **start;
2295	  struct alpha_elf_link_hash_entry *h;
2296
2297	  h = hashes[i];
2298	  while (h->root.root.type == bfd_link_hash_indirect
2299		 || h->root.root.type == bfd_link_hash_warning)
2300	    h = (struct alpha_elf_link_hash_entry *)h->root.root.u.i.link;
2301
2302	  pbe = start = &h->got_entries;
2303	  while ((be = *pbe) != NULL)
2304	    {
2305	      if (be->use_count == 0)
2306		{
2307		  *pbe = be->next;
2308		  memset (be, 0xa5, sizeof (*be));
2309		  goto kill;
2310		}
2311	      if (be->gotobj != b)
2312		goto next;
2313
2314	      for (ae = *start; ae ; ae = ae->next)
2315		if (ae->gotobj == a
2316		    && ae->reloc_type == be->reloc_type
2317		    && ae->addend == be->addend)
2318		  {
2319		    ae->flags |= be->flags;
2320		    ae->use_count += be->use_count;
2321		    *pbe = be->next;
2322		    memset (be, 0xa5, sizeof (*be));
2323		    goto kill;
2324		  }
2325	      be->gotobj = a;
2326	      total += alpha_got_entry_size (be->reloc_type);
2327
2328	    next:;
2329	      pbe = &be->next;
2330	    kill:;
2331	    }
2332	}
2333
2334      alpha_elf_tdata (bsub)->gotobj = a;
2335    }
2336  alpha_elf_tdata (a)->total_got_size = total;
2337
2338  /* Merge the two in_got chains.  */
2339  {
2340    bfd *next;
2341
2342    bsub = a;
2343    while ((next = alpha_elf_tdata (bsub)->in_got_link_next) != NULL)
2344      bsub = next;
2345
2346    alpha_elf_tdata (bsub)->in_got_link_next = b;
2347  }
2348}
2349
2350/* Calculate the offsets for the got entries.  */
2351
2352static bool
2353elf64_alpha_calc_got_offsets_for_symbol (struct alpha_elf_link_hash_entry *h,
2354					 void * arg ATTRIBUTE_UNUSED)
2355{
2356  struct alpha_elf_got_entry *gotent;
2357
2358  for (gotent = h->got_entries; gotent; gotent = gotent->next)
2359    if (gotent->use_count > 0)
2360      {
2361	struct alpha_elf_obj_tdata *td;
2362	bfd_size_type *plge;
2363
2364	td = alpha_elf_tdata (gotent->gotobj);
2365	plge = &td->got->size;
2366	gotent->got_offset = *plge;
2367	*plge += alpha_got_entry_size (gotent->reloc_type);
2368      }
2369
2370  return true;
2371}
2372
2373static void
2374elf64_alpha_calc_got_offsets (struct bfd_link_info *info)
2375{
2376  bfd *i, *got_list;
2377  struct alpha_elf_link_hash_table * htab;
2378
2379  htab = alpha_elf_hash_table (info);
2380  if (htab == NULL)
2381    return;
2382  got_list = htab->got_list;
2383
2384  /* First, zero out the .got sizes, as we may be recalculating the
2385     .got after optimizing it.  */
2386  for (i = got_list; i ; i = alpha_elf_tdata(i)->got_link_next)
2387    alpha_elf_tdata(i)->got->size = 0;
2388
2389  /* Next, fill in the offsets for all the global entries.  */
2390  alpha_elf_link_hash_traverse (htab,
2391				elf64_alpha_calc_got_offsets_for_symbol,
2392				NULL);
2393
2394  /* Finally, fill in the offsets for the local entries.  */
2395  for (i = got_list; i ; i = alpha_elf_tdata(i)->got_link_next)
2396    {
2397      bfd_size_type got_offset = alpha_elf_tdata(i)->got->size;
2398      bfd *j;
2399
2400      for (j = i; j ; j = alpha_elf_tdata(j)->in_got_link_next)
2401	{
2402	  struct alpha_elf_got_entry **local_got_entries, *gotent;
2403	  int k, n;
2404
2405	  local_got_entries = alpha_elf_tdata(j)->local_got_entries;
2406	  if (!local_got_entries)
2407	    continue;
2408
2409	  for (k = 0, n = elf_tdata(j)->symtab_hdr.sh_info; k < n; ++k)
2410	    for (gotent = local_got_entries[k]; gotent; gotent = gotent->next)
2411	      if (gotent->use_count > 0)
2412		{
2413		  gotent->got_offset = got_offset;
2414		  got_offset += alpha_got_entry_size (gotent->reloc_type);
2415		}
2416	}
2417
2418      alpha_elf_tdata(i)->got->size = got_offset;
2419    }
2420}
2421
2422/* Constructs the gots.  */
2423
2424static bool
2425elf64_alpha_size_got_sections (struct bfd_link_info *info,
2426			       bool may_merge)
2427{
2428  bfd *i, *got_list, *cur_got_obj = NULL;
2429  struct alpha_elf_link_hash_table * htab;
2430
2431  htab = alpha_elf_hash_table (info);
2432  if (htab == NULL)
2433    return false;
2434  got_list = htab->got_list;
2435
2436  /* On the first time through, pretend we have an existing got list
2437     consisting of all of the input files.  */
2438  if (got_list == NULL)
2439    {
2440      for (i = info->input_bfds; i ; i = i->link.next)
2441	{
2442	  bfd *this_got;
2443
2444	  if (! is_alpha_elf (i))
2445	    continue;
2446
2447	  this_got = alpha_elf_tdata (i)->gotobj;
2448	  if (this_got == NULL)
2449	    continue;
2450
2451	  /* We are assuming no merging has yet occurred.  */
2452	  BFD_ASSERT (this_got == i);
2453
2454	  if (alpha_elf_tdata (this_got)->total_got_size > MAX_GOT_SIZE)
2455	    {
2456	      /* Yikes! A single object file has too many entries.  */
2457	      _bfd_error_handler
2458		/* xgettext:c-format */
2459		(_("%pB: .got subsegment exceeds 64K (size %d)"),
2460		 i, alpha_elf_tdata (this_got)->total_got_size);
2461	      return false;
2462	    }
2463
2464	  if (got_list == NULL)
2465	    got_list = this_got;
2466	  else
2467	    alpha_elf_tdata(cur_got_obj)->got_link_next = this_got;
2468	  cur_got_obj = this_got;
2469	}
2470
2471      /* Strange degenerate case of no got references.  */
2472      if (got_list == NULL)
2473	return true;
2474
2475      htab->got_list = got_list;
2476    }
2477
2478  cur_got_obj = got_list;
2479  if (cur_got_obj == NULL)
2480    return false;
2481
2482  if (may_merge)
2483    {
2484      i = alpha_elf_tdata(cur_got_obj)->got_link_next;
2485      while (i != NULL)
2486	{
2487	  if (elf64_alpha_can_merge_gots (cur_got_obj, i))
2488	    {
2489	      elf64_alpha_merge_gots (cur_got_obj, i);
2490
2491	      alpha_elf_tdata(i)->got->size = 0;
2492	      i = alpha_elf_tdata(i)->got_link_next;
2493	      alpha_elf_tdata(cur_got_obj)->got_link_next = i;
2494	    }
2495	  else
2496	    {
2497	      cur_got_obj = i;
2498	      i = alpha_elf_tdata(i)->got_link_next;
2499	    }
2500	}
2501    }
2502
2503  /* Once the gots have been merged, fill in the got offsets for
2504     everything therein.  */
2505  elf64_alpha_calc_got_offsets (info);
2506
2507  return true;
2508}
2509
2510static bool
2511elf64_alpha_size_plt_section_1 (struct alpha_elf_link_hash_entry *h,
2512				void * data)
2513{
2514  asection *splt = (asection *) data;
2515  struct alpha_elf_got_entry *gotent;
2516  bool saw_one = false;
2517
2518  /* If we didn't need an entry before, we still don't.  */
2519  if (!h->root.needs_plt)
2520    return true;
2521
2522  /* For each LITERAL got entry still in use, allocate a plt entry.  */
2523  for (gotent = h->got_entries; gotent ; gotent = gotent->next)
2524    if (gotent->reloc_type == R_ALPHA_LITERAL
2525	&& gotent->use_count > 0)
2526      {
2527	if (splt->size == 0)
2528	  splt->size = PLT_HEADER_SIZE;
2529	gotent->plt_offset = splt->size;
2530	splt->size += PLT_ENTRY_SIZE;
2531	saw_one = true;
2532      }
2533
2534  /* If there weren't any, there's no longer a need for the PLT entry.  */
2535  if (!saw_one)
2536    h->root.needs_plt = false;
2537
2538  return true;
2539}
2540
2541/* Called from relax_section to rebuild the PLT in light of potential changes
2542   in the function's status.  */
2543
2544static void
2545elf64_alpha_size_plt_section (struct bfd_link_info *info)
2546{
2547  asection *splt, *spltrel, *sgotplt;
2548  unsigned long entries;
2549  struct alpha_elf_link_hash_table * htab;
2550
2551  htab = alpha_elf_hash_table (info);
2552  if (htab == NULL)
2553    return;
2554
2555  splt = elf_hash_table(info)->splt;
2556  if (splt == NULL)
2557    return;
2558
2559  splt->size = 0;
2560
2561  alpha_elf_link_hash_traverse (htab,
2562				elf64_alpha_size_plt_section_1, splt);
2563
2564  /* Every plt entry requires a JMP_SLOT relocation.  */
2565  spltrel = elf_hash_table(info)->srelplt;
2566  entries = 0;
2567  if (splt->size)
2568    {
2569      if (elf64_alpha_use_secureplt)
2570	entries = (splt->size - NEW_PLT_HEADER_SIZE) / NEW_PLT_ENTRY_SIZE;
2571      else
2572	entries = (splt->size - OLD_PLT_HEADER_SIZE) / OLD_PLT_ENTRY_SIZE;
2573    }
2574  spltrel->size = entries * sizeof (Elf64_External_Rela);
2575
2576  /* When using the secureplt, we need two words somewhere in the data
2577     segment for the dynamic linker to tell us where to go.  This is the
2578     entire contents of the .got.plt section.  */
2579  if (elf64_alpha_use_secureplt)
2580    {
2581      sgotplt = elf_hash_table(info)->sgotplt;
2582      sgotplt->size = entries ? 16 : 0;
2583    }
2584}
2585
2586static bool
2587elf64_alpha_always_size_sections (bfd *output_bfd ATTRIBUTE_UNUSED,
2588				  struct bfd_link_info *info)
2589{
2590  bfd *i;
2591  struct alpha_elf_link_hash_table * htab;
2592
2593  if (bfd_link_relocatable (info))
2594    return true;
2595
2596  htab = alpha_elf_hash_table (info);
2597  if (htab == NULL)
2598    return false;
2599
2600  if (!elf64_alpha_size_got_sections (info, true))
2601    return false;
2602
2603  /* Allocate space for all of the .got subsections.  */
2604  i = htab->got_list;
2605  for ( ; i ; i = alpha_elf_tdata(i)->got_link_next)
2606    {
2607      asection *s = alpha_elf_tdata(i)->got;
2608      if (s->size > 0)
2609	{
2610	  s->contents = (bfd_byte *) bfd_zalloc (i, s->size);
2611	  if (s->contents == NULL)
2612	    return false;
2613	}
2614    }
2615
2616  return true;
2617}
2618
2619/* The number of dynamic relocations required by a static relocation.  */
2620
2621static int
2622alpha_dynamic_entries_for_reloc (int r_type, int dynamic, int shared, int pie)
2623{
2624  switch (r_type)
2625    {
2626    /* May appear in GOT entries.  */
2627    case R_ALPHA_TLSGD:
2628      return (dynamic ? 2 : shared ? 1 : 0);
2629    case R_ALPHA_TLSLDM:
2630      return shared;
2631    case R_ALPHA_LITERAL:
2632      return dynamic || shared;
2633    case R_ALPHA_GOTTPREL:
2634      return dynamic || (shared && !pie);
2635    case R_ALPHA_GOTDTPREL:
2636      return dynamic;
2637
2638    /* May appear in data sections.  */
2639    case R_ALPHA_REFLONG:
2640    case R_ALPHA_REFQUAD:
2641      return dynamic || shared;
2642    case R_ALPHA_TPREL64:
2643      return dynamic || (shared && !pie);
2644
2645    /* Everything else is illegal.  We'll issue an error during
2646       relocate_section.  */
2647    default:
2648      return 0;
2649    }
2650}
2651
2652/* Work out the sizes of the dynamic relocation entries.  */
2653
2654static bool
2655elf64_alpha_calc_dynrel_sizes (struct alpha_elf_link_hash_entry *h,
2656			       struct bfd_link_info *info)
2657{
2658  bool dynamic;
2659  struct alpha_elf_reloc_entry *relent;
2660  unsigned long entries;
2661
2662  /* If the symbol was defined as a common symbol in a regular object
2663     file, and there was no definition in any dynamic object, then the
2664     linker will have allocated space for the symbol in a common
2665     section but the ELF_LINK_HASH_DEF_REGULAR flag will not have been
2666     set.  This is done for dynamic symbols in
2667     elf_adjust_dynamic_symbol but this is not done for non-dynamic
2668     symbols, somehow.  */
2669  if (!h->root.def_regular
2670      && h->root.ref_regular
2671      && !h->root.def_dynamic
2672      && (h->root.root.type == bfd_link_hash_defined
2673	  || h->root.root.type == bfd_link_hash_defweak)
2674      && !(h->root.root.u.def.section->owner->flags & DYNAMIC))
2675    h->root.def_regular = 1;
2676
2677  /* If the symbol is dynamic, we'll need all the relocations in their
2678     natural form.  If this is a shared object, and it has been forced
2679     local, we'll need the same number of RELATIVE relocations.  */
2680  dynamic = alpha_elf_dynamic_symbol_p (&h->root, info);
2681
2682  /* If the symbol is a hidden undefined weak, then we never have any
2683     relocations.  Avoid the loop which may want to add RELATIVE relocs
2684     based on bfd_link_pic (info).  */
2685  if (h->root.root.type == bfd_link_hash_undefweak && !dynamic)
2686    return true;
2687
2688  for (relent = h->reloc_entries; relent; relent = relent->next)
2689    {
2690      entries = alpha_dynamic_entries_for_reloc (relent->rtype, dynamic,
2691						 bfd_link_pic (info),
2692						 bfd_link_pie (info));
2693      if (entries)
2694	{
2695	  asection *sec = relent->sec;
2696	  relent->srel->size +=
2697	    entries * sizeof (Elf64_External_Rela) * relent->count;
2698	  if ((sec->flags & SEC_READONLY) != 0)
2699	    {
2700	      info->flags |= DT_TEXTREL;
2701	      info->callbacks->minfo
2702		(_("%pB: dynamic relocation against `%pT' in "
2703		   "read-only section `%pA'\n"),
2704		 sec->owner, h->root.root.root.string, sec);
2705	    }
2706	}
2707    }
2708
2709  return true;
2710}
2711
2712/* Subroutine of elf64_alpha_size_rela_got_section for doing the
2713   global symbols.  */
2714
2715static bool
2716elf64_alpha_size_rela_got_1 (struct alpha_elf_link_hash_entry *h,
2717			     struct bfd_link_info *info)
2718{
2719  bool dynamic;
2720  struct alpha_elf_got_entry *gotent;
2721  unsigned long entries;
2722
2723  /* If we're using a plt for this symbol, then all of its relocations
2724     for its got entries go into .rela.plt.  */
2725  if (h->root.needs_plt)
2726    return true;
2727
2728  /* If the symbol is dynamic, we'll need all the relocations in their
2729     natural form.  If this is a shared object, and it has been forced
2730     local, we'll need the same number of RELATIVE relocations.  */
2731  dynamic = alpha_elf_dynamic_symbol_p (&h->root, info);
2732
2733  /* If the symbol is a hidden undefined weak, then we never have any
2734     relocations.  Avoid the loop which may want to add RELATIVE relocs
2735     based on bfd_link_pic (info).  */
2736  if (h->root.root.type == bfd_link_hash_undefweak && !dynamic)
2737    return true;
2738
2739  entries = 0;
2740  for (gotent = h->got_entries; gotent ; gotent = gotent->next)
2741    if (gotent->use_count > 0)
2742      entries += alpha_dynamic_entries_for_reloc (gotent->reloc_type, dynamic,
2743						  bfd_link_pic (info),
2744						  bfd_link_pie (info));
2745
2746  if (entries > 0)
2747    {
2748      asection *srel = elf_hash_table(info)->srelgot;
2749      BFD_ASSERT (srel != NULL);
2750      srel->size += sizeof (Elf64_External_Rela) * entries;
2751    }
2752
2753  return true;
2754}
2755
2756/* Set the sizes of the dynamic relocation sections.  */
2757
2758static void
2759elf64_alpha_size_rela_got_section (struct bfd_link_info *info)
2760{
2761  unsigned long entries;
2762  bfd *i;
2763  asection *srel;
2764  struct alpha_elf_link_hash_table * htab;
2765
2766  htab = alpha_elf_hash_table (info);
2767  if (htab == NULL)
2768    return;
2769
2770  /* Shared libraries often require RELATIVE relocs, and some relocs
2771     require attention for the main application as well.  */
2772
2773  entries = 0;
2774  for (i = htab->got_list;
2775       i ; i = alpha_elf_tdata(i)->got_link_next)
2776    {
2777      bfd *j;
2778
2779      for (j = i; j ; j = alpha_elf_tdata(j)->in_got_link_next)
2780	{
2781	  struct alpha_elf_got_entry **local_got_entries, *gotent;
2782	  int k, n;
2783
2784	  local_got_entries = alpha_elf_tdata(j)->local_got_entries;
2785	  if (!local_got_entries)
2786	    continue;
2787
2788	  for (k = 0, n = elf_tdata(j)->symtab_hdr.sh_info; k < n; ++k)
2789	    for (gotent = local_got_entries[k];
2790		 gotent ; gotent = gotent->next)
2791	      if (gotent->use_count > 0)
2792		entries += (alpha_dynamic_entries_for_reloc
2793			    (gotent->reloc_type, 0, bfd_link_pic (info),
2794			     bfd_link_pie (info)));
2795	}
2796    }
2797
2798  srel = elf_hash_table(info)->srelgot;
2799  if (!srel)
2800    {
2801      BFD_ASSERT (entries == 0);
2802      return;
2803    }
2804  srel->size = sizeof (Elf64_External_Rela) * entries;
2805
2806  /* Now do the non-local symbols.  */
2807  alpha_elf_link_hash_traverse (htab,
2808				elf64_alpha_size_rela_got_1, info);
2809}
2810
2811/* Set the sizes of the dynamic sections.  */
2812
2813static bool
2814elf64_alpha_size_dynamic_sections (bfd *output_bfd ATTRIBUTE_UNUSED,
2815				   struct bfd_link_info *info)
2816{
2817  bfd *dynobj;
2818  asection *s;
2819  bool relplt, relocs;
2820  struct alpha_elf_link_hash_table * htab;
2821
2822  htab = alpha_elf_hash_table (info);
2823  if (htab == NULL)
2824    return false;
2825
2826  dynobj = elf_hash_table(info)->dynobj;
2827  BFD_ASSERT(dynobj != NULL);
2828
2829  if (elf_hash_table (info)->dynamic_sections_created)
2830    {
2831      /* Set the contents of the .interp section to the interpreter.  */
2832      if (bfd_link_executable (info) && !info->nointerp)
2833	{
2834	  s = bfd_get_linker_section (dynobj, ".interp");
2835	  BFD_ASSERT (s != NULL);
2836	  s->size = sizeof ELF_DYNAMIC_INTERPRETER;
2837	  s->contents = (unsigned char *) ELF_DYNAMIC_INTERPRETER;
2838	}
2839
2840      /* Now that we've seen all of the input files, we can decide which
2841	 symbols need dynamic relocation entries and which don't.  We've
2842	 collected information in check_relocs that we can now apply to
2843	 size the dynamic relocation sections.  */
2844      alpha_elf_link_hash_traverse (htab,
2845				    elf64_alpha_calc_dynrel_sizes, info);
2846
2847      elf64_alpha_size_rela_got_section (info);
2848      elf64_alpha_size_plt_section (info);
2849    }
2850  /* else we're not dynamic and by definition we don't need such things.  */
2851
2852  /* The check_relocs and adjust_dynamic_symbol entry points have
2853     determined the sizes of the various dynamic sections.  Allocate
2854     memory for them.  */
2855  relplt = false;
2856  relocs = false;
2857  for (s = dynobj->sections; s != NULL; s = s->next)
2858    {
2859      const char *name;
2860
2861      if (!(s->flags & SEC_LINKER_CREATED))
2862	continue;
2863
2864      /* It's OK to base decisions on the section name, because none
2865	 of the dynobj section names depend upon the input files.  */
2866      name = bfd_section_name (s);
2867
2868      if (startswith (name, ".rela"))
2869	{
2870	  if (s->size != 0)
2871	    {
2872	      if (strcmp (name, ".rela.plt") == 0)
2873		relplt = true;
2874	      else
2875		relocs = true;
2876
2877	      /* We use the reloc_count field as a counter if we need
2878		 to copy relocs into the output file.  */
2879	      s->reloc_count = 0;
2880	    }
2881	}
2882      else if (! startswith (name, ".got")
2883	       && strcmp (name, ".plt") != 0
2884	       && strcmp (name, ".dynbss") != 0)
2885	{
2886	  /* It's not one of our dynamic sections, so don't allocate space.  */
2887	  continue;
2888	}
2889
2890      if (s->size == 0)
2891	{
2892	  /* If we don't need this section, strip it from the output file.
2893	     This is to handle .rela.bss and .rela.plt.  We must create it
2894	     in create_dynamic_sections, because it must be created before
2895	     the linker maps input sections to output sections.  The
2896	     linker does that before adjust_dynamic_symbol is called, and
2897	     it is that function which decides whether anything needs to
2898	     go into these sections.  */
2899	  if (!startswith (name, ".got"))
2900	    s->flags |= SEC_EXCLUDE;
2901	}
2902      else if ((s->flags & SEC_HAS_CONTENTS) != 0)
2903	{
2904	  /* Allocate memory for the section contents.  */
2905	  s->contents = (bfd_byte *) bfd_zalloc (dynobj, s->size);
2906	  if (s->contents == NULL)
2907	    return false;
2908	}
2909    }
2910
2911  if (elf_hash_table (info)->dynamic_sections_created)
2912    {
2913      /* Add some entries to the .dynamic section.  We fill in the
2914	 values later, in elf64_alpha_finish_dynamic_sections, but we
2915	 must add the entries now so that we get the correct size for
2916	 the .dynamic section.  The DT_DEBUG entry is filled in by the
2917	 dynamic linker and used by the debugger.  */
2918#define add_dynamic_entry(TAG, VAL) \
2919  _bfd_elf_add_dynamic_entry (info, TAG, VAL)
2920
2921      if (!_bfd_elf_add_dynamic_tags (output_bfd, info,
2922				      relocs || relplt))
2923	return false;
2924
2925      if (relplt
2926	  && elf64_alpha_use_secureplt
2927	  && !add_dynamic_entry (DT_ALPHA_PLTRO, 1))
2928	return false;
2929    }
2930#undef add_dynamic_entry
2931
2932  return true;
2933}
2934
2935/* These functions do relaxation for Alpha ELF.
2936
2937   Currently I'm only handling what I can do with existing compiler
2938   and assembler support, which means no instructions are removed,
2939   though some may be nopped.  At this time GCC does not emit enough
2940   information to do all of the relaxing that is possible.  It will
2941   take some not small amount of work for that to happen.
2942
2943   There are a couple of interesting papers that I once read on this
2944   subject, that I cannot find references to at the moment, that
2945   related to Alpha in particular.  They are by David Wall, then of
2946   DEC WRL.  */
2947
2948struct alpha_relax_info
2949{
2950  bfd *abfd;
2951  asection *sec;
2952  bfd_byte *contents;
2953  Elf_Internal_Shdr *symtab_hdr;
2954  Elf_Internal_Rela *relocs, *relend;
2955  struct bfd_link_info *link_info;
2956  bfd_vma gp;
2957  bfd *gotobj;
2958  asection *tsec;
2959  struct alpha_elf_link_hash_entry *h;
2960  struct alpha_elf_got_entry **first_gotent;
2961  struct alpha_elf_got_entry *gotent;
2962  bool changed_contents;
2963  bool changed_relocs;
2964  unsigned char other;
2965};
2966
2967static Elf_Internal_Rela *
2968elf64_alpha_find_reloc_at_ofs (Elf_Internal_Rela *rel,
2969			       Elf_Internal_Rela *relend,
2970			       bfd_vma offset, int type)
2971{
2972  while (rel < relend)
2973    {
2974      if (rel->r_offset == offset
2975	  && ELF64_R_TYPE (rel->r_info) == (unsigned int) type)
2976	return rel;
2977      ++rel;
2978    }
2979  return NULL;
2980}
2981
2982static bool
2983elf64_alpha_relax_got_load (struct alpha_relax_info *info, bfd_vma symval,
2984			    Elf_Internal_Rela *irel, unsigned long r_type)
2985{
2986  unsigned int insn;
2987  bfd_signed_vma disp;
2988
2989  /* Get the instruction.  */
2990  insn = bfd_get_32 (info->abfd, info->contents + irel->r_offset);
2991
2992  if (insn >> 26 != OP_LDQ)
2993    {
2994      reloc_howto_type *howto = elf64_alpha_howto_table + r_type;
2995      _bfd_error_handler
2996	/* xgettext:c-format */
2997	(_("%pB: %pA+%#" PRIx64 ": warning: "
2998	   "%s relocation against unexpected insn"),
2999	 info->abfd, info->sec, (uint64_t) irel->r_offset, howto->name);
3000      return true;
3001    }
3002
3003  /* Can't relax dynamic symbols.  */
3004  if (info->h != NULL
3005      && alpha_elf_dynamic_symbol_p (&info->h->root, info->link_info))
3006    return true;
3007
3008  /* Can't use local-exec relocations in shared libraries.  */
3009  if (r_type == R_ALPHA_GOTTPREL
3010      && bfd_link_dll (info->link_info))
3011    return true;
3012
3013  if (r_type == R_ALPHA_LITERAL)
3014    {
3015      /* Look for nice constant addresses.  This includes the not-uncommon
3016	 special case of 0 for undefweak symbols.  */
3017      if ((info->h && info->h->root.root.type == bfd_link_hash_undefweak)
3018	  || (!bfd_link_pic (info->link_info)
3019	      && (symval >= (bfd_vma)-0x8000 || symval < 0x8000)))
3020	{
3021	  disp = 0;
3022	  insn = (OP_LDA << 26) | (insn & (31 << 21)) | (31 << 16);
3023	  insn |= (symval & 0xffff);
3024	  r_type = R_ALPHA_NONE;
3025	}
3026      else
3027	{
3028	  /* We may only create GPREL relocs during the second pass.  */
3029	  if (info->link_info->relax_pass == 0)
3030	    return true;
3031
3032	  disp = symval - info->gp;
3033	  insn = (OP_LDA << 26) | (insn & 0x03ff0000);
3034	  r_type = R_ALPHA_GPREL16;
3035	}
3036    }
3037  else
3038    {
3039      bfd_vma dtp_base, tp_base;
3040
3041      BFD_ASSERT (elf_hash_table (info->link_info)->tls_sec != NULL);
3042      dtp_base = alpha_get_dtprel_base (info->link_info);
3043      tp_base = alpha_get_tprel_base (info->link_info);
3044      disp = symval - (r_type == R_ALPHA_GOTDTPREL ? dtp_base : tp_base);
3045
3046      insn = (OP_LDA << 26) | (insn & (31 << 21)) | (31 << 16);
3047
3048      switch (r_type)
3049	{
3050	case R_ALPHA_GOTDTPREL:
3051	  r_type = R_ALPHA_DTPREL16;
3052	  break;
3053	case R_ALPHA_GOTTPREL:
3054	  r_type = R_ALPHA_TPREL16;
3055	  break;
3056	default:
3057	  BFD_ASSERT (0);
3058	  return false;
3059	}
3060    }
3061
3062  if (disp < -0x8000 || disp >= 0x8000)
3063    return true;
3064
3065  bfd_put_32 (info->abfd, (bfd_vma) insn, info->contents + irel->r_offset);
3066  info->changed_contents = true;
3067
3068  /* Reduce the use count on this got entry by one, possibly
3069     eliminating it.  */
3070  if (--info->gotent->use_count == 0)
3071    {
3072      int sz = alpha_got_entry_size (r_type);
3073      alpha_elf_tdata (info->gotobj)->total_got_size -= sz;
3074      if (!info->h)
3075	alpha_elf_tdata (info->gotobj)->local_got_size -= sz;
3076    }
3077
3078  /* Smash the existing GOT relocation for its 16-bit immediate pair.  */
3079  irel->r_info = ELF64_R_INFO (ELF64_R_SYM (irel->r_info), r_type);
3080  info->changed_relocs = true;
3081
3082  /* ??? Search forward through this basic block looking for insns
3083     that use the target register.  Stop after an insn modifying the
3084     register is seen, or after a branch or call.
3085
3086     Any such memory load insn may be substituted by a load directly
3087     off the GP.  This allows the memory load insn to be issued before
3088     the calculated GP register would otherwise be ready.
3089
3090     Any such jsr insn can be replaced by a bsr if it is in range.
3091
3092     This would mean that we'd have to _add_ relocations, the pain of
3093     which gives one pause.  */
3094
3095  return true;
3096}
3097
3098static bfd_vma
3099elf64_alpha_relax_opt_call (struct alpha_relax_info *info, bfd_vma symval)
3100{
3101  /* If the function has the same gp, and we can identify that the
3102     function does not use its function pointer, we can eliminate the
3103     address load.  */
3104
3105  /* If the symbol is marked NOPV, we are being told the function never
3106     needs its procedure value.  */
3107  if ((info->other & STO_ALPHA_STD_GPLOAD) == STO_ALPHA_NOPV)
3108    return symval;
3109
3110  /* If the symbol is marked STD_GP, we are being told the function does
3111     a normal ldgp in the first two words.  */
3112  else if ((info->other & STO_ALPHA_STD_GPLOAD) == STO_ALPHA_STD_GPLOAD)
3113    ;
3114
3115  /* Otherwise, we may be able to identify a GP load in the first two
3116     words, which we can then skip.  */
3117  else
3118    {
3119      Elf_Internal_Rela *tsec_relocs, *tsec_relend, *tsec_free, *gpdisp;
3120      bfd_vma ofs;
3121
3122      /* Load the relocations from the section that the target symbol is in.  */
3123      if (info->sec == info->tsec)
3124	{
3125	  tsec_relocs = info->relocs;
3126	  tsec_relend = info->relend;
3127	  tsec_free = NULL;
3128	}
3129      else
3130	{
3131	  tsec_relocs = (_bfd_elf_link_read_relocs
3132			 (info->abfd, info->tsec, NULL,
3133			 (Elf_Internal_Rela *) NULL,
3134			 info->link_info->keep_memory));
3135	  if (tsec_relocs == NULL)
3136	    return 0;
3137	  tsec_relend = tsec_relocs + info->tsec->reloc_count;
3138	  tsec_free = (elf_section_data (info->tsec)->relocs == tsec_relocs
3139		       ? NULL
3140		       : tsec_relocs);
3141	}
3142
3143      /* Recover the symbol's offset within the section.  */
3144      ofs = (symval - info->tsec->output_section->vma
3145	     - info->tsec->output_offset);
3146
3147      /* Look for a GPDISP reloc.  */
3148      gpdisp = (elf64_alpha_find_reloc_at_ofs
3149		(tsec_relocs, tsec_relend, ofs, R_ALPHA_GPDISP));
3150
3151      if (!gpdisp || gpdisp->r_addend != 4)
3152	{
3153	  free (tsec_free);
3154	  return 0;
3155	}
3156      free (tsec_free);
3157    }
3158
3159  /* We've now determined that we can skip an initial gp load.  Verify
3160     that the call and the target use the same gp.   */
3161  if (info->link_info->output_bfd->xvec != info->tsec->owner->xvec
3162      || info->gotobj != alpha_elf_tdata (info->tsec->owner)->gotobj)
3163    return 0;
3164
3165  return symval + 8;
3166}
3167
3168static bool
3169elf64_alpha_relax_with_lituse (struct alpha_relax_info *info,
3170			       bfd_vma symval, Elf_Internal_Rela *irel)
3171{
3172  Elf_Internal_Rela *urel, *erel, *irelend = info->relend;
3173  int flags;
3174  bfd_signed_vma disp;
3175  bool fits16;
3176  bool fits32;
3177  bool lit_reused = false;
3178  bool all_optimized = true;
3179  bool changed_contents;
3180  bool changed_relocs;
3181  bfd_byte *contents = info->contents;
3182  bfd *abfd = info->abfd;
3183  bfd_vma sec_output_vma;
3184  unsigned int lit_insn;
3185  int relax_pass;
3186
3187  lit_insn = bfd_get_32 (abfd, contents + irel->r_offset);
3188  if (lit_insn >> 26 != OP_LDQ)
3189    {
3190      _bfd_error_handler
3191	/* xgettext:c-format */
3192	(_("%pB: %pA+%#" PRIx64 ": warning: "
3193	   "%s relocation against unexpected insn"),
3194	 abfd, info->sec, (uint64_t) irel->r_offset, "LITERAL");
3195      return true;
3196    }
3197
3198  /* Can't relax dynamic symbols.  */
3199  if (info->h != NULL
3200      && alpha_elf_dynamic_symbol_p (&info->h->root, info->link_info))
3201    return true;
3202
3203  changed_contents = info->changed_contents;
3204  changed_relocs = info->changed_relocs;
3205  sec_output_vma = info->sec->output_section->vma + info->sec->output_offset;
3206  relax_pass = info->link_info->relax_pass;
3207
3208  /* Summarize how this particular LITERAL is used.  */
3209  for (erel = irel+1, flags = 0; erel < irelend; ++erel)
3210    {
3211      if (ELF64_R_TYPE (erel->r_info) != R_ALPHA_LITUSE)
3212	break;
3213      if (erel->r_addend <= 6)
3214	flags |= 1 << erel->r_addend;
3215    }
3216
3217  /* A little preparation for the loop...  */
3218  disp = symval - info->gp;
3219
3220  for (urel = irel+1; urel < erel; ++urel)
3221    {
3222      bfd_vma urel_r_offset = urel->r_offset;
3223      unsigned int insn;
3224      int insn_disp;
3225      bfd_signed_vma xdisp;
3226      Elf_Internal_Rela nrel;
3227
3228      insn = bfd_get_32 (abfd, contents + urel_r_offset);
3229
3230      switch (urel->r_addend)
3231	{
3232	case LITUSE_ALPHA_ADDR:
3233	default:
3234	  /* This type is really just a placeholder to note that all
3235	     uses cannot be optimized, but to still allow some.  */
3236	  all_optimized = false;
3237	  break;
3238
3239	case LITUSE_ALPHA_BASE:
3240	  /* We may only create GPREL relocs during the second pass.  */
3241	  if (relax_pass == 0)
3242	    {
3243	      all_optimized = false;
3244	      break;
3245	    }
3246
3247	  /* We can always optimize 16-bit displacements.  */
3248
3249	  /* Extract the displacement from the instruction, sign-extending
3250	     it if necessary, then test whether it is within 16 or 32 bits
3251	     displacement from GP.  */
3252	  insn_disp = ((insn & 0xffff) ^ 0x8000) - 0x8000;
3253
3254	  xdisp = disp + insn_disp;
3255	  fits16 = (xdisp >= - (bfd_signed_vma) 0x8000 && xdisp < 0x8000);
3256	  fits32 = (xdisp >= - (bfd_signed_vma) 0x80000000
3257		    && xdisp < 0x7fff8000);
3258
3259	  if (fits16)
3260	    {
3261	      /* Take the op code and dest from this insn, take the base
3262		 register from the literal insn.  Leave the offset alone.  */
3263	      insn = (insn & 0xffe0ffff) | (lit_insn & 0x001f0000);
3264	      bfd_put_32 (abfd, (bfd_vma) insn, contents + urel_r_offset);
3265	      changed_contents = true;
3266
3267	      nrel = *urel;
3268	      nrel.r_info = ELF64_R_INFO (ELF64_R_SYM (irel->r_info),
3269					  R_ALPHA_GPREL16);
3270	      nrel.r_addend = irel->r_addend;
3271
3272	      /* As we adjust, move the reloc to the end so that we don't
3273		 break the LITERAL+LITUSE chain.  */
3274	      if (urel < --erel)
3275		*urel-- = *erel;
3276	      *erel = nrel;
3277	      changed_relocs = true;
3278	    }
3279
3280	  /* If all mem+byte, we can optimize 32-bit mem displacements.  */
3281	  else if (fits32 && !(flags & ~6))
3282	    {
3283	      /* FIXME: sanity check that lit insn Ra is mem insn Rb.  */
3284
3285	      irel->r_info = ELF64_R_INFO (ELF64_R_SYM (irel->r_info),
3286					   R_ALPHA_GPRELHIGH);
3287	      lit_insn = (OP_LDAH << 26) | (lit_insn & 0x03ff0000);
3288	      bfd_put_32 (abfd, (bfd_vma) lit_insn, contents + irel->r_offset);
3289	      lit_reused = true;
3290	      changed_contents = true;
3291
3292	      /* Since all relocs must be optimized, don't bother swapping
3293		 this relocation to the end.  */
3294	      urel->r_info = ELF64_R_INFO (ELF64_R_SYM (irel->r_info),
3295					   R_ALPHA_GPRELLOW);
3296	      urel->r_addend = irel->r_addend;
3297	      changed_relocs = true;
3298	    }
3299	  else
3300	    all_optimized = false;
3301	  break;
3302
3303	case LITUSE_ALPHA_BYTOFF:
3304	  /* We can always optimize byte instructions.  */
3305
3306	  /* FIXME: sanity check the insn for byte op.  Check that the
3307	     literal dest reg is indeed Rb in the byte insn.  */
3308
3309	  insn &= ~ (unsigned) 0x001ff000;
3310	  insn |= ((symval & 7) << 13) | 0x1000;
3311	  bfd_put_32 (abfd, (bfd_vma) insn, contents + urel_r_offset);
3312	  changed_contents = true;
3313
3314	  nrel = *urel;
3315	  nrel.r_info = ELF64_R_INFO (0, R_ALPHA_NONE);
3316	  nrel.r_addend = 0;
3317
3318	  /* As we adjust, move the reloc to the end so that we don't
3319	     break the LITERAL+LITUSE chain.  */
3320	  if (urel < --erel)
3321	    *urel-- = *erel;
3322	  *erel = nrel;
3323	  changed_relocs = true;
3324	  break;
3325
3326	case LITUSE_ALPHA_JSR:
3327	case LITUSE_ALPHA_TLSGD:
3328	case LITUSE_ALPHA_TLSLDM:
3329	case LITUSE_ALPHA_JSRDIRECT:
3330	  {
3331	    bfd_vma optdest, org;
3332	    bfd_signed_vma odisp;
3333
3334	    /* For undefined weak symbols, we're mostly interested in getting
3335	       rid of the got entry whenever possible, so optimize this to a
3336	       use of the zero register.  */
3337	    if (info->h && info->h->root.root.type == bfd_link_hash_undefweak)
3338	      {
3339		insn |= 31 << 16;
3340		bfd_put_32 (abfd, (bfd_vma) insn, contents + urel_r_offset);
3341
3342		changed_contents = true;
3343		break;
3344	      }
3345
3346	    /* If not zero, place to jump without needing pv.  */
3347	    optdest = elf64_alpha_relax_opt_call (info, symval);
3348	    org = sec_output_vma + urel_r_offset + 4;
3349	    odisp = (optdest ? optdest : symval) - org;
3350
3351	    if (odisp >= -0x400000 && odisp < 0x400000)
3352	      {
3353		Elf_Internal_Rela *xrel;
3354
3355		/* Preserve branch prediction call stack when possible.  */
3356		if ((insn & INSN_JSR_MASK) == INSN_JSR)
3357		  insn = (OP_BSR << 26) | (insn & 0x03e00000);
3358		else
3359		  insn = (OP_BR << 26) | (insn & 0x03e00000);
3360		bfd_put_32 (abfd, (bfd_vma) insn, contents + urel_r_offset);
3361		changed_contents = true;
3362
3363		nrel = *urel;
3364		nrel.r_info = ELF64_R_INFO (ELF64_R_SYM (irel->r_info),
3365					    R_ALPHA_BRADDR);
3366		nrel.r_addend = irel->r_addend;
3367
3368		if (optdest)
3369		  nrel.r_addend += optdest - symval;
3370		else
3371		  all_optimized = false;
3372
3373		/* Kill any HINT reloc that might exist for this insn.  */
3374		xrel = (elf64_alpha_find_reloc_at_ofs
3375			(info->relocs, info->relend, urel_r_offset,
3376			 R_ALPHA_HINT));
3377		if (xrel)
3378		  xrel->r_info = ELF64_R_INFO (0, R_ALPHA_NONE);
3379
3380		/* As we adjust, move the reloc to the end so that we don't
3381		   break the LITERAL+LITUSE chain.  */
3382		if (urel < --erel)
3383		  *urel-- = *erel;
3384		*erel = nrel;
3385
3386		info->changed_relocs = true;
3387	      }
3388	    else
3389	      all_optimized = false;
3390
3391	    /* Even if the target is not in range for a direct branch,
3392	       if we share a GP, we can eliminate the gp reload.  */
3393	    if (optdest)
3394	      {
3395		Elf_Internal_Rela *gpdisp
3396		  = (elf64_alpha_find_reloc_at_ofs
3397		     (info->relocs, irelend, urel_r_offset + 4,
3398		      R_ALPHA_GPDISP));
3399		if (gpdisp)
3400		  {
3401		    bfd_byte *p_ldah = contents + gpdisp->r_offset;
3402		    bfd_byte *p_lda = p_ldah + gpdisp->r_addend;
3403		    unsigned int ldah = bfd_get_32 (abfd, p_ldah);
3404		    unsigned int lda = bfd_get_32 (abfd, p_lda);
3405
3406		    /* Verify that the instruction is "ldah $29,0($26)".
3407		       Consider a function that ends in a noreturn call,
3408		       and that the next function begins with an ldgp,
3409		       and that by accident there is no padding between.
3410		       In that case the insn would use $27 as the base.  */
3411		    if (ldah == 0x27ba0000 && lda == 0x23bd0000)
3412		      {
3413			bfd_put_32 (abfd, (bfd_vma) INSN_UNOP, p_ldah);
3414			bfd_put_32 (abfd, (bfd_vma) INSN_UNOP, p_lda);
3415
3416			gpdisp->r_info = ELF64_R_INFO (0, R_ALPHA_NONE);
3417			changed_contents = true;
3418			changed_relocs = true;
3419		      }
3420		  }
3421	      }
3422	  }
3423	  break;
3424	}
3425    }
3426
3427  /* If we reused the literal instruction, we must have optimized all.  */
3428  BFD_ASSERT(!lit_reused || all_optimized);
3429
3430  /* If all cases were optimized, we can reduce the use count on this
3431     got entry by one, possibly eliminating it.  */
3432  if (all_optimized)
3433    {
3434      if (--info->gotent->use_count == 0)
3435	{
3436	  int sz = alpha_got_entry_size (R_ALPHA_LITERAL);
3437	  alpha_elf_tdata (info->gotobj)->total_got_size -= sz;
3438	  if (!info->h)
3439	    alpha_elf_tdata (info->gotobj)->local_got_size -= sz;
3440	}
3441
3442      /* If the literal instruction is no longer needed (it may have been
3443	 reused.  We can eliminate it.  */
3444      /* ??? For now, I don't want to deal with compacting the section,
3445	 so just nop it out.  */
3446      if (!lit_reused)
3447	{
3448	  irel->r_info = ELF64_R_INFO (0, R_ALPHA_NONE);
3449	  changed_relocs = true;
3450
3451	  bfd_put_32 (abfd, (bfd_vma) INSN_UNOP, contents + irel->r_offset);
3452	  changed_contents = true;
3453	}
3454    }
3455
3456  info->changed_contents = changed_contents;
3457  info->changed_relocs = changed_relocs;
3458
3459  if (all_optimized || relax_pass == 0)
3460    return true;
3461  return elf64_alpha_relax_got_load (info, symval, irel, R_ALPHA_LITERAL);
3462}
3463
3464static bool
3465elf64_alpha_relax_tls_get_addr (struct alpha_relax_info *info, bfd_vma symval,
3466				Elf_Internal_Rela *irel, bool is_gd)
3467{
3468  bfd_byte *pos[5];
3469  unsigned int insn, tlsgd_reg;
3470  Elf_Internal_Rela *gpdisp, *hint;
3471  bool dynamic, use_gottprel;
3472  unsigned long new_symndx;
3473
3474  dynamic = (info->h != NULL
3475	     && alpha_elf_dynamic_symbol_p (&info->h->root, info->link_info));
3476
3477  /* If a TLS symbol is accessed using IE at least once, there is no point
3478     to use dynamic model for it.  */
3479  if (is_gd && info->h && (info->h->flags & ALPHA_ELF_LINK_HASH_TLS_IE))
3480    ;
3481
3482  /* If the symbol is local, and we've already committed to DF_STATIC_TLS,
3483     then we might as well relax to IE.  */
3484  else if (bfd_link_pic (info->link_info) && !dynamic
3485	   && (info->link_info->flags & DF_STATIC_TLS))
3486    ;
3487
3488  /* Otherwise we must be building an executable to do anything.  */
3489  else if (bfd_link_pic (info->link_info))
3490    return true;
3491
3492  /* The TLSGD/TLSLDM relocation must be followed by a LITERAL and
3493     the matching LITUSE_TLS relocations.  */
3494  if (irel + 2 >= info->relend)
3495    return true;
3496  if (ELF64_R_TYPE (irel[1].r_info) != R_ALPHA_LITERAL
3497      || ELF64_R_TYPE (irel[2].r_info) != R_ALPHA_LITUSE
3498      || irel[2].r_addend != (is_gd ? LITUSE_ALPHA_TLSGD : LITUSE_ALPHA_TLSLDM))
3499    return true;
3500
3501  /* There must be a GPDISP relocation positioned immediately after the
3502     LITUSE relocation.  */
3503  gpdisp = elf64_alpha_find_reloc_at_ofs (info->relocs, info->relend,
3504					  irel[2].r_offset + 4, R_ALPHA_GPDISP);
3505  if (!gpdisp)
3506    return true;
3507
3508  pos[0] = info->contents + irel[0].r_offset;
3509  pos[1] = info->contents + irel[1].r_offset;
3510  pos[2] = info->contents + irel[2].r_offset;
3511  pos[3] = info->contents + gpdisp->r_offset;
3512  pos[4] = pos[3] + gpdisp->r_addend;
3513
3514  /* Beware of the compiler hoisting part of the sequence out a loop
3515     and adjusting the destination register for the TLSGD insn.  If this
3516     happens, there will be a move into $16 before the JSR insn, so only
3517     transformations of the first insn pair should use this register.  */
3518  tlsgd_reg = bfd_get_32 (info->abfd, pos[0]);
3519  tlsgd_reg = (tlsgd_reg >> 21) & 31;
3520
3521  /* Generally, the positions are not allowed to be out of order, lest the
3522     modified insn sequence have different register lifetimes.  We can make
3523     an exception when pos 1 is adjacent to pos 0.  */
3524  if (pos[1] + 4 == pos[0])
3525    {
3526      bfd_byte *tmp = pos[0];
3527      pos[0] = pos[1];
3528      pos[1] = tmp;
3529    }
3530  if (pos[1] >= pos[2] || pos[2] >= pos[3])
3531    return true;
3532
3533  /* Reduce the use count on the LITERAL relocation.  Do this before we
3534     smash the symndx when we adjust the relocations below.  */
3535  {
3536    struct alpha_elf_got_entry *lit_gotent;
3537    struct alpha_elf_link_hash_entry *lit_h;
3538    unsigned long indx;
3539
3540    BFD_ASSERT (ELF64_R_SYM (irel[1].r_info) >= info->symtab_hdr->sh_info);
3541    indx = ELF64_R_SYM (irel[1].r_info) - info->symtab_hdr->sh_info;
3542    lit_h = alpha_elf_sym_hashes (info->abfd)[indx];
3543
3544    while (lit_h->root.root.type == bfd_link_hash_indirect
3545	   || lit_h->root.root.type == bfd_link_hash_warning)
3546      lit_h = (struct alpha_elf_link_hash_entry *) lit_h->root.root.u.i.link;
3547
3548    for (lit_gotent = lit_h->got_entries; lit_gotent ;
3549	 lit_gotent = lit_gotent->next)
3550      if (lit_gotent->gotobj == info->gotobj
3551	  && lit_gotent->reloc_type == R_ALPHA_LITERAL
3552	  && lit_gotent->addend == irel[1].r_addend)
3553	break;
3554    BFD_ASSERT (lit_gotent);
3555
3556    if (--lit_gotent->use_count == 0)
3557      {
3558	int sz = alpha_got_entry_size (R_ALPHA_LITERAL);
3559	alpha_elf_tdata (info->gotobj)->total_got_size -= sz;
3560      }
3561  }
3562
3563  /* Change
3564
3565	lda	$16,x($gp)			!tlsgd!1
3566	ldq	$27,__tls_get_addr($gp)		!literal!1
3567	jsr	$26,($27),__tls_get_addr	!lituse_tlsgd!1
3568	ldah	$29,0($26)			!gpdisp!2
3569	lda	$29,0($29)			!gpdisp!2
3570     to
3571	ldq	$16,x($gp)			!gottprel
3572	unop
3573	call_pal rduniq
3574	addq	$16,$0,$0
3575	unop
3576     or the first pair to
3577	lda	$16,x($gp)			!tprel
3578	unop
3579     or
3580	ldah	$16,x($gp)			!tprelhi
3581	lda	$16,x($16)			!tprello
3582
3583     as appropriate.  */
3584
3585  use_gottprel = false;
3586  new_symndx = is_gd ? ELF64_R_SYM (irel->r_info) : STN_UNDEF;
3587
3588  /* Some compilers warn about a Boolean-looking expression being
3589     used in a switch.  The explicit cast silences them.  */
3590  switch ((int) (!dynamic && !bfd_link_pic (info->link_info)))
3591    {
3592    case 1:
3593      {
3594	bfd_vma tp_base;
3595	bfd_signed_vma disp;
3596
3597	BFD_ASSERT (elf_hash_table (info->link_info)->tls_sec != NULL);
3598	tp_base = alpha_get_tprel_base (info->link_info);
3599	disp = symval - tp_base;
3600
3601	if (disp >= -0x8000 && disp < 0x8000)
3602	  {
3603	    insn = (OP_LDA << 26) | (tlsgd_reg << 21) | (31 << 16);
3604	    bfd_put_32 (info->abfd, (bfd_vma) insn, pos[0]);
3605	    bfd_put_32 (info->abfd, (bfd_vma) INSN_UNOP, pos[1]);
3606
3607	    irel[0].r_offset = pos[0] - info->contents;
3608	    irel[0].r_info = ELF64_R_INFO (new_symndx, R_ALPHA_TPREL16);
3609	    irel[1].r_info = ELF64_R_INFO (0, R_ALPHA_NONE);
3610	    break;
3611	  }
3612	else if (disp >= -(bfd_signed_vma) 0x80000000
3613		 && disp < (bfd_signed_vma) 0x7fff8000
3614		 && pos[0] + 4 == pos[1])
3615	  {
3616	    insn = (OP_LDAH << 26) | (tlsgd_reg << 21) | (31 << 16);
3617	    bfd_put_32 (info->abfd, (bfd_vma) insn, pos[0]);
3618	    insn = (OP_LDA << 26) | (tlsgd_reg << 21) | (tlsgd_reg << 16);
3619	    bfd_put_32 (info->abfd, (bfd_vma) insn, pos[1]);
3620
3621	    irel[0].r_offset = pos[0] - info->contents;
3622	    irel[0].r_info = ELF64_R_INFO (new_symndx, R_ALPHA_TPRELHI);
3623	    irel[1].r_offset = pos[1] - info->contents;
3624	    irel[1].r_info = ELF64_R_INFO (new_symndx, R_ALPHA_TPRELLO);
3625	    break;
3626	  }
3627      }
3628      /* FALLTHRU */
3629
3630    default:
3631      use_gottprel = true;
3632
3633      insn = (OP_LDQ << 26) | (tlsgd_reg << 21) | (29 << 16);
3634      bfd_put_32 (info->abfd, (bfd_vma) insn, pos[0]);
3635      bfd_put_32 (info->abfd, (bfd_vma) INSN_UNOP, pos[1]);
3636
3637      irel[0].r_offset = pos[0] - info->contents;
3638      irel[0].r_info = ELF64_R_INFO (new_symndx, R_ALPHA_GOTTPREL);
3639      irel[1].r_info = ELF64_R_INFO (0, R_ALPHA_NONE);
3640      break;
3641    }
3642
3643  bfd_put_32 (info->abfd, (bfd_vma) INSN_RDUNIQ, pos[2]);
3644
3645  insn = INSN_ADDQ | (16 << 21) | (0 << 16) | (0 << 0);
3646  bfd_put_32 (info->abfd, (bfd_vma) insn, pos[3]);
3647
3648  bfd_put_32 (info->abfd, (bfd_vma) INSN_UNOP, pos[4]);
3649
3650  irel[2].r_info = ELF64_R_INFO (0, R_ALPHA_NONE);
3651  gpdisp->r_info = ELF64_R_INFO (0, R_ALPHA_NONE);
3652
3653  hint = elf64_alpha_find_reloc_at_ofs (info->relocs, info->relend,
3654					irel[2].r_offset, R_ALPHA_HINT);
3655  if (hint)
3656    hint->r_info = ELF64_R_INFO (0, R_ALPHA_NONE);
3657
3658  info->changed_contents = true;
3659  info->changed_relocs = true;
3660
3661  /* Reduce the use count on the TLSGD/TLSLDM relocation.  */
3662  if (--info->gotent->use_count == 0)
3663    {
3664      int sz = alpha_got_entry_size (info->gotent->reloc_type);
3665      alpha_elf_tdata (info->gotobj)->total_got_size -= sz;
3666      if (!info->h)
3667	alpha_elf_tdata (info->gotobj)->local_got_size -= sz;
3668    }
3669
3670  /* If we've switched to a GOTTPREL relocation, increment the reference
3671     count on that got entry.  */
3672  if (use_gottprel)
3673    {
3674      struct alpha_elf_got_entry *tprel_gotent;
3675
3676      for (tprel_gotent = *info->first_gotent; tprel_gotent ;
3677	   tprel_gotent = tprel_gotent->next)
3678	if (tprel_gotent->gotobj == info->gotobj
3679	    && tprel_gotent->reloc_type == R_ALPHA_GOTTPREL
3680	    && tprel_gotent->addend == irel->r_addend)
3681	  break;
3682      if (tprel_gotent)
3683	tprel_gotent->use_count++;
3684      else
3685	{
3686	  if (info->gotent->use_count == 0)
3687	    tprel_gotent = info->gotent;
3688	  else
3689	    {
3690	      tprel_gotent = (struct alpha_elf_got_entry *)
3691		bfd_alloc (info->abfd, sizeof (struct alpha_elf_got_entry));
3692	      if (!tprel_gotent)
3693		return false;
3694
3695	      tprel_gotent->next = *info->first_gotent;
3696	      *info->first_gotent = tprel_gotent;
3697
3698	      tprel_gotent->gotobj = info->gotobj;
3699	      tprel_gotent->addend = irel->r_addend;
3700	      tprel_gotent->got_offset = -1;
3701	      tprel_gotent->reloc_done = 0;
3702	      tprel_gotent->reloc_xlated = 0;
3703	    }
3704
3705	  tprel_gotent->use_count = 1;
3706	  tprel_gotent->reloc_type = R_ALPHA_GOTTPREL;
3707	}
3708    }
3709
3710  return true;
3711}
3712
3713static bool
3714elf64_alpha_relax_section (bfd *abfd, asection *sec,
3715			   struct bfd_link_info *link_info, bool *again)
3716{
3717  Elf_Internal_Shdr *symtab_hdr;
3718  Elf_Internal_Rela *internal_relocs;
3719  Elf_Internal_Rela *irel, *irelend;
3720  Elf_Internal_Sym *isymbuf = NULL;
3721  struct alpha_elf_got_entry **local_got_entries;
3722  struct alpha_relax_info info;
3723  struct alpha_elf_link_hash_table * htab;
3724  int relax_pass;
3725
3726  htab = alpha_elf_hash_table (link_info);
3727  if (htab == NULL)
3728    return false;
3729
3730  /* There's nothing to change, yet.  */
3731  *again = false;
3732
3733  if (bfd_link_relocatable (link_info)
3734      || ((sec->flags & (SEC_CODE | SEC_RELOC | SEC_ALLOC))
3735	  != (SEC_CODE | SEC_RELOC | SEC_ALLOC))
3736      || sec->reloc_count == 0)
3737    return true;
3738
3739  BFD_ASSERT (is_alpha_elf (abfd));
3740  relax_pass = link_info->relax_pass;
3741
3742  /* Make sure our GOT and PLT tables are up-to-date.  */
3743  if (htab->relax_trip != link_info->relax_trip)
3744    {
3745      htab->relax_trip = link_info->relax_trip;
3746
3747      /* This should never fail after the initial round, since the only error
3748	 is GOT overflow, and relaxation only shrinks the table.  However, we
3749	 may only merge got sections during the first pass.  If we merge
3750	 sections after we've created GPREL relocs, the GP for the merged
3751	 section backs up which may put the relocs out of range.  */
3752      if (!elf64_alpha_size_got_sections (link_info, relax_pass == 0))
3753	abort ();
3754      if (elf_hash_table (link_info)->dynamic_sections_created)
3755	{
3756	  elf64_alpha_size_plt_section (link_info);
3757	  elf64_alpha_size_rela_got_section (link_info);
3758	}
3759    }
3760
3761  symtab_hdr = &elf_symtab_hdr (abfd);
3762  local_got_entries = alpha_elf_tdata(abfd)->local_got_entries;
3763
3764  /* Load the relocations for this section.  */
3765  internal_relocs = (_bfd_elf_link_read_relocs
3766		     (abfd, sec, NULL, (Elf_Internal_Rela *) NULL,
3767		      link_info->keep_memory));
3768  if (internal_relocs == NULL)
3769    return false;
3770
3771  memset(&info, 0, sizeof (info));
3772  info.abfd = abfd;
3773  info.sec = sec;
3774  info.link_info = link_info;
3775  info.symtab_hdr = symtab_hdr;
3776  info.relocs = internal_relocs;
3777  info.relend = irelend = internal_relocs + sec->reloc_count;
3778
3779  /* Find the GP for this object.  Do not store the result back via
3780     _bfd_set_gp_value, since this could change again before final.  */
3781  info.gotobj = alpha_elf_tdata (abfd)->gotobj;
3782  if (info.gotobj)
3783    {
3784      asection *sgot = alpha_elf_tdata (info.gotobj)->got;
3785      info.gp = (sgot->output_section->vma
3786		 + sgot->output_offset
3787		 + 0x8000);
3788    }
3789
3790  /* Get the section contents.  */
3791  if (elf_section_data (sec)->this_hdr.contents != NULL)
3792    info.contents = elf_section_data (sec)->this_hdr.contents;
3793  else
3794    {
3795      if (!bfd_malloc_and_get_section (abfd, sec, &info.contents))
3796	goto error_return;
3797    }
3798
3799  for (irel = internal_relocs; irel < irelend; irel++)
3800    {
3801      bfd_vma symval;
3802      struct alpha_elf_got_entry *gotent;
3803      unsigned long r_type = ELF64_R_TYPE (irel->r_info);
3804      unsigned long r_symndx = ELF64_R_SYM (irel->r_info);
3805
3806      /* Early exit for unhandled or unrelaxable relocations.  */
3807      if (r_type != R_ALPHA_LITERAL)
3808	{
3809	  /* We complete everything except LITERAL in the first pass.  */
3810	  if (relax_pass != 0)
3811	    continue;
3812	  if (r_type == R_ALPHA_TLSLDM)
3813	    {
3814	      /* The symbol for a TLSLDM reloc is ignored.  Collapse the
3815		 reloc to the STN_UNDEF (0) symbol so that they all match.  */
3816	      r_symndx = STN_UNDEF;
3817	    }
3818	  else if (r_type != R_ALPHA_GOTDTPREL
3819		   && r_type != R_ALPHA_GOTTPREL
3820		   && r_type != R_ALPHA_TLSGD)
3821	    continue;
3822	}
3823
3824      /* Get the value of the symbol referred to by the reloc.  */
3825      if (r_symndx < symtab_hdr->sh_info)
3826	{
3827	  /* A local symbol.  */
3828	  Elf_Internal_Sym *isym;
3829
3830	  /* Read this BFD's local symbols.  */
3831	  if (isymbuf == NULL)
3832	    {
3833	      isymbuf = (Elf_Internal_Sym *) symtab_hdr->contents;
3834	      if (isymbuf == NULL)
3835		isymbuf = bfd_elf_get_elf_syms (abfd, symtab_hdr,
3836						symtab_hdr->sh_info, 0,
3837						NULL, NULL, NULL);
3838	      if (isymbuf == NULL)
3839		goto error_return;
3840	    }
3841
3842	  isym = isymbuf + r_symndx;
3843
3844	  /* Given the symbol for a TLSLDM reloc is ignored, this also
3845	     means forcing the symbol value to the tp base.  */
3846	  if (r_type == R_ALPHA_TLSLDM)
3847	    {
3848	      info.tsec = bfd_abs_section_ptr;
3849	      symval = alpha_get_tprel_base (info.link_info);
3850	    }
3851	  else
3852	    {
3853	      symval = isym->st_value;
3854	      if (isym->st_shndx == SHN_UNDEF)
3855		continue;
3856	      else if (isym->st_shndx == SHN_ABS)
3857		info.tsec = bfd_abs_section_ptr;
3858	      else if (isym->st_shndx == SHN_COMMON)
3859		info.tsec = bfd_com_section_ptr;
3860	      else
3861		info.tsec = bfd_section_from_elf_index (abfd, isym->st_shndx);
3862	    }
3863
3864	  info.h = NULL;
3865	  info.other = isym->st_other;
3866	  if (local_got_entries)
3867	    info.first_gotent = &local_got_entries[r_symndx];
3868	  else
3869	    {
3870	      info.first_gotent = &info.gotent;
3871	      info.gotent = NULL;
3872	    }
3873	}
3874      else
3875	{
3876	  unsigned long indx;
3877	  struct alpha_elf_link_hash_entry *h;
3878
3879	  indx = r_symndx - symtab_hdr->sh_info;
3880	  h = alpha_elf_sym_hashes (abfd)[indx];
3881	  BFD_ASSERT (h != NULL);
3882
3883	  while (h->root.root.type == bfd_link_hash_indirect
3884		 || h->root.root.type == bfd_link_hash_warning)
3885	    h = (struct alpha_elf_link_hash_entry *)h->root.root.u.i.link;
3886
3887	  /* If the symbol is undefined, we can't do anything with it.  */
3888	  if (h->root.root.type == bfd_link_hash_undefined)
3889	    continue;
3890
3891	  /* If the symbol isn't defined in the current module,
3892	     again we can't do anything.  */
3893	  if (h->root.root.type == bfd_link_hash_undefweak)
3894	    {
3895	      info.tsec = bfd_abs_section_ptr;
3896	      symval = 0;
3897	    }
3898	  else if (!h->root.def_regular)
3899	    {
3900	      /* Except for TLSGD relocs, which can sometimes be
3901		 relaxed to GOTTPREL relocs.  */
3902	      if (r_type != R_ALPHA_TLSGD)
3903		continue;
3904	      info.tsec = bfd_abs_section_ptr;
3905	      symval = 0;
3906	    }
3907	  else
3908	    {
3909	      info.tsec = h->root.root.u.def.section;
3910	      symval = h->root.root.u.def.value;
3911	    }
3912
3913	  info.h = h;
3914	  info.other = h->root.other;
3915	  info.first_gotent = &h->got_entries;
3916	}
3917
3918      /* Search for the got entry to be used by this relocation.  */
3919      for (gotent = *info.first_gotent; gotent ; gotent = gotent->next)
3920	if (gotent->gotobj == info.gotobj
3921	    && gotent->reloc_type == r_type
3922	    && gotent->addend == irel->r_addend)
3923	  break;
3924      info.gotent = gotent;
3925
3926      symval += info.tsec->output_section->vma + info.tsec->output_offset;
3927      symval += irel->r_addend;
3928
3929      switch (r_type)
3930	{
3931	case R_ALPHA_LITERAL:
3932	  BFD_ASSERT(info.gotent != NULL);
3933
3934	  /* If there exist LITUSE relocations immediately following, this
3935	     opens up all sorts of interesting optimizations, because we
3936	     now know every location that this address load is used.  */
3937	  if (irel+1 < irelend
3938	      && ELF64_R_TYPE (irel[1].r_info) == R_ALPHA_LITUSE)
3939	    {
3940	      if (!elf64_alpha_relax_with_lituse (&info, symval, irel))
3941		goto error_return;
3942	    }
3943	  else
3944	    {
3945	      if (!elf64_alpha_relax_got_load (&info, symval, irel, r_type))
3946		goto error_return;
3947	    }
3948	  break;
3949
3950	case R_ALPHA_GOTDTPREL:
3951	case R_ALPHA_GOTTPREL:
3952	  BFD_ASSERT(info.gotent != NULL);
3953	  if (!elf64_alpha_relax_got_load (&info, symval, irel, r_type))
3954	    goto error_return;
3955	  break;
3956
3957	case R_ALPHA_TLSGD:
3958	case R_ALPHA_TLSLDM:
3959	  BFD_ASSERT(info.gotent != NULL);
3960	  if (!elf64_alpha_relax_tls_get_addr (&info, symval, irel,
3961					       r_type == R_ALPHA_TLSGD))
3962	    goto error_return;
3963	  break;
3964	}
3965    }
3966
3967  if (isymbuf != NULL
3968      && symtab_hdr->contents != (unsigned char *) isymbuf)
3969    {
3970      if (!link_info->keep_memory)
3971	free (isymbuf);
3972      else
3973	{
3974	  /* Cache the symbols for elf_link_input_bfd.  */
3975	  symtab_hdr->contents = (unsigned char *) isymbuf;
3976	}
3977    }
3978
3979  if (info.contents != NULL
3980      && elf_section_data (sec)->this_hdr.contents != info.contents)
3981    {
3982      if (!info.changed_contents && !link_info->keep_memory)
3983	free (info.contents);
3984      else
3985	{
3986	  /* Cache the section contents for elf_link_input_bfd.  */
3987	  elf_section_data (sec)->this_hdr.contents = info.contents;
3988	}
3989    }
3990
3991  if (elf_section_data (sec)->relocs != internal_relocs)
3992    {
3993      if (!info.changed_relocs)
3994	free (internal_relocs);
3995      else
3996	elf_section_data (sec)->relocs = internal_relocs;
3997    }
3998
3999  *again = info.changed_contents || info.changed_relocs;
4000
4001  return true;
4002
4003 error_return:
4004  if (symtab_hdr->contents != (unsigned char *) isymbuf)
4005    free (isymbuf);
4006  if (elf_section_data (sec)->this_hdr.contents != info.contents)
4007    free (info.contents);
4008  if (elf_section_data (sec)->relocs != internal_relocs)
4009    free (internal_relocs);
4010  return false;
4011}
4012
4013/* Emit a dynamic relocation for (DYNINDX, RTYPE, ADDEND) at (SEC, OFFSET)
4014   into the next available slot in SREL.  */
4015
4016static void
4017elf64_alpha_emit_dynrel (bfd *abfd, struct bfd_link_info *info,
4018			 asection *sec, asection *srel, bfd_vma offset,
4019			 long dynindx, long rtype, bfd_vma addend)
4020{
4021  Elf_Internal_Rela outrel;
4022  bfd_byte *loc;
4023
4024  BFD_ASSERT (srel != NULL);
4025
4026  outrel.r_info = ELF64_R_INFO (dynindx, rtype);
4027  outrel.r_addend = addend;
4028
4029  offset = _bfd_elf_section_offset (abfd, info, sec, offset);
4030  if ((offset | 1) != (bfd_vma) -1)
4031    outrel.r_offset = sec->output_section->vma + sec->output_offset + offset;
4032  else
4033    memset (&outrel, 0, sizeof (outrel));
4034
4035  loc = srel->contents;
4036  loc += srel->reloc_count++ * sizeof (Elf64_External_Rela);
4037  bfd_elf64_swap_reloca_out (abfd, &outrel, loc);
4038  BFD_ASSERT (sizeof (Elf64_External_Rela) * srel->reloc_count <= srel->size);
4039}
4040
4041/* Relocate an Alpha ELF section for a relocatable link.
4042
4043   We don't have to change anything unless the reloc is against a section
4044   symbol, in which case we have to adjust according to where the section
4045   symbol winds up in the output section.  */
4046
4047static int
4048elf64_alpha_relocate_section_r (bfd *output_bfd ATTRIBUTE_UNUSED,
4049				struct bfd_link_info *info ATTRIBUTE_UNUSED,
4050				bfd *input_bfd, asection *input_section,
4051				bfd_byte *contents ATTRIBUTE_UNUSED,
4052				Elf_Internal_Rela *relocs,
4053				Elf_Internal_Sym *local_syms,
4054				asection **local_sections)
4055{
4056  unsigned long symtab_hdr_sh_info;
4057  Elf_Internal_Rela *rel;
4058  Elf_Internal_Rela *relend;
4059  struct elf_link_hash_entry **sym_hashes;
4060  bool ret_val = true;
4061
4062  symtab_hdr_sh_info = elf_symtab_hdr (input_bfd).sh_info;
4063  sym_hashes = elf_sym_hashes (input_bfd);
4064
4065  relend = relocs + input_section->reloc_count;
4066  for (rel = relocs; rel < relend; rel++)
4067    {
4068      unsigned long r_symndx;
4069      Elf_Internal_Sym *sym;
4070      asection *sec;
4071      unsigned long r_type;
4072
4073      r_type = ELF64_R_TYPE (rel->r_info);
4074      if (r_type >= R_ALPHA_max)
4075	{
4076	  _bfd_error_handler
4077	    /* xgettext:c-format */
4078	    (_("%pB: unsupported relocation type %#x"),
4079	     input_bfd, (int) r_type);
4080	  bfd_set_error (bfd_error_bad_value);
4081	  ret_val = false;
4082	  continue;
4083	}
4084
4085      /* The symbol associated with GPDISP and LITUSE is
4086	 immaterial.  Only the addend is significant.  */
4087      if (r_type == R_ALPHA_GPDISP || r_type == R_ALPHA_LITUSE)
4088	continue;
4089
4090      r_symndx = ELF64_R_SYM (rel->r_info);
4091      if (r_symndx < symtab_hdr_sh_info)
4092	{
4093	  sym = local_syms + r_symndx;
4094	  sec = local_sections[r_symndx];
4095	}
4096      else
4097	{
4098	  struct elf_link_hash_entry *h;
4099
4100	  h = sym_hashes[r_symndx - symtab_hdr_sh_info];
4101
4102	  while (h->root.type == bfd_link_hash_indirect
4103		 || h->root.type == bfd_link_hash_warning)
4104	    h = (struct elf_link_hash_entry *) h->root.u.i.link;
4105
4106	  if (h->root.type != bfd_link_hash_defined
4107	      && h->root.type != bfd_link_hash_defweak)
4108	    continue;
4109
4110	  sym = NULL;
4111	  sec = h->root.u.def.section;
4112	}
4113
4114      if (sec != NULL && discarded_section (sec))
4115	RELOC_AGAINST_DISCARDED_SECTION (info, input_bfd, input_section,
4116					 rel, 1, relend,
4117					 elf64_alpha_howto_table + r_type, 0,
4118					 contents);
4119
4120      if (sym != NULL && ELF_ST_TYPE (sym->st_info) == STT_SECTION)
4121	rel->r_addend += sec->output_offset;
4122    }
4123
4124  return ret_val;
4125}
4126
4127/* Relocate an Alpha ELF section.  */
4128
4129static int
4130elf64_alpha_relocate_section (bfd *output_bfd, struct bfd_link_info *info,
4131			      bfd *input_bfd, asection *input_section,
4132			      bfd_byte *contents, Elf_Internal_Rela *relocs,
4133			      Elf_Internal_Sym *local_syms,
4134			      asection **local_sections)
4135{
4136  Elf_Internal_Shdr *symtab_hdr;
4137  Elf_Internal_Rela *rel;
4138  Elf_Internal_Rela *relend;
4139  asection *sgot, *srel, *srelgot;
4140  bfd *dynobj, *gotobj;
4141  bfd_vma gp, tp_base, dtp_base;
4142  struct alpha_elf_got_entry **local_got_entries;
4143  bool ret_val;
4144
4145  BFD_ASSERT (is_alpha_elf (input_bfd));
4146
4147  /* Handle relocatable links with a smaller loop.  */
4148  if (bfd_link_relocatable (info))
4149    return elf64_alpha_relocate_section_r (output_bfd, info, input_bfd,
4150					   input_section, contents, relocs,
4151					   local_syms, local_sections);
4152
4153  /* This is a final link.  */
4154
4155  ret_val = true;
4156
4157  symtab_hdr = &elf_symtab_hdr (input_bfd);
4158
4159  dynobj = elf_hash_table (info)->dynobj;
4160  srelgot = elf_hash_table (info)->srelgot;
4161
4162  if (input_section->flags & SEC_ALLOC)
4163    {
4164      const char *section_name;
4165      section_name = (bfd_elf_string_from_elf_section
4166		      (input_bfd, elf_elfheader(input_bfd)->e_shstrndx,
4167		       _bfd_elf_single_rel_hdr (input_section)->sh_name));
4168      BFD_ASSERT(section_name != NULL);
4169      srel = bfd_get_linker_section (dynobj, section_name);
4170    }
4171  else
4172    srel = NULL;
4173
4174  /* Find the gp value for this input bfd.  */
4175  gotobj = alpha_elf_tdata (input_bfd)->gotobj;
4176  if (gotobj)
4177    {
4178      sgot = alpha_elf_tdata (gotobj)->got;
4179      gp = _bfd_get_gp_value (gotobj);
4180      if (gp == 0)
4181	{
4182	  gp = (sgot->output_section->vma
4183		+ sgot->output_offset
4184		+ 0x8000);
4185	  _bfd_set_gp_value (gotobj, gp);
4186	}
4187    }
4188  else
4189    {
4190      sgot = NULL;
4191      gp = 0;
4192    }
4193
4194  local_got_entries = alpha_elf_tdata(input_bfd)->local_got_entries;
4195
4196  if (elf_hash_table (info)->tls_sec != NULL)
4197    {
4198      dtp_base = alpha_get_dtprel_base (info);
4199      tp_base = alpha_get_tprel_base (info);
4200    }
4201  else
4202    dtp_base = tp_base = 0;
4203
4204  relend = relocs + input_section->reloc_count;
4205  for (rel = relocs; rel < relend; rel++)
4206    {
4207      struct alpha_elf_link_hash_entry *h = NULL;
4208      struct alpha_elf_got_entry *gotent;
4209      bfd_reloc_status_type r;
4210      reloc_howto_type *howto;
4211      unsigned long r_symndx;
4212      Elf_Internal_Sym *sym = NULL;
4213      asection *sec = NULL;
4214      bfd_vma value;
4215      bfd_vma addend;
4216      bool dynamic_symbol_p;
4217      bool unresolved_reloc = false;
4218      bool undef_weak_ref = false;
4219      unsigned long r_type;
4220
4221      r_type = ELF64_R_TYPE(rel->r_info);
4222      if (r_type >= R_ALPHA_max)
4223	{
4224	  _bfd_error_handler
4225	    /* xgettext:c-format */
4226	    (_("%pB: unsupported relocation type %#x"),
4227	     input_bfd, (int) r_type);
4228	  bfd_set_error (bfd_error_bad_value);
4229	  ret_val = false;
4230	  continue;
4231	}
4232
4233      howto = elf64_alpha_howto_table + r_type;
4234      r_symndx = ELF64_R_SYM(rel->r_info);
4235
4236      /* The symbol for a TLSLDM reloc is ignored.  Collapse the
4237	 reloc to the STN_UNDEF (0) symbol so that they all match.  */
4238      if (r_type == R_ALPHA_TLSLDM)
4239	r_symndx = STN_UNDEF;
4240
4241      if (r_symndx < symtab_hdr->sh_info)
4242	{
4243	  asection *msec;
4244	  sym = local_syms + r_symndx;
4245	  sec = local_sections[r_symndx];
4246	  msec = sec;
4247	  value = _bfd_elf_rela_local_sym (output_bfd, sym, &msec, rel);
4248
4249	  /* If this is a tp-relative relocation against sym STN_UNDEF (0),
4250	     this is hackery from relax_section.  Force the value to
4251	     be the tls module base.  */
4252	  if (r_symndx == STN_UNDEF
4253	      && (r_type == R_ALPHA_TLSLDM
4254		  || r_type == R_ALPHA_GOTTPREL
4255		  || r_type == R_ALPHA_TPREL64
4256		  || r_type == R_ALPHA_TPRELHI
4257		  || r_type == R_ALPHA_TPRELLO
4258		  || r_type == R_ALPHA_TPREL16))
4259	    value = dtp_base;
4260
4261	  if (local_got_entries)
4262	    gotent = local_got_entries[r_symndx];
4263	  else
4264	    gotent = NULL;
4265
4266	  /* Need to adjust local GOT entries' addends for SEC_MERGE
4267	     unless it has been done already.  */
4268	  if ((sec->flags & SEC_MERGE)
4269	      && ELF_ST_TYPE (sym->st_info) == STT_SECTION
4270	      && sec->sec_info_type == SEC_INFO_TYPE_MERGE
4271	      && gotent
4272	      && !gotent->reloc_xlated)
4273	    {
4274	      struct alpha_elf_got_entry *ent;
4275
4276	      for (ent = gotent; ent; ent = ent->next)
4277		{
4278		  ent->reloc_xlated = 1;
4279		  if (ent->use_count == 0)
4280		    continue;
4281		  msec = sec;
4282		  ent->addend =
4283		    _bfd_merged_section_offset (output_bfd, &msec,
4284						elf_section_data (sec)->
4285						  sec_info,
4286						sym->st_value + ent->addend);
4287		  ent->addend -= sym->st_value;
4288		  ent->addend += msec->output_section->vma
4289				 + msec->output_offset
4290				 - sec->output_section->vma
4291				 - sec->output_offset;
4292		}
4293	    }
4294
4295	  dynamic_symbol_p = false;
4296	}
4297      else
4298	{
4299	  bool warned, ignored;
4300	  struct elf_link_hash_entry *hh;
4301	  struct elf_link_hash_entry **sym_hashes = elf_sym_hashes (input_bfd);
4302
4303	  RELOC_FOR_GLOBAL_SYMBOL (info, input_bfd, input_section, rel,
4304				   r_symndx, symtab_hdr, sym_hashes,
4305				   hh, sec, value,
4306				   unresolved_reloc, warned, ignored);
4307
4308	  if (warned)
4309	    continue;
4310
4311	  if (value == 0
4312	      && ! unresolved_reloc
4313	      && hh->root.type == bfd_link_hash_undefweak)
4314	    undef_weak_ref = true;
4315
4316	  h = (struct alpha_elf_link_hash_entry *) hh;
4317	  dynamic_symbol_p = alpha_elf_dynamic_symbol_p (&h->root, info);
4318	  gotent = h->got_entries;
4319	}
4320
4321      if (sec != NULL && discarded_section (sec))
4322	RELOC_AGAINST_DISCARDED_SECTION (info, input_bfd, input_section,
4323					 rel, 1, relend, howto, 0, contents);
4324
4325      addend = rel->r_addend;
4326      value += addend;
4327
4328      /* Search for the proper got entry.  */
4329      for (; gotent ; gotent = gotent->next)
4330	if (gotent->gotobj == gotobj
4331	    && gotent->reloc_type == r_type
4332	    && gotent->addend == addend)
4333	  break;
4334
4335      switch (r_type)
4336	{
4337	case R_ALPHA_GPDISP:
4338	  {
4339	    bfd_byte *p_ldah, *p_lda;
4340
4341	    BFD_ASSERT(gp != 0);
4342
4343	    value = (input_section->output_section->vma
4344		     + input_section->output_offset
4345		     + rel->r_offset);
4346
4347	    p_ldah = contents + rel->r_offset;
4348	    p_lda = p_ldah + rel->r_addend;
4349
4350	    r = elf64_alpha_do_reloc_gpdisp (input_bfd, gp - value,
4351					     p_ldah, p_lda);
4352	  }
4353	  break;
4354
4355	case R_ALPHA_LITERAL:
4356	  BFD_ASSERT(sgot != NULL);
4357	  BFD_ASSERT(gp != 0);
4358	  BFD_ASSERT(gotent != NULL);
4359	  BFD_ASSERT(gotent->use_count >= 1);
4360
4361	  if (!gotent->reloc_done)
4362	    {
4363	      gotent->reloc_done = 1;
4364
4365	      bfd_put_64 (output_bfd, value,
4366			  sgot->contents + gotent->got_offset);
4367
4368	      /* If the symbol has been forced local, output a
4369		 RELATIVE reloc, otherwise it will be handled in
4370		 finish_dynamic_symbol.  */
4371	      if (bfd_link_pic (info)
4372		  && !dynamic_symbol_p
4373		  && !undef_weak_ref)
4374		elf64_alpha_emit_dynrel (output_bfd, info, sgot, srelgot,
4375					 gotent->got_offset, 0,
4376					 R_ALPHA_RELATIVE, value);
4377	    }
4378
4379	  value = (sgot->output_section->vma
4380		   + sgot->output_offset
4381		   + gotent->got_offset);
4382	  value -= gp;
4383	  goto default_reloc;
4384
4385	case R_ALPHA_GPREL32:
4386	case R_ALPHA_GPREL16:
4387	case R_ALPHA_GPRELLOW:
4388	  if (dynamic_symbol_p)
4389	    {
4390	      _bfd_error_handler
4391		/* xgettext:c-format */
4392		(_("%pB: gp-relative relocation against dynamic symbol %s"),
4393		 input_bfd, h->root.root.root.string);
4394	      ret_val = false;
4395	    }
4396	  BFD_ASSERT(gp != 0);
4397	  value -= gp;
4398	  goto default_reloc;
4399
4400	case R_ALPHA_GPRELHIGH:
4401	  if (dynamic_symbol_p)
4402	    {
4403	      _bfd_error_handler
4404		/* xgettext:c-format */
4405		(_("%pB: gp-relative relocation against dynamic symbol %s"),
4406		 input_bfd, h->root.root.root.string);
4407	      ret_val = false;
4408	    }
4409	  BFD_ASSERT(gp != 0);
4410	  value -= gp;
4411	  value = ((bfd_signed_vma) value >> 16) + ((value >> 15) & 1);
4412	  goto default_reloc;
4413
4414	case R_ALPHA_HINT:
4415	  /* A call to a dynamic symbol is definitely out of range of
4416	     the 16-bit displacement.  Don't bother writing anything.  */
4417	  if (dynamic_symbol_p)
4418	    {
4419	      r = bfd_reloc_ok;
4420	      break;
4421	    }
4422	  /* The regular PC-relative stuff measures from the start of
4423	     the instruction rather than the end.  */
4424	  value -= 4;
4425	  goto default_reloc;
4426
4427	case R_ALPHA_BRADDR:
4428	  if (dynamic_symbol_p)
4429	    {
4430	      _bfd_error_handler
4431		/* xgettext:c-format */
4432		(_("%pB: pc-relative relocation against dynamic symbol %s"),
4433		 input_bfd, h->root.root.root.string);
4434	      ret_val = false;
4435	    }
4436	  /* The regular PC-relative stuff measures from the start of
4437	     the instruction rather than the end.  */
4438	  value -= 4;
4439	  goto default_reloc;
4440
4441	case R_ALPHA_BRSGP:
4442	  {
4443	    int other;
4444	    const char *name;
4445
4446	    /* The regular PC-relative stuff measures from the start of
4447	       the instruction rather than the end.  */
4448	    value -= 4;
4449
4450	    /* The source and destination gp must be the same.  Note that
4451	       the source will always have an assigned gp, since we forced
4452	       one in check_relocs, but that the destination may not, as
4453	       it might not have had any relocations at all.  Also take
4454	       care not to crash if H is an undefined symbol.  */
4455	    if (h != NULL && sec != NULL
4456		&& alpha_elf_tdata (sec->owner)->gotobj
4457		&& gotobj != alpha_elf_tdata (sec->owner)->gotobj)
4458	      {
4459		_bfd_error_handler
4460		  /* xgettext:c-format */
4461		  (_("%pB: change in gp: BRSGP %s"),
4462		   input_bfd, h->root.root.root.string);
4463		ret_val = false;
4464	      }
4465
4466	    /* The symbol should be marked either NOPV or STD_GPLOAD.  */
4467	    if (h != NULL)
4468	      other = h->root.other;
4469	    else
4470	      other = sym->st_other;
4471	    switch (other & STO_ALPHA_STD_GPLOAD)
4472	      {
4473	      case STO_ALPHA_NOPV:
4474		break;
4475	      case STO_ALPHA_STD_GPLOAD:
4476		value += 8;
4477		break;
4478	      default:
4479		if (h != NULL)
4480		  name = h->root.root.root.string;
4481		else
4482		  {
4483		    name = (bfd_elf_string_from_elf_section
4484			    (input_bfd, symtab_hdr->sh_link, sym->st_name));
4485		    if (name == NULL)
4486		      name = _("<unknown>");
4487		    else if (name[0] == 0)
4488		      name = bfd_section_name (sec);
4489		  }
4490		_bfd_error_handler
4491		  /* xgettext:c-format */
4492		  (_("%pB: !samegp reloc against symbol without .prologue: %s"),
4493		   input_bfd, name);
4494		ret_val = false;
4495		break;
4496	      }
4497
4498	    goto default_reloc;
4499	  }
4500
4501	case R_ALPHA_REFLONG:
4502	case R_ALPHA_REFQUAD:
4503	case R_ALPHA_DTPREL64:
4504	case R_ALPHA_TPREL64:
4505	  {
4506	    long dynindx, dyntype = r_type;
4507	    bfd_vma dynaddend;
4508
4509	    /* Careful here to remember RELATIVE relocations for global
4510	       variables for symbolic shared objects.  */
4511
4512	    if (dynamic_symbol_p)
4513	      {
4514		BFD_ASSERT(h->root.dynindx != -1);
4515		dynindx = h->root.dynindx;
4516		dynaddend = addend;
4517		addend = 0, value = 0;
4518	      }
4519	    else if (r_type == R_ALPHA_DTPREL64)
4520	      {
4521		BFD_ASSERT (elf_hash_table (info)->tls_sec != NULL);
4522		value -= dtp_base;
4523		goto default_reloc;
4524	      }
4525	    else if (r_type == R_ALPHA_TPREL64)
4526	      {
4527		BFD_ASSERT (elf_hash_table (info)->tls_sec != NULL);
4528		if (!bfd_link_dll (info))
4529		  {
4530		    value -= tp_base;
4531		    goto default_reloc;
4532		  }
4533		dynindx = 0;
4534		dynaddend = value - dtp_base;
4535	      }
4536	    else if (bfd_link_pic (info)
4537		     && r_symndx != STN_UNDEF
4538		     && (input_section->flags & SEC_ALLOC)
4539		     && !undef_weak_ref
4540		     && !(unresolved_reloc
4541			  && (_bfd_elf_section_offset (output_bfd, info,
4542						       input_section,
4543						       rel->r_offset)
4544			      == (bfd_vma) -1)))
4545	      {
4546		if (r_type == R_ALPHA_REFLONG)
4547		  {
4548		    _bfd_error_handler
4549		      /* xgettext:c-format */
4550		      (_("%pB: unhandled dynamic relocation against %s"),
4551		       input_bfd,
4552		       h->root.root.root.string);
4553		    ret_val = false;
4554		  }
4555		dynindx = 0;
4556		dyntype = R_ALPHA_RELATIVE;
4557		dynaddend = value;
4558	      }
4559	    else
4560	      goto default_reloc;
4561
4562	    if (input_section->flags & SEC_ALLOC)
4563	      elf64_alpha_emit_dynrel (output_bfd, info, input_section,
4564				       srel, rel->r_offset, dynindx,
4565				       dyntype, dynaddend);
4566	  }
4567	  goto default_reloc;
4568
4569	case R_ALPHA_SREL16:
4570	case R_ALPHA_SREL32:
4571	case R_ALPHA_SREL64:
4572	  if (dynamic_symbol_p)
4573	    {
4574	      _bfd_error_handler
4575		/* xgettext:c-format */
4576		(_("%pB: pc-relative relocation against dynamic symbol %s"),
4577		 input_bfd, h->root.root.root.string);
4578	      ret_val = false;
4579	    }
4580	  else if (bfd_link_pic (info)
4581		   && undef_weak_ref)
4582	    {
4583	      _bfd_error_handler
4584		/* xgettext:c-format */
4585		(_("%pB: pc-relative relocation against undefined weak symbol %s"),
4586		 input_bfd, h->root.root.root.string);
4587	      ret_val = false;
4588	    }
4589
4590
4591	  /* ??? .eh_frame references to discarded sections will be smashed
4592	     to relocations against SHN_UNDEF.  The .eh_frame format allows
4593	     NULL to be encoded as 0 in any format, so this works here.  */
4594	  if (r_symndx == STN_UNDEF
4595	      || (unresolved_reloc
4596		  && _bfd_elf_section_offset (output_bfd, info,
4597					      input_section,
4598					      rel->r_offset) == (bfd_vma) -1))
4599	    howto = (elf64_alpha_howto_table
4600		     + (r_type - R_ALPHA_SREL32 + R_ALPHA_REFLONG));
4601	  goto default_reloc;
4602
4603	case R_ALPHA_TLSLDM:
4604	  /* Ignore the symbol for the relocation.  The result is always
4605	     the current module.  */
4606	  dynamic_symbol_p = 0;
4607	  /* FALLTHRU */
4608
4609	case R_ALPHA_TLSGD:
4610	  if (!gotent->reloc_done)
4611	    {
4612	      gotent->reloc_done = 1;
4613
4614	      /* Note that the module index for the main program is 1.  */
4615	      bfd_put_64 (output_bfd,
4616			  !bfd_link_pic (info) && !dynamic_symbol_p,
4617			  sgot->contents + gotent->got_offset);
4618
4619	      /* If the symbol has been forced local, output a
4620		 DTPMOD64 reloc, otherwise it will be handled in
4621		 finish_dynamic_symbol.  */
4622	      if (bfd_link_pic (info) && !dynamic_symbol_p)
4623		elf64_alpha_emit_dynrel (output_bfd, info, sgot, srelgot,
4624					 gotent->got_offset, 0,
4625					 R_ALPHA_DTPMOD64, 0);
4626
4627	      if (dynamic_symbol_p || r_type == R_ALPHA_TLSLDM)
4628		value = 0;
4629	      else
4630		{
4631		  BFD_ASSERT (elf_hash_table (info)->tls_sec != NULL);
4632		  value -= dtp_base;
4633		}
4634	      bfd_put_64 (output_bfd, value,
4635			  sgot->contents + gotent->got_offset + 8);
4636	    }
4637
4638	  value = (sgot->output_section->vma
4639		   + sgot->output_offset
4640		   + gotent->got_offset);
4641	  value -= gp;
4642	  goto default_reloc;
4643
4644	case R_ALPHA_DTPRELHI:
4645	case R_ALPHA_DTPRELLO:
4646	case R_ALPHA_DTPREL16:
4647	  if (dynamic_symbol_p)
4648	    {
4649	      _bfd_error_handler
4650		/* xgettext:c-format */
4651		(_("%pB: dtp-relative relocation against dynamic symbol %s"),
4652		 input_bfd, h->root.root.root.string);
4653	      ret_val = false;
4654	    }
4655	  BFD_ASSERT (elf_hash_table (info)->tls_sec != NULL);
4656	  value -= dtp_base;
4657	  if (r_type == R_ALPHA_DTPRELHI)
4658	    value = ((bfd_signed_vma) value >> 16) + ((value >> 15) & 1);
4659	  goto default_reloc;
4660
4661	case R_ALPHA_TPRELHI:
4662	case R_ALPHA_TPRELLO:
4663	case R_ALPHA_TPREL16:
4664	  if (bfd_link_dll (info))
4665	    {
4666	      _bfd_error_handler
4667		/* xgettext:c-format */
4668		(_("%pB: TLS local exec code cannot be linked into shared objects"),
4669		input_bfd);
4670	      ret_val = false;
4671	    }
4672	  else if (dynamic_symbol_p)
4673	    {
4674	      _bfd_error_handler
4675		/* xgettext:c-format */
4676		(_("%pB: tp-relative relocation against dynamic symbol %s"),
4677		 input_bfd, h->root.root.root.string);
4678	      ret_val = false;
4679	    }
4680	  BFD_ASSERT (elf_hash_table (info)->tls_sec != NULL);
4681	  value -= tp_base;
4682	  if (r_type == R_ALPHA_TPRELHI)
4683	    value = ((bfd_signed_vma) value >> 16) + ((value >> 15) & 1);
4684	  goto default_reloc;
4685
4686	case R_ALPHA_GOTDTPREL:
4687	case R_ALPHA_GOTTPREL:
4688	  BFD_ASSERT(sgot != NULL);
4689	  BFD_ASSERT(gp != 0);
4690	  BFD_ASSERT(gotent != NULL);
4691	  BFD_ASSERT(gotent->use_count >= 1);
4692
4693	  if (!gotent->reloc_done)
4694	    {
4695	      gotent->reloc_done = 1;
4696
4697	      if (dynamic_symbol_p)
4698		value = 0;
4699	      else
4700		{
4701		  BFD_ASSERT (elf_hash_table (info)->tls_sec != NULL);
4702		  if (r_type == R_ALPHA_GOTDTPREL)
4703		    value -= dtp_base;
4704		  else if (bfd_link_executable (info))
4705		    value -= tp_base;
4706		  else
4707		    {
4708		      elf64_alpha_emit_dynrel (output_bfd, info, sgot, srelgot,
4709					       gotent->got_offset, 0,
4710					       R_ALPHA_TPREL64,
4711					       value - dtp_base);
4712		      value = 0;
4713		    }
4714		}
4715	      bfd_put_64 (output_bfd, value,
4716			  sgot->contents + gotent->got_offset);
4717	    }
4718
4719	  value = (sgot->output_section->vma
4720		   + sgot->output_offset
4721		   + gotent->got_offset);
4722	  value -= gp;
4723	  goto default_reloc;
4724
4725	default:
4726	default_reloc:
4727	  r = _bfd_final_link_relocate (howto, input_bfd, input_section,
4728					contents, rel->r_offset, value, 0);
4729	  break;
4730	}
4731
4732      switch (r)
4733	{
4734	case bfd_reloc_ok:
4735	  break;
4736
4737	case bfd_reloc_overflow:
4738	  {
4739	    const char *name;
4740
4741	    /* Don't warn if the overflow is due to pc relative reloc
4742	       against discarded section.  Section optimization code should
4743	       handle it.  */
4744
4745	    if (r_symndx < symtab_hdr->sh_info
4746		&& sec != NULL && howto->pc_relative
4747		&& discarded_section (sec))
4748	      break;
4749
4750	    if (h != NULL)
4751	      name = NULL;
4752	    else
4753	      {
4754		name = (bfd_elf_string_from_elf_section
4755			(input_bfd, symtab_hdr->sh_link, sym->st_name));
4756		if (name == NULL)
4757		  return false;
4758		if (*name == '\0')
4759		  name = bfd_section_name (sec);
4760	      }
4761	    (*info->callbacks->reloc_overflow)
4762	      (info, (h ? &h->root.root : NULL), name, howto->name,
4763	       (bfd_vma) 0, input_bfd, input_section, rel->r_offset);
4764	  }
4765	  break;
4766
4767	default:
4768	case bfd_reloc_outofrange:
4769	  abort ();
4770	}
4771    }
4772
4773  return ret_val;
4774}
4775
4776/* Finish up dynamic symbol handling.  We set the contents of various
4777   dynamic sections here.  */
4778
4779static bool
4780elf64_alpha_finish_dynamic_symbol (bfd *output_bfd, struct bfd_link_info *info,
4781				   struct elf_link_hash_entry *h,
4782				   Elf_Internal_Sym *sym)
4783{
4784  struct alpha_elf_link_hash_entry *ah = (struct alpha_elf_link_hash_entry *)h;
4785
4786  if (h->needs_plt)
4787    {
4788      /* Fill in the .plt entry for this symbol.  */
4789      asection *splt, *sgot, *srel;
4790      Elf_Internal_Rela outrel;
4791      bfd_byte *loc;
4792      bfd_vma got_addr, plt_addr;
4793      bfd_vma plt_index;
4794      struct alpha_elf_got_entry *gotent;
4795
4796      BFD_ASSERT (h->dynindx != -1);
4797
4798      splt = elf_hash_table (info)->splt;
4799      BFD_ASSERT (splt != NULL);
4800      srel = elf_hash_table (info)->srelplt;
4801      BFD_ASSERT (srel != NULL);
4802
4803      for (gotent = ah->got_entries; gotent ; gotent = gotent->next)
4804	if (gotent->reloc_type == R_ALPHA_LITERAL
4805	    && gotent->use_count > 0)
4806	  {
4807	    unsigned int insn;
4808	    int disp;
4809
4810	    sgot = alpha_elf_tdata (gotent->gotobj)->got;
4811	    BFD_ASSERT (sgot != NULL);
4812
4813	    BFD_ASSERT (gotent->got_offset != -1);
4814	    BFD_ASSERT (gotent->plt_offset != -1);
4815
4816	    got_addr = (sgot->output_section->vma
4817			+ sgot->output_offset
4818			+ gotent->got_offset);
4819	    plt_addr = (splt->output_section->vma
4820			+ splt->output_offset
4821			+ gotent->plt_offset);
4822
4823	    plt_index = (gotent->plt_offset-PLT_HEADER_SIZE) / PLT_ENTRY_SIZE;
4824
4825	    /* Fill in the entry in the procedure linkage table.  */
4826	    if (elf64_alpha_use_secureplt)
4827	      {
4828		disp = (PLT_HEADER_SIZE - 4) - (gotent->plt_offset + 4);
4829		insn = INSN_AD (INSN_BR, 31, disp);
4830		bfd_put_32 (output_bfd, insn,
4831			    splt->contents + gotent->plt_offset);
4832
4833		plt_index = ((gotent->plt_offset - NEW_PLT_HEADER_SIZE)
4834			     / NEW_PLT_ENTRY_SIZE);
4835	      }
4836	    else if ((output_bfd->flags & BFD_TRADITIONAL_FORMAT) != 0)
4837	      {
4838	        long hi, lo;
4839
4840	        /* decompose the reloc offset for the plt for ldah+lda */
4841	        hi = plt_index * sizeof(Elf64_External_Rela);
4842	        lo = ((hi & 0xffff) ^ 0x8000) - 0x8000;
4843	        hi = (hi - lo) >> 16;
4844
4845	        insn = INSN_ABO (INSN_LDAH, 28, 31, hi);
4846		bfd_put_32 (output_bfd, insn,
4847			    splt->contents + gotent->plt_offset);
4848
4849	        insn = INSN_ABO (INSN_LDA, 28, 28, lo);
4850		bfd_put_32 (output_bfd, insn,
4851			    splt->contents + gotent->plt_offset + 4);
4852
4853		disp = -(gotent->plt_offset + 12);
4854		insn = INSN_AD (INSN_BR, 31, disp);
4855
4856		bfd_put_32 (output_bfd, insn,
4857			    splt->contents + gotent->plt_offset + 8);
4858
4859		plt_index = ((gotent->plt_offset - OLD_PLT_HEADER_SIZE)
4860			     / OLD_PLT_ENTRY_SIZE);
4861	      }
4862	    else
4863	      {
4864		disp = -(gotent->plt_offset + 4);
4865		insn = INSN_AD (INSN_BR, 28, disp);
4866		bfd_put_32 (output_bfd, insn,
4867			    splt->contents + gotent->plt_offset);
4868		bfd_put_32 (output_bfd, INSN_UNOP,
4869			    splt->contents + gotent->plt_offset + 4);
4870		bfd_put_32 (output_bfd, INSN_UNOP,
4871			    splt->contents + gotent->plt_offset + 8);
4872
4873		plt_index = ((gotent->plt_offset - OLD_PLT_HEADER_SIZE)
4874			     / OLD_PLT_ENTRY_SIZE);
4875	      }
4876
4877	    /* Fill in the entry in the .rela.plt section.  */
4878	    outrel.r_offset = got_addr;
4879	    outrel.r_info = ELF64_R_INFO(h->dynindx, R_ALPHA_JMP_SLOT);
4880	    outrel.r_addend = 0;
4881
4882	    loc = srel->contents + plt_index * sizeof (Elf64_External_Rela);
4883	    bfd_elf64_swap_reloca_out (output_bfd, &outrel, loc);
4884
4885	    /* Fill in the entry in the .got.  */
4886	    bfd_put_64 (output_bfd, plt_addr,
4887			sgot->contents + gotent->got_offset);
4888	  }
4889    }
4890  else if (alpha_elf_dynamic_symbol_p (h, info))
4891    {
4892      /* Fill in the dynamic relocations for this symbol's .got entries.  */
4893      asection *srel;
4894      struct alpha_elf_got_entry *gotent;
4895
4896      srel = elf_hash_table (info)->srelgot;
4897      BFD_ASSERT (srel != NULL);
4898
4899      for (gotent = ((struct alpha_elf_link_hash_entry *) h)->got_entries;
4900	   gotent != NULL;
4901	   gotent = gotent->next)
4902	{
4903	  asection *sgot;
4904	  long r_type;
4905
4906	  if (gotent->use_count == 0)
4907	    continue;
4908
4909	  sgot = alpha_elf_tdata (gotent->gotobj)->got;
4910
4911	  r_type = gotent->reloc_type;
4912	  switch (r_type)
4913	    {
4914	    case R_ALPHA_LITERAL:
4915	      r_type = R_ALPHA_GLOB_DAT;
4916	      break;
4917	    case R_ALPHA_TLSGD:
4918	      r_type = R_ALPHA_DTPMOD64;
4919	      break;
4920	    case R_ALPHA_GOTDTPREL:
4921	      r_type = R_ALPHA_DTPREL64;
4922	      break;
4923	    case R_ALPHA_GOTTPREL:
4924	      r_type = R_ALPHA_TPREL64;
4925	      break;
4926	    case R_ALPHA_TLSLDM:
4927	    default:
4928	      abort ();
4929	    }
4930
4931	  elf64_alpha_emit_dynrel (output_bfd, info, sgot, srel,
4932				   gotent->got_offset, h->dynindx,
4933				   r_type, gotent->addend);
4934
4935	  if (gotent->reloc_type == R_ALPHA_TLSGD)
4936	    elf64_alpha_emit_dynrel (output_bfd, info, sgot, srel,
4937				     gotent->got_offset + 8, h->dynindx,
4938				     R_ALPHA_DTPREL64, gotent->addend);
4939	}
4940    }
4941
4942  /* Mark some specially defined symbols as absolute.  */
4943  if (h == elf_hash_table (info)->hdynamic
4944      || h == elf_hash_table (info)->hgot
4945      || h == elf_hash_table (info)->hplt)
4946    sym->st_shndx = SHN_ABS;
4947
4948  return true;
4949}
4950
4951/* Finish up the dynamic sections.  */
4952
4953static bool
4954elf64_alpha_finish_dynamic_sections (bfd *output_bfd,
4955				     struct bfd_link_info *info)
4956{
4957  bfd *dynobj;
4958  asection *sdyn;
4959
4960  dynobj = elf_hash_table (info)->dynobj;
4961  sdyn = bfd_get_linker_section (dynobj, ".dynamic");
4962
4963  if (elf_hash_table (info)->dynamic_sections_created)
4964    {
4965      asection *splt, *sgotplt, *srelaplt;
4966      Elf64_External_Dyn *dyncon, *dynconend;
4967      bfd_vma plt_vma, gotplt_vma;
4968
4969      splt = elf_hash_table (info)->splt;
4970      srelaplt = elf_hash_table (info)->srelplt;
4971      BFD_ASSERT (splt != NULL && sdyn != NULL);
4972
4973      plt_vma = splt->output_section->vma + splt->output_offset;
4974
4975      gotplt_vma = 0;
4976      if (elf64_alpha_use_secureplt)
4977	{
4978	  sgotplt = elf_hash_table (info)->sgotplt;
4979	  BFD_ASSERT (sgotplt != NULL);
4980	  if (sgotplt->size > 0)
4981	    gotplt_vma = sgotplt->output_section->vma + sgotplt->output_offset;
4982	}
4983
4984      dyncon = (Elf64_External_Dyn *) sdyn->contents;
4985      dynconend = (Elf64_External_Dyn *) (sdyn->contents + sdyn->size);
4986      for (; dyncon < dynconend; dyncon++)
4987	{
4988	  Elf_Internal_Dyn dyn;
4989
4990	  bfd_elf64_swap_dyn_in (dynobj, dyncon, &dyn);
4991
4992	  switch (dyn.d_tag)
4993	    {
4994	    case DT_PLTGOT:
4995	      dyn.d_un.d_ptr
4996		= elf64_alpha_use_secureplt ? gotplt_vma : plt_vma;
4997	      break;
4998	    case DT_PLTRELSZ:
4999	      dyn.d_un.d_val = srelaplt ? srelaplt->size : 0;
5000	      break;
5001	    case DT_JMPREL:
5002	      dyn.d_un.d_ptr = srelaplt ? (srelaplt->output_section->vma
5003					   + srelaplt->output_offset) : 0;
5004	      break;
5005	    }
5006
5007	  bfd_elf64_swap_dyn_out (output_bfd, &dyn, dyncon);
5008	}
5009
5010      /* Initialize the plt header.  */
5011      if (splt->size > 0)
5012	{
5013	  unsigned int insn;
5014	  int ofs;
5015
5016	  if (elf64_alpha_use_secureplt)
5017	    {
5018	      ofs = gotplt_vma - (plt_vma + PLT_HEADER_SIZE);
5019
5020	      insn = INSN_ABC (INSN_SUBQ, 27, 28, 25);
5021	      bfd_put_32 (output_bfd, insn, splt->contents);
5022
5023	      insn = INSN_ABO (INSN_LDAH, 28, 28, (ofs + 0x8000) >> 16);
5024	      bfd_put_32 (output_bfd, insn, splt->contents + 4);
5025
5026	      insn = INSN_ABC (INSN_S4SUBQ, 25, 25, 25);
5027	      bfd_put_32 (output_bfd, insn, splt->contents + 8);
5028
5029	      insn = INSN_ABO (INSN_LDA, 28, 28, ofs);
5030	      bfd_put_32 (output_bfd, insn, splt->contents + 12);
5031
5032	      insn = INSN_ABO (INSN_LDQ, 27, 28, 0);
5033	      bfd_put_32 (output_bfd, insn, splt->contents + 16);
5034
5035	      insn = INSN_ABC (INSN_ADDQ, 25, 25, 25);
5036	      bfd_put_32 (output_bfd, insn, splt->contents + 20);
5037
5038	      insn = INSN_ABO (INSN_LDQ, 28, 28, 8);
5039	      bfd_put_32 (output_bfd, insn, splt->contents + 24);
5040
5041	      insn = INSN_AB (INSN_JMP, 31, 27);
5042	      bfd_put_32 (output_bfd, insn, splt->contents + 28);
5043
5044	      insn = INSN_AD (INSN_BR, 28, -PLT_HEADER_SIZE);
5045	      bfd_put_32 (output_bfd, insn, splt->contents + 32);
5046	    }
5047	  else
5048	    {
5049	      insn = INSN_AD (INSN_BR, 27, 0);	/* br $27, .+4 */
5050	      bfd_put_32 (output_bfd, insn, splt->contents);
5051
5052	      insn = INSN_ABO (INSN_LDQ, 27, 27, 12);
5053	      bfd_put_32 (output_bfd, insn, splt->contents + 4);
5054
5055	      insn = INSN_UNOP;
5056	      bfd_put_32 (output_bfd, insn, splt->contents + 8);
5057
5058	      insn = INSN_AB (INSN_JMP, 27, 27);
5059	      bfd_put_32 (output_bfd, insn, splt->contents + 12);
5060
5061	      /* The next two words will be filled in by ld.so.  */
5062	      bfd_put_64 (output_bfd, 0, splt->contents + 16);
5063	      bfd_put_64 (output_bfd, 0, splt->contents + 24);
5064	    }
5065
5066	  elf_section_data (splt->output_section)->this_hdr.sh_entsize = 0;
5067	}
5068    }
5069
5070  return true;
5071}
5072
5073/* We need to use a special link routine to handle the .mdebug section.
5074   We need to merge all instances of these sections together, not write
5075   them all out sequentially.  */
5076
5077static bool
5078elf64_alpha_final_link (bfd *abfd, struct bfd_link_info *info)
5079{
5080  asection *o;
5081  struct bfd_link_order *p;
5082  asection *mdebug_sec;
5083  struct ecoff_debug_info debug;
5084  const struct ecoff_debug_swap *swap
5085    = get_elf_backend_data (abfd)->elf_backend_ecoff_debug_swap;
5086  HDRR *symhdr = &debug.symbolic_header;
5087  void * mdebug_handle = NULL;
5088  struct alpha_elf_link_hash_table * htab;
5089
5090  htab = alpha_elf_hash_table (info);
5091  if (htab == NULL)
5092    return false;
5093
5094  /* Go through the sections and collect the mdebug information.  */
5095  mdebug_sec = NULL;
5096  for (o = abfd->sections; o != (asection *) NULL; o = o->next)
5097    {
5098      if (strcmp (o->name, ".mdebug") == 0)
5099	{
5100	  struct extsym_info einfo;
5101
5102	  /* We have found the .mdebug section in the output file.
5103	     Look through all the link_orders comprising it and merge
5104	     the information together.  */
5105	  symhdr->magic = swap->sym_magic;
5106	  /* FIXME: What should the version stamp be?  */
5107	  symhdr->vstamp = 0;
5108	  symhdr->ilineMax = 0;
5109	  symhdr->cbLine = 0;
5110	  symhdr->idnMax = 0;
5111	  symhdr->ipdMax = 0;
5112	  symhdr->isymMax = 0;
5113	  symhdr->ioptMax = 0;
5114	  symhdr->iauxMax = 0;
5115	  symhdr->issMax = 0;
5116	  symhdr->issExtMax = 0;
5117	  symhdr->ifdMax = 0;
5118	  symhdr->crfd = 0;
5119	  symhdr->iextMax = 0;
5120
5121	  /* We accumulate the debugging information itself in the
5122	     debug_info structure.  */
5123	  debug.line = NULL;
5124	  debug.external_dnr = NULL;
5125	  debug.external_pdr = NULL;
5126	  debug.external_sym = NULL;
5127	  debug.external_opt = NULL;
5128	  debug.external_aux = NULL;
5129	  debug.ss = NULL;
5130	  debug.ssext = debug.ssext_end = NULL;
5131	  debug.external_fdr = NULL;
5132	  debug.external_rfd = NULL;
5133	  debug.external_ext = debug.external_ext_end = NULL;
5134
5135	  mdebug_handle = bfd_ecoff_debug_init (abfd, &debug, swap, info);
5136	  if (mdebug_handle == NULL)
5137	    return false;
5138
5139	  if (1)
5140	    {
5141	      asection *s;
5142	      EXTR esym;
5143	      bfd_vma last = 0;
5144	      unsigned int i;
5145	      static const char * const name[] =
5146		{
5147		  ".text", ".init", ".fini", ".data",
5148		  ".rodata", ".sdata", ".sbss", ".bss"
5149		};
5150	      static const int sc[] = { scText, scInit, scFini, scData,
5151					  scRData, scSData, scSBss, scBss };
5152
5153	      esym.jmptbl = 0;
5154	      esym.cobol_main = 0;
5155	      esym.weakext = 0;
5156	      esym.reserved = 0;
5157	      esym.ifd = ifdNil;
5158	      esym.asym.iss = issNil;
5159	      esym.asym.st = stLocal;
5160	      esym.asym.reserved = 0;
5161	      esym.asym.index = indexNil;
5162	      for (i = 0; i < 8; i++)
5163		{
5164		  esym.asym.sc = sc[i];
5165		  s = bfd_get_section_by_name (abfd, name[i]);
5166		  if (s != NULL)
5167		    {
5168		      esym.asym.value = s->vma;
5169		      last = s->vma + s->size;
5170		    }
5171		  else
5172		    esym.asym.value = last;
5173
5174		  if (! bfd_ecoff_debug_one_external (abfd, &debug, swap,
5175						      name[i], &esym))
5176		    return false;
5177		}
5178	    }
5179
5180	  for (p = o->map_head.link_order;
5181	       p != (struct bfd_link_order *) NULL;
5182	       p = p->next)
5183	    {
5184	      asection *input_section;
5185	      bfd *input_bfd;
5186	      const struct ecoff_debug_swap *input_swap;
5187	      struct ecoff_debug_info input_debug;
5188	      char *eraw_src;
5189	      char *eraw_end;
5190
5191	      if (p->type != bfd_indirect_link_order)
5192		{
5193		  if (p->type == bfd_data_link_order)
5194		    continue;
5195		  abort ();
5196		}
5197
5198	      input_section = p->u.indirect.section;
5199	      input_bfd = input_section->owner;
5200
5201	      if (! is_alpha_elf (input_bfd))
5202		/* I don't know what a non ALPHA ELF bfd would be
5203		   doing with a .mdebug section, but I don't really
5204		   want to deal with it.  */
5205		continue;
5206
5207	      input_swap = (get_elf_backend_data (input_bfd)
5208			    ->elf_backend_ecoff_debug_swap);
5209
5210	      BFD_ASSERT (p->size == input_section->size);
5211
5212	      /* The ECOFF linking code expects that we have already
5213		 read in the debugging information and set up an
5214		 ecoff_debug_info structure, so we do that now.  */
5215	      if (!elf64_alpha_read_ecoff_info (input_bfd, input_section,
5216						&input_debug))
5217		return false;
5218
5219	      if (! (bfd_ecoff_debug_accumulate
5220		     (mdebug_handle, abfd, &debug, swap, input_bfd,
5221		      &input_debug, input_swap, info)))
5222		return false;
5223
5224	      /* Loop through the external symbols.  For each one with
5225		 interesting information, try to find the symbol in
5226		 the linker global hash table and save the information
5227		 for the output external symbols.  */
5228	      eraw_src = (char *) input_debug.external_ext;
5229	      eraw_end = (eraw_src
5230			  + (input_debug.symbolic_header.iextMax
5231			     * input_swap->external_ext_size));
5232	      for (;
5233		   eraw_src < eraw_end;
5234		   eraw_src += input_swap->external_ext_size)
5235		{
5236		  EXTR ext;
5237		  const char *name;
5238		  struct alpha_elf_link_hash_entry *h;
5239
5240		  (*input_swap->swap_ext_in) (input_bfd, eraw_src, &ext);
5241		  if (ext.asym.sc == scNil
5242		      || ext.asym.sc == scUndefined
5243		      || ext.asym.sc == scSUndefined)
5244		    continue;
5245
5246		  name = input_debug.ssext + ext.asym.iss;
5247		  h = alpha_elf_link_hash_lookup (htab, name, false, false, true);
5248		  if (h == NULL || h->esym.ifd != -2)
5249		    continue;
5250
5251		  if (ext.ifd != -1)
5252		    {
5253		      BFD_ASSERT (ext.ifd
5254				  < input_debug.symbolic_header.ifdMax);
5255		      ext.ifd = input_debug.ifdmap[ext.ifd];
5256		    }
5257
5258		  h->esym = ext;
5259		}
5260
5261	      /* Free up the information we just read.  */
5262	      free (input_debug.line);
5263	      free (input_debug.external_dnr);
5264	      free (input_debug.external_pdr);
5265	      free (input_debug.external_sym);
5266	      free (input_debug.external_opt);
5267	      free (input_debug.external_aux);
5268	      free (input_debug.ss);
5269	      free (input_debug.ssext);
5270	      free (input_debug.external_fdr);
5271	      free (input_debug.external_rfd);
5272	      free (input_debug.external_ext);
5273
5274	      /* Hack: reset the SEC_HAS_CONTENTS flag so that
5275		 elf_link_input_bfd ignores this section.  */
5276	      input_section->flags &=~ SEC_HAS_CONTENTS;
5277	    }
5278
5279	  /* Build the external symbol information.  */
5280	  einfo.abfd = abfd;
5281	  einfo.info = info;
5282	  einfo.debug = &debug;
5283	  einfo.swap = swap;
5284	  einfo.failed = false;
5285	  elf_link_hash_traverse (elf_hash_table (info),
5286				  elf64_alpha_output_extsym,
5287				  &einfo);
5288	  if (einfo.failed)
5289	    return false;
5290
5291	  /* Set the size of the .mdebug section.  */
5292	  o->size = bfd_ecoff_debug_size (abfd, &debug, swap);
5293
5294	  /* Skip this section later on (I don't think this currently
5295	     matters, but someday it might).  */
5296	  o->map_head.link_order = (struct bfd_link_order *) NULL;
5297
5298	  mdebug_sec = o;
5299	}
5300    }
5301
5302  /* Invoke the regular ELF backend linker to do all the work.  */
5303  if (! bfd_elf_final_link (abfd, info))
5304    return false;
5305
5306  /* Now write out the computed sections.  */
5307
5308  /* The .got subsections...  */
5309  {
5310    bfd *i, *dynobj = elf_hash_table(info)->dynobj;
5311    for (i = htab->got_list;
5312	 i != NULL;
5313	 i = alpha_elf_tdata(i)->got_link_next)
5314      {
5315	asection *sgot;
5316
5317	/* elf_bfd_final_link already did everything in dynobj.  */
5318	if (i == dynobj)
5319	  continue;
5320
5321	sgot = alpha_elf_tdata(i)->got;
5322	if (! bfd_set_section_contents (abfd, sgot->output_section,
5323					sgot->contents,
5324					(file_ptr) sgot->output_offset,
5325					sgot->size))
5326	  return false;
5327      }
5328  }
5329
5330  if (mdebug_sec != (asection *) NULL)
5331    {
5332      BFD_ASSERT (abfd->output_has_begun);
5333      if (! bfd_ecoff_write_accumulated_debug (mdebug_handle, abfd, &debug,
5334					       swap, info,
5335					       mdebug_sec->filepos))
5336	return false;
5337
5338      bfd_ecoff_debug_free (mdebug_handle, abfd, &debug, swap, info);
5339    }
5340
5341  return true;
5342}
5343
5344static enum elf_reloc_type_class
5345elf64_alpha_reloc_type_class (const struct bfd_link_info *info ATTRIBUTE_UNUSED,
5346			      const asection *rel_sec ATTRIBUTE_UNUSED,
5347			      const Elf_Internal_Rela *rela)
5348{
5349  switch ((int) ELF64_R_TYPE (rela->r_info))
5350    {
5351    case R_ALPHA_RELATIVE:
5352      return reloc_class_relative;
5353    case R_ALPHA_JMP_SLOT:
5354      return reloc_class_plt;
5355    case R_ALPHA_COPY:
5356      return reloc_class_copy;
5357    default:
5358      return reloc_class_normal;
5359    }
5360}
5361
5362static const struct bfd_elf_special_section elf64_alpha_special_sections[] =
5363{
5364  { STRING_COMMA_LEN (".sbss"),	 -2, SHT_NOBITS,   SHF_ALLOC + SHF_WRITE + SHF_ALPHA_GPREL },
5365  { STRING_COMMA_LEN (".sdata"), -2, SHT_PROGBITS, SHF_ALLOC + SHF_WRITE + SHF_ALPHA_GPREL },
5366  { NULL,		      0,  0, 0,		   0 }
5367};
5368
5369/* ECOFF swapping routines.  These are used when dealing with the
5370   .mdebug section, which is in the ECOFF debugging format.  Copied
5371   from elf32-mips.c.  */
5372static const struct ecoff_debug_swap
5373elf64_alpha_ecoff_debug_swap =
5374{
5375  /* Symbol table magic number.  */
5376  magicSym2,
5377  /* Alignment of debugging information.  E.g., 4.  */
5378  8,
5379  /* Sizes of external symbolic information.  */
5380  sizeof (struct hdr_ext),
5381  sizeof (struct dnr_ext),
5382  sizeof (struct pdr_ext),
5383  sizeof (struct sym_ext),
5384  sizeof (struct opt_ext),
5385  sizeof (struct fdr_ext),
5386  sizeof (struct rfd_ext),
5387  sizeof (struct ext_ext),
5388  /* Functions to swap in external symbolic data.  */
5389  ecoff_swap_hdr_in,
5390  ecoff_swap_dnr_in,
5391  ecoff_swap_pdr_in,
5392  ecoff_swap_sym_in,
5393  ecoff_swap_opt_in,
5394  ecoff_swap_fdr_in,
5395  ecoff_swap_rfd_in,
5396  ecoff_swap_ext_in,
5397  _bfd_ecoff_swap_tir_in,
5398  _bfd_ecoff_swap_rndx_in,
5399  /* Functions to swap out external symbolic data.  */
5400  ecoff_swap_hdr_out,
5401  ecoff_swap_dnr_out,
5402  ecoff_swap_pdr_out,
5403  ecoff_swap_sym_out,
5404  ecoff_swap_opt_out,
5405  ecoff_swap_fdr_out,
5406  ecoff_swap_rfd_out,
5407  ecoff_swap_ext_out,
5408  _bfd_ecoff_swap_tir_out,
5409  _bfd_ecoff_swap_rndx_out,
5410  /* Function to read in symbolic data.  */
5411  elf64_alpha_read_ecoff_info
5412};
5413
5414/* Use a non-standard hash bucket size of 8.  */
5415
5416static const struct elf_size_info alpha_elf_size_info =
5417{
5418  sizeof (Elf64_External_Ehdr),
5419  sizeof (Elf64_External_Phdr),
5420  sizeof (Elf64_External_Shdr),
5421  sizeof (Elf64_External_Rel),
5422  sizeof (Elf64_External_Rela),
5423  sizeof (Elf64_External_Sym),
5424  sizeof (Elf64_External_Dyn),
5425  sizeof (Elf_External_Note),
5426  8,
5427  1,
5428  64, 3,
5429  ELFCLASS64, EV_CURRENT,
5430  bfd_elf64_write_out_phdrs,
5431  bfd_elf64_write_shdrs_and_ehdr,
5432  bfd_elf64_checksum_contents,
5433  bfd_elf64_write_relocs,
5434  bfd_elf64_swap_symbol_in,
5435  bfd_elf64_swap_symbol_out,
5436  bfd_elf64_slurp_reloc_table,
5437  bfd_elf64_slurp_symbol_table,
5438  bfd_elf64_swap_dyn_in,
5439  bfd_elf64_swap_dyn_out,
5440  bfd_elf64_swap_reloc_in,
5441  bfd_elf64_swap_reloc_out,
5442  bfd_elf64_swap_reloca_in,
5443  bfd_elf64_swap_reloca_out
5444};
5445
5446#define TARGET_LITTLE_SYM	alpha_elf64_vec
5447#define TARGET_LITTLE_NAME	"elf64-alpha"
5448#define ELF_ARCH		bfd_arch_alpha
5449#define ELF_TARGET_ID		ALPHA_ELF_DATA
5450#define ELF_MACHINE_CODE	EM_ALPHA
5451#define ELF_MAXPAGESIZE	0x10000
5452#define ELF_COMMONPAGESIZE	0x2000
5453
5454#define bfd_elf64_bfd_link_hash_table_create \
5455  elf64_alpha_bfd_link_hash_table_create
5456
5457#define bfd_elf64_bfd_reloc_type_lookup \
5458  elf64_alpha_bfd_reloc_type_lookup
5459#define bfd_elf64_bfd_reloc_name_lookup \
5460  elf64_alpha_bfd_reloc_name_lookup
5461#define elf_info_to_howto \
5462  elf64_alpha_info_to_howto
5463
5464#define bfd_elf64_mkobject \
5465  elf64_alpha_mkobject
5466#define elf_backend_object_p \
5467  elf64_alpha_object_p
5468
5469#define elf_backend_section_from_shdr \
5470  elf64_alpha_section_from_shdr
5471#define elf_backend_section_flags \
5472  elf64_alpha_section_flags
5473#define elf_backend_fake_sections \
5474  elf64_alpha_fake_sections
5475
5476#define bfd_elf64_bfd_is_local_label_name \
5477  elf64_alpha_is_local_label_name
5478#define bfd_elf64_find_nearest_line \
5479  elf64_alpha_find_nearest_line
5480#define bfd_elf64_bfd_relax_section \
5481  elf64_alpha_relax_section
5482
5483#define elf_backend_add_symbol_hook \
5484  elf64_alpha_add_symbol_hook
5485#define elf_backend_relocs_compatible \
5486  _bfd_elf_relocs_compatible
5487#define elf_backend_sort_relocs_p \
5488  elf64_alpha_sort_relocs_p
5489#define elf_backend_check_relocs \
5490  elf64_alpha_check_relocs
5491#define elf_backend_create_dynamic_sections \
5492  elf64_alpha_create_dynamic_sections
5493#define elf_backend_adjust_dynamic_symbol \
5494  elf64_alpha_adjust_dynamic_symbol
5495#define elf_backend_merge_symbol_attribute \
5496  elf64_alpha_merge_symbol_attribute
5497#define elf_backend_copy_indirect_symbol \
5498  elf64_alpha_copy_indirect_symbol
5499#define elf_backend_always_size_sections \
5500  elf64_alpha_always_size_sections
5501#define elf_backend_size_dynamic_sections \
5502  elf64_alpha_size_dynamic_sections
5503#define elf_backend_omit_section_dynsym \
5504  _bfd_elf_omit_section_dynsym_all
5505#define elf_backend_relocate_section \
5506  elf64_alpha_relocate_section
5507#define elf_backend_finish_dynamic_symbol \
5508  elf64_alpha_finish_dynamic_symbol
5509#define elf_backend_finish_dynamic_sections \
5510  elf64_alpha_finish_dynamic_sections
5511#define bfd_elf64_bfd_final_link \
5512  elf64_alpha_final_link
5513#define elf_backend_reloc_type_class \
5514  elf64_alpha_reloc_type_class
5515
5516#define elf_backend_can_gc_sections	1
5517#define elf_backend_gc_mark_hook	elf64_alpha_gc_mark_hook
5518
5519#define elf_backend_ecoff_debug_swap \
5520  &elf64_alpha_ecoff_debug_swap
5521
5522#define elf_backend_size_info \
5523  alpha_elf_size_info
5524
5525#define elf_backend_special_sections \
5526  elf64_alpha_special_sections
5527
5528#define elf_backend_strip_zero_sized_dynamic_sections \
5529  _bfd_elf_strip_zero_sized_dynamic_sections
5530
5531/* A few constants that determine how the .plt section is set up.  */
5532#define elf_backend_want_got_plt 0
5533#define elf_backend_plt_readonly 0
5534#define elf_backend_want_plt_sym 1
5535#define elf_backend_got_header_size 0
5536#define elf_backend_dtrel_excludes_plt 1
5537
5538#include "elf64-target.h"
5539
5540/* FreeBSD support.  */
5541
5542#undef TARGET_LITTLE_SYM
5543#define TARGET_LITTLE_SYM	alpha_elf64_fbsd_vec
5544#undef TARGET_LITTLE_NAME
5545#define TARGET_LITTLE_NAME	"elf64-alpha-freebsd"
5546#undef	ELF_OSABI
5547#define	ELF_OSABI		ELFOSABI_FREEBSD
5548
5549/* The kernel recognizes executables as valid only if they carry a
5550   "FreeBSD" label in the ELF header.  So we put this label on all
5551   executables and (for simplicity) also all other object files.  */
5552
5553static bool
5554elf64_alpha_fbsd_init_file_header (bfd *abfd, struct bfd_link_info *info)
5555{
5556  Elf_Internal_Ehdr * i_ehdrp;	/* ELF file header, internal form.  */
5557
5558  if (!_bfd_elf_init_file_header (abfd, info))
5559    return false;
5560
5561  i_ehdrp = elf_elfheader (abfd);
5562
5563  /* Put an ABI label supported by FreeBSD >= 4.1.  */
5564  i_ehdrp->e_ident[EI_OSABI] = get_elf_backend_data (abfd)->elf_osabi;
5565#ifdef OLD_FREEBSD_ABI_LABEL
5566  /* The ABI label supported by FreeBSD <= 4.0 is quite nonstandard.  */
5567  memcpy (&i_ehdrp->e_ident[EI_ABIVERSION], "FreeBSD", 8);
5568#endif
5569  return true;
5570}
5571
5572#undef elf_backend_init_file_header
5573#define elf_backend_init_file_header \
5574  elf64_alpha_fbsd_init_file_header
5575
5576#undef  elf64_bed
5577#define elf64_bed elf64_alpha_fbsd_bed
5578
5579#include "elf64-target.h"
5580