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