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