Import gdb-7.0
[dragonfly.git] / contrib / gdb-6.2.1 / bfd / ecofflink.c
1 /* Routines to link ECOFF debugging information.
2    Copyright 1993, 1994, 1995, 1996, 1997, 2000, 2001, 2002, 2003
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                               bfd_archive_filename (input_bfd));
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 #if 0
1843             bfd_size_type external_pdr_size;
1844             char *pdr_ptr;
1845             PDR pdr;
1846             
1847             external_pdr_size = debug_swap->external_pdr_size;
1848             
1849             pdr_ptr = ((char *) debug_info->external_pdr
1850                       + fdr_ptr->ipdFirst * external_pdr_size);
1851             (*debug_swap->swap_pdr_in) (abfd, (PTR) pdr_ptr, &pdr);
1852           /* The address of the first PDR is the offset of that
1853              procedure relative to the beginning of file FDR.  */
1854             tab->base_addr = fdr_ptr->adr - pdr.adr;
1855 #else
1856           /* The address of the first PDR is the offset of that
1857              procedure relative to the beginning of file FDR.  */
1858           tab->base_addr = fdr_ptr->adr; 
1859 #endif
1860         }
1861       else
1862         {
1863           /* XXX I don't know about stabs, so this is a guess
1864              (davidm@cs.arizona.edu).  */
1865           tab->base_addr = fdr_ptr->adr;
1866         }
1867       tab->fdr = fdr_ptr;
1868       ++tab;
1869     }
1870
1871   /* Finally, the table is sorted in increasing memory-address order.
1872      The table is mostly sorted already, but there are cases (e.g.,
1873      static functions in include files), where this does not hold.
1874      Use "odump -PFv" to verify...  */
1875   qsort ((PTR) line_info->fdrtab, (size_t) len,
1876          sizeof (struct ecoff_fdrtab_entry), cmp_fdrtab_entry);
1877
1878   return TRUE;
1879 }
1880
1881 /* Return index of first FDR that covers to OFFSET.  */
1882
1883 static long
1884 fdrtab_lookup (line_info, offset)
1885      struct ecoff_find_line *line_info;
1886      bfd_vma offset;
1887 {
1888   long low, high, len;
1889   long mid = -1;
1890   struct ecoff_fdrtab_entry *tab;
1891
1892   len = line_info->fdrtab_len;
1893   if (len == 0)
1894     return -1;
1895
1896   tab = line_info->fdrtab;
1897   for (low = 0, high = len - 1 ; low != high ;)
1898     {
1899       mid = (high + low) / 2;
1900       if (offset >= tab[mid].base_addr && offset < tab[mid + 1].base_addr)
1901         goto find_min;
1902
1903       if (tab[mid].base_addr > offset)
1904         high = mid;
1905       else
1906         low = mid + 1;
1907     }
1908
1909   /* eraxxon: at this point 'offset' is either lower than the lowest entry or
1910      higher than the highest entry. In the former case high = low = mid = 0;
1911      we want to return -1.  In the latter case, low = high and mid = low - 1;
1912      we want to return the index of the highest entry.  Only in former case
1913      will the following 'catch-all' test be true.  */
1914   ++mid;
1915
1916   /* Last entry is catch-all for all higher addresses.  */
1917   if (offset < tab[mid].base_addr)
1918     return -1;
1919
1920  find_min:
1921
1922   /* eraxxon: There may be multiple FDRs in the table with the
1923      same base_addr; make sure that we are at the first one.  */
1924   while (mid > 0 && tab[mid - 1].base_addr == tab[mid].base_addr)
1925     --mid;
1926
1927   return mid;
1928 }
1929
1930 /* Look up a line given an address, storing the information in
1931    LINE_INFO->cache.  */
1932
1933 static bfd_boolean
1934 lookup_line (abfd, debug_info, debug_swap, line_info)
1935      bfd *abfd;
1936      struct ecoff_debug_info * const debug_info;
1937      const struct ecoff_debug_swap * const debug_swap;
1938      struct ecoff_find_line *line_info;
1939 {
1940   struct ecoff_fdrtab_entry *tab;
1941   bfd_vma offset;
1942   bfd_boolean stabs;
1943   FDR *fdr_ptr;
1944   int i;
1945
1946   /* eraxxon: note that 'offset' is the full vma, not a section offset.  */
1947   offset = line_info->cache.start;
1948
1949   /* Build FDR table (sorted by object file's base-address) if we
1950      don't have it already.  */
1951   if (line_info->fdrtab == NULL
1952       && !mk_fdrtab (abfd, debug_info, debug_swap, line_info))
1953     return FALSE;
1954
1955   tab = line_info->fdrtab;
1956
1957   /* Find first FDR for address OFFSET.  */
1958   i = fdrtab_lookup (line_info, offset);
1959   if (i < 0)
1960     return FALSE;               /* no FDR, no fun...  */
1961   
1962   /* eraxxon: 'fdrtab_lookup' doesn't give what we want, at least for Compaq's
1963      C++ compiler 6.2.  Consider three FDRs with starting addresses of x, y,
1964      and z, respectively, such that x < y < z.  Assume further that
1965      y < 'offset' < z.  It is possible at times that the PDR for 'offset' is
1966      associated with FDR x and *not* with FDR y.  Erg!!
1967
1968      From a binary dump of my C++ test case 'moo' using Compaq's coffobjanl
1969      (output format has been edited for our purposes):
1970
1971      FDR [2]: (main.C): First instruction: 0x12000207c <x>
1972        PDR [5] for File [2]: LoopTest__Xv                 <0x1200020a0> (a)
1973        PDR [7] for File [2]: foo__Xv                      <0x120002168>
1974      FDR [1]: (-1):     First instruction: 0x1200020e8 <y>
1975        PDR [3] for File [1]:                              <0x120001ad0> (b)
1976      FDR [6]: (-1):     First instruction: 0x1200026f0 <z>
1977
1978      (a) In the case of PDR5, the vma is such that the first few instructions
1979      of the procedure can be found.  But since the size of this procedure is
1980      160b, the vma will soon cross into the 'address space' of FDR1 and no
1981      debugging info will be found.  How repugnant!
1982
1983      (b) It is also possible for a PDR to have a *lower* vma than its associated
1984      FDR; see FDR1 and PDR3.  Gross!
1985
1986      Since the FDRs that are causing so much havok (in this case) 1) do not
1987      describe actual files (fdr.rss == -1), and 2) contain only compiler
1988      generated routines, I thought a simple fix would be to exclude them from
1989      the FDR table in 'mk_fdrtab'.  But, besides not knowing for certain
1990      whether this would be correct, it creates an additional problem.  If we
1991      happen to ask for source file info on a compiler generated (procedure)
1992      symbol -- which is still in the symbol table -- the result can be
1993      information from a real procedure!  This is because compiler generated
1994      procedures with vma's higher than the last FDR in the fdr table will be
1995      associated with a PDR from this FDR, specifically the PDR with the
1996      highest vma.  This wasn't a problem before, because each procedure had a
1997      PDR.  (Yes, this problem could be eliminated if we kept the size of the
1998      last PDR around, but things are already getting ugly).
1999
2000      Probably, a better solution would be to have a sorted PDR table.  Each
2001      PDR would have a pointer to its FDR so file information could still be
2002      obtained.  A FDR table could still be constructed if necessary -- since
2003      it only contains pointers, not much extra memory would be used -- but
2004      the PDR table would be searched to locate debugging info.
2005
2006      There is still at least one remaining issue.  Sometimes a FDR can have a
2007      bogus name, but contain PDRs that should belong to another FDR with a
2008      real name.  E.g:
2009
2010      FDR [3]: 0000000120001b50 (/home/.../Array.H~alt~deccxx_5E5A62AD)
2011        PDR [a] for File [3]: 0000000120001b50
2012        PDR [b] for File [3]: 0000000120001cf0
2013        PDR [c] for File [3]: 0000000120001dc8
2014        PDR [d] for File [3]: 0000000120001e40
2015        PDR [e] for File [3]: 0000000120001eb8
2016        PDR [f] for File [3]: 0000000120001f4c
2017      FDR [4]: 0000000120001b50 (/home/.../Array.H)
2018
2019      Here, FDR4 has the correct name, but should (seemingly) contain PDRa-f.
2020      The symbol table for PDR4 does contain symbols for PDRa-f, but so does
2021      the symbol table for FDR3.  However the former is different; perhaps this
2022      can be detected easily. (I'm not sure at this point.)  This problem only
2023      seems to be associated with files with templates.  I am assuming the idea
2024      is that there is a 'fake' FDR (with PDRs) for each differently typed set
2025      of templates that must be generated.  Currently, FDR4 is completely
2026      excluded from the FDR table in 'mk_fdrtab' because it contains no PDRs.
2027
2028      Since I don't have time to prepare a real fix for this right now, be
2029      prepared for 'A Horrible Hack' to force the inspection of all non-stabs
2030      FDRs.  It's coming...  */
2031   fdr_ptr = tab[i].fdr;
2032
2033   /* Check whether this file has stabs debugging information.  In a
2034      file with stabs debugging information, the second local symbol is
2035      named @stabs.  */
2036   stabs = FALSE;
2037   if (fdr_ptr->csym >= 2)
2038     {
2039       char *sym_ptr;
2040       SYMR sym;
2041
2042       sym_ptr = ((char *) debug_info->external_sym
2043                  + (fdr_ptr->isymBase + 1) * debug_swap->external_sym_size);
2044       (*debug_swap->swap_sym_in) (abfd, sym_ptr, &sym);
2045       if (strcmp (debug_info->ss + fdr_ptr->issBase + sym.iss,
2046                   STABS_SYMBOL) == 0)
2047         stabs = TRUE;
2048     }
2049
2050   if (!stabs)
2051     {
2052       bfd_size_type external_pdr_size;
2053       char *pdr_ptr;
2054       char *best_pdr = NULL;
2055       FDR *best_fdr;
2056       bfd_signed_vma best_dist = -1;
2057       PDR pdr;
2058       unsigned char *line_ptr;
2059       unsigned char *line_end;
2060       int lineno;
2061       /* This file uses ECOFF debugging information.  Each FDR has a
2062          list of procedure descriptors (PDR).  The address in the FDR
2063          is the absolute address of the first procedure.  The address
2064          in the first PDR gives the offset of that procedure relative
2065          to the object file's base-address.  The addresses in
2066          subsequent PDRs specify each procedure's address relative to
2067          the object file's base-address.  To make things more juicy,
2068          whenever the PROF bit in the PDR is set, the real entry point
2069          of the procedure may be 16 bytes below what would normally be
2070          the procedure's entry point.  Instead, DEC came up with a
2071          wicked scheme to create profiled libraries "on the fly":
2072          instead of shipping a regular and a profiled version of each
2073          library, they insert 16 bytes of unused space in front of
2074          each procedure and set the "prof" bit in the PDR to indicate
2075          that there is a gap there (this is done automagically by "as"
2076          when option "-pg" is specified).  Thus, normally, you link
2077          against such a library and, except for lots of 16 byte gaps
2078          between functions, things will behave as usual.  However,
2079          when invoking "ld" with option "-pg", it will fill those gaps
2080          with code that calls mcount().  It then moves the function's
2081          entry point down by 16 bytes, and out pops a binary that has
2082          all functions profiled.
2083
2084          NOTE: Neither FDRs nor PDRs are strictly sorted in memory
2085                order.  For example, when including header-files that
2086                define functions, the FDRs follow behind the including
2087                file, even though their code may have been generated at
2088                a lower address.  File coff-alpha.c from libbfd
2089                illustrates this (use "odump -PFv" to look at a file's
2090                FDR/PDR).  Similarly, PDRs are sometimes out of order
2091                as well.  An example of this is OSF/1 v3.0 libc's
2092                malloc.c.  I'm not sure why this happens, but it could
2093                be due to optimizations that reorder a function's
2094                position within an object-file.
2095
2096          Strategy:
2097
2098          On the first call to this function, we build a table of FDRs
2099          that is sorted by the base-address of the object-file the FDR
2100          is referring to.  Notice that each object-file may contain
2101          code from multiple source files (e.g., due to code defined in
2102          include files).  Thus, for any given base-address, there may
2103          be multiple FDRs (but this case is, fortunately, uncommon).
2104          lookup(addr) guarantees to return the first FDR that applies
2105          to address ADDR.  Thus, after invoking lookup(), we have a
2106          list of FDRs that may contain the PDR for ADDR.  Next, we
2107          walk through the PDRs of these FDRs and locate the one that
2108          is closest to ADDR (i.e., for which the difference between
2109          ADDR and the PDR's entry point is positive and minimal).
2110          Once, the right FDR and PDR are located, we simply walk
2111          through the line-number table to lookup the line-number that
2112          best matches ADDR.  Obviously, things could be sped up by
2113          keeping a sorted list of PDRs instead of a sorted list of
2114          FDRs.  However, this would increase space requirements
2115          considerably, which is undesirable.  */
2116       external_pdr_size = debug_swap->external_pdr_size;
2117
2118 #if 0 /* eraxxon: PDR addresses (pdr.adr) are not relative to FDRs!
2119          Leave 'offset' alone.  */
2120       /* Make offset relative to object file's start-address.  */
2121       offset -= tab[i].base_addr;
2122 #endif
2123       /* eraxxon: The Horrible Hack: Because of the problems above, set 'i'
2124          to 0 so we look through all FDRs.
2125
2126          Because FDR's without any symbols are assumed to be non-stabs,
2127          searching through all FDRs may cause the following code to try to
2128          read stabs FDRs as ECOFF ones.  However, I don't think this will
2129          harm anything.  */
2130       i = 0;
2131       
2132       /* Search FDR list starting at tab[i] for the PDR that best matches
2133          OFFSET.  Normally, the FDR list is only one entry long.  */
2134       best_fdr = NULL;
2135       do
2136         {
2137           /* eraxxon: 'dist' and 'min_dist' can be negative now
2138              because we iterate over every FDR rather than just ones
2139              with a base address less than or equal to 'offset'.  */
2140           bfd_signed_vma dist = -1, min_dist = -1;
2141           char *pdr_hold;
2142           char *pdr_end;
2143
2144           fdr_ptr = tab[i].fdr;
2145
2146           pdr_ptr = ((char *) debug_info->external_pdr
2147                      + fdr_ptr->ipdFirst * external_pdr_size);
2148           pdr_end = pdr_ptr + fdr_ptr->cpd * external_pdr_size;
2149           (*debug_swap->swap_pdr_in) (abfd, (PTR) pdr_ptr, &pdr);
2150           /* Find PDR that is closest to OFFSET.  If pdr.prof is set,
2151              the procedure entry-point *may* be 0x10 below pdr.adr.  We
2152              simply pretend that pdr.prof *implies* a lower entry-point.
2153              This is safe because it just means that may identify 4 NOPs
2154              in front of the function as belonging to the function.  */
2155           for (pdr_hold = NULL;
2156                pdr_ptr < pdr_end;
2157                (pdr_ptr += external_pdr_size,
2158                 (*debug_swap->swap_pdr_in) (abfd, (PTR) pdr_ptr, &pdr)))
2159             {
2160               if (offset >= (pdr.adr - 0x10 * pdr.prof))
2161                 {
2162                   dist = offset - (pdr.adr - 0x10 * pdr.prof);
2163
2164                   /* eraxxon: 'dist' can be negative now.  Note that
2165                      'min_dist' can be negative if 'pdr_hold' below is NULL.  */
2166                   if (!pdr_hold || (dist >= 0 && dist < min_dist))
2167                     {
2168                       min_dist = dist;
2169                       pdr_hold = pdr_ptr;
2170                     }
2171                 }
2172             }
2173
2174           if (!best_pdr || (min_dist >= 0 && min_dist < best_dist))
2175             {
2176               best_dist = (bfd_vma) min_dist;  
2177               best_fdr = fdr_ptr;
2178               best_pdr = pdr_hold;
2179             }
2180           /* Continue looping until base_addr of next entry is different.  */
2181         }
2182       /* eraxxon: We want to iterate over all FDRs.
2183          See previous comment about 'fdrtab_lookup'.  */
2184       while (++i < line_info->fdrtab_len);
2185
2186       if (!best_fdr || !best_pdr)
2187         return FALSE;                   /* Shouldn't happen...  */
2188
2189       /* Phew, finally we got something that we can hold onto.  */
2190       fdr_ptr = best_fdr;
2191       pdr_ptr = best_pdr;
2192       (*debug_swap->swap_pdr_in) (abfd, (PTR) pdr_ptr, &pdr);
2193       /* Now we can look for the actual line number.  The line numbers
2194          are stored in a very funky format, which I won't try to
2195          describe.  The search is bounded by the end of the FDRs line
2196          number entries.  */
2197       line_end = debug_info->line + fdr_ptr->cbLineOffset + fdr_ptr->cbLine;
2198
2199       /* Make offset relative to procedure entry.  */
2200       offset -= pdr.adr - 0x10 * pdr.prof;
2201       lineno = pdr.lnLow;
2202       line_ptr = debug_info->line + fdr_ptr->cbLineOffset + pdr.cbLineOffset;
2203       while (line_ptr < line_end)
2204         {
2205           int delta;
2206           unsigned int count;
2207
2208           delta = *line_ptr >> 4;
2209           if (delta >= 0x8)
2210             delta -= 0x10;
2211           count = (*line_ptr & 0xf) + 1;
2212           ++line_ptr;
2213           if (delta == -8)
2214             {
2215               delta = (((line_ptr[0]) & 0xff) << 8) + ((line_ptr[1]) & 0xff);
2216               if (delta >= 0x8000)
2217                 delta -= 0x10000;
2218               line_ptr += 2;
2219             }
2220           lineno += delta;
2221           if (offset < count * 4)
2222             {
2223               line_info->cache.stop += count * 4 - offset;
2224               break;
2225             }
2226           offset -= count * 4;
2227         }
2228
2229       /* If fdr_ptr->rss is -1, then this file does not have full
2230          symbols, at least according to gdb/mipsread.c.  */
2231       if (fdr_ptr->rss == -1)
2232         {
2233           line_info->cache.filename = NULL;
2234           if (pdr.isym == -1)
2235             line_info->cache.functionname = NULL;
2236           else
2237             {
2238               EXTR proc_ext;
2239
2240               (*debug_swap->swap_ext_in)
2241                 (abfd,
2242                  ((char *) debug_info->external_ext
2243                   + pdr.isym * debug_swap->external_ext_size),
2244                  &proc_ext);
2245               line_info->cache.functionname = (debug_info->ssext
2246                                                + proc_ext.asym.iss);
2247             }
2248         }
2249       else
2250         {
2251           SYMR proc_sym;
2252
2253           line_info->cache.filename = (debug_info->ss
2254                                        + fdr_ptr->issBase
2255                                        + fdr_ptr->rss);
2256           (*debug_swap->swap_sym_in)
2257             (abfd,
2258              ((char *) debug_info->external_sym
2259               + ((fdr_ptr->isymBase + pdr.isym)
2260                  * debug_swap->external_sym_size)),
2261              &proc_sym);
2262           line_info->cache.functionname = (debug_info->ss
2263                                            + fdr_ptr->issBase
2264                                            + proc_sym.iss);
2265         }
2266       if (lineno == ilineNil)
2267         lineno = 0;
2268       line_info->cache.line_num = lineno;
2269     }
2270   else
2271     {
2272       bfd_size_type external_sym_size;
2273       const char *directory_name;
2274       const char *main_file_name;
2275       const char *current_file_name;
2276       const char *function_name;
2277       const char *line_file_name;
2278       bfd_vma low_func_vma;
2279       bfd_vma low_line_vma;
2280       bfd_boolean past_line;
2281       bfd_boolean past_fn;
2282       char *sym_ptr, *sym_ptr_end;
2283       size_t len, funclen;
2284       char *buffer = NULL;
2285
2286       /* This file uses stabs debugging information.  When gcc is not
2287          optimizing, it will put the line number information before
2288          the function name stabs entry.  When gcc is optimizing, it
2289          will put the stabs entry for all the function first, followed
2290          by the line number information.  (This appears to happen
2291          because of the two output files used by the -mgpopt switch,
2292          which is implied by -O).  This means that we must keep
2293          looking through the symbols until we find both a line number
2294          and a function name which are beyond the address we want.  */
2295
2296       line_info->cache.filename = NULL;
2297       line_info->cache.functionname = NULL;
2298       line_info->cache.line_num = 0;
2299
2300       directory_name = NULL;
2301       main_file_name = NULL;
2302       current_file_name = NULL;
2303       function_name = NULL;
2304       line_file_name = NULL;
2305       low_func_vma = 0;
2306       low_line_vma = 0;
2307       past_line = FALSE;
2308       past_fn = FALSE;
2309
2310       external_sym_size = debug_swap->external_sym_size;
2311
2312       sym_ptr = ((char *) debug_info->external_sym
2313                  + (fdr_ptr->isymBase + 2) * external_sym_size);
2314       sym_ptr_end = sym_ptr + (fdr_ptr->csym - 2) * external_sym_size;
2315       for (;
2316            sym_ptr < sym_ptr_end && (! past_line || ! past_fn);
2317            sym_ptr += external_sym_size)
2318         {
2319           SYMR sym;
2320
2321           (*debug_swap->swap_sym_in) (abfd, sym_ptr, &sym);
2322
2323           if (ECOFF_IS_STAB (&sym))
2324             {
2325               switch (ECOFF_UNMARK_STAB (sym.index))
2326                 {
2327                 case N_SO:
2328                   main_file_name = current_file_name =
2329                     debug_info->ss + fdr_ptr->issBase + sym.iss;
2330
2331                   /* Check the next symbol to see if it is also an
2332                      N_SO symbol.  */
2333                   if (sym_ptr + external_sym_size < sym_ptr_end)
2334                     {
2335                       SYMR nextsym;
2336
2337                       (*debug_swap->swap_sym_in) (abfd,
2338                                                   sym_ptr + external_sym_size,
2339                                                   &nextsym);
2340                       if (ECOFF_IS_STAB (&nextsym)
2341                           && ECOFF_UNMARK_STAB (nextsym.index) == N_SO)
2342                         {
2343                           directory_name = current_file_name;
2344                           main_file_name = current_file_name =
2345                             debug_info->ss + fdr_ptr->issBase + nextsym.iss;
2346                           sym_ptr += external_sym_size;
2347                         }
2348                     }
2349                   break;
2350
2351                 case N_SOL:
2352                   current_file_name =
2353                     debug_info->ss + fdr_ptr->issBase + sym.iss;
2354                   break;
2355
2356                 case N_FUN:
2357                   if (sym.value > offset)
2358                     past_fn = TRUE;
2359                   else if (sym.value >= low_func_vma)
2360                     {
2361                       low_func_vma = sym.value;
2362                       function_name =
2363                         debug_info->ss + fdr_ptr->issBase + sym.iss;
2364                     }
2365                   break;
2366                 }
2367             }
2368           else if (sym.st == stLabel && sym.index != indexNil)
2369             {
2370               if (sym.value > offset)
2371                 past_line = TRUE;
2372               else if (sym.value >= low_line_vma)
2373                 {
2374                   low_line_vma = sym.value;
2375                   line_file_name = current_file_name;
2376                   line_info->cache.line_num = sym.index;
2377                 }
2378             }
2379         }
2380
2381       if (line_info->cache.line_num != 0)
2382         main_file_name = line_file_name;
2383
2384       /* We need to remove the stuff after the colon in the function
2385          name.  We also need to put the directory name and the file
2386          name together.  */
2387       if (function_name == NULL)
2388         len = funclen = 0;
2389       else
2390         len = funclen = strlen (function_name) + 1;
2391
2392       if (main_file_name != NULL
2393           && directory_name != NULL
2394           && main_file_name[0] != '/')
2395         len += strlen (directory_name) + strlen (main_file_name) + 1;
2396
2397       if (len != 0)
2398         {
2399           if (line_info->find_buffer != NULL)
2400             free (line_info->find_buffer);
2401           buffer = (char *) bfd_malloc ((bfd_size_type) len);
2402           if (buffer == NULL)
2403             return FALSE;
2404           line_info->find_buffer = buffer;
2405         }
2406
2407       if (function_name != NULL)
2408         {
2409           char *colon;
2410
2411           strcpy (buffer, function_name);
2412           colon = strchr (buffer, ':');
2413           if (colon != NULL)
2414             *colon = '\0';
2415           line_info->cache.functionname = buffer;
2416         }
2417
2418       if (main_file_name != NULL)
2419         {
2420           if (directory_name == NULL || main_file_name[0] == '/')
2421             line_info->cache.filename = main_file_name;
2422           else
2423             {
2424               sprintf (buffer + funclen, "%s%s", directory_name,
2425                        main_file_name);
2426               line_info->cache.filename = buffer + funclen;
2427             }
2428         }
2429     }
2430
2431   return TRUE;
2432 }
2433
2434 /* Do the work of find_nearest_line.  */
2435
2436 bfd_boolean
2437 _bfd_ecoff_locate_line (abfd, section, offset, debug_info, debug_swap,
2438                         line_info, filename_ptr, functionname_ptr, retline_ptr)
2439      bfd *abfd;
2440      asection *section;
2441      bfd_vma offset;
2442      struct ecoff_debug_info * const debug_info;
2443      const struct ecoff_debug_swap * const debug_swap;
2444      struct ecoff_find_line *line_info;
2445      const char **filename_ptr;
2446      const char **functionname_ptr;
2447      unsigned int *retline_ptr;
2448 {
2449   offset += section->vma;
2450
2451   if (line_info->cache.sect == NULL
2452       || line_info->cache.sect != section
2453       || offset < line_info->cache.start
2454       || offset >= line_info->cache.stop)
2455     {
2456       line_info->cache.sect = section;
2457       line_info->cache.start = offset;
2458       line_info->cache.stop = offset;
2459       if (! lookup_line (abfd, debug_info, debug_swap, line_info))
2460         {
2461           line_info->cache.sect = NULL;
2462           return FALSE;
2463         }
2464     }
2465
2466   *filename_ptr = line_info->cache.filename;
2467   *functionname_ptr = line_info->cache.functionname;
2468   *retline_ptr = line_info->cache.line_num;
2469
2470   return TRUE;
2471 }
2472 \f
2473 /* These routines copy symbolic information into a memory buffer.
2474
2475    FIXME: The whole point of the shuffle code is to avoid storing
2476    everything in memory, since the linker is such a memory hog.  This
2477    code makes that effort useless.  It is only called by the MIPS ELF
2478    code when generating a shared library, so it is not that big a
2479    deal, but it should be fixed eventually.  */
2480
2481 /* Collect a shuffle into a memory buffer.  */
2482
2483 static bfd_boolean ecoff_collect_shuffle
2484   PARAMS ((struct shuffle *, bfd_byte *));
2485
2486 static bfd_boolean
2487 ecoff_collect_shuffle (l, buff)
2488      struct shuffle *l;
2489      bfd_byte *buff;
2490 {
2491   unsigned long total;
2492
2493   total = 0;
2494   for (; l != (struct shuffle *) NULL; l = l->next)
2495     {
2496       if (! l->filep)
2497         memcpy (buff, l->u.memory, l->size);
2498       else
2499         {
2500           if (bfd_seek (l->u.file.input_bfd, l->u.file.offset, SEEK_SET) != 0
2501               || (bfd_bread (buff, (bfd_size_type) l->size, l->u.file.input_bfd)
2502                   != l->size))
2503             return FALSE;
2504         }
2505       total += l->size;
2506       buff += l->size;
2507     }
2508
2509   return TRUE;
2510 }
2511
2512 /* Copy PDR information into a memory buffer.  */
2513
2514 bfd_boolean
2515 _bfd_ecoff_get_accumulated_pdr (handle, buff)
2516      PTR handle;
2517      bfd_byte *buff;
2518 {
2519   struct accumulate *ainfo = (struct accumulate *) handle;
2520
2521   return ecoff_collect_shuffle (ainfo->pdr, buff);
2522 }
2523
2524 /* Copy symbol information into a memory buffer.  */
2525
2526 bfd_boolean
2527 _bfd_ecoff_get_accumulated_sym (handle, buff)
2528      PTR handle;
2529      bfd_byte *buff;
2530 {
2531   struct accumulate *ainfo = (struct accumulate *) handle;
2532
2533   return ecoff_collect_shuffle (ainfo->sym, buff);
2534 }
2535
2536 /* Copy the string table into a memory buffer.  */
2537
2538 bfd_boolean
2539 _bfd_ecoff_get_accumulated_ss (handle, buff)
2540      PTR handle;
2541      bfd_byte *buff;
2542 {
2543   struct accumulate *ainfo = (struct accumulate *) handle;
2544   struct string_hash_entry *sh;
2545   unsigned long total;
2546
2547   /* The string table is written out from the hash table if this is a
2548      final link.  */
2549   BFD_ASSERT (ainfo->ss == (struct shuffle *) NULL);
2550   *buff++ = '\0';
2551   total = 1;
2552   BFD_ASSERT (ainfo->ss_hash == NULL || ainfo->ss_hash->val == 1);
2553   for (sh = ainfo->ss_hash;
2554        sh != (struct string_hash_entry *) NULL;
2555        sh = sh->next)
2556     {
2557       size_t len;
2558
2559       len = strlen (sh->root.string);
2560       memcpy (buff, (PTR) sh->root.string, len + 1);
2561       total += len + 1;
2562       buff += len + 1;
2563     }
2564
2565   return TRUE;
2566 }