xref: /netbsd-src/external/gpl3/binutils.old/dist/bfd/ecofflink.c (revision 3587d6f89c746bbb4f886219ddacd41ace480ecf)
1 /* Routines to link ECOFF debugging information.
2    Copyright (C) 1993-2020 Free Software Foundation, Inc.
3    Written by Ian Lance Taylor, Cygnus Support, <ian@cygnus.com>.
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 #include "sysdep.h"
23 #include "bfd.h"
24 #include "bfdlink.h"
25 #include "libbfd.h"
26 #include "ecoff-bfd.h"
27 #include "objalloc.h"
28 #include "aout/stab_gnu.h"
29 #include "coff/internal.h"
30 #include "coff/sym.h"
31 #include "coff/symconst.h"
32 #include "coff/ecoff.h"
33 #include "libcoff.h"
34 #include "libecoff.h"
35 
36 /* Routines to swap auxiliary information in and out.  I am assuming
37    that the auxiliary information format is always going to be target
38    independent.  */
39 
40 /* Swap in a type information record.
41    BIGEND says whether AUX symbols are big-endian or little-endian; this
42    info comes from the file header record (fh-fBigendian).  */
43 
44 void
45 _bfd_ecoff_swap_tir_in (int bigend, const struct tir_ext *ext_copy,
46 			TIR *intern)
47 {
48   struct tir_ext ext[1];
49 
50   *ext = *ext_copy;		/* Make it reasonable to do in-place.  */
51 
52   /* now the fun stuff...  */
53   if (bigend)
54     {
55       intern->fBitfield	  = 0 != (ext->t_bits1[0] & TIR_BITS1_FBITFIELD_BIG);
56       intern->continued	  = 0 != (ext->t_bits1[0] & TIR_BITS1_CONTINUED_BIG);
57       intern->bt	  = (ext->t_bits1[0] & TIR_BITS1_BT_BIG)
58 			  >>		       TIR_BITS1_BT_SH_BIG;
59       intern->tq4	  = (ext->t_tq45[0] & TIR_BITS_TQ4_BIG)
60 			  >>		      TIR_BITS_TQ4_SH_BIG;
61       intern->tq5	  = (ext->t_tq45[0] & TIR_BITS_TQ5_BIG)
62 			  >>		      TIR_BITS_TQ5_SH_BIG;
63       intern->tq0	  = (ext->t_tq01[0] & TIR_BITS_TQ0_BIG)
64 			  >>		      TIR_BITS_TQ0_SH_BIG;
65       intern->tq1	  = (ext->t_tq01[0] & TIR_BITS_TQ1_BIG)
66 			  >>		      TIR_BITS_TQ1_SH_BIG;
67       intern->tq2	  = (ext->t_tq23[0] & TIR_BITS_TQ2_BIG)
68 			  >>		      TIR_BITS_TQ2_SH_BIG;
69       intern->tq3	  = (ext->t_tq23[0] & TIR_BITS_TQ3_BIG)
70 			  >>		      TIR_BITS_TQ3_SH_BIG;
71     }
72   else
73     {
74       intern->fBitfield	  = 0 != (ext->t_bits1[0] & TIR_BITS1_FBITFIELD_LITTLE);
75       intern->continued	  = 0 != (ext->t_bits1[0] & TIR_BITS1_CONTINUED_LITTLE);
76       intern->bt	  = (ext->t_bits1[0] & TIR_BITS1_BT_LITTLE)
77 			  >>		    TIR_BITS1_BT_SH_LITTLE;
78       intern->tq4	  = (ext->t_tq45[0] & TIR_BITS_TQ4_LITTLE)
79 			  >>		    TIR_BITS_TQ4_SH_LITTLE;
80       intern->tq5	  = (ext->t_tq45[0] & TIR_BITS_TQ5_LITTLE)
81 			  >>		    TIR_BITS_TQ5_SH_LITTLE;
82       intern->tq0	  = (ext->t_tq01[0] & TIR_BITS_TQ0_LITTLE)
83 			  >>		    TIR_BITS_TQ0_SH_LITTLE;
84       intern->tq1	  = (ext->t_tq01[0] & TIR_BITS_TQ1_LITTLE)
85 			  >>		    TIR_BITS_TQ1_SH_LITTLE;
86       intern->tq2	  = (ext->t_tq23[0] & TIR_BITS_TQ2_LITTLE)
87 			  >>		    TIR_BITS_TQ2_SH_LITTLE;
88       intern->tq3	  = (ext->t_tq23[0] & TIR_BITS_TQ3_LITTLE)
89 			  >>		    TIR_BITS_TQ3_SH_LITTLE;
90     }
91 
92 #ifdef TEST
93   if (memcmp ((char *)ext, (char *)intern, sizeof (*intern)) != 0)
94     abort ();
95 #endif
96 }
97 
98 /* Swap out a type information record.
99    BIGEND says whether AUX symbols are big-endian or little-endian; this
100    info comes from the file header record (fh-fBigendian).  */
101 
102 void
103 _bfd_ecoff_swap_tir_out (int bigend,
104 			 const TIR *intern_copy,
105 			 struct tir_ext *ext)
106 {
107   TIR intern[1];
108 
109   *intern = *intern_copy;	/* Make it reasonable to do in-place.  */
110 
111   /* now the fun stuff...  */
112   if (bigend)
113     {
114       ext->t_bits1[0] = ((intern->fBitfield ? TIR_BITS1_FBITFIELD_BIG : 0)
115 		       | (intern->continued ? TIR_BITS1_CONTINUED_BIG : 0)
116 		       | ((intern->bt << TIR_BITS1_BT_SH_BIG)
117 			  & TIR_BITS1_BT_BIG));
118       ext->t_tq45[0] = (((intern->tq4 << TIR_BITS_TQ4_SH_BIG)
119 		       & TIR_BITS_TQ4_BIG)
120 		      | ((intern->tq5 << TIR_BITS_TQ5_SH_BIG)
121 			 & TIR_BITS_TQ5_BIG));
122       ext->t_tq01[0] = (((intern->tq0 << TIR_BITS_TQ0_SH_BIG)
123 		       & TIR_BITS_TQ0_BIG)
124 		      | ((intern->tq1 << TIR_BITS_TQ1_SH_BIG)
125 			 & TIR_BITS_TQ1_BIG));
126       ext->t_tq23[0] = (((intern->tq2 << TIR_BITS_TQ2_SH_BIG)
127 		       & TIR_BITS_TQ2_BIG)
128 		      | ((intern->tq3 << TIR_BITS_TQ3_SH_BIG)
129 			 & TIR_BITS_TQ3_BIG));
130     }
131   else
132     {
133       ext->t_bits1[0] = ((intern->fBitfield ? TIR_BITS1_FBITFIELD_LITTLE : 0)
134 		       | (intern->continued ? TIR_BITS1_CONTINUED_LITTLE : 0)
135 		       | ((intern->bt << TIR_BITS1_BT_SH_LITTLE)
136 			  & TIR_BITS1_BT_LITTLE));
137       ext->t_tq45[0] = (((intern->tq4 << TIR_BITS_TQ4_SH_LITTLE)
138 		       & TIR_BITS_TQ4_LITTLE)
139 		      | ((intern->tq5 << TIR_BITS_TQ5_SH_LITTLE)
140 			 & TIR_BITS_TQ5_LITTLE));
141       ext->t_tq01[0] = (((intern->tq0 << TIR_BITS_TQ0_SH_LITTLE)
142 		       & TIR_BITS_TQ0_LITTLE)
143 		      | ((intern->tq1 << TIR_BITS_TQ1_SH_LITTLE)
144 			 & TIR_BITS_TQ1_LITTLE));
145       ext->t_tq23[0] = (((intern->tq2 << TIR_BITS_TQ2_SH_LITTLE)
146 		       & TIR_BITS_TQ2_LITTLE)
147 		      | ((intern->tq3 << TIR_BITS_TQ3_SH_LITTLE)
148 			 & TIR_BITS_TQ3_LITTLE));
149     }
150 
151 #ifdef TEST
152   if (memcmp ((char *)ext, (char *)intern, sizeof (*intern)) != 0)
153     abort ();
154 #endif
155 }
156 
157 /* Swap in a relative symbol record.  BIGEND says whether it is in
158    big-endian or little-endian format.*/
159 
160 void
161 _bfd_ecoff_swap_rndx_in (int bigend,
162 			 const struct rndx_ext *ext_copy,
163 			 RNDXR *intern)
164 {
165   struct rndx_ext ext[1];
166 
167   *ext = *ext_copy;		/* Make it reasonable to do in-place.  */
168 
169   /* now the fun stuff...  */
170   if (bigend)
171     {
172       intern->rfd   = (ext->r_bits[0] << RNDX_BITS0_RFD_SH_LEFT_BIG)
173 		  | ((ext->r_bits[1] & RNDX_BITS1_RFD_BIG)
174 				    >> RNDX_BITS1_RFD_SH_BIG);
175       intern->index = ((ext->r_bits[1] & RNDX_BITS1_INDEX_BIG)
176 				    << RNDX_BITS1_INDEX_SH_LEFT_BIG)
177 		  | (ext->r_bits[2] << RNDX_BITS2_INDEX_SH_LEFT_BIG)
178 		  | (ext->r_bits[3] << RNDX_BITS3_INDEX_SH_LEFT_BIG);
179     }
180   else
181     {
182       intern->rfd   = (ext->r_bits[0] << RNDX_BITS0_RFD_SH_LEFT_LITTLE)
183 		  | ((ext->r_bits[1] & RNDX_BITS1_RFD_LITTLE)
184 				    << RNDX_BITS1_RFD_SH_LEFT_LITTLE);
185       intern->index = ((ext->r_bits[1] & RNDX_BITS1_INDEX_LITTLE)
186 				    >> RNDX_BITS1_INDEX_SH_LITTLE)
187 		  | (ext->r_bits[2] << RNDX_BITS2_INDEX_SH_LEFT_LITTLE)
188 		  | ((unsigned int) ext->r_bits[3]
189 		     << RNDX_BITS3_INDEX_SH_LEFT_LITTLE);
190     }
191 
192 #ifdef TEST
193   if (memcmp ((char *)ext, (char *)intern, sizeof (*intern)) != 0)
194     abort ();
195 #endif
196 }
197 
198 /* Swap out a relative symbol record.  BIGEND says whether it is in
199    big-endian or little-endian format.*/
200 
201 void
202 _bfd_ecoff_swap_rndx_out (int bigend,
203 			  const RNDXR *intern_copy,
204 			  struct rndx_ext *ext)
205 {
206   RNDXR intern[1];
207 
208   *intern = *intern_copy;	/* Make it reasonable to do in-place.  */
209 
210   /* now the fun stuff...  */
211   if (bigend)
212     {
213       ext->r_bits[0] = intern->rfd >> RNDX_BITS0_RFD_SH_LEFT_BIG;
214       ext->r_bits[1] = (((intern->rfd << RNDX_BITS1_RFD_SH_BIG)
215 		       & RNDX_BITS1_RFD_BIG)
216 		      | ((intern->index >> RNDX_BITS1_INDEX_SH_LEFT_BIG)
217 			 & RNDX_BITS1_INDEX_BIG));
218       ext->r_bits[2] = intern->index >> RNDX_BITS2_INDEX_SH_LEFT_BIG;
219       ext->r_bits[3] = intern->index >> RNDX_BITS3_INDEX_SH_LEFT_BIG;
220     }
221   else
222     {
223       ext->r_bits[0] = intern->rfd >> RNDX_BITS0_RFD_SH_LEFT_LITTLE;
224       ext->r_bits[1] = (((intern->rfd >> RNDX_BITS1_RFD_SH_LEFT_LITTLE)
225 		       & RNDX_BITS1_RFD_LITTLE)
226 		      | ((intern->index << RNDX_BITS1_INDEX_SH_LITTLE)
227 			 & RNDX_BITS1_INDEX_LITTLE));
228       ext->r_bits[2] = intern->index >> RNDX_BITS2_INDEX_SH_LEFT_LITTLE;
229       ext->r_bits[3] = intern->index >> RNDX_BITS3_INDEX_SH_LEFT_LITTLE;
230     }
231 
232 #ifdef TEST
233   if (memcmp ((char *)ext, (char *)intern, sizeof (*intern)) != 0)
234     abort ();
235 #endif
236 }
237 
238 /* The minimum amount of data to allocate.  */
239 #define ALLOC_SIZE (4064)
240 
241 /* Add bytes to a buffer.  Return success.  */
242 
243 static bfd_boolean
244 ecoff_add_bytes (char **buf, char **bufend, size_t need)
245 {
246   size_t have;
247   size_t want;
248   char *newbuf;
249 
250   have = *bufend - *buf;
251   if (have > need)
252     want = ALLOC_SIZE;
253   else
254     {
255       want = need - have;
256       if (want < ALLOC_SIZE)
257 	want = ALLOC_SIZE;
258     }
259   newbuf = (char *) bfd_realloc (*buf, (bfd_size_type) have + want);
260   if (newbuf == NULL)
261     return FALSE;
262   *buf = newbuf;
263   *bufend = *buf + have + want;
264   return TRUE;
265 }
266 
267 /* We keep a hash table which maps strings to numbers.  We use it to
268    map FDR names to indices in the output file, and to map local
269    strings when combining stabs debugging information.  */
270 
271 struct string_hash_entry
272 {
273   struct bfd_hash_entry root;
274   /* FDR index or string table offset.  */
275   long val;
276   /* Next entry in string table.  */
277   struct string_hash_entry *next;
278 };
279 
280 struct string_hash_table
281 {
282   struct bfd_hash_table table;
283 };
284 
285 /* Routine to create an entry in a string hash table.  */
286 
287 static struct bfd_hash_entry *
288 string_hash_newfunc (struct bfd_hash_entry *entry,
289 		     struct bfd_hash_table *table,
290 		     const char *string)
291 {
292   struct string_hash_entry *ret = (struct string_hash_entry *) entry;
293 
294   /* Allocate the structure if it has not already been allocated by a
295      subclass.  */
296   if (ret == (struct string_hash_entry *) NULL)
297     ret = ((struct string_hash_entry *)
298 	   bfd_hash_allocate (table, sizeof (struct string_hash_entry)));
299   if (ret == (struct string_hash_entry *) NULL)
300     return NULL;
301 
302   /* Call the allocation method of the superclass.  */
303   ret = ((struct string_hash_entry *)
304 	 bfd_hash_newfunc ((struct bfd_hash_entry *) ret, table, string));
305 
306   if (ret)
307     {
308       /* Initialize the local fields.  */
309       ret->val = -1;
310       ret->next = NULL;
311     }
312 
313   return (struct bfd_hash_entry *) ret;
314 }
315 
316 /* Look up an entry in an string hash table.  */
317 
318 #define string_hash_lookup(t, string, create, copy) \
319   ((struct string_hash_entry *) \
320    bfd_hash_lookup (&(t)->table, (string), (create), (copy)))
321 
322 /* We can't afford to read in all the debugging information when we do
323    a link.  Instead, we build a list of these structures to show how
324    different parts of the input file map to the output file.  */
325 
326 struct shuffle
327 {
328   /* The next entry in this linked list.  */
329   struct shuffle *next;
330   /* The length of the information.  */
331   unsigned long size;
332   /* Whether this information comes from a file or not.  */
333   bfd_boolean filep;
334   union
335     {
336       struct
337 	{
338 	  /* The BFD the data comes from.  */
339 	  bfd *input_bfd;
340 	  /* The offset within input_bfd.  */
341 	  file_ptr offset;
342 	} file;
343       /* The data to be written out.  */
344       void * memory;
345     } u;
346 };
347 
348 /* This structure holds information across calls to
349    bfd_ecoff_debug_accumulate.  */
350 
351 struct accumulate
352 {
353   /* The FDR hash table.  */
354   struct string_hash_table fdr_hash;
355   /* The strings hash table.  */
356   struct string_hash_table str_hash;
357   /* Linked lists describing how to shuffle the input debug
358      information into the output file.  We keep a pointer to both the
359      head and the tail.  */
360   struct shuffle *line;
361   struct shuffle *line_end;
362   struct shuffle *pdr;
363   struct shuffle *pdr_end;
364   struct shuffle *sym;
365   struct shuffle *sym_end;
366   struct shuffle *opt;
367   struct shuffle *opt_end;
368   struct shuffle *aux;
369   struct shuffle *aux_end;
370   struct shuffle *ss;
371   struct shuffle *ss_end;
372   struct string_hash_entry *ss_hash;
373   struct string_hash_entry *ss_hash_end;
374   struct shuffle *fdr;
375   struct shuffle *fdr_end;
376   struct shuffle *rfd;
377   struct shuffle *rfd_end;
378   /* The size of the largest file shuffle.  */
379   unsigned long largest_file_shuffle;
380   /* An objalloc for debugging information.  */
381   struct objalloc *memory;
382 };
383 
384 /* Add a file entry to a shuffle list.  */
385 
386 static bfd_boolean
387 add_file_shuffle (struct accumulate *ainfo,
388 		  struct shuffle **head,
389 		  struct shuffle **tail,
390 		  bfd *input_bfd,
391 		  file_ptr offset,
392 		  unsigned long size)
393 {
394   struct shuffle *n;
395 
396   if (*tail != (struct shuffle *) NULL
397       && (*tail)->filep
398       && (*tail)->u.file.input_bfd == input_bfd
399       && (*tail)->u.file.offset + (*tail)->size == (unsigned long) offset)
400     {
401       /* Just merge this entry onto the existing one.  */
402       (*tail)->size += size;
403       if ((*tail)->size > ainfo->largest_file_shuffle)
404 	ainfo->largest_file_shuffle = (*tail)->size;
405       return TRUE;
406     }
407 
408   n = (struct shuffle *) objalloc_alloc (ainfo->memory,
409 					 sizeof (struct shuffle));
410   if (!n)
411     {
412       bfd_set_error (bfd_error_no_memory);
413       return FALSE;
414     }
415   n->next = NULL;
416   n->size = size;
417   n->filep = TRUE;
418   n->u.file.input_bfd = input_bfd;
419   n->u.file.offset = offset;
420   if (*head == (struct shuffle *) NULL)
421     *head = n;
422   if (*tail != (struct shuffle *) NULL)
423     (*tail)->next = n;
424   *tail = n;
425   if (size > ainfo->largest_file_shuffle)
426     ainfo->largest_file_shuffle = size;
427   return TRUE;
428 }
429 
430 /* Add a memory entry to a shuffle list.  */
431 
432 static bfd_boolean
433 add_memory_shuffle (struct accumulate *ainfo,
434 		    struct shuffle **head,
435 		    struct shuffle **tail,
436 		    bfd_byte *data,
437 		    unsigned long size)
438 {
439   struct shuffle *n;
440 
441   n = (struct shuffle *) objalloc_alloc (ainfo->memory,
442 					 sizeof (struct shuffle));
443   if (!n)
444     {
445       bfd_set_error (bfd_error_no_memory);
446       return FALSE;
447     }
448   n->next = NULL;
449   n->size = size;
450   n->filep = FALSE;
451   n->u.memory = data;
452   if (*head == (struct shuffle *) NULL)
453     *head = n;
454   if (*tail != (struct shuffle *) NULL)
455     (*tail)->next = n;
456   *tail = n;
457   return TRUE;
458 }
459 
460 /* Initialize the FDR hash table.  This returns a handle which is then
461    passed in to bfd_ecoff_debug_accumulate, et. al.  */
462 
463 void *
464 bfd_ecoff_debug_init (bfd *output_bfd ATTRIBUTE_UNUSED,
465 		      struct ecoff_debug_info *output_debug,
466 		      const struct ecoff_debug_swap *output_swap ATTRIBUTE_UNUSED,
467 		      struct bfd_link_info *info)
468 {
469   struct accumulate *ainfo;
470   bfd_size_type amt = sizeof (struct accumulate);
471 
472   ainfo = (struct accumulate *) bfd_malloc (amt);
473   if (!ainfo)
474     return NULL;
475   if (!bfd_hash_table_init_n (&ainfo->fdr_hash.table, string_hash_newfunc,
476 			      sizeof (struct string_hash_entry), 1021))
477     return NULL;
478 
479   ainfo->line = NULL;
480   ainfo->line_end = NULL;
481   ainfo->pdr = NULL;
482   ainfo->pdr_end = NULL;
483   ainfo->sym = NULL;
484   ainfo->sym_end = NULL;
485   ainfo->opt = NULL;
486   ainfo->opt_end = NULL;
487   ainfo->aux = NULL;
488   ainfo->aux_end = NULL;
489   ainfo->ss = NULL;
490   ainfo->ss_end = NULL;
491   ainfo->ss_hash = NULL;
492   ainfo->ss_hash_end = NULL;
493   ainfo->fdr = NULL;
494   ainfo->fdr_end = NULL;
495   ainfo->rfd = NULL;
496   ainfo->rfd_end = NULL;
497 
498   ainfo->largest_file_shuffle = 0;
499 
500   if (! bfd_link_relocatable (info))
501     {
502       if (!bfd_hash_table_init (&ainfo->str_hash.table, string_hash_newfunc,
503 				sizeof (struct string_hash_entry)))
504 	return NULL;
505 
506       /* The first entry in the string table is the empty string.  */
507       output_debug->symbolic_header.issMax = 1;
508     }
509 
510   ainfo->memory = objalloc_create ();
511   if (ainfo->memory == NULL)
512     {
513       bfd_set_error (bfd_error_no_memory);
514       return NULL;
515     }
516 
517   return ainfo;
518 }
519 
520 /* Free the accumulated debugging information.  */
521 
522 void
523 bfd_ecoff_debug_free (void * handle,
524 		      bfd *output_bfd ATTRIBUTE_UNUSED,
525 		      struct ecoff_debug_info *output_debug ATTRIBUTE_UNUSED,
526 		      const struct ecoff_debug_swap *output_swap ATTRIBUTE_UNUSED,
527 		      struct bfd_link_info *info)
528 {
529   struct accumulate *ainfo = (struct accumulate *) handle;
530 
531   bfd_hash_table_free (&ainfo->fdr_hash.table);
532 
533   if (! bfd_link_relocatable (info))
534     bfd_hash_table_free (&ainfo->str_hash.table);
535 
536   objalloc_free (ainfo->memory);
537 
538   free (ainfo);
539 }
540 
541 /* Accumulate the debugging information from INPUT_BFD into
542    OUTPUT_BFD.  The INPUT_DEBUG argument points to some ECOFF
543    debugging information which we want to link into the information
544    pointed to by the OUTPUT_DEBUG argument.  OUTPUT_SWAP and
545    INPUT_SWAP point to the swapping information needed.  INFO is the
546    linker information structure.  HANDLE is returned by
547    bfd_ecoff_debug_init.  */
548 
549 bfd_boolean
550 bfd_ecoff_debug_accumulate (void * handle,
551 			    bfd *output_bfd,
552 			    struct ecoff_debug_info *output_debug,
553 			    const struct ecoff_debug_swap *output_swap,
554 			    bfd *input_bfd,
555 			    struct ecoff_debug_info *input_debug,
556 			    const struct ecoff_debug_swap *input_swap,
557 			    struct bfd_link_info *info)
558 {
559   struct accumulate *ainfo = (struct accumulate *) handle;
560   void (* const swap_sym_in) (bfd *, void *, SYMR *)
561     = input_swap->swap_sym_in;
562   void (* const swap_rfd_in) (bfd *, void *, RFDT *)
563     = input_swap->swap_rfd_in;
564   void (* const swap_sym_out) (bfd *, const SYMR *, void *)
565     = output_swap->swap_sym_out;
566   void (* const swap_fdr_out) (bfd *, const FDR *, void *)
567     = output_swap->swap_fdr_out;
568   void (* const swap_rfd_out) (bfd *, const RFDT *, void *)
569     = output_swap->swap_rfd_out;
570   bfd_size_type external_pdr_size = output_swap->external_pdr_size;
571   bfd_size_type external_sym_size = output_swap->external_sym_size;
572   bfd_size_type external_opt_size = output_swap->external_opt_size;
573   bfd_size_type external_fdr_size = output_swap->external_fdr_size;
574   bfd_size_type external_rfd_size = output_swap->external_rfd_size;
575   HDRR * const output_symhdr = &output_debug->symbolic_header;
576   HDRR * const input_symhdr = &input_debug->symbolic_header;
577   bfd_vma section_adjust[scMax];
578   asection *sec;
579   bfd_byte *fdr_start;
580   bfd_byte *fdr_ptr;
581   bfd_byte *fdr_end;
582   bfd_size_type fdr_add;
583   unsigned int copied;
584   RFDT i;
585   unsigned long sz;
586   bfd_byte *rfd_out;
587   bfd_byte *rfd_in;
588   bfd_byte *rfd_end;
589   long newrfdbase = 0;
590   long oldrfdbase = 0;
591   bfd_byte *fdr_out;
592   bfd_size_type amt;
593 
594   /* Use section_adjust to hold the value to add to a symbol in a
595      particular section.  */
596   memset (section_adjust, 0, sizeof section_adjust);
597 
598 #define SET(name, indx) \
599   sec = bfd_get_section_by_name (input_bfd, name); \
600   if (sec != NULL) \
601     section_adjust[indx] = (sec->output_section->vma \
602 			    + sec->output_offset \
603 			    - sec->vma);
604 
605   SET (".text", scText);
606   SET (".data", scData);
607   SET (".bss", scBss);
608   SET (".sdata", scSData);
609   SET (".sbss", scSBss);
610   /* scRdata section may be either .rdata or .rodata.  */
611   SET (".rdata", scRData);
612   SET (".rodata", scRData);
613   SET (".init", scInit);
614   SET (".fini", scFini);
615   SET (".rconst", scRConst);
616 
617 #undef SET
618 
619   /* Find all the debugging information based on the FDR's.  We need
620      to handle them whether they are swapped or not.  */
621   if (input_debug->fdr != (FDR *) NULL)
622     {
623       fdr_start = (bfd_byte *) input_debug->fdr;
624       fdr_add = sizeof (FDR);
625     }
626   else
627     {
628       fdr_start = (bfd_byte *) input_debug->external_fdr;
629       fdr_add = input_swap->external_fdr_size;
630     }
631   fdr_end = fdr_start + input_symhdr->ifdMax * fdr_add;
632 
633   amt = input_symhdr->ifdMax;
634   amt *= sizeof (RFDT);
635   input_debug->ifdmap = (RFDT *) bfd_alloc (input_bfd, amt);
636 
637   sz = (input_symhdr->crfd + input_symhdr->ifdMax) * external_rfd_size;
638   rfd_out = (bfd_byte *) objalloc_alloc (ainfo->memory, sz);
639   if (!input_debug->ifdmap || !rfd_out)
640     {
641       bfd_set_error (bfd_error_no_memory);
642       return FALSE;
643     }
644   if (!add_memory_shuffle (ainfo, &ainfo->rfd, &ainfo->rfd_end, rfd_out, sz))
645     return FALSE;
646 
647   copied = 0;
648 
649   /* Look through the FDR's to see which ones we are going to include
650      in the final output.  We do not want duplicate FDR information
651      for header files, because ECOFF debugging is often very large.
652      When we find an FDR with no line information which can be merged,
653      we look it up in a hash table to ensure that we only include it
654      once.  We keep a table mapping FDR numbers to the final number
655      they get with the BFD, so that we can refer to it when we write
656      out the external symbols.  */
657   for (fdr_ptr = fdr_start, i = 0;
658        fdr_ptr < fdr_end;
659        fdr_ptr += fdr_add, i++, rfd_out += external_rfd_size)
660     {
661       FDR fdr;
662 
663       if (input_debug->fdr != (FDR *) NULL)
664 	fdr = *(FDR *) fdr_ptr;
665       else
666 	(*input_swap->swap_fdr_in) (input_bfd, fdr_ptr, &fdr);
667 
668       /* See if this FDR can be merged with an existing one.  */
669       if (fdr.cbLine == 0 && fdr.rss != -1 && fdr.fMerge)
670 	{
671 	  const char *name;
672 	  char *lookup;
673 	  struct string_hash_entry *fh;
674 
675 	  /* We look up a string formed from the file name and the
676 	     number of symbols and aux entries.  Sometimes an include
677 	     file will conditionally define a typedef or something
678 	     based on the order of include files.  Using the number of
679 	     symbols and aux entries as a hash reduces the chance that
680 	     we will merge symbol information that should not be
681 	     merged.  */
682 	  name = input_debug->ss + fdr.issBase + fdr.rss;
683 
684 	  lookup = (char *) bfd_malloc ((bfd_size_type) strlen (name) + 20);
685 	  if (lookup == NULL)
686 	    return FALSE;
687 	  sprintf (lookup, "%s %lx %lx", name, (unsigned long) fdr.csym,
688 		   (unsigned long) fdr.caux);
689 
690 	  fh = string_hash_lookup (&ainfo->fdr_hash, lookup, TRUE, TRUE);
691 	  free (lookup);
692 	  if (fh == (struct string_hash_entry *) NULL)
693 	    return FALSE;
694 
695 	  if (fh->val != -1)
696 	    {
697 	      input_debug->ifdmap[i] = fh->val;
698 	      (*swap_rfd_out) (output_bfd, input_debug->ifdmap + i, rfd_out);
699 
700 	      /* Don't copy this FDR.  */
701 	      continue;
702 	    }
703 
704 	  fh->val = output_symhdr->ifdMax + copied;
705 	}
706 
707       input_debug->ifdmap[i] = output_symhdr->ifdMax + copied;
708       (*swap_rfd_out) (output_bfd, input_debug->ifdmap + i, rfd_out);
709       ++copied;
710     }
711 
712   newrfdbase = output_symhdr->crfd;
713   output_symhdr->crfd += input_symhdr->ifdMax;
714 
715   /* Copy over any existing RFD's.  RFD's are only created by the
716      linker, so this will only happen for input files which are the
717      result of a partial link.  */
718   rfd_in = (bfd_byte *) input_debug->external_rfd;
719   rfd_end = rfd_in + input_symhdr->crfd * input_swap->external_rfd_size;
720   for (;
721        rfd_in < rfd_end;
722        rfd_in += input_swap->external_rfd_size)
723     {
724       RFDT rfd;
725 
726       (*swap_rfd_in) (input_bfd, rfd_in, &rfd);
727       BFD_ASSERT (rfd >= 0 && rfd < input_symhdr->ifdMax);
728       rfd = input_debug->ifdmap[rfd];
729       (*swap_rfd_out) (output_bfd, &rfd, rfd_out);
730       rfd_out += external_rfd_size;
731     }
732 
733   oldrfdbase = output_symhdr->crfd;
734   output_symhdr->crfd += input_symhdr->crfd;
735 
736   /* Look through the FDR's and copy over all associated debugging
737      information.  */
738   sz = copied * external_fdr_size;
739   fdr_out = (bfd_byte *) objalloc_alloc (ainfo->memory, sz);
740   if (!fdr_out)
741     {
742       bfd_set_error (bfd_error_no_memory);
743       return FALSE;
744     }
745   if (!add_memory_shuffle (ainfo, &ainfo->fdr, &ainfo->fdr_end, fdr_out, sz))
746     return FALSE;
747   for (fdr_ptr = fdr_start, i = 0;
748        fdr_ptr < fdr_end;
749        fdr_ptr += fdr_add, i++)
750     {
751       FDR fdr;
752       bfd_byte *sym_out;
753       bfd_byte *lraw_src;
754       bfd_byte *lraw_end;
755       bfd_boolean fgotfilename;
756 
757       if (input_debug->ifdmap[i] < output_symhdr->ifdMax)
758 	{
759 	  /* We are not copying this FDR.  */
760 	  continue;
761 	}
762 
763       if (input_debug->fdr != (FDR *) NULL)
764 	fdr = *(FDR *) fdr_ptr;
765       else
766 	(*input_swap->swap_fdr_in) (input_bfd, fdr_ptr, &fdr);
767 
768       /* FIXME: It is conceivable that this FDR points to the .init or
769 	 .fini section, in which case this will not do the right
770 	 thing.  */
771       fdr.adr += section_adjust[scText];
772 
773       /* Swap in the local symbols, adjust their values, and swap them
774 	 out again.  */
775       fgotfilename = FALSE;
776       sz = fdr.csym * external_sym_size;
777       sym_out = (bfd_byte *) objalloc_alloc (ainfo->memory, sz);
778       if (!sym_out)
779 	{
780 	  bfd_set_error (bfd_error_no_memory);
781 	  return FALSE;
782 	}
783       if (!add_memory_shuffle (ainfo, &ainfo->sym, &ainfo->sym_end, sym_out,
784 			       sz))
785 	return FALSE;
786       lraw_src = ((bfd_byte *) input_debug->external_sym
787 		  + fdr.isymBase * input_swap->external_sym_size);
788       lraw_end = lraw_src + fdr.csym * input_swap->external_sym_size;
789       for (;  lraw_src < lraw_end;  lraw_src += input_swap->external_sym_size)
790 	{
791 	  SYMR internal_sym;
792 
793 	  (*swap_sym_in) (input_bfd, lraw_src, &internal_sym);
794 
795 	  BFD_ASSERT (internal_sym.sc != scCommon
796 		      && internal_sym.sc != scSCommon);
797 
798 	  /* Adjust the symbol value if appropriate.  */
799 	  switch (internal_sym.st)
800 	    {
801 	    case stNil:
802 	      if (ECOFF_IS_STAB (&internal_sym))
803 		break;
804 	      /* Fall through.  */
805 	    case stGlobal:
806 	    case stStatic:
807 	    case stLabel:
808 	    case stProc:
809 	    case stStaticProc:
810 	      internal_sym.value += section_adjust[internal_sym.sc];
811 	      break;
812 
813 	    default:
814 	      break;
815 	    }
816 
817 	  /* If we are doing a final link, we hash all the strings in
818 	     the local symbol table together.  This reduces the amount
819 	     of space required by debugging information.  We don't do
820 	     this when performing a relocatable link because it would
821 	     prevent us from easily merging different FDR's.  */
822 	  if (! bfd_link_relocatable (info))
823 	    {
824 	      bfd_boolean ffilename;
825 	      const char *name;
826 
827 	      if (! fgotfilename && internal_sym.iss == fdr.rss)
828 		ffilename = TRUE;
829 	      else
830 		ffilename = FALSE;
831 
832 	      /* Hash the name into the string table.  */
833 	      name = input_debug->ss + fdr.issBase + internal_sym.iss;
834 	      if (*name == '\0')
835 		internal_sym.iss = 0;
836 	      else
837 		{
838 		  struct string_hash_entry *sh;
839 
840 		  sh = string_hash_lookup (&ainfo->str_hash, name, TRUE, TRUE);
841 		  if (sh == (struct string_hash_entry *) NULL)
842 		    return FALSE;
843 		  if (sh->val == -1)
844 		    {
845 		      sh->val = output_symhdr->issMax;
846 		      output_symhdr->issMax += strlen (name) + 1;
847 		      if (ainfo->ss_hash == (struct string_hash_entry *) NULL)
848 			ainfo->ss_hash = sh;
849 		      if (ainfo->ss_hash_end
850 			  != (struct string_hash_entry *) NULL)
851 			ainfo->ss_hash_end->next = sh;
852 		      ainfo->ss_hash_end = sh;
853 		    }
854 		  internal_sym.iss = sh->val;
855 		}
856 
857 	      if (ffilename)
858 		{
859 		  fdr.rss = internal_sym.iss;
860 		  fgotfilename = TRUE;
861 		}
862 	    }
863 
864 	  (*swap_sym_out) (output_bfd, &internal_sym, sym_out);
865 	  sym_out += external_sym_size;
866 	}
867 
868       fdr.isymBase = output_symhdr->isymMax;
869       output_symhdr->isymMax += fdr.csym;
870 
871       /* Copy the information that does not need swapping.  */
872 
873       /* FIXME: If we are relaxing, we need to adjust the line
874 	 numbers.  Frankly, forget it.  Anybody using stabs debugging
875 	 information will not use this line number information, and
876 	 stabs are adjusted correctly.  */
877       if (fdr.cbLine > 0)
878 	{
879 	  file_ptr pos = input_symhdr->cbLineOffset + fdr.cbLineOffset;
880 	  if (!add_file_shuffle (ainfo, &ainfo->line, &ainfo->line_end,
881 				 input_bfd, pos, (unsigned long) fdr.cbLine))
882 	    return FALSE;
883 	  fdr.ilineBase = output_symhdr->ilineMax;
884 	  fdr.cbLineOffset = output_symhdr->cbLine;
885 	  output_symhdr->ilineMax += fdr.cline;
886 	  output_symhdr->cbLine += fdr.cbLine;
887 	}
888       if (fdr.caux > 0)
889 	{
890 	  file_ptr pos = (input_symhdr->cbAuxOffset
891 			  + fdr.iauxBase * sizeof (union aux_ext));
892 	  if (!add_file_shuffle (ainfo, &ainfo->aux, &ainfo->aux_end,
893 				 input_bfd, pos,
894 				 fdr.caux * sizeof (union aux_ext)))
895 	    return FALSE;
896 	  fdr.iauxBase = output_symhdr->iauxMax;
897 	  output_symhdr->iauxMax += fdr.caux;
898 	}
899       if (! bfd_link_relocatable (info))
900 	{
901 
902 	  /* When we are hashing strings, we lie about the number of
903 	     strings attached to each FDR.  We need to set cbSs
904 	     because some versions of dbx apparently use it to decide
905 	     how much of the string table to read in.  */
906 	  fdr.issBase = 0;
907 	  fdr.cbSs = output_symhdr->issMax;
908 	}
909       else if (fdr.cbSs > 0)
910 	{
911 	  file_ptr pos = input_symhdr->cbSsOffset + fdr.issBase;
912 	  if (!add_file_shuffle (ainfo, &ainfo->ss, &ainfo->ss_end,
913 				 input_bfd, pos, (unsigned long) fdr.cbSs))
914 	    return FALSE;
915 	  fdr.issBase = output_symhdr->issMax;
916 	  output_symhdr->issMax += fdr.cbSs;
917 	}
918 
919       if (output_bfd->xvec->header_byteorder
920 	  == input_bfd->xvec->header_byteorder)
921 	{
922 	  /* The two BFD's have the same endianness, and we don't have
923 	     to adjust the PDR addresses, so simply copying the
924 	     information will suffice.  */
925 	  BFD_ASSERT (external_pdr_size == input_swap->external_pdr_size);
926 	  if (fdr.cpd > 0)
927 	    {
928 	      file_ptr pos = (input_symhdr->cbPdOffset
929 			      + fdr.ipdFirst * external_pdr_size);
930 	      unsigned long size = fdr.cpd * external_pdr_size;
931 	      if (!add_file_shuffle (ainfo, &ainfo->pdr, &ainfo->pdr_end,
932 				     input_bfd, pos, size))
933 		return FALSE;
934 	    }
935 	  BFD_ASSERT (external_opt_size == input_swap->external_opt_size);
936 	  if (fdr.copt > 0)
937 	    {
938 	      file_ptr pos = (input_symhdr->cbOptOffset
939 			      + fdr.ioptBase * external_opt_size);
940 	      unsigned long size = fdr.copt * external_opt_size;
941 	      if (!add_file_shuffle (ainfo, &ainfo->opt, &ainfo->opt_end,
942 				     input_bfd, pos, size))
943 		return FALSE;
944 	    }
945 	}
946       else
947 	{
948 	  bfd_size_type outsz, insz;
949 	  bfd_byte *in;
950 	  bfd_byte *end;
951 	  bfd_byte *out;
952 
953 	  /* The two BFD's have different endianness, so we must swap
954 	     everything in and out.  This code would always work, but
955 	     it would be unnecessarily slow in the normal case.  */
956 	  outsz = external_pdr_size;
957 	  insz = input_swap->external_pdr_size;
958 	  in = ((bfd_byte *) input_debug->external_pdr
959 		+ fdr.ipdFirst * insz);
960 	  end = in + fdr.cpd * insz;
961 	  sz = fdr.cpd * outsz;
962 	  out = (bfd_byte *) objalloc_alloc (ainfo->memory, sz);
963 	  if (!out)
964 	    {
965 	      bfd_set_error (bfd_error_no_memory);
966 	      return FALSE;
967 	    }
968 	  if (!add_memory_shuffle (ainfo, &ainfo->pdr, &ainfo->pdr_end, out,
969 				   sz))
970 	    return FALSE;
971 	  for (; in < end; in += insz, out += outsz)
972 	    {
973 	      PDR pdr;
974 
975 	      (*input_swap->swap_pdr_in) (input_bfd, in, &pdr);
976 	      (*output_swap->swap_pdr_out) (output_bfd, &pdr, out);
977 	    }
978 
979 	  /* Swap over the optimization information.  */
980 	  outsz = external_opt_size;
981 	  insz = input_swap->external_opt_size;
982 	  in = ((bfd_byte *) input_debug->external_opt
983 		+ fdr.ioptBase * insz);
984 	  end = in + fdr.copt * insz;
985 	  sz = fdr.copt * outsz;
986 	  out = (bfd_byte *) objalloc_alloc (ainfo->memory, sz);
987 	  if (!out)
988 	    {
989 	      bfd_set_error (bfd_error_no_memory);
990 	      return FALSE;
991 	    }
992 	  if (!add_memory_shuffle (ainfo, &ainfo->opt, &ainfo->opt_end, out,
993 				   sz))
994 	    return FALSE;
995 	  for (; in < end; in += insz, out += outsz)
996 	    {
997 	      OPTR opt;
998 
999 	      (*input_swap->swap_opt_in) (input_bfd, in, &opt);
1000 	      (*output_swap->swap_opt_out) (output_bfd, &opt, out);
1001 	    }
1002 	}
1003 
1004       fdr.ipdFirst = output_symhdr->ipdMax;
1005       output_symhdr->ipdMax += fdr.cpd;
1006       fdr.ioptBase = output_symhdr->ioptMax;
1007       output_symhdr->ioptMax += fdr.copt;
1008 
1009       if (fdr.crfd <= 0)
1010 	{
1011 	  /* Point this FDR at the table of RFD's we created.  */
1012 	  fdr.rfdBase = newrfdbase;
1013 	  fdr.crfd = input_symhdr->ifdMax;
1014 	}
1015       else
1016 	{
1017 	  /* Point this FDR at the remapped RFD's.  */
1018 	  fdr.rfdBase += oldrfdbase;
1019 	}
1020 
1021       (*swap_fdr_out) (output_bfd, &fdr, fdr_out);
1022       fdr_out += external_fdr_size;
1023       ++output_symhdr->ifdMax;
1024     }
1025 
1026   return TRUE;
1027 }
1028 
1029 /* Add a string to the debugging information we are accumulating.
1030    Return the offset from the fdr string base.  */
1031 
1032 static long
1033 ecoff_add_string (struct accumulate *ainfo,
1034 		  struct bfd_link_info *info,
1035 		  struct ecoff_debug_info *debug,
1036 		  FDR *fdr,
1037 		  const char *string)
1038 {
1039   HDRR *symhdr;
1040   size_t len;
1041   bfd_size_type ret;
1042 
1043   symhdr = &debug->symbolic_header;
1044   len = strlen (string);
1045   if (bfd_link_relocatable (info))
1046     {
1047       if (!add_memory_shuffle (ainfo, &ainfo->ss, &ainfo->ss_end,
1048 			       (bfd_byte *) string, len + 1))
1049 	return -1;
1050       ret = symhdr->issMax;
1051       symhdr->issMax += len + 1;
1052       fdr->cbSs += len + 1;
1053     }
1054   else
1055     {
1056       struct string_hash_entry *sh;
1057 
1058       sh = string_hash_lookup (&ainfo->str_hash, string, TRUE, TRUE);
1059       if (sh == (struct string_hash_entry *) NULL)
1060 	return -1;
1061       if (sh->val == -1)
1062 	{
1063 	  sh->val = symhdr->issMax;
1064 	  symhdr->issMax += len + 1;
1065 	  if (ainfo->ss_hash == (struct string_hash_entry *) NULL)
1066 	    ainfo->ss_hash = sh;
1067 	  if (ainfo->ss_hash_end
1068 	      != (struct string_hash_entry *) NULL)
1069 	    ainfo->ss_hash_end->next = sh;
1070 	  ainfo->ss_hash_end = sh;
1071 	}
1072       ret = sh->val;
1073     }
1074 
1075   return ret;
1076 }
1077 
1078 /* Add debugging information from a non-ECOFF file.  */
1079 
1080 bfd_boolean
1081 bfd_ecoff_debug_accumulate_other (void * handle,
1082 				  bfd *output_bfd,
1083 				  struct ecoff_debug_info *output_debug,
1084 				  const struct ecoff_debug_swap *output_swap,
1085 				  bfd *input_bfd,
1086 				  struct bfd_link_info *info)
1087 {
1088   struct accumulate *ainfo = (struct accumulate *) handle;
1089   void (* const swap_sym_out) (bfd *, const SYMR *, void *)
1090     = output_swap->swap_sym_out;
1091   HDRR *output_symhdr = &output_debug->symbolic_header;
1092   FDR fdr;
1093   asection *sec;
1094   asymbol **symbols;
1095   asymbol **sym_ptr;
1096   asymbol **sym_end;
1097   long symsize;
1098   long symcount;
1099   void * external_fdr;
1100 
1101   memset (&fdr, 0, sizeof fdr);
1102 
1103   sec = bfd_get_section_by_name (input_bfd, ".text");
1104   if (sec != NULL)
1105     fdr.adr = sec->output_section->vma + sec->output_offset;
1106   else
1107     {
1108       /* FIXME: What about .init or .fini?  */
1109       fdr.adr = 0;
1110     }
1111 
1112   fdr.issBase = output_symhdr->issMax;
1113   fdr.cbSs = 0;
1114   fdr.rss = ecoff_add_string (ainfo, info, output_debug, &fdr,
1115 			      input_bfd->filename);
1116   if (fdr.rss == -1)
1117     return FALSE;
1118   fdr.isymBase = output_symhdr->isymMax;
1119 
1120   /* Get the local symbols from the input BFD.  */
1121   symsize = bfd_get_symtab_upper_bound (input_bfd);
1122   if (symsize < 0)
1123     return FALSE;
1124   symbols = (asymbol **) bfd_alloc (output_bfd, (bfd_size_type) symsize);
1125   if (symbols == (asymbol **) NULL)
1126     return FALSE;
1127   symcount = bfd_canonicalize_symtab (input_bfd, symbols);
1128   if (symcount < 0)
1129     return FALSE;
1130   sym_end = symbols + symcount;
1131 
1132   /* Handle the local symbols.  Any external symbols are handled
1133      separately.  */
1134   fdr.csym = 0;
1135   for (sym_ptr = symbols; sym_ptr != sym_end; sym_ptr++)
1136     {
1137       SYMR internal_sym;
1138       void * external_sym;
1139 
1140       if (((*sym_ptr)->flags & BSF_EXPORT) != 0)
1141 	continue;
1142       memset (&internal_sym, 0, sizeof internal_sym);
1143       internal_sym.iss = ecoff_add_string (ainfo, info, output_debug, &fdr,
1144 					   (*sym_ptr)->name);
1145 
1146       if (internal_sym.iss == -1)
1147 	return FALSE;
1148       if (bfd_is_com_section ((*sym_ptr)->section)
1149 	  || bfd_is_und_section ((*sym_ptr)->section))
1150 	internal_sym.value = (*sym_ptr)->value;
1151       else
1152 	internal_sym.value = ((*sym_ptr)->value
1153 			      + (*sym_ptr)->section->output_offset
1154 			      + (*sym_ptr)->section->output_section->vma);
1155       internal_sym.st = stNil;
1156       internal_sym.sc = scUndefined;
1157       internal_sym.index = indexNil;
1158 
1159       external_sym = objalloc_alloc (ainfo->memory,
1160 				     output_swap->external_sym_size);
1161       if (!external_sym)
1162 	{
1163 	  bfd_set_error (bfd_error_no_memory);
1164 	  return FALSE;
1165 	}
1166       (*swap_sym_out) (output_bfd, &internal_sym, external_sym);
1167       add_memory_shuffle (ainfo, &ainfo->sym, &ainfo->sym_end,
1168 			  (bfd_byte *) external_sym,
1169 			  (unsigned long) output_swap->external_sym_size);
1170       ++fdr.csym;
1171       ++output_symhdr->isymMax;
1172     }
1173 
1174   bfd_release (output_bfd, symbols);
1175 
1176   /* Leave everything else in the FDR zeroed out.  This will cause
1177      the lang field to be langC.  The fBigendian field will
1178      indicate little endian format, but it doesn't matter because
1179      it only applies to aux fields and there are none.  */
1180   external_fdr = objalloc_alloc (ainfo->memory,
1181 				 output_swap->external_fdr_size);
1182   if (!external_fdr)
1183     {
1184       bfd_set_error (bfd_error_no_memory);
1185       return FALSE;
1186     }
1187   (*output_swap->swap_fdr_out) (output_bfd, &fdr, external_fdr);
1188   add_memory_shuffle (ainfo, &ainfo->fdr, &ainfo->fdr_end,
1189 		      (bfd_byte *) external_fdr,
1190 		      (unsigned long) output_swap->external_fdr_size);
1191 
1192   ++output_symhdr->ifdMax;
1193 
1194   return TRUE;
1195 }
1196 
1197 /* Set up ECOFF debugging information for the external symbols.
1198    FIXME: This is done using a memory buffer, but it should be
1199    probably be changed to use a shuffle structure.  The assembler uses
1200    this interface, so that must be changed to do something else.  */
1201 
1202 bfd_boolean
1203 bfd_ecoff_debug_externals (bfd *abfd,
1204 			   struct ecoff_debug_info *debug,
1205 			   const struct ecoff_debug_swap *swap,
1206 			   bfd_boolean relocatable,
1207 			   bfd_boolean (*get_extr) (asymbol *, EXTR *),
1208 			   void (*set_index) (asymbol *, bfd_size_type))
1209 {
1210   HDRR * const symhdr = &debug->symbolic_header;
1211   asymbol **sym_ptr_ptr;
1212   size_t c;
1213 
1214   sym_ptr_ptr = bfd_get_outsymbols (abfd);
1215   if (sym_ptr_ptr == NULL)
1216     return TRUE;
1217 
1218   for (c = bfd_get_symcount (abfd); c > 0; c--, sym_ptr_ptr++)
1219     {
1220       asymbol *sym_ptr;
1221       EXTR esym;
1222 
1223       sym_ptr = *sym_ptr_ptr;
1224 
1225       /* Get the external symbol information.  */
1226       if (! (*get_extr) (sym_ptr, &esym))
1227 	continue;
1228 
1229       /* If we're producing an executable, move common symbols into
1230 	 bss.  */
1231       if (! relocatable)
1232 	{
1233 	  if (esym.asym.sc == scCommon)
1234 	    esym.asym.sc = scBss;
1235 	  else if (esym.asym.sc == scSCommon)
1236 	    esym.asym.sc = scSBss;
1237 	}
1238 
1239       if (bfd_is_com_section (sym_ptr->section)
1240 	  || bfd_is_und_section (sym_ptr->section)
1241 	  || sym_ptr->section->output_section == (asection *) NULL)
1242 	{
1243 	  /* FIXME: gas does not keep the value of a small undefined
1244 	     symbol in the symbol itself, because of relocation
1245 	     problems.  */
1246 	  if (esym.asym.sc != scSUndefined
1247 	      || esym.asym.value == 0
1248 	      || sym_ptr->value != 0)
1249 	    esym.asym.value = sym_ptr->value;
1250 	}
1251       else
1252 	esym.asym.value = (sym_ptr->value
1253 			   + sym_ptr->section->output_offset
1254 			   + sym_ptr->section->output_section->vma);
1255 
1256       if (set_index)
1257 	(*set_index) (sym_ptr, (bfd_size_type) symhdr->iextMax);
1258 
1259       if (! bfd_ecoff_debug_one_external (abfd, debug, swap,
1260 					  sym_ptr->name, &esym))
1261 	return FALSE;
1262     }
1263 
1264   return TRUE;
1265 }
1266 
1267 /* Add a single external symbol to the debugging information.  */
1268 
1269 bfd_boolean
1270 bfd_ecoff_debug_one_external (bfd *abfd,
1271 			      struct ecoff_debug_info *debug,
1272 			      const struct ecoff_debug_swap *swap,
1273 			      const char *name,
1274 			      EXTR *esym)
1275 {
1276   const bfd_size_type external_ext_size = swap->external_ext_size;
1277   void (* const swap_ext_out) (bfd *, const EXTR *, void *)
1278     = swap->swap_ext_out;
1279   HDRR * const symhdr = &debug->symbolic_header;
1280   size_t namelen;
1281 
1282   namelen = strlen (name);
1283 
1284   if ((size_t) (debug->ssext_end - debug->ssext)
1285       < symhdr->issExtMax + namelen + 1)
1286     {
1287       if (! ecoff_add_bytes ((char **) &debug->ssext,
1288 			     (char **) &debug->ssext_end,
1289 			     symhdr->issExtMax + namelen + 1))
1290 	return FALSE;
1291     }
1292   if ((size_t) ((char *) debug->external_ext_end
1293 		- (char *) debug->external_ext)
1294       < (symhdr->iextMax + 1) * external_ext_size)
1295     {
1296       char *external_ext = (char *) debug->external_ext;
1297       char *external_ext_end = (char *) debug->external_ext_end;
1298       if (! ecoff_add_bytes ((char **) &external_ext,
1299 			     (char **) &external_ext_end,
1300 			     (symhdr->iextMax + 1) * (size_t) external_ext_size))
1301 	return FALSE;
1302       debug->external_ext = external_ext;
1303       debug->external_ext_end = external_ext_end;
1304     }
1305 
1306   esym->asym.iss = symhdr->issExtMax;
1307 
1308   (*swap_ext_out) (abfd, esym,
1309 		   ((char *) debug->external_ext
1310 		    + symhdr->iextMax * swap->external_ext_size));
1311 
1312   ++symhdr->iextMax;
1313 
1314   strcpy (debug->ssext + symhdr->issExtMax, name);
1315   symhdr->issExtMax += namelen + 1;
1316 
1317   return TRUE;
1318 }
1319 
1320 /* Align the ECOFF debugging information.  */
1321 
1322 static void
1323 ecoff_align_debug (bfd *abfd ATTRIBUTE_UNUSED,
1324 		   struct ecoff_debug_info *debug,
1325 		   const struct ecoff_debug_swap *swap)
1326 {
1327   HDRR * const symhdr = &debug->symbolic_header;
1328   bfd_size_type debug_align, aux_align, rfd_align;
1329   size_t add;
1330 
1331   /* Adjust the counts so that structures are aligned.  */
1332   debug_align = swap->debug_align;
1333   aux_align = debug_align / sizeof (union aux_ext);
1334   rfd_align = debug_align / swap->external_rfd_size;
1335 
1336   add = debug_align - (symhdr->cbLine & (debug_align - 1));
1337   if (add != debug_align)
1338     {
1339       if (debug->line != (unsigned char *) NULL)
1340 	memset ((debug->line + symhdr->cbLine), 0, add);
1341       symhdr->cbLine += add;
1342     }
1343 
1344   add = debug_align - (symhdr->issMax & (debug_align - 1));
1345   if (add != debug_align)
1346     {
1347       if (debug->ss != (char *) NULL)
1348 	memset ((debug->ss + symhdr->issMax), 0, add);
1349       symhdr->issMax += add;
1350     }
1351 
1352   add = debug_align - (symhdr->issExtMax & (debug_align - 1));
1353   if (add != debug_align)
1354     {
1355       if (debug->ssext != (char *) NULL)
1356 	memset ((debug->ssext + symhdr->issExtMax), 0, add);
1357       symhdr->issExtMax += add;
1358     }
1359 
1360   add = aux_align - (symhdr->iauxMax & (aux_align - 1));
1361   if (add != aux_align)
1362     {
1363       if (debug->external_aux != (union aux_ext *) NULL)
1364 	memset ((debug->external_aux + symhdr->iauxMax), 0,
1365 		add * sizeof (union aux_ext));
1366       symhdr->iauxMax += add;
1367     }
1368 
1369   add = rfd_align - (symhdr->crfd & (rfd_align - 1));
1370   if (add != rfd_align)
1371     {
1372       if (debug->external_rfd != NULL)
1373 	memset (((char *) debug->external_rfd
1374 		 + symhdr->crfd * swap->external_rfd_size),
1375 		0, (size_t) (add * swap->external_rfd_size));
1376       symhdr->crfd += add;
1377     }
1378 }
1379 
1380 /* Return the size required by the ECOFF debugging information.  */
1381 
1382 bfd_size_type
1383 bfd_ecoff_debug_size (bfd *abfd,
1384 		      struct ecoff_debug_info *debug,
1385 		      const struct ecoff_debug_swap *swap)
1386 {
1387   bfd_size_type tot;
1388 
1389   ecoff_align_debug (abfd, debug, swap);
1390   tot = swap->external_hdr_size;
1391 
1392 #define ADD(count, size) \
1393   tot += debug->symbolic_header.count * size
1394 
1395   ADD (cbLine, sizeof (unsigned char));
1396   ADD (idnMax, swap->external_dnr_size);
1397   ADD (ipdMax, swap->external_pdr_size);
1398   ADD (isymMax, swap->external_sym_size);
1399   ADD (ioptMax, swap->external_opt_size);
1400   ADD (iauxMax, sizeof (union aux_ext));
1401   ADD (issMax, sizeof (char));
1402   ADD (issExtMax, sizeof (char));
1403   ADD (ifdMax, swap->external_fdr_size);
1404   ADD (crfd, swap->external_rfd_size);
1405   ADD (iextMax, swap->external_ext_size);
1406 
1407 #undef ADD
1408 
1409   return tot;
1410 }
1411 
1412 /* Write out the ECOFF symbolic header, given the file position it is
1413    going to be placed at.  This assumes that the counts are set
1414    correctly.  */
1415 
1416 static bfd_boolean
1417 ecoff_write_symhdr (bfd *abfd,
1418 		    struct ecoff_debug_info *debug,
1419 		    const struct ecoff_debug_swap *swap,
1420 		    file_ptr where)
1421 {
1422   HDRR * const symhdr = &debug->symbolic_header;
1423   char *buff = NULL;
1424 
1425   ecoff_align_debug (abfd, debug, swap);
1426 
1427   /* Go to the right location in the file.  */
1428   if (bfd_seek (abfd, where, SEEK_SET) != 0)
1429     return FALSE;
1430 
1431   where += swap->external_hdr_size;
1432 
1433   symhdr->magic = swap->sym_magic;
1434 
1435   /* Fill in the file offsets.  */
1436 #define SET(offset, count, size) \
1437   if (symhdr->count == 0) \
1438     symhdr->offset = 0; \
1439   else \
1440     { \
1441       symhdr->offset = where; \
1442       where += symhdr->count * size; \
1443     }
1444 
1445   SET (cbLineOffset, cbLine, sizeof (unsigned char));
1446   SET (cbDnOffset, idnMax, swap->external_dnr_size);
1447   SET (cbPdOffset, ipdMax, swap->external_pdr_size);
1448   SET (cbSymOffset, isymMax, swap->external_sym_size);
1449   SET (cbOptOffset, ioptMax, swap->external_opt_size);
1450   SET (cbAuxOffset, iauxMax, sizeof (union aux_ext));
1451   SET (cbSsOffset, issMax, sizeof (char));
1452   SET (cbSsExtOffset, issExtMax, sizeof (char));
1453   SET (cbFdOffset, ifdMax, swap->external_fdr_size);
1454   SET (cbRfdOffset, crfd, swap->external_rfd_size);
1455   SET (cbExtOffset, iextMax, swap->external_ext_size);
1456 #undef SET
1457 
1458   buff = (char *) bfd_malloc (swap->external_hdr_size);
1459   if (buff == NULL && swap->external_hdr_size != 0)
1460     goto error_return;
1461 
1462   (*swap->swap_hdr_out) (abfd, symhdr, buff);
1463   if (bfd_bwrite (buff, swap->external_hdr_size, abfd)
1464       != swap->external_hdr_size)
1465     goto error_return;
1466 
1467   if (buff != NULL)
1468     free (buff);
1469   return TRUE;
1470  error_return:
1471   if (buff != NULL)
1472     free (buff);
1473   return FALSE;
1474 }
1475 
1476 /* Write out the ECOFF debugging information.  This function assumes
1477    that the information (the pointers and counts) in *DEBUG have been
1478    set correctly.  WHERE is the position in the file to write the
1479    information to.  This function fills in the file offsets in the
1480    symbolic header.  */
1481 
1482 bfd_boolean
1483 bfd_ecoff_write_debug (bfd *abfd,
1484 		       struct ecoff_debug_info *debug,
1485 		       const struct ecoff_debug_swap *swap,
1486 		       file_ptr where)
1487 {
1488   HDRR * const symhdr = &debug->symbolic_header;
1489 
1490   if (! ecoff_write_symhdr (abfd, debug, swap, where))
1491     return FALSE;
1492 
1493 #define WRITE(ptr, count, size, offset) \
1494   BFD_ASSERT (symhdr->offset == 0 \
1495 	      || (bfd_vma) bfd_tell (abfd) == symhdr->offset); \
1496   if (bfd_bwrite (debug->ptr, (bfd_size_type) size * symhdr->count, abfd)\
1497       != size * symhdr->count) \
1498     return FALSE;
1499 
1500   WRITE (line, cbLine, sizeof (unsigned char), cbLineOffset);
1501   WRITE (external_dnr, idnMax, swap->external_dnr_size, cbDnOffset);
1502   WRITE (external_pdr, ipdMax, swap->external_pdr_size, cbPdOffset);
1503   WRITE (external_sym, isymMax, swap->external_sym_size, cbSymOffset);
1504   WRITE (external_opt, ioptMax, swap->external_opt_size, cbOptOffset);
1505   WRITE (external_aux, iauxMax, (bfd_size_type) sizeof (union aux_ext),
1506 	 cbAuxOffset);
1507   WRITE (ss, issMax, sizeof (char), cbSsOffset);
1508   WRITE (ssext, issExtMax, sizeof (char), cbSsExtOffset);
1509   WRITE (external_fdr, ifdMax, swap->external_fdr_size, cbFdOffset);
1510   WRITE (external_rfd, crfd, swap->external_rfd_size, cbRfdOffset);
1511   WRITE (external_ext, iextMax, swap->external_ext_size, cbExtOffset);
1512 #undef WRITE
1513 
1514   return TRUE;
1515 }
1516 
1517 /* Write out a shuffle list.  */
1518 
1519 
1520 static bfd_boolean
1521 ecoff_write_shuffle (bfd *abfd,
1522 		     const struct ecoff_debug_swap *swap,
1523 		     struct shuffle *shuffle,
1524 		     void * space)
1525 {
1526   struct shuffle *l;
1527   unsigned long total;
1528 
1529   total = 0;
1530   for (l = shuffle; l != (struct shuffle *) NULL; l = l->next)
1531     {
1532       if (! l->filep)
1533 	{
1534 	  if (bfd_bwrite (l->u.memory, (bfd_size_type) l->size, abfd)
1535 	      != l->size)
1536 	    return FALSE;
1537 	}
1538       else
1539 	{
1540 	  if (bfd_seek (l->u.file.input_bfd, l->u.file.offset, SEEK_SET) != 0
1541 	      || bfd_bread (space, (bfd_size_type) l->size,
1542 			   l->u.file.input_bfd) != l->size
1543 	      || bfd_bwrite (space, (bfd_size_type) l->size, abfd) != l->size)
1544 	    return FALSE;
1545 	}
1546       total += l->size;
1547     }
1548 
1549   if ((total & (swap->debug_align - 1)) != 0)
1550     {
1551       unsigned int i;
1552       bfd_byte *s;
1553 
1554       i = swap->debug_align - (total & (swap->debug_align - 1));
1555       s = (bfd_byte *) bfd_zmalloc ((bfd_size_type) i);
1556       if (s == NULL && i != 0)
1557 	return FALSE;
1558 
1559       if (bfd_bwrite (s, (bfd_size_type) i, abfd) != i)
1560 	{
1561 	  free (s);
1562 	  return FALSE;
1563 	}
1564       free (s);
1565     }
1566 
1567   return TRUE;
1568 }
1569 
1570 /* Write out debugging information using accumulated linker
1571    information.  */
1572 
1573 bfd_boolean
1574 bfd_ecoff_write_accumulated_debug (void * handle,
1575 				   bfd *abfd,
1576 				   struct ecoff_debug_info *debug,
1577 				   const struct ecoff_debug_swap *swap,
1578 				   struct bfd_link_info *info,
1579 				   file_ptr where)
1580 {
1581   struct accumulate *ainfo = (struct accumulate *) handle;
1582   void * space = NULL;
1583   bfd_size_type amt;
1584 
1585   if (! ecoff_write_symhdr (abfd, debug, swap, where))
1586     goto error_return;
1587 
1588   amt = ainfo->largest_file_shuffle;
1589   space = bfd_malloc (amt);
1590   if (space == NULL && ainfo->largest_file_shuffle != 0)
1591     goto error_return;
1592 
1593   if (! ecoff_write_shuffle (abfd, swap, ainfo->line, space)
1594       || ! ecoff_write_shuffle (abfd, swap, ainfo->pdr, space)
1595       || ! ecoff_write_shuffle (abfd, swap, ainfo->sym, space)
1596       || ! ecoff_write_shuffle (abfd, swap, ainfo->opt, space)
1597       || ! ecoff_write_shuffle (abfd, swap, ainfo->aux, space))
1598     goto error_return;
1599 
1600   /* The string table is written out from the hash table if this is a
1601      final link.  */
1602   if (bfd_link_relocatable (info))
1603     {
1604       BFD_ASSERT (ainfo->ss_hash == (struct string_hash_entry *) NULL);
1605       if (! ecoff_write_shuffle (abfd, swap, ainfo->ss, space))
1606 	goto error_return;
1607     }
1608   else
1609     {
1610       unsigned long total;
1611       bfd_byte null;
1612       struct string_hash_entry *sh;
1613 
1614       BFD_ASSERT (ainfo->ss == (struct shuffle *) NULL);
1615       null = 0;
1616       if (bfd_bwrite (&null, (bfd_size_type) 1, abfd) != 1)
1617 	goto error_return;
1618       total = 1;
1619       BFD_ASSERT (ainfo->ss_hash == NULL || ainfo->ss_hash->val == 1);
1620       for (sh = ainfo->ss_hash;
1621 	   sh != (struct string_hash_entry *) NULL;
1622 	   sh = sh->next)
1623 	{
1624 	  size_t len;
1625 
1626 	  len = strlen (sh->root.string);
1627 	  amt = len + 1;
1628 	  if (bfd_bwrite (sh->root.string, amt, abfd) != amt)
1629 	    goto error_return;
1630 	  total += len + 1;
1631 	}
1632 
1633       if ((total & (swap->debug_align - 1)) != 0)
1634 	{
1635 	  unsigned int i;
1636 	  bfd_byte *s;
1637 
1638 	  i = swap->debug_align - (total & (swap->debug_align - 1));
1639 	  s = (bfd_byte *) bfd_zmalloc ((bfd_size_type) i);
1640 	  if (s == NULL && i != 0)
1641 	    goto error_return;
1642 
1643 	  if (bfd_bwrite (s, (bfd_size_type) i, abfd) != i)
1644 	    {
1645 	      free (s);
1646 	      goto error_return;
1647 	    }
1648 	  free (s);
1649 	}
1650     }
1651 
1652   /* The external strings and symbol are not converted over to using
1653      shuffles.  FIXME: They probably should be.  */
1654   amt = debug->symbolic_header.issExtMax;
1655   if (bfd_bwrite (debug->ssext, amt, abfd) != amt)
1656     goto error_return;
1657   if ((debug->symbolic_header.issExtMax & (swap->debug_align - 1)) != 0)
1658     {
1659       unsigned int i;
1660       bfd_byte *s;
1661 
1662       i = (swap->debug_align
1663 	   - (debug->symbolic_header.issExtMax & (swap->debug_align - 1)));
1664       s = (bfd_byte *) bfd_zmalloc ((bfd_size_type) i);
1665       if (s == NULL && i != 0)
1666 	goto error_return;
1667 
1668       if (bfd_bwrite (s, (bfd_size_type) i, abfd) != i)
1669 	{
1670 	  free (s);
1671 	  goto error_return;
1672 	}
1673       free (s);
1674     }
1675 
1676   if (! ecoff_write_shuffle (abfd, swap, ainfo->fdr, space)
1677       || ! ecoff_write_shuffle (abfd, swap, ainfo->rfd, space))
1678     goto error_return;
1679 
1680   BFD_ASSERT (debug->symbolic_header.cbExtOffset == 0
1681 	      || (debug->symbolic_header.cbExtOffset
1682 		  == (bfd_vma) bfd_tell (abfd)));
1683 
1684   amt = debug->symbolic_header.iextMax * swap->external_ext_size;
1685   if (bfd_bwrite (debug->external_ext, amt, abfd) != amt)
1686     goto error_return;
1687 
1688   if (space != NULL)
1689     free (space);
1690   return TRUE;
1691 
1692  error_return:
1693   if (space != NULL)
1694     free (space);
1695   return FALSE;
1696 }
1697 
1698 /* Handle the find_nearest_line function for both ECOFF and MIPS ELF
1699    files.  */
1700 
1701 /* Compare FDR entries.  This is called via qsort.  */
1702 
1703 static int
1704 cmp_fdrtab_entry (const void * leftp, const void * rightp)
1705 {
1706   const struct ecoff_fdrtab_entry *lp =
1707     (const struct ecoff_fdrtab_entry *) leftp;
1708   const struct ecoff_fdrtab_entry *rp =
1709     (const struct ecoff_fdrtab_entry *) rightp;
1710 
1711   if (lp->base_addr < rp->base_addr)
1712     return -1;
1713   if (lp->base_addr > rp->base_addr)
1714     return 1;
1715   return 0;
1716 }
1717 
1718 /* Each file descriptor (FDR) has a memory address, to simplify
1719    looking up an FDR by address, we build a table covering all FDRs
1720    that have a least one procedure descriptor in them.  The final
1721    table will be sorted by address so we can look it up via binary
1722    search.  */
1723 
1724 static bfd_boolean
1725 mk_fdrtab (bfd *abfd,
1726 	   struct ecoff_debug_info * const debug_info,
1727 	   const struct ecoff_debug_swap * const debug_swap,
1728 	   struct ecoff_find_line *line_info)
1729 {
1730   struct ecoff_fdrtab_entry *tab;
1731   FDR *fdr_ptr;
1732   FDR *fdr_start;
1733   FDR *fdr_end;
1734   bfd_boolean stabs;
1735   long len;
1736   bfd_size_type amt;
1737 
1738   fdr_start = debug_info->fdr;
1739   fdr_end = fdr_start + debug_info->symbolic_header.ifdMax;
1740 
1741   /* First, let's see how long the table needs to be.  */
1742   for (len = 0, fdr_ptr = fdr_start; fdr_ptr < fdr_end; fdr_ptr++)
1743     {
1744       if (fdr_ptr->cpd == 0)	/* Skip FDRs that have no PDRs.  */
1745 	continue;
1746       ++len;
1747     }
1748 
1749   /* Now, create and fill in the table.  */
1750   amt = (bfd_size_type) len * sizeof (struct ecoff_fdrtab_entry);
1751   line_info->fdrtab = (struct ecoff_fdrtab_entry*) bfd_zalloc (abfd, amt);
1752   if (line_info->fdrtab == NULL)
1753     return FALSE;
1754   line_info->fdrtab_len = len;
1755 
1756   tab = line_info->fdrtab;
1757   for (fdr_ptr = fdr_start; fdr_ptr < fdr_end; fdr_ptr++)
1758     {
1759       if (fdr_ptr->cpd == 0)
1760 	continue;
1761 
1762       /* Check whether this file has stabs debugging information.  In
1763 	 a file with stabs debugging information, the second local
1764 	 symbol is named @stabs.  */
1765       stabs = FALSE;
1766       if (fdr_ptr->csym >= 2)
1767 	{
1768 	  char *sym_ptr;
1769 	  SYMR sym;
1770 
1771 	  sym_ptr = ((char *) debug_info->external_sym
1772 		     + (fdr_ptr->isymBase + 1) * debug_swap->external_sym_size);
1773 	  (*debug_swap->swap_sym_in) (abfd, sym_ptr, &sym);
1774 	  if (strcmp (debug_info->ss + fdr_ptr->issBase + sym.iss,
1775 		      STABS_SYMBOL) == 0)
1776 	    stabs = TRUE;
1777 	}
1778 
1779       if (!stabs)
1780 	{
1781 	  /* eraxxon: There are at least two problems with this computation:
1782 	     1) PDRs do *not* contain offsets but full vma's; and typically the
1783 	     address of the first PDR is the address of the FDR, which will
1784 	     make (most) of the results of the original computation 0!
1785 	     2) Once in a wacky while, the Compaq compiler generated PDR
1786 	     addresses do not equal the FDR vma, but they (the PDR address)
1787 	     are still vma's and not offsets.  Cf. comments in
1788 	     'lookup_line'.  */
1789 	  /* The address of the first PDR is the offset of that
1790 	     procedure relative to the beginning of file FDR.  */
1791 	  tab->base_addr = fdr_ptr->adr;
1792 	}
1793       else
1794 	{
1795 	  /* XXX I don't know about stabs, so this is a guess
1796 	     (davidm@cs.arizona.edu).  */
1797 	  tab->base_addr = fdr_ptr->adr;
1798 	}
1799       tab->fdr = fdr_ptr;
1800       ++tab;
1801     }
1802 
1803   /* Finally, the table is sorted in increasing memory-address order.
1804      The table is mostly sorted already, but there are cases (e.g.,
1805      static functions in include files), where this does not hold.
1806      Use "odump -PFv" to verify...  */
1807   qsort (line_info->fdrtab, (size_t) len,
1808 	 sizeof (struct ecoff_fdrtab_entry), cmp_fdrtab_entry);
1809 
1810   return TRUE;
1811 }
1812 
1813 /* Return index of first FDR that covers to OFFSET.  */
1814 
1815 static long
1816 fdrtab_lookup (struct ecoff_find_line *line_info, bfd_vma offset)
1817 {
1818   long low, high, len;
1819   long mid = -1;
1820   struct ecoff_fdrtab_entry *tab;
1821 
1822   len = line_info->fdrtab_len;
1823   if (len == 0)
1824     return -1;
1825 
1826   tab = line_info->fdrtab;
1827   for (low = 0, high = len - 1 ; low != high ;)
1828     {
1829       mid = (high + low) / 2;
1830       if (offset >= tab[mid].base_addr && offset < tab[mid + 1].base_addr)
1831 	goto find_min;
1832 
1833       if (tab[mid].base_addr > offset)
1834 	high = mid;
1835       else
1836 	low = mid + 1;
1837     }
1838 
1839   /* eraxxon: at this point 'offset' is either lower than the lowest entry or
1840      higher than the highest entry. In the former case high = low = mid = 0;
1841      we want to return -1.  In the latter case, low = high and mid = low - 1;
1842      we want to return the index of the highest entry.  Only in former case
1843      will the following 'catch-all' test be true.  */
1844   ++mid;
1845 
1846   /* Last entry is catch-all for all higher addresses.  */
1847   if (offset < tab[mid].base_addr)
1848     return -1;
1849 
1850  find_min:
1851 
1852   /* eraxxon: There may be multiple FDRs in the table with the
1853      same base_addr; make sure that we are at the first one.  */
1854   while (mid > 0 && tab[mid - 1].base_addr == tab[mid].base_addr)
1855     --mid;
1856 
1857   return mid;
1858 }
1859 
1860 /* Look up a line given an address, storing the information in
1861    LINE_INFO->cache.  */
1862 
1863 static bfd_boolean
1864 lookup_line (bfd *abfd,
1865 	     struct ecoff_debug_info * const debug_info,
1866 	     const struct ecoff_debug_swap * const debug_swap,
1867 	     struct ecoff_find_line *line_info)
1868 {
1869   struct ecoff_fdrtab_entry *tab;
1870   bfd_vma offset;
1871   bfd_boolean stabs;
1872   FDR *fdr_ptr;
1873   int i;
1874 
1875   /* eraxxon: note that 'offset' is the full vma, not a section offset.  */
1876   offset = line_info->cache.start;
1877 
1878   /* Build FDR table (sorted by object file's base-address) if we
1879      don't have it already.  */
1880   if (line_info->fdrtab == NULL
1881       && !mk_fdrtab (abfd, debug_info, debug_swap, line_info))
1882     return FALSE;
1883 
1884   tab = line_info->fdrtab;
1885 
1886   /* Find first FDR for address OFFSET.  */
1887   i = fdrtab_lookup (line_info, offset);
1888   if (i < 0)
1889     return FALSE;		/* no FDR, no fun...  */
1890 
1891   /* eraxxon: 'fdrtab_lookup' doesn't give what we want, at least for Compaq's
1892      C++ compiler 6.2.  Consider three FDRs with starting addresses of x, y,
1893      and z, respectively, such that x < y < z.  Assume further that
1894      y < 'offset' < z.  It is possible at times that the PDR for 'offset' is
1895      associated with FDR x and *not* with FDR y.  Erg!!
1896 
1897      From a binary dump of my C++ test case 'moo' using Compaq's coffobjanl
1898      (output format has been edited for our purposes):
1899 
1900      FDR [2]: (main.C): First instruction: 0x12000207c <x>
1901        PDR [5] for File [2]: LoopTest__Xv		  <0x1200020a0> (a)
1902        PDR [7] for File [2]: foo__Xv			  <0x120002168>
1903      FDR [1]: (-1):	First instruction: 0x1200020e8 <y>
1904        PDR [3] for File [1]:				  <0x120001ad0> (b)
1905      FDR [6]: (-1):	First instruction: 0x1200026f0 <z>
1906 
1907      (a) In the case of PDR5, the vma is such that the first few instructions
1908      of the procedure can be found.  But since the size of this procedure is
1909      160b, the vma will soon cross into the 'address space' of FDR1 and no
1910      debugging info will be found.  How repugnant!
1911 
1912      (b) It is also possible for a PDR to have a *lower* vma than its associated
1913      FDR; see FDR1 and PDR3.  Gross!
1914 
1915      Since the FDRs that are causing so much havok (in this case) 1) do not
1916      describe actual files (fdr.rss == -1), and 2) contain only compiler
1917      generated routines, I thought a simple fix would be to exclude them from
1918      the FDR table in 'mk_fdrtab'.  But, besides not knowing for certain
1919      whether this would be correct, it creates an additional problem.  If we
1920      happen to ask for source file info on a compiler generated (procedure)
1921      symbol -- which is still in the symbol table -- the result can be
1922      information from a real procedure!  This is because compiler generated
1923      procedures with vma's higher than the last FDR in the fdr table will be
1924      associated with a PDR from this FDR, specifically the PDR with the
1925      highest vma.  This wasn't a problem before, because each procedure had a
1926      PDR.  (Yes, this problem could be eliminated if we kept the size of the
1927      last PDR around, but things are already getting ugly).
1928 
1929      Probably, a better solution would be to have a sorted PDR table.  Each
1930      PDR would have a pointer to its FDR so file information could still be
1931      obtained.  A FDR table could still be constructed if necessary -- since
1932      it only contains pointers, not much extra memory would be used -- but
1933      the PDR table would be searched to locate debugging info.
1934 
1935      There is still at least one remaining issue.  Sometimes a FDR can have a
1936      bogus name, but contain PDRs that should belong to another FDR with a
1937      real name.  E.g:
1938 
1939      FDR [3]: 0000000120001b50 (/home/.../Array.H~alt~deccxx_5E5A62AD)
1940        PDR [a] for File [3]: 0000000120001b50
1941        PDR [b] for File [3]: 0000000120001cf0
1942        PDR [c] for File [3]: 0000000120001dc8
1943        PDR [d] for File [3]: 0000000120001e40
1944        PDR [e] for File [3]: 0000000120001eb8
1945        PDR [f] for File [3]: 0000000120001f4c
1946      FDR [4]: 0000000120001b50 (/home/.../Array.H)
1947 
1948      Here, FDR4 has the correct name, but should (seemingly) contain PDRa-f.
1949      The symbol table for PDR4 does contain symbols for PDRa-f, but so does
1950      the symbol table for FDR3.  However the former is different; perhaps this
1951      can be detected easily. (I'm not sure at this point.)  This problem only
1952      seems to be associated with files with templates.  I am assuming the idea
1953      is that there is a 'fake' FDR (with PDRs) for each differently typed set
1954      of templates that must be generated.  Currently, FDR4 is completely
1955      excluded from the FDR table in 'mk_fdrtab' because it contains no PDRs.
1956 
1957      Since I don't have time to prepare a real fix for this right now, be
1958      prepared for 'A Horrible Hack' to force the inspection of all non-stabs
1959      FDRs.  It's coming...  */
1960   fdr_ptr = tab[i].fdr;
1961 
1962   /* Check whether this file has stabs debugging information.  In a
1963      file with stabs debugging information, the second local symbol is
1964      named @stabs.  */
1965   stabs = FALSE;
1966   if (fdr_ptr->csym >= 2)
1967     {
1968       char *sym_ptr;
1969       SYMR sym;
1970 
1971       sym_ptr = ((char *) debug_info->external_sym
1972 		 + (fdr_ptr->isymBase + 1) * debug_swap->external_sym_size);
1973       (*debug_swap->swap_sym_in) (abfd, sym_ptr, &sym);
1974       if (strcmp (debug_info->ss + fdr_ptr->issBase + sym.iss,
1975 		  STABS_SYMBOL) == 0)
1976 	stabs = TRUE;
1977     }
1978 
1979   if (!stabs)
1980     {
1981       bfd_size_type external_pdr_size;
1982       char *pdr_ptr;
1983       char *best_pdr = NULL;
1984       FDR *best_fdr;
1985       bfd_signed_vma best_dist = -1;
1986       PDR pdr;
1987       unsigned char *line_ptr;
1988       unsigned char *line_end;
1989       int lineno;
1990       /* This file uses ECOFF debugging information.  Each FDR has a
1991 	 list of procedure descriptors (PDR).  The address in the FDR
1992 	 is the absolute address of the first procedure.  The address
1993 	 in the first PDR gives the offset of that procedure relative
1994 	 to the object file's base-address.  The addresses in
1995 	 subsequent PDRs specify each procedure's address relative to
1996 	 the object file's base-address.  To make things more juicy,
1997 	 whenever the PROF bit in the PDR is set, the real entry point
1998 	 of the procedure may be 16 bytes below what would normally be
1999 	 the procedure's entry point.  Instead, DEC came up with a
2000 	 wicked scheme to create profiled libraries "on the fly":
2001 	 instead of shipping a regular and a profiled version of each
2002 	 library, they insert 16 bytes of unused space in front of
2003 	 each procedure and set the "prof" bit in the PDR to indicate
2004 	 that there is a gap there (this is done automagically by "as"
2005 	 when option "-pg" is specified).  Thus, normally, you link
2006 	 against such a library and, except for lots of 16 byte gaps
2007 	 between functions, things will behave as usual.  However,
2008 	 when invoking "ld" with option "-pg", it will fill those gaps
2009 	 with code that calls mcount().  It then moves the function's
2010 	 entry point down by 16 bytes, and out pops a binary that has
2011 	 all functions profiled.
2012 
2013 	 NOTE: Neither FDRs nor PDRs are strictly sorted in memory
2014 	       order.  For example, when including header-files that
2015 	       define functions, the FDRs follow behind the including
2016 	       file, even though their code may have been generated at
2017 	       a lower address.  File coff-alpha.c from libbfd
2018 	       illustrates this (use "odump -PFv" to look at a file's
2019 	       FDR/PDR).  Similarly, PDRs are sometimes out of order
2020 	       as well.  An example of this is OSF/1 v3.0 libc's
2021 	       malloc.c.  I'm not sure why this happens, but it could
2022 	       be due to optimizations that reorder a function's
2023 	       position within an object-file.
2024 
2025 	 Strategy:
2026 
2027 	 On the first call to this function, we build a table of FDRs
2028 	 that is sorted by the base-address of the object-file the FDR
2029 	 is referring to.  Notice that each object-file may contain
2030 	 code from multiple source files (e.g., due to code defined in
2031 	 include files).  Thus, for any given base-address, there may
2032 	 be multiple FDRs (but this case is, fortunately, uncommon).
2033 	 lookup(addr) guarantees to return the first FDR that applies
2034 	 to address ADDR.  Thus, after invoking lookup(), we have a
2035 	 list of FDRs that may contain the PDR for ADDR.  Next, we
2036 	 walk through the PDRs of these FDRs and locate the one that
2037 	 is closest to ADDR (i.e., for which the difference between
2038 	 ADDR and the PDR's entry point is positive and minimal).
2039 	 Once, the right FDR and PDR are located, we simply walk
2040 	 through the line-number table to lookup the line-number that
2041 	 best matches ADDR.  Obviously, things could be sped up by
2042 	 keeping a sorted list of PDRs instead of a sorted list of
2043 	 FDRs.  However, this would increase space requirements
2044 	 considerably, which is undesirable.  */
2045       external_pdr_size = debug_swap->external_pdr_size;
2046 
2047       /* eraxxon: The Horrible Hack: Because of the problems above, set 'i'
2048 	 to 0 so we look through all FDRs.
2049 
2050 	 Because FDR's without any symbols are assumed to be non-stabs,
2051 	 searching through all FDRs may cause the following code to try to
2052 	 read stabs FDRs as ECOFF ones.  However, I don't think this will
2053 	 harm anything.  */
2054       i = 0;
2055 
2056       /* Search FDR list starting at tab[i] for the PDR that best matches
2057 	 OFFSET.  Normally, the FDR list is only one entry long.  */
2058       best_fdr = NULL;
2059       do
2060 	{
2061 	  /* eraxxon: 'dist' and 'min_dist' can be negative now
2062 	     because we iterate over every FDR rather than just ones
2063 	     with a base address less than or equal to 'offset'.  */
2064 	  bfd_signed_vma dist = -1, min_dist = -1;
2065 	  char *pdr_hold;
2066 	  char *pdr_end;
2067 
2068 	  fdr_ptr = tab[i].fdr;
2069 
2070 	  pdr_ptr = ((char *) debug_info->external_pdr
2071 		     + fdr_ptr->ipdFirst * external_pdr_size);
2072 	  pdr_end = pdr_ptr + fdr_ptr->cpd * external_pdr_size;
2073 	  (*debug_swap->swap_pdr_in) (abfd, pdr_ptr, &pdr);
2074 	  /* Find PDR that is closest to OFFSET.  If pdr.prof is set,
2075 	     the procedure entry-point *may* be 0x10 below pdr.adr.  We
2076 	     simply pretend that pdr.prof *implies* a lower entry-point.
2077 	     This is safe because it just means that may identify 4 NOPs
2078 	     in front of the function as belonging to the function.  */
2079 	  for (pdr_hold = NULL;
2080 	       pdr_ptr < pdr_end;
2081 	       (pdr_ptr += external_pdr_size,
2082 		(*debug_swap->swap_pdr_in) (abfd, pdr_ptr, &pdr)))
2083 	    {
2084 	      if (offset >= (pdr.adr - 0x10 * pdr.prof))
2085 		{
2086 		  dist = offset - (pdr.adr - 0x10 * pdr.prof);
2087 
2088 		  /* eraxxon: 'dist' can be negative now.  Note that
2089 		     'min_dist' can be negative if 'pdr_hold' below is NULL.  */
2090 		  if (!pdr_hold || (dist >= 0 && dist < min_dist))
2091 		    {
2092 		      min_dist = dist;
2093 		      pdr_hold = pdr_ptr;
2094 		    }
2095 		}
2096 	    }
2097 
2098 	  if (!best_pdr || (min_dist >= 0 && min_dist < best_dist))
2099 	    {
2100 	      best_dist = (bfd_vma) min_dist;
2101 	      best_fdr = fdr_ptr;
2102 	      best_pdr = pdr_hold;
2103 	    }
2104 	  /* Continue looping until base_addr of next entry is different.  */
2105 	}
2106       /* eraxxon: We want to iterate over all FDRs.
2107 	 See previous comment about 'fdrtab_lookup'.  */
2108       while (++i < line_info->fdrtab_len);
2109 
2110       if (!best_fdr || !best_pdr)
2111 	return FALSE;			/* Shouldn't happen...  */
2112 
2113       /* Phew, finally we got something that we can hold onto.  */
2114       fdr_ptr = best_fdr;
2115       pdr_ptr = best_pdr;
2116       (*debug_swap->swap_pdr_in) (abfd, pdr_ptr, &pdr);
2117       /* Now we can look for the actual line number.  The line numbers
2118 	 are stored in a very funky format, which I won't try to
2119 	 describe.  The search is bounded by the end of the FDRs line
2120 	 number entries.  */
2121       line_end = debug_info->line + fdr_ptr->cbLineOffset + fdr_ptr->cbLine;
2122 
2123       /* Make offset relative to procedure entry.  */
2124       offset -= pdr.adr - 0x10 * pdr.prof;
2125       lineno = pdr.lnLow;
2126       line_ptr = debug_info->line + fdr_ptr->cbLineOffset + pdr.cbLineOffset;
2127       while (line_ptr < line_end)
2128 	{
2129 	  int delta;
2130 	  unsigned int count;
2131 
2132 	  delta = *line_ptr >> 4;
2133 	  if (delta >= 0x8)
2134 	    delta -= 0x10;
2135 	  count = (*line_ptr & 0xf) + 1;
2136 	  ++line_ptr;
2137 	  if (delta == -8)
2138 	    {
2139 	      delta = (((line_ptr[0]) & 0xff) << 8) + ((line_ptr[1]) & 0xff);
2140 	      if (delta >= 0x8000)
2141 		delta -= 0x10000;
2142 	      line_ptr += 2;
2143 	    }
2144 	  lineno += delta;
2145 	  if (offset < count * 4)
2146 	    {
2147 	      line_info->cache.stop += count * 4 - offset;
2148 	      break;
2149 	    }
2150 	  offset -= count * 4;
2151 	}
2152 
2153       /* If fdr_ptr->rss is -1, then this file does not have full
2154 	 symbols, at least according to gdb/mipsread.c.  */
2155       if (fdr_ptr->rss == -1)
2156 	{
2157 	  line_info->cache.filename = NULL;
2158 	  if (pdr.isym == -1)
2159 	    line_info->cache.functionname = NULL;
2160 	  else
2161 	    {
2162 	      EXTR proc_ext;
2163 
2164 	      (*debug_swap->swap_ext_in)
2165 		(abfd,
2166 		 ((char *) debug_info->external_ext
2167 		  + pdr.isym * debug_swap->external_ext_size),
2168 		 &proc_ext);
2169 	      line_info->cache.functionname = (debug_info->ssext
2170 					       + proc_ext.asym.iss);
2171 	    }
2172 	}
2173       else
2174 	{
2175 	  SYMR proc_sym;
2176 
2177 	  line_info->cache.filename = (debug_info->ss
2178 				       + fdr_ptr->issBase
2179 				       + fdr_ptr->rss);
2180 	  (*debug_swap->swap_sym_in)
2181 	    (abfd,
2182 	     ((char *) debug_info->external_sym
2183 	      + ((fdr_ptr->isymBase + pdr.isym)
2184 		 * debug_swap->external_sym_size)),
2185 	     &proc_sym);
2186 	  line_info->cache.functionname = (debug_info->ss
2187 					   + fdr_ptr->issBase
2188 					   + proc_sym.iss);
2189 	}
2190       if (lineno == ilineNil)
2191 	lineno = 0;
2192       line_info->cache.line_num = lineno;
2193     }
2194   else
2195     {
2196       bfd_size_type external_sym_size;
2197       const char *directory_name;
2198       const char *main_file_name;
2199       const char *current_file_name;
2200       const char *function_name;
2201       const char *line_file_name;
2202       bfd_vma low_func_vma;
2203       bfd_vma low_line_vma;
2204       bfd_boolean past_line;
2205       bfd_boolean past_fn;
2206       char *sym_ptr, *sym_ptr_end;
2207       size_t len, funclen;
2208       char *buffer = NULL;
2209 
2210       /* This file uses stabs debugging information.  When gcc is not
2211 	 optimizing, it will put the line number information before
2212 	 the function name stabs entry.  When gcc is optimizing, it
2213 	 will put the stabs entry for all the function first, followed
2214 	 by the line number information.  (This appears to happen
2215 	 because of the two output files used by the -mgpopt switch,
2216 	 which is implied by -O).  This means that we must keep
2217 	 looking through the symbols until we find both a line number
2218 	 and a function name which are beyond the address we want.  */
2219 
2220       line_info->cache.filename = NULL;
2221       line_info->cache.functionname = NULL;
2222       line_info->cache.line_num = 0;
2223 
2224       directory_name = NULL;
2225       main_file_name = NULL;
2226       current_file_name = NULL;
2227       function_name = NULL;
2228       line_file_name = NULL;
2229       low_func_vma = 0;
2230       low_line_vma = 0;
2231       past_line = FALSE;
2232       past_fn = FALSE;
2233 
2234       external_sym_size = debug_swap->external_sym_size;
2235 
2236       sym_ptr = ((char *) debug_info->external_sym
2237 		 + (fdr_ptr->isymBase + 2) * external_sym_size);
2238       sym_ptr_end = sym_ptr + (fdr_ptr->csym - 2) * external_sym_size;
2239       for (;
2240 	   sym_ptr < sym_ptr_end && (! past_line || ! past_fn);
2241 	   sym_ptr += external_sym_size)
2242 	{
2243 	  SYMR sym;
2244 
2245 	  (*debug_swap->swap_sym_in) (abfd, sym_ptr, &sym);
2246 
2247 	  if (ECOFF_IS_STAB (&sym))
2248 	    {
2249 	      switch (ECOFF_UNMARK_STAB (sym.index))
2250 		{
2251 		case N_SO:
2252 		  main_file_name = current_file_name =
2253 		    debug_info->ss + fdr_ptr->issBase + sym.iss;
2254 
2255 		  /* Check the next symbol to see if it is also an
2256 		     N_SO symbol.  */
2257 		  if (sym_ptr + external_sym_size < sym_ptr_end)
2258 		    {
2259 		      SYMR nextsym;
2260 
2261 		      (*debug_swap->swap_sym_in) (abfd,
2262 						  sym_ptr + external_sym_size,
2263 						  &nextsym);
2264 		      if (ECOFF_IS_STAB (&nextsym)
2265 			  && ECOFF_UNMARK_STAB (nextsym.index) == N_SO)
2266 			{
2267 			  directory_name = current_file_name;
2268 			  main_file_name = current_file_name =
2269 			    debug_info->ss + fdr_ptr->issBase + nextsym.iss;
2270 			  sym_ptr += external_sym_size;
2271 			}
2272 		    }
2273 		  break;
2274 
2275 		case N_SOL:
2276 		  current_file_name =
2277 		    debug_info->ss + fdr_ptr->issBase + sym.iss;
2278 		  break;
2279 
2280 		case N_FUN:
2281 		  if (sym.value > offset)
2282 		    past_fn = TRUE;
2283 		  else if (sym.value >= low_func_vma)
2284 		    {
2285 		      low_func_vma = sym.value;
2286 		      function_name =
2287 			debug_info->ss + fdr_ptr->issBase + sym.iss;
2288 		    }
2289 		  break;
2290 		}
2291 	    }
2292 	  else if (sym.st == stLabel && sym.index != indexNil)
2293 	    {
2294 	      if (sym.value > offset)
2295 		past_line = TRUE;
2296 	      else if (sym.value >= low_line_vma)
2297 		{
2298 		  low_line_vma = sym.value;
2299 		  line_file_name = current_file_name;
2300 		  line_info->cache.line_num = sym.index;
2301 		}
2302 	    }
2303 	}
2304 
2305       if (line_info->cache.line_num != 0)
2306 	main_file_name = line_file_name;
2307 
2308       /* We need to remove the stuff after the colon in the function
2309 	 name.  We also need to put the directory name and the file
2310 	 name together.  */
2311       if (function_name == NULL)
2312 	len = funclen = 0;
2313       else
2314 	len = funclen = strlen (function_name) + 1;
2315 
2316       if (main_file_name != NULL
2317 	  && directory_name != NULL
2318 	  && main_file_name[0] != '/')
2319 	len += strlen (directory_name) + strlen (main_file_name) + 1;
2320 
2321       if (len != 0)
2322 	{
2323 	  if (line_info->find_buffer != NULL)
2324 	    free (line_info->find_buffer);
2325 	  buffer = (char *) bfd_malloc ((bfd_size_type) len);
2326 	  if (buffer == NULL)
2327 	    return FALSE;
2328 	  line_info->find_buffer = buffer;
2329 	}
2330 
2331       if (function_name != NULL)
2332 	{
2333 	  char *colon;
2334 
2335 	  strcpy (buffer, function_name);
2336 	  colon = strchr (buffer, ':');
2337 	  if (colon != NULL)
2338 	    *colon = '\0';
2339 	  line_info->cache.functionname = buffer;
2340 	}
2341 
2342       if (main_file_name != NULL)
2343 	{
2344 	  if (directory_name == NULL || main_file_name[0] == '/')
2345 	    line_info->cache.filename = main_file_name;
2346 	  else
2347 	    {
2348 	      sprintf (buffer + funclen, "%s%s", directory_name,
2349 		       main_file_name);
2350 	      line_info->cache.filename = buffer + funclen;
2351 	    }
2352 	}
2353     }
2354 
2355   return TRUE;
2356 }
2357 
2358 /* Do the work of find_nearest_line.  */
2359 
2360 bfd_boolean
2361 _bfd_ecoff_locate_line (bfd *abfd,
2362 			asection *section,
2363 			bfd_vma offset,
2364 			struct ecoff_debug_info * const debug_info,
2365 			const struct ecoff_debug_swap * const debug_swap,
2366 			struct ecoff_find_line *line_info,
2367 			const char **filename_ptr,
2368 			const char **functionname_ptr,
2369 			unsigned int *retline_ptr)
2370 {
2371   offset += section->vma;
2372 
2373   if (line_info->cache.sect == NULL
2374       || line_info->cache.sect != section
2375       || offset < line_info->cache.start
2376       || offset >= line_info->cache.stop)
2377     {
2378       line_info->cache.sect = section;
2379       line_info->cache.start = offset;
2380       line_info->cache.stop = offset;
2381       if (! lookup_line (abfd, debug_info, debug_swap, line_info))
2382 	{
2383 	  line_info->cache.sect = NULL;
2384 	  return FALSE;
2385 	}
2386     }
2387 
2388   *filename_ptr = line_info->cache.filename;
2389   *functionname_ptr = line_info->cache.functionname;
2390   *retline_ptr = line_info->cache.line_num;
2391 
2392   return TRUE;
2393 }
2394 
2395 /* These routines copy symbolic information into a memory buffer.
2396 
2397    FIXME: The whole point of the shuffle code is to avoid storing
2398    everything in memory, since the linker is such a memory hog.  This
2399    code makes that effort useless.  It is only called by the MIPS ELF
2400    code when generating a shared library, so it is not that big a
2401    deal, but it should be fixed eventually.  */
2402 
2403 /* Collect a shuffle into a memory buffer.  */
2404 
2405 static bfd_boolean
2406 ecoff_collect_shuffle (struct shuffle *l, bfd_byte *buff)
2407 {
2408   unsigned long total;
2409 
2410   total = 0;
2411   for (; l != (struct shuffle *) NULL; l = l->next)
2412     {
2413       if (! l->filep)
2414 	memcpy (buff, l->u.memory, l->size);
2415       else
2416 	{
2417 	  if (bfd_seek (l->u.file.input_bfd, l->u.file.offset, SEEK_SET) != 0
2418 	      || (bfd_bread (buff, (bfd_size_type) l->size, l->u.file.input_bfd)
2419 		  != l->size))
2420 	    return FALSE;
2421 	}
2422       total += l->size;
2423       buff += l->size;
2424     }
2425 
2426   return TRUE;
2427 }
2428 
2429 /* Copy PDR information into a memory buffer.  */
2430 
2431 bfd_boolean
2432 _bfd_ecoff_get_accumulated_pdr (void * handle,
2433 				bfd_byte *buff)
2434 {
2435   struct accumulate *ainfo = (struct accumulate *) handle;
2436 
2437   return ecoff_collect_shuffle (ainfo->pdr, buff);
2438 }
2439 
2440 /* Copy symbol information into a memory buffer.  */
2441 
2442 bfd_boolean
2443 _bfd_ecoff_get_accumulated_sym (void * handle, bfd_byte *buff)
2444 {
2445   struct accumulate *ainfo = (struct accumulate *) handle;
2446 
2447   return ecoff_collect_shuffle (ainfo->sym, buff);
2448 }
2449 
2450 /* Copy the string table into a memory buffer.  */
2451 
2452 bfd_boolean
2453 _bfd_ecoff_get_accumulated_ss (void * handle, bfd_byte *buff)
2454 {
2455   struct accumulate *ainfo = (struct accumulate *) handle;
2456   struct string_hash_entry *sh;
2457   unsigned long total;
2458 
2459   /* The string table is written out from the hash table if this is a
2460      final link.  */
2461   BFD_ASSERT (ainfo->ss == (struct shuffle *) NULL);
2462   *buff++ = '\0';
2463   total = 1;
2464   BFD_ASSERT (ainfo->ss_hash == NULL || ainfo->ss_hash->val == 1);
2465   for (sh = ainfo->ss_hash;
2466        sh != (struct string_hash_entry *) NULL;
2467        sh = sh->next)
2468     {
2469       size_t len;
2470 
2471       len = strlen (sh->root.string);
2472       memcpy (buff, sh->root.string, len + 1);
2473       total += len + 1;
2474       buff += len + 1;
2475     }
2476 
2477   return TRUE;
2478 }
2479