Automatic date update in version.in
[platform/upstream/binutils.git] / bfd / xsym.c
1 /* xSYM symbol-file support for BFD.
2    Copyright (C) 1999-2014 Free Software Foundation, Inc.
3
4    This file is part of BFD, the Binary File Descriptor library.
5
6    This program is free software; you can redistribute it and/or modify
7    it under the terms of the GNU General Public License as published by
8    the Free Software Foundation; either version 3 of the License, or
9    (at your option) any later version.
10
11    This program is distributed in the hope that it will be useful,
12    but WITHOUT ANY WARRANTY; without even the implied warranty of
13    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
14    GNU General Public License for more details.
15
16    You should have received a copy of the GNU General Public License
17    along with this program; if not, write to the Free Software
18    Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston,
19    MA 02110-1301, USA.  */
20
21 /* xSYM is the debugging format used by CodeWarrior on Mac OS classic.  */
22
23 #include "sysdep.h"
24 #include "alloca-conf.h"
25 #include "xsym.h"
26 #include "bfd.h"
27 #include "libbfd.h"
28
29 #define bfd_sym_close_and_cleanup                   _bfd_generic_close_and_cleanup
30 #define bfd_sym_bfd_free_cached_info                _bfd_generic_bfd_free_cached_info
31 #define bfd_sym_new_section_hook                    _bfd_generic_new_section_hook
32 #define bfd_sym_bfd_is_local_label_name             bfd_generic_is_local_label_name
33 #define bfd_sym_bfd_is_target_special_symbol       ((bfd_boolean (*) (bfd *, asymbol *)) bfd_false)
34 #define bfd_sym_get_lineno                          _bfd_nosymbols_get_lineno
35 #define bfd_sym_find_nearest_line                   _bfd_nosymbols_find_nearest_line
36 #define bfd_sym_find_line                           _bfd_nosymbols_find_line
37 #define bfd_sym_find_inliner_info                   _bfd_nosymbols_find_inliner_info
38 #define bfd_sym_bfd_make_debug_symbol               _bfd_nosymbols_bfd_make_debug_symbol
39 #define bfd_sym_read_minisymbols                    _bfd_generic_read_minisymbols
40 #define bfd_sym_minisymbol_to_symbol                _bfd_generic_minisymbol_to_symbol
41 #define bfd_sym_set_arch_mach                       _bfd_generic_set_arch_mach
42 #define bfd_sym_get_section_contents                _bfd_generic_get_section_contents
43 #define bfd_sym_set_section_contents                _bfd_generic_set_section_contents
44 #define bfd_sym_bfd_get_relocated_section_contents  bfd_generic_get_relocated_section_contents
45 #define bfd_sym_bfd_relax_section                   bfd_generic_relax_section
46 #define bfd_sym_bfd_gc_sections                     bfd_generic_gc_sections
47 #define bfd_sym_bfd_lookup_section_flags            bfd_generic_lookup_section_flags
48 #define bfd_sym_bfd_merge_sections                  bfd_generic_merge_sections
49 #define bfd_sym_bfd_is_group_section                bfd_generic_is_group_section
50 #define bfd_sym_bfd_discard_group                   bfd_generic_discard_group
51 #define bfd_sym_section_already_linked              _bfd_generic_section_already_linked
52 #define bfd_sym_bfd_define_common_symbol            bfd_generic_define_common_symbol
53 #define bfd_sym_bfd_link_hash_table_create          _bfd_generic_link_hash_table_create
54 #define bfd_sym_bfd_link_add_symbols                _bfd_generic_link_add_symbols
55 #define bfd_sym_bfd_link_just_syms                  _bfd_generic_link_just_syms
56 #define bfd_sym_bfd_copy_link_hash_symbol_type \
57   _bfd_generic_copy_link_hash_symbol_type
58 #define bfd_sym_bfd_final_link                      _bfd_generic_final_link
59 #define bfd_sym_bfd_link_split_section              _bfd_generic_link_split_section
60 #define bfd_sym_get_section_contents_in_window      _bfd_generic_get_section_contents_in_window
61
62 extern const bfd_target sym_vec;
63
64 static int
65 pstrcmp (const char *as, const char *bs)
66 {
67   const unsigned char *a = (const unsigned char *) as;
68   const unsigned char *b = (const unsigned char *) bs;
69   unsigned char clen;
70   int ret;
71
72   clen = (a[0] > b[0]) ? b[0] : a[0];
73   ret = memcmp (a + 1, b + 1, clen);
74   if (ret != 0)
75     return ret;
76
77   if (a[0] == b[0])
78     return 0;
79   else if (a[0] < b[0])
80     return -1;
81   else
82     return 1;
83 }
84
85 static unsigned long
86 compute_offset (unsigned long first_page,
87                 unsigned long page_size,
88                 unsigned long entry_size,
89                 unsigned long sym_index)
90 {
91   unsigned long entries_per_page = page_size / entry_size;
92   unsigned long page_number = first_page + (sym_index / entries_per_page);
93   unsigned long page_offset = (sym_index % entries_per_page) * entry_size;
94
95   return (page_number * page_size) + page_offset;
96 }
97
98 bfd_boolean
99 bfd_sym_mkobject (bfd *abfd ATTRIBUTE_UNUSED)
100 {
101   return 1;
102 }
103
104 void
105 bfd_sym_print_symbol (bfd *abfd ATTRIBUTE_UNUSED,
106                       void * afile ATTRIBUTE_UNUSED,
107                       asymbol *symbol ATTRIBUTE_UNUSED,
108                       bfd_print_symbol_type how ATTRIBUTE_UNUSED)
109 {
110   return;
111 }
112
113 bfd_boolean
114 bfd_sym_valid (bfd *abfd)
115 {
116   if (abfd == NULL || abfd->xvec == NULL)
117     return 0;
118
119   return abfd->xvec == &sym_vec;
120 }
121
122 unsigned char *
123 bfd_sym_read_name_table (bfd *abfd, bfd_sym_header_block *dshb)
124 {
125   unsigned char *rstr;
126   long ret;
127   size_t table_size = dshb->dshb_nte.dti_page_count * dshb->dshb_page_size;
128   size_t table_offset = dshb->dshb_nte.dti_first_page * dshb->dshb_page_size;
129
130   rstr = bfd_alloc (abfd, table_size);
131   if (rstr == NULL)
132     return rstr;
133
134   bfd_seek (abfd, table_offset, SEEK_SET);
135   ret = bfd_bread (rstr, table_size, abfd);
136   if (ret < 0 || (unsigned long) ret != table_size)
137     {
138       bfd_release (abfd, rstr);
139       return NULL;
140     }
141
142   return rstr;
143 }
144
145 void
146 bfd_sym_parse_file_reference_v32 (unsigned char *buf,
147                                   size_t len,
148                                   bfd_sym_file_reference *entry)
149 {
150   BFD_ASSERT (len == 6);
151
152   entry->fref_frte_index = bfd_getb16 (buf);
153   entry->fref_offset = bfd_getb32 (buf + 2);
154 }
155
156 void
157 bfd_sym_parse_disk_table_v32 (unsigned char *buf,
158                               size_t len,
159                               bfd_sym_table_info *table)
160 {
161   BFD_ASSERT (len == 8);
162
163   table->dti_first_page = bfd_getb16 (buf);
164   table->dti_page_count = bfd_getb16 (buf + 2);
165   table->dti_object_count = bfd_getb32 (buf + 4);
166 }
167
168 void
169 bfd_sym_parse_header_v32 (unsigned char *buf,
170                           size_t len,
171                           bfd_sym_header_block *header)
172 {
173   BFD_ASSERT (len == 154);
174
175   memcpy (header->dshb_id, buf, 32);
176   header->dshb_page_size = bfd_getb16 (buf + 32);
177   header->dshb_hash_page = bfd_getb16 (buf + 34);
178   header->dshb_root_mte = bfd_getb16 (buf + 36);
179   header->dshb_mod_date = bfd_getb32 (buf + 38);
180
181   bfd_sym_parse_disk_table_v32 (buf + 42, 8, &header->dshb_frte);
182   bfd_sym_parse_disk_table_v32 (buf + 50, 8, &header->dshb_rte);
183   bfd_sym_parse_disk_table_v32 (buf + 58, 8, &header->dshb_mte);
184   bfd_sym_parse_disk_table_v32 (buf + 66, 8, &header->dshb_cmte);
185   bfd_sym_parse_disk_table_v32 (buf + 74, 8, &header->dshb_cvte);
186   bfd_sym_parse_disk_table_v32 (buf + 82, 8, &header->dshb_csnte);
187   bfd_sym_parse_disk_table_v32 (buf + 90, 8, &header->dshb_clte);
188   bfd_sym_parse_disk_table_v32 (buf + 98, 8, &header->dshb_ctte);
189   bfd_sym_parse_disk_table_v32 (buf + 106, 8, &header->dshb_tte);
190   bfd_sym_parse_disk_table_v32 (buf + 114, 8, &header->dshb_nte);
191   bfd_sym_parse_disk_table_v32 (buf + 122, 8, &header->dshb_tinfo);
192   bfd_sym_parse_disk_table_v32 (buf + 130, 8, &header->dshb_fite);
193   bfd_sym_parse_disk_table_v32 (buf + 138, 8, &header->dshb_const);
194
195   memcpy (&header->dshb_file_creator, buf + 146, 4);
196   memcpy (&header->dshb_file_type, buf + 150, 4);
197 }
198
199 int
200 bfd_sym_read_header_v32 (bfd *abfd, bfd_sym_header_block *header)
201 {
202   unsigned char buf[154];
203   long ret;
204
205   ret = bfd_bread (buf, 154, abfd);
206   if (ret != 154)
207     return -1;
208
209   bfd_sym_parse_header_v32 (buf, 154, header);
210
211   return 0;
212 }
213
214 int
215 bfd_sym_read_header_v34 (bfd *abfd ATTRIBUTE_UNUSED,
216                          bfd_sym_header_block *header ATTRIBUTE_UNUSED)
217 {
218   abort ();
219 }
220
221 int
222 bfd_sym_read_header (bfd *abfd,
223                      bfd_sym_header_block *header,
224                      bfd_sym_version version)
225 {
226   switch (version)
227     {
228     case BFD_SYM_VERSION_3_5:
229     case BFD_SYM_VERSION_3_4:
230       return bfd_sym_read_header_v34 (abfd, header);
231     case BFD_SYM_VERSION_3_3:
232     case BFD_SYM_VERSION_3_2:
233       return bfd_sym_read_header_v32 (abfd, header);
234     case BFD_SYM_VERSION_3_1:
235     default:
236       return 0;
237     }
238 }
239
240 int
241 bfd_sym_read_version (bfd *abfd, bfd_sym_version *version)
242 {
243   char version_string[32];
244   long ret;
245
246   ret = bfd_bread (version_string, sizeof (version_string), abfd);
247   if (ret != sizeof (version_string))
248     return -1;
249
250   if (pstrcmp (version_string, BFD_SYM_VERSION_STR_3_1) == 0)
251     *version = BFD_SYM_VERSION_3_1;
252   else if (pstrcmp (version_string, BFD_SYM_VERSION_STR_3_2) == 0)
253     *version = BFD_SYM_VERSION_3_2;
254   else if (pstrcmp (version_string, BFD_SYM_VERSION_STR_3_3) == 0)
255     *version = BFD_SYM_VERSION_3_3;
256   else if (pstrcmp (version_string, BFD_SYM_VERSION_STR_3_4) == 0)
257     *version = BFD_SYM_VERSION_3_4;
258   else if (pstrcmp (version_string, BFD_SYM_VERSION_STR_3_5) == 0)
259     *version = BFD_SYM_VERSION_3_5;
260   else
261     return -1;
262
263   return 0;
264 }
265
266 void
267 bfd_sym_display_table_summary (FILE *f,
268                                bfd_sym_table_info *dti,
269                                const char *name)
270 {
271   fprintf (f, "%-6s %13ld %13ld %13ld\n",
272            name,
273            dti->dti_first_page,
274            dti->dti_page_count,
275            dti->dti_object_count);
276 }
277
278 void
279 bfd_sym_display_header (FILE *f, bfd_sym_header_block *dshb)
280 {
281   fprintf (f, "            Version: %.*s\n", dshb->dshb_id[0], dshb->dshb_id + 1);
282   fprintf (f, "          Page Size: 0x%x\n", dshb->dshb_page_size);
283   fprintf (f, "          Hash Page: %lu\n", dshb->dshb_hash_page);
284   fprintf (f, "           Root MTE: %lu\n", dshb->dshb_root_mte);
285   fprintf (f, "  Modification Date: ");
286   fprintf (f, "[unimplemented]");
287   fprintf (f, " (0x%lx)\n", dshb->dshb_mod_date);
288
289   fprintf (f, "       File Creator:  %.4s  Type: %.4s\n\n",
290            dshb->dshb_file_creator, dshb->dshb_file_type);
291
292   fprintf (f, "Table Name   First Page    Page Count   Object Count\n");
293   fprintf (f, "~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~\n");
294
295   bfd_sym_display_table_summary (f, &dshb->dshb_nte, "NTE");
296   bfd_sym_display_table_summary (f, &dshb->dshb_rte, "RTE");
297   bfd_sym_display_table_summary (f, &dshb->dshb_mte, "MTE");
298   bfd_sym_display_table_summary (f, &dshb->dshb_frte, "FRTE");
299   bfd_sym_display_table_summary (f, &dshb->dshb_cmte, "CMTE");
300   bfd_sym_display_table_summary (f, &dshb->dshb_cvte, "CVTE");
301   bfd_sym_display_table_summary (f, &dshb->dshb_csnte, "CSNTE");
302   bfd_sym_display_table_summary (f, &dshb->dshb_clte, "CLTE");
303   bfd_sym_display_table_summary (f, &dshb->dshb_ctte, "CTTE");
304   bfd_sym_display_table_summary (f, &dshb->dshb_tte, "TTE");
305   bfd_sym_display_table_summary (f, &dshb->dshb_tinfo, "TINFO");
306   bfd_sym_display_table_summary (f, &dshb->dshb_fite, "FITE");
307   bfd_sym_display_table_summary (f, &dshb->dshb_const, "CONST");
308
309   fprintf (f, "\n");
310 }
311
312 void
313 bfd_sym_parse_resources_table_entry_v32 (unsigned char *buf,
314                                          size_t len,
315                                          bfd_sym_resources_table_entry *entry)
316 {
317   BFD_ASSERT (len == 18);
318
319   memcpy (&entry->rte_res_type, buf, 4);
320   entry->rte_res_number = bfd_getb16 (buf + 4);
321   entry->rte_nte_index = bfd_getb32 (buf + 6);
322   entry->rte_mte_first = bfd_getb16 (buf + 10);
323   entry->rte_mte_last = bfd_getb16 (buf + 12);
324   entry->rte_res_size = bfd_getb32 (buf + 14);
325 }
326
327 void
328 bfd_sym_parse_modules_table_entry_v33 (unsigned char *buf,
329                                        size_t len,
330                                        bfd_sym_modules_table_entry *entry)
331 {
332   BFD_ASSERT (len == 46);
333
334   entry->mte_rte_index = bfd_getb16 (buf);
335   entry->mte_res_offset = bfd_getb32 (buf + 2);
336   entry->mte_size = bfd_getb32 (buf + 6);
337   entry->mte_kind = buf[10];
338   entry->mte_scope = buf[11];
339   entry->mte_parent = bfd_getb16 (buf + 12);
340   bfd_sym_parse_file_reference_v32 (buf + 14, 6, &entry->mte_imp_fref);
341   entry->mte_imp_end = bfd_getb32 (buf + 20);
342   entry->mte_nte_index = bfd_getb32 (buf + 24);
343   entry->mte_cmte_index = bfd_getb16 (buf + 28);
344   entry->mte_cvte_index = bfd_getb32 (buf + 30);
345   entry->mte_clte_index = bfd_getb16 (buf + 34);
346   entry->mte_ctte_index = bfd_getb16 (buf + 36);
347   entry->mte_csnte_idx_1 = bfd_getb32 (buf + 38);
348   entry->mte_csnte_idx_2 = bfd_getb32 (buf + 42);
349 }
350
351 void
352 bfd_sym_parse_file_references_table_entry_v32 (unsigned char *buf,
353                                                size_t len,
354                                                bfd_sym_file_references_table_entry *entry)
355 {
356   unsigned int type;
357
358   BFD_ASSERT (len == 10);
359
360   memset (entry, 0, sizeof (bfd_sym_file_references_table_entry));
361   type = bfd_getb16 (buf);
362
363   switch (type)
364     {
365     case BFD_SYM_END_OF_LIST_3_2:
366       entry->generic.type = BFD_SYM_END_OF_LIST;
367       break;
368
369     case BFD_SYM_FILE_NAME_INDEX_3_2:
370       entry->filename.type = BFD_SYM_FILE_NAME_INDEX;
371       entry->filename.nte_index = bfd_getb32 (buf + 2);
372       entry->filename.mod_date = bfd_getb32 (buf + 6);
373       break;
374
375     default:
376       entry->entry.mte_index = type;
377       entry->entry.file_offset = bfd_getb32 (buf + 2);
378     }
379 }
380
381 void
382 bfd_sym_parse_contained_modules_table_entry_v32 (unsigned char *buf,
383                                                  size_t len,
384                                                  bfd_sym_contained_modules_table_entry *entry)
385 {
386   unsigned int type;
387
388   BFD_ASSERT (len == 6);
389
390   memset (entry, 0, sizeof (bfd_sym_contained_modules_table_entry));
391   type = bfd_getb16 (buf);
392
393   switch (type)
394     {
395     case BFD_SYM_END_OF_LIST_3_2:
396       entry->generic.type = BFD_SYM_END_OF_LIST;
397       break;
398
399     default:
400       entry->entry.mte_index = type;
401       entry->entry.nte_index = bfd_getb32 (buf + 2);
402       break;
403     }
404 }
405
406 void
407 bfd_sym_parse_contained_variables_table_entry_v32 (unsigned char *buf,
408                                                    size_t len,
409                                                    bfd_sym_contained_variables_table_entry *entry)
410 {
411   unsigned int type;
412
413   BFD_ASSERT (len == 26);
414
415   memset (entry, 0, sizeof (bfd_sym_contained_variables_table_entry));
416   type = bfd_getb16 (buf);
417
418   switch (type)
419     {
420     case BFD_SYM_END_OF_LIST_3_2:
421       entry->generic.type = BFD_SYM_END_OF_LIST;
422       break;
423
424     case BFD_SYM_SOURCE_FILE_CHANGE_3_2:
425       entry->file.type = BFD_SYM_SOURCE_FILE_CHANGE;
426       bfd_sym_parse_file_reference_v32 (buf + 2, 6, &entry->file.fref);
427       break;
428
429     default:
430       entry->entry.tte_index = type;
431       entry->entry.nte_index = bfd_getb32 (buf + 2);
432       entry->entry.file_delta = bfd_getb16 (buf + 6);
433       entry->entry.scope = buf[8];
434       entry->entry.la_size = buf[9];
435
436       if (entry->entry.la_size == BFD_SYM_CVTE_SCA)
437         {
438           entry->entry.address.scstruct.sca_kind = buf[10];
439           entry->entry.address.scstruct.sca_class = buf[11];
440           entry->entry.address.scstruct.sca_offset = bfd_getb32 (buf + 12);
441         }
442       else if (entry->entry.la_size <= BFD_SYM_CVTE_SCA)
443         {
444 #if BFD_SYM_CVTE_SCA > 0
445           memcpy (&entry->entry.address.lastruct.la, buf + 10,
446                   BFD_SYM_CVTE_SCA);
447 #endif
448           entry->entry.address.lastruct.la_kind = buf[23];
449         }
450       else if (entry->entry.la_size == BFD_SYM_CVTE_BIG_LA)
451         {
452           entry->entry.address.biglastruct.big_la = bfd_getb32 (buf + 10);
453           entry->entry.address.biglastruct.big_la_kind = buf[12];
454         }
455     }
456 }
457
458 void
459 bfd_sym_parse_contained_statements_table_entry_v32 (unsigned char *buf,
460                                                     size_t len,
461                                                     bfd_sym_contained_statements_table_entry *entry)
462 {
463   unsigned int type;
464
465   BFD_ASSERT (len == 8);
466
467   memset (entry, 0, sizeof (bfd_sym_contained_statements_table_entry));
468   type = bfd_getb16 (buf);
469
470   switch (type)
471     {
472     case BFD_SYM_END_OF_LIST_3_2:
473       entry->generic.type = BFD_SYM_END_OF_LIST;
474       break;
475
476     case BFD_SYM_SOURCE_FILE_CHANGE_3_2:
477       entry->file.type = BFD_SYM_SOURCE_FILE_CHANGE;
478       bfd_sym_parse_file_reference_v32 (buf + 2, 6, &entry->file.fref);
479       break;
480
481     default:
482       entry->entry.mte_index = type;
483       entry->entry.mte_offset = bfd_getb16 (buf + 2);
484       entry->entry.file_delta = bfd_getb32 (buf + 4);
485       break;
486     }
487 }
488
489 void
490 bfd_sym_parse_contained_labels_table_entry_v32 (unsigned char *buf,
491                                                 size_t len,
492                                                 bfd_sym_contained_labels_table_entry *entry)
493 {
494   unsigned int type;
495
496   BFD_ASSERT (len == 12);
497
498   memset (entry, 0, sizeof (bfd_sym_contained_labels_table_entry));
499   type = bfd_getb16 (buf);
500
501   switch (type)
502     {
503     case BFD_SYM_END_OF_LIST_3_2:
504       entry->generic.type = BFD_SYM_END_OF_LIST;
505       break;
506
507     case BFD_SYM_SOURCE_FILE_CHANGE_3_2:
508       entry->file.type = BFD_SYM_SOURCE_FILE_CHANGE;
509       bfd_sym_parse_file_reference_v32 (buf + 2, 6, &entry->file.fref);
510       break;
511
512     default:
513       entry->entry.mte_index = type;
514       entry->entry.mte_offset = bfd_getb16 (buf + 2);
515       entry->entry.nte_index = bfd_getb32 (buf + 4);
516       entry->entry.file_delta = bfd_getb16 (buf + 8);
517       entry->entry.scope = bfd_getb16 (buf + 10);
518       break;
519     }
520 }
521
522 void
523 bfd_sym_parse_type_table_entry_v32 (unsigned char *buf,
524                                     size_t len,
525                                     bfd_sym_type_table_entry *entry)
526 {
527   BFD_ASSERT (len == 4);
528
529   *entry = bfd_getb32 (buf);
530 }
531
532 int
533 bfd_sym_fetch_resources_table_entry (bfd *abfd,
534                                      bfd_sym_resources_table_entry *entry,
535                                      unsigned long sym_index)
536 {
537   void (*parser) (unsigned char *, size_t, bfd_sym_resources_table_entry *);
538   unsigned long offset;
539   unsigned long entry_size;
540   unsigned char buf[18];
541   bfd_sym_data_struct *sdata = NULL;
542
543   parser = NULL;
544   BFD_ASSERT (bfd_sym_valid (abfd));
545   sdata = abfd->tdata.sym_data;
546
547   if (sym_index == 0)
548     return -1;
549
550   switch (sdata->version)
551     {
552     case BFD_SYM_VERSION_3_5:
553     case BFD_SYM_VERSION_3_4:
554       return -1;
555
556     case BFD_SYM_VERSION_3_3:
557     case BFD_SYM_VERSION_3_2:
558       entry_size = 18;
559       parser = bfd_sym_parse_resources_table_entry_v32;
560       break;
561
562     case BFD_SYM_VERSION_3_1:
563     default:
564       return -1;
565     }
566   if (parser == NULL)
567     return -1;
568
569   offset = compute_offset (sdata->header.dshb_rte.dti_first_page,
570                            sdata->header.dshb_page_size,
571                            entry_size, sym_index);
572
573   if (bfd_seek (abfd, offset, SEEK_SET) < 0)
574     return -1;
575   if (bfd_bread (buf, entry_size, abfd) != entry_size)
576     return -1;
577
578   (*parser) (buf, entry_size, entry);
579
580   return 0;
581 }
582
583 int
584 bfd_sym_fetch_modules_table_entry (bfd *abfd,
585                                    bfd_sym_modules_table_entry *entry,
586                                    unsigned long sym_index)
587 {
588   void (*parser) (unsigned char *, size_t, bfd_sym_modules_table_entry *);
589   unsigned long offset;
590   unsigned long entry_size;
591   unsigned char buf[46];
592   bfd_sym_data_struct *sdata = NULL;
593
594   parser = NULL;
595   BFD_ASSERT (bfd_sym_valid (abfd));
596   sdata = abfd->tdata.sym_data;
597
598   if (sym_index == 0)
599     return -1;
600
601   switch (sdata->version)
602     {
603     case BFD_SYM_VERSION_3_5:
604     case BFD_SYM_VERSION_3_4:
605       return -1;
606
607     case BFD_SYM_VERSION_3_3:
608       entry_size = 46;
609       parser = bfd_sym_parse_modules_table_entry_v33;
610       break;
611
612     case BFD_SYM_VERSION_3_2:
613     case BFD_SYM_VERSION_3_1:
614     default:
615       return -1;
616     }
617   if (parser == NULL)
618     return -1;
619
620   offset = compute_offset (sdata->header.dshb_mte.dti_first_page,
621                            sdata->header.dshb_page_size,
622                            entry_size, sym_index);
623
624   if (bfd_seek (abfd, offset, SEEK_SET) < 0)
625     return -1;
626   if (bfd_bread (buf, entry_size, abfd) != entry_size)
627     return -1;
628
629   (*parser) (buf, entry_size, entry);
630
631   return 0;
632 }
633
634 int
635 bfd_sym_fetch_file_references_table_entry (bfd *abfd,
636                                            bfd_sym_file_references_table_entry *entry,
637                                            unsigned long sym_index)
638 {
639   void (*parser) (unsigned char *, size_t, bfd_sym_file_references_table_entry *);
640   unsigned long offset;
641   unsigned long entry_size = 0;
642   unsigned char buf[8];
643   bfd_sym_data_struct *sdata = NULL;
644
645   parser = NULL;
646   BFD_ASSERT (bfd_sym_valid (abfd));
647   sdata = abfd->tdata.sym_data;
648
649   if (sym_index == 0)
650     return -1;
651
652   switch (sdata->version)
653     {
654     case BFD_SYM_VERSION_3_3:
655     case BFD_SYM_VERSION_3_2:
656       entry_size = 10;
657       parser = bfd_sym_parse_file_references_table_entry_v32;
658       break;
659
660     case BFD_SYM_VERSION_3_5:
661     case BFD_SYM_VERSION_3_4:
662     case BFD_SYM_VERSION_3_1:
663     default:
664       break;
665     }
666
667   if (parser == NULL)
668     return -1;
669
670   offset = compute_offset (sdata->header.dshb_frte.dti_first_page,
671                            sdata->header.dshb_page_size,
672                            entry_size, sym_index);
673
674   if (bfd_seek (abfd, offset, SEEK_SET) < 0)
675     return -1;
676   if (bfd_bread (buf, entry_size, abfd) != entry_size)
677     return -1;
678
679   (*parser) (buf, entry_size, entry);
680
681   return 0;
682 }
683
684 int
685 bfd_sym_fetch_contained_modules_table_entry (bfd *abfd,
686                                              bfd_sym_contained_modules_table_entry *entry,
687                                              unsigned long sym_index)
688 {
689   void (*parser) (unsigned char *, size_t, bfd_sym_contained_modules_table_entry *);
690   unsigned long offset;
691   unsigned long entry_size = 0;
692   unsigned char buf[6];
693   bfd_sym_data_struct *sdata = NULL;
694
695   parser = NULL;
696   BFD_ASSERT (bfd_sym_valid (abfd));
697   sdata = abfd->tdata.sym_data;
698
699   if (sym_index == 0)
700     return -1;
701
702   switch (sdata->version)
703     {
704     case BFD_SYM_VERSION_3_3:
705     case BFD_SYM_VERSION_3_2:
706       entry_size = 6;
707       parser = bfd_sym_parse_contained_modules_table_entry_v32;
708       break;
709
710     case BFD_SYM_VERSION_3_5:
711     case BFD_SYM_VERSION_3_4:
712     case BFD_SYM_VERSION_3_1:
713     default:
714       break;
715     }
716
717   if (parser == NULL)
718     return -1;
719
720   offset = compute_offset (sdata->header.dshb_cmte.dti_first_page,
721                            sdata->header.dshb_page_size,
722                            entry_size, sym_index);
723
724   if (bfd_seek (abfd, offset, SEEK_SET) < 0)
725     return -1;
726   if (bfd_bread (buf, entry_size, abfd) != entry_size)
727     return -1;
728
729   (*parser) (buf, entry_size, entry);
730
731   return 0;
732 }
733
734 int
735 bfd_sym_fetch_contained_variables_table_entry (bfd *abfd,
736                                                bfd_sym_contained_variables_table_entry *entry,
737                                                unsigned long sym_index)
738 {
739   void (*parser) (unsigned char *, size_t, bfd_sym_contained_variables_table_entry *);
740   unsigned long offset;
741   unsigned long entry_size = 0;
742   unsigned char buf[26];
743   bfd_sym_data_struct *sdata = NULL;
744
745   parser = NULL;
746   BFD_ASSERT (bfd_sym_valid (abfd));
747   sdata = abfd->tdata.sym_data;
748
749   if (sym_index == 0)
750     return -1;
751
752   switch (sdata->version)
753     {
754     case BFD_SYM_VERSION_3_3:
755     case BFD_SYM_VERSION_3_2:
756       entry_size = 26;
757       parser = bfd_sym_parse_contained_variables_table_entry_v32;
758       break;
759
760     case BFD_SYM_VERSION_3_5:
761     case BFD_SYM_VERSION_3_4:
762     case BFD_SYM_VERSION_3_1:
763     default:
764       break;
765     }
766
767   if (parser == NULL)
768     return -1;
769
770   offset = compute_offset (sdata->header.dshb_cvte.dti_first_page,
771                            sdata->header.dshb_page_size,
772                            entry_size, sym_index);
773
774   if (bfd_seek (abfd, offset, SEEK_SET) < 0)
775     return -1;
776   if (bfd_bread (buf, entry_size, abfd) != entry_size)
777     return -1;
778
779   (*parser) (buf, entry_size, entry);
780
781   return 0;
782 }
783
784 int
785 bfd_sym_fetch_contained_statements_table_entry (bfd *abfd,
786                                                 bfd_sym_contained_statements_table_entry *entry,
787                                                 unsigned long sym_index)
788 {
789   void (*parser) (unsigned char *, size_t, bfd_sym_contained_statements_table_entry *);
790   unsigned long offset;
791   unsigned long entry_size = 0;
792   unsigned char buf[8];
793   bfd_sym_data_struct *sdata = NULL;
794
795   parser = NULL;
796   BFD_ASSERT (bfd_sym_valid (abfd));
797   sdata = abfd->tdata.sym_data;
798
799   if (sym_index == 0)
800     return -1;
801
802   switch (sdata->version)
803     {
804     case BFD_SYM_VERSION_3_3:
805     case BFD_SYM_VERSION_3_2:
806       entry_size = 8;
807       parser = bfd_sym_parse_contained_statements_table_entry_v32;
808       break;
809
810     case BFD_SYM_VERSION_3_5:
811     case BFD_SYM_VERSION_3_4:
812     case BFD_SYM_VERSION_3_1:
813     default:
814       break;
815     }
816
817   if (parser == NULL)
818     return -1;
819
820   offset = compute_offset (sdata->header.dshb_csnte.dti_first_page,
821                            sdata->header.dshb_page_size,
822                            entry_size, sym_index);
823
824   if (bfd_seek (abfd, offset, SEEK_SET) < 0)
825     return -1;
826   if (bfd_bread (buf, entry_size, abfd) != entry_size)
827     return -1;
828
829   (*parser) (buf, entry_size, entry);
830
831   return 0;
832 }
833
834 int
835 bfd_sym_fetch_contained_labels_table_entry (bfd *abfd,
836                                             bfd_sym_contained_labels_table_entry *entry,
837                                             unsigned long sym_index)
838 {
839   void (*parser) (unsigned char *, size_t, bfd_sym_contained_labels_table_entry *);
840   unsigned long offset;
841   unsigned long entry_size = 0;
842   unsigned char buf[12];
843   bfd_sym_data_struct *sdata = NULL;
844
845   parser = NULL;
846   BFD_ASSERT (bfd_sym_valid (abfd));
847   sdata = abfd->tdata.sym_data;
848
849   if (sym_index == 0)
850     return -1;
851
852   switch (sdata->version)
853     {
854     case BFD_SYM_VERSION_3_3:
855     case BFD_SYM_VERSION_3_2:
856       entry_size = 12;
857       parser = bfd_sym_parse_contained_labels_table_entry_v32;
858       break;
859
860     case BFD_SYM_VERSION_3_5:
861     case BFD_SYM_VERSION_3_4:
862     case BFD_SYM_VERSION_3_1:
863     default:
864       break;
865     }
866
867   if (parser == NULL)
868     return -1;
869
870   offset = compute_offset (sdata->header.dshb_clte.dti_first_page,
871                            sdata->header.dshb_page_size,
872                            entry_size, sym_index);
873
874   if (bfd_seek (abfd, offset, SEEK_SET) < 0)
875     return -1;
876   if (bfd_bread (buf, entry_size, abfd) != entry_size)
877     return -1;
878
879   (*parser) (buf, entry_size, entry);
880
881   return 0;
882 }
883
884 int
885 bfd_sym_fetch_contained_types_table_entry (bfd *abfd,
886                                            bfd_sym_contained_types_table_entry *entry,
887                                            unsigned long sym_index)
888 {
889   void (*parser) (unsigned char *, size_t, bfd_sym_contained_types_table_entry *);
890   unsigned long offset;
891   unsigned long entry_size = 0;
892   unsigned char buf[0];
893   bfd_sym_data_struct *sdata = NULL;
894
895   parser = NULL;
896   BFD_ASSERT (bfd_sym_valid (abfd));
897   sdata = abfd->tdata.sym_data;
898
899   if (sym_index == 0)
900     return -1;
901
902   switch (sdata->version)
903     {
904     case BFD_SYM_VERSION_3_3:
905     case BFD_SYM_VERSION_3_2:
906       entry_size = 0;
907       parser = NULL;
908       break;
909
910     case BFD_SYM_VERSION_3_5:
911     case BFD_SYM_VERSION_3_4:
912     case BFD_SYM_VERSION_3_1:
913     default:
914       break;
915     }
916
917   if (parser == NULL)
918     return -1;
919
920   offset = compute_offset (sdata->header.dshb_ctte.dti_first_page,
921                            sdata->header.dshb_page_size,
922                            entry_size, sym_index);
923
924   if (bfd_seek (abfd, offset, SEEK_SET) < 0)
925     return -1;
926   if (bfd_bread (buf, entry_size, abfd) != entry_size)
927     return -1;
928
929   (*parser) (buf, entry_size, entry);
930
931   return 0;
932 }
933
934 int
935 bfd_sym_fetch_file_references_index_table_entry (bfd *abfd,
936                                                  bfd_sym_file_references_index_table_entry *entry,
937                                                  unsigned long sym_index)
938 {
939   void (*parser) (unsigned char *, size_t, bfd_sym_file_references_index_table_entry *);
940   unsigned long offset;
941   unsigned long entry_size = 0;
942   unsigned char buf[0];
943   bfd_sym_data_struct *sdata = NULL;
944
945   parser = NULL;
946   BFD_ASSERT (bfd_sym_valid (abfd));
947   sdata = abfd->tdata.sym_data;
948
949   if (sym_index == 0)
950     return -1;
951
952   switch (sdata->version)
953     {
954     case BFD_SYM_VERSION_3_3:
955     case BFD_SYM_VERSION_3_2:
956       entry_size = 0;
957       parser = NULL;
958       break;
959
960     case BFD_SYM_VERSION_3_5:
961     case BFD_SYM_VERSION_3_4:
962     case BFD_SYM_VERSION_3_1:
963     default:
964       break;
965     }
966
967   if (parser == NULL)
968     return -1;
969
970   offset = compute_offset (sdata->header.dshb_fite.dti_first_page,
971                            sdata->header.dshb_page_size,
972                            entry_size, sym_index);
973
974   if (bfd_seek (abfd, offset, SEEK_SET) < 0)
975     return -1;
976   if (bfd_bread (buf, entry_size, abfd) != entry_size)
977     return -1;
978
979   (*parser) (buf, entry_size, entry);
980
981   return 0;
982 }
983
984 int
985 bfd_sym_fetch_constant_pool_entry (bfd *abfd,
986                                    bfd_sym_constant_pool_entry *entry,
987                                    unsigned long sym_index)
988 {
989   void (*parser) (unsigned char *, size_t, bfd_sym_constant_pool_entry *);
990   unsigned long offset;
991   unsigned long entry_size = 0;
992   unsigned char buf[0];
993   bfd_sym_data_struct *sdata = NULL;
994
995   parser = NULL;
996   BFD_ASSERT (bfd_sym_valid (abfd));
997   sdata = abfd->tdata.sym_data;
998
999   if (sym_index == 0)
1000     return -1;
1001
1002   switch (sdata->version)
1003     {
1004     case BFD_SYM_VERSION_3_3:
1005     case BFD_SYM_VERSION_3_2:
1006       entry_size = 0;
1007       parser = NULL;
1008       break;
1009
1010     case BFD_SYM_VERSION_3_5:
1011     case BFD_SYM_VERSION_3_4:
1012     case BFD_SYM_VERSION_3_1:
1013     default:
1014       break;
1015     }
1016
1017   if (parser == NULL)
1018     return -1;
1019
1020   offset = compute_offset (sdata->header.dshb_fite.dti_first_page,
1021                            sdata->header.dshb_page_size,
1022                            entry_size, sym_index);
1023
1024   if (bfd_seek (abfd, offset, SEEK_SET) < 0)
1025     return -1;
1026   if (bfd_bread (buf, entry_size, abfd) != entry_size)
1027     return -1;
1028
1029   (*parser) (buf, entry_size, entry);
1030
1031   return 0;
1032 }
1033
1034 int
1035 bfd_sym_fetch_type_table_entry (bfd *abfd,
1036                                 bfd_sym_type_table_entry *entry,
1037                                 unsigned long sym_index)
1038 {
1039   void (*parser) (unsigned char *, size_t, bfd_sym_type_table_entry *);
1040   unsigned long offset;
1041   unsigned long entry_size = 0;
1042   unsigned char buf[4];
1043   bfd_sym_data_struct *sdata = NULL;
1044
1045   parser = NULL;
1046   BFD_ASSERT (bfd_sym_valid (abfd));
1047   sdata = abfd->tdata.sym_data;
1048
1049   switch (sdata->version)
1050     {
1051     case BFD_SYM_VERSION_3_3:
1052     case BFD_SYM_VERSION_3_2:
1053       entry_size = 4;
1054       parser = bfd_sym_parse_type_table_entry_v32;
1055       break;
1056
1057     case BFD_SYM_VERSION_3_5:
1058     case BFD_SYM_VERSION_3_4:
1059     case BFD_SYM_VERSION_3_1:
1060     default:
1061       break;
1062     }
1063
1064   if (parser == NULL)
1065     return -1;
1066
1067   offset = compute_offset (sdata->header.dshb_tte.dti_first_page,
1068                            sdata->header.dshb_page_size,
1069                            entry_size, sym_index);
1070
1071   if (bfd_seek (abfd, offset, SEEK_SET) < 0)
1072     return -1;
1073   if (bfd_bread (buf, entry_size, abfd) != entry_size)
1074     return -1;
1075
1076   (*parser) (buf, entry_size, entry);
1077
1078   return 0;
1079 }
1080
1081 int
1082 bfd_sym_fetch_type_information_table_entry (bfd *abfd,
1083                                             bfd_sym_type_information_table_entry *entry,
1084                                             unsigned long offset)
1085 {
1086   unsigned char buf[4];
1087
1088   BFD_ASSERT (bfd_sym_valid (abfd));
1089
1090   if (offset == 0)
1091     return -1;
1092
1093   if (bfd_seek (abfd, offset, SEEK_SET) < 0)
1094     return -1;
1095
1096   if (bfd_bread (buf, 4, abfd) != 4)
1097     return -1;
1098   entry->nte_index = bfd_getb32 (buf);
1099
1100   if (bfd_bread (buf, 2, abfd) != 2)
1101     return -1;
1102   entry->physical_size = bfd_getb16 (buf);
1103
1104   if (entry->physical_size & 0x8000)
1105     {
1106       if (bfd_bread (buf, 4, abfd) != 4)
1107         return -1;
1108       entry->physical_size &= 0x7fff;
1109       entry->logical_size = bfd_getb32 (buf);
1110       entry->offset = offset + 10;
1111     }
1112   else
1113     {
1114       if (bfd_bread (buf, 2, abfd) != 2)
1115         return -1;
1116       entry->physical_size &= 0x7fff;
1117       entry->logical_size = bfd_getb16 (buf);
1118       entry->offset = offset + 8;
1119     }
1120
1121   return 0;
1122 }
1123
1124 int
1125 bfd_sym_fetch_type_table_information (bfd *abfd,
1126                                       bfd_sym_type_information_table_entry *entry,
1127                                       unsigned long sym_index)
1128 {
1129   bfd_sym_type_table_entry tindex;
1130   bfd_sym_data_struct *sdata = NULL;
1131
1132   BFD_ASSERT (bfd_sym_valid (abfd));
1133   sdata = abfd->tdata.sym_data;
1134
1135   if (sdata->header.dshb_tte.dti_object_count <= 99)
1136     return -1;
1137   if (sym_index < 100)
1138     return -1;
1139
1140   if (bfd_sym_fetch_type_table_entry (abfd, &tindex, sym_index - 100) < 0)
1141     return -1;
1142   if (bfd_sym_fetch_type_information_table_entry (abfd, entry, tindex) < 0)
1143     return -1;
1144
1145   return 0;
1146 }
1147
1148 const unsigned char *
1149 bfd_sym_symbol_name (bfd *abfd, unsigned long sym_index)
1150 {
1151   bfd_sym_data_struct *sdata = NULL;
1152
1153   BFD_ASSERT (bfd_sym_valid (abfd));
1154   sdata = abfd->tdata.sym_data;
1155
1156   if (sym_index == 0)
1157     return (const unsigned char *) "";
1158
1159   sym_index *= 2;
1160   if ((sym_index / sdata->header.dshb_page_size)
1161       > sdata->header.dshb_nte.dti_page_count)
1162     return (const unsigned char *) "\09[INVALID]";
1163
1164   return (const unsigned char *) sdata->name_table + sym_index;
1165 }
1166
1167 const unsigned char *
1168 bfd_sym_module_name (bfd *abfd, unsigned long sym_index)
1169 {
1170   bfd_sym_modules_table_entry entry;
1171
1172   if (bfd_sym_fetch_modules_table_entry (abfd, &entry, sym_index) < 0)
1173     return (const unsigned char *) "\09[INVALID]";
1174
1175   return bfd_sym_symbol_name (abfd, entry.mte_nte_index);
1176 }
1177
1178 const char *
1179 bfd_sym_unparse_storage_kind (enum bfd_sym_storage_kind kind)
1180 {
1181   switch (kind)
1182     {
1183     case BFD_SYM_STORAGE_KIND_LOCAL: return "LOCAL";
1184     case BFD_SYM_STORAGE_KIND_VALUE: return "VALUE";
1185     case BFD_SYM_STORAGE_KIND_REFERENCE: return "REFERENCE";
1186     case BFD_SYM_STORAGE_KIND_WITH: return "WITH";
1187     default: return "[UNKNOWN]";
1188     }
1189 }
1190
1191 const char *
1192 bfd_sym_unparse_storage_class (enum bfd_sym_storage_class kind)
1193 {
1194   switch (kind)
1195     {
1196     case BFD_SYM_STORAGE_CLASS_REGISTER: return "REGISTER";
1197     case BFD_SYM_STORAGE_CLASS_GLOBAL: return "GLOBAL";
1198     case BFD_SYM_STORAGE_CLASS_FRAME_RELATIVE: return "FRAME_RELATIVE";
1199     case BFD_SYM_STORAGE_CLASS_STACK_RELATIVE: return "STACK_RELATIVE";
1200     case BFD_SYM_STORAGE_CLASS_ABSOLUTE: return "ABSOLUTE";
1201     case BFD_SYM_STORAGE_CLASS_CONSTANT: return "CONSTANT";
1202     case BFD_SYM_STORAGE_CLASS_RESOURCE: return "RESOURCE";
1203     case BFD_SYM_STORAGE_CLASS_BIGCONSTANT: return "BIGCONSTANT";
1204     default: return "[UNKNOWN]";
1205     }
1206 }
1207
1208 const char *
1209 bfd_sym_unparse_module_kind (enum bfd_sym_module_kind kind)
1210 {
1211   switch (kind)
1212     {
1213     case BFD_SYM_MODULE_KIND_NONE: return "NONE";
1214     case BFD_SYM_MODULE_KIND_PROGRAM: return "PROGRAM";
1215     case BFD_SYM_MODULE_KIND_UNIT: return "UNIT";
1216     case BFD_SYM_MODULE_KIND_PROCEDURE: return "PROCEDURE";
1217     case BFD_SYM_MODULE_KIND_FUNCTION: return "FUNCTION";
1218     case BFD_SYM_MODULE_KIND_DATA: return "DATA";
1219     case BFD_SYM_MODULE_KIND_BLOCK: return "BLOCK";
1220     default: return "[UNKNOWN]";
1221     }
1222 }
1223
1224 const char *
1225 bfd_sym_unparse_symbol_scope (enum bfd_sym_symbol_scope scope)
1226 {
1227   switch (scope)
1228     {
1229     case BFD_SYM_SYMBOL_SCOPE_LOCAL: return "LOCAL";
1230     case BFD_SYM_SYMBOL_SCOPE_GLOBAL: return "GLOBAL";
1231     default:
1232       return "[UNKNOWN]";
1233     }
1234 }
1235
1236 void
1237 bfd_sym_print_file_reference (bfd *abfd,
1238                               FILE *f,
1239                               bfd_sym_file_reference *entry)
1240 {
1241   bfd_sym_file_references_table_entry frtentry;
1242   int ret;
1243
1244   ret = bfd_sym_fetch_file_references_table_entry (abfd, &frtentry,
1245                                                    entry->fref_frte_index);
1246   fprintf (f, "FILE ");
1247
1248   if ((ret < 0) || (frtentry.generic.type != BFD_SYM_FILE_NAME_INDEX))
1249     fprintf (f, "[INVALID]");
1250   else
1251     fprintf (f, "\"%.*s\"",
1252              bfd_sym_symbol_name (abfd, frtentry.filename.nte_index)[0],
1253              &bfd_sym_symbol_name (abfd, frtentry.filename.nte_index)[1]);
1254
1255   fprintf (f, " (FRTE %lu)", entry->fref_frte_index);
1256 }
1257
1258 void
1259 bfd_sym_print_resources_table_entry (bfd *abfd,
1260                                      FILE *f,
1261                                      bfd_sym_resources_table_entry *entry)
1262 {
1263   fprintf (f, " \"%.*s\" (NTE %lu), type \"%.4s\", num %u, size %lu, MTE %lu -- %lu",
1264            bfd_sym_symbol_name (abfd, entry->rte_nte_index)[0],
1265            &bfd_sym_symbol_name (abfd, entry->rte_nte_index)[1],
1266            entry->rte_nte_index, entry->rte_res_type, entry->rte_res_number,
1267            entry->rte_res_size, entry->rte_mte_first, entry->rte_mte_last);
1268 }
1269
1270 void
1271 bfd_sym_print_modules_table_entry (bfd *abfd,
1272                                    FILE *f,
1273                                    bfd_sym_modules_table_entry *entry)
1274 {
1275   fprintf (f, "\"%.*s\" (NTE %lu)",
1276            bfd_sym_symbol_name (abfd, entry->mte_nte_index)[0],
1277            &bfd_sym_symbol_name (abfd, entry->mte_nte_index)[1],
1278            entry->mte_nte_index);
1279
1280   fprintf (f, "\n            ");
1281
1282   bfd_sym_print_file_reference (abfd, f, &entry->mte_imp_fref);
1283   fprintf (f, " range %lu -- %lu",
1284            entry->mte_imp_fref.fref_offset, entry->mte_imp_end);
1285
1286   fprintf (f, "\n            ");
1287
1288   fprintf (f, "kind %s", bfd_sym_unparse_module_kind (entry->mte_kind));
1289   fprintf (f, ", scope %s", bfd_sym_unparse_symbol_scope (entry->mte_scope));
1290
1291   fprintf (f, ", RTE %lu, offset %lu, size %lu",
1292            entry->mte_rte_index, entry->mte_res_offset, entry->mte_size);
1293
1294   fprintf (f, "\n            ");
1295
1296   fprintf (f, "CMTE %lu, CVTE %lu, CLTE %lu, CTTE %lu, CSNTE1 %lu, CSNTE2 %lu",
1297            entry->mte_cmte_index, entry->mte_cvte_index,
1298            entry->mte_clte_index, entry->mte_ctte_index,
1299            entry->mte_csnte_idx_1, entry->mte_csnte_idx_2);
1300
1301   if (entry->mte_parent != 0)
1302     fprintf (f, ", parent %lu", entry->mte_parent);
1303   else
1304     fprintf (f, ", no parent");
1305
1306   if (entry->mte_cmte_index != 0)
1307     fprintf (f, ", child %lu", entry->mte_cmte_index);
1308   else
1309     fprintf (f, ", no child");
1310 }
1311
1312 void
1313 bfd_sym_print_file_references_table_entry (bfd *abfd,
1314                                            FILE *f,
1315                                            bfd_sym_file_references_table_entry *entry)
1316 {
1317   switch (entry->generic.type)
1318     {
1319     case BFD_SYM_FILE_NAME_INDEX:
1320       fprintf (f, "FILE \"%.*s\" (NTE %lu), modtime ",
1321                bfd_sym_symbol_name (abfd, entry->filename.nte_index)[0],
1322                &bfd_sym_symbol_name (abfd, entry->filename.nte_index)[1],
1323                entry->filename.nte_index);
1324
1325       fprintf (f, "[UNIMPLEMENTED]");
1326       /* printModDate (entry->filename.mod_date); */
1327       fprintf (f, " (0x%lx)", entry->filename.mod_date);
1328       break;
1329
1330     case BFD_SYM_END_OF_LIST:
1331       fprintf (f, "END");
1332       break;
1333
1334     default:
1335       fprintf (f, "\"%.*s\" (MTE %lu), offset %lu",
1336                bfd_sym_module_name (abfd, entry->entry.mte_index)[0],
1337                &bfd_sym_module_name (abfd, entry->entry.mte_index)[1],
1338                entry->entry.mte_index,
1339                entry->entry.file_offset);
1340       break;
1341     }
1342 }
1343
1344 void
1345 bfd_sym_print_contained_modules_table_entry (bfd *abfd,
1346                                              FILE *f,
1347                                              bfd_sym_contained_modules_table_entry *entry)
1348 {
1349   switch (entry->generic.type)
1350     {
1351     case BFD_SYM_END_OF_LIST:
1352       fprintf (f, "END");
1353       break;
1354
1355     default:
1356       fprintf (f, "\"%.*s\" (MTE %lu, NTE %lu)",
1357                bfd_sym_module_name (abfd, entry->entry.mte_index)[0],
1358                &bfd_sym_module_name (abfd, entry->entry.mte_index)[1],
1359                entry->entry.mte_index,
1360                entry->entry.nte_index);
1361       break;
1362     }
1363 }
1364
1365 void
1366 bfd_sym_print_contained_variables_table_entry (bfd *abfd,
1367                                                FILE *f,
1368                                                bfd_sym_contained_variables_table_entry *entry)
1369 {
1370   if (entry->generic.type == BFD_SYM_END_OF_LIST)
1371     {
1372       fprintf (f, "END");
1373       return;
1374     }
1375
1376   if (entry->generic.type == BFD_SYM_SOURCE_FILE_CHANGE)
1377     {
1378       bfd_sym_print_file_reference (abfd, f, &entry->file.fref);
1379       fprintf (f, " offset %lu", entry->file.fref.fref_offset);
1380       return;
1381     }
1382
1383   fprintf (f, "\"%.*s\" (NTE %lu)",
1384            bfd_sym_symbol_name (abfd, entry->entry.nte_index)[0],
1385            &bfd_sym_symbol_name (abfd, entry->entry.nte_index)[1],
1386            entry->entry.nte_index);
1387
1388   fprintf (f, ", TTE %lu", entry->entry.tte_index);
1389   fprintf (f, ", offset %lu", entry->entry.file_delta);
1390   fprintf (f, ", scope %s", bfd_sym_unparse_symbol_scope (entry->entry.scope));
1391
1392   if (entry->entry.la_size == BFD_SYM_CVTE_SCA)
1393     fprintf (f, ", latype %s, laclass %s, laoffset %lu",
1394              bfd_sym_unparse_storage_kind (entry->entry.address.scstruct.sca_kind),
1395              bfd_sym_unparse_storage_class (entry->entry.address.scstruct.sca_class),
1396              entry->entry.address.scstruct.sca_offset);
1397   else if (entry->entry.la_size <= BFD_SYM_CVTE_LA_MAX_SIZE)
1398     {
1399       unsigned long i;
1400
1401       fprintf (f, ", la [");
1402       for (i = 0; i < entry->entry.la_size; i++)
1403         fprintf (f, "0x%02x ", entry->entry.address.lastruct.la[i]);
1404       fprintf (f, "]");
1405     }
1406   else if (entry->entry.la_size == BFD_SYM_CVTE_BIG_LA)
1407     fprintf (f, ", bigla %lu, biglakind %u",
1408              entry->entry.address.biglastruct.big_la,
1409              entry->entry.address.biglastruct.big_la_kind);
1410
1411   else
1412     fprintf (f, ", la [INVALID]");
1413 }
1414
1415 void
1416 bfd_sym_print_contained_statements_table_entry (bfd *abfd,
1417                                                 FILE *f,
1418                                                 bfd_sym_contained_statements_table_entry *entry)
1419 {
1420   if (entry->generic.type == BFD_SYM_END_OF_LIST)
1421     {
1422       fprintf (f, "END");
1423       return;
1424     }
1425
1426   if (entry->generic.type == BFD_SYM_SOURCE_FILE_CHANGE)
1427     {
1428       bfd_sym_print_file_reference (abfd, f, &entry->file.fref);
1429       fprintf (f, " offset %lu", entry->file.fref.fref_offset);
1430       return;
1431     }
1432
1433   fprintf (f, "\"%.*s\" (MTE %lu), offset %lu, delta %lu",
1434            bfd_sym_module_name (abfd, entry->entry.mte_index)[0],
1435            &bfd_sym_module_name (abfd, entry->entry.mte_index)[1],
1436            entry->entry.mte_index,
1437            entry->entry.mte_offset,
1438            entry->entry.file_delta);
1439 }
1440
1441 void
1442 bfd_sym_print_contained_labels_table_entry (bfd *abfd,
1443                                             FILE *f,
1444                                             bfd_sym_contained_labels_table_entry *entry)
1445 {
1446   if (entry->generic.type == BFD_SYM_END_OF_LIST)
1447     {
1448       fprintf (f, "END");
1449       return;
1450     }
1451
1452   if (entry->generic.type == BFD_SYM_SOURCE_FILE_CHANGE)
1453     {
1454       bfd_sym_print_file_reference (abfd, f, &entry->file.fref);
1455       fprintf (f, " offset %lu", entry->file.fref.fref_offset);
1456       return;
1457     }
1458
1459   fprintf (f, "\"%.*s\" (MTE %lu), offset %lu, delta %lu, scope %s",
1460            bfd_sym_module_name (abfd, entry->entry.mte_index)[0],
1461            &bfd_sym_module_name (abfd, entry->entry.mte_index)[1],
1462            entry->entry.mte_index,
1463            entry->entry.mte_offset,
1464            entry->entry.file_delta,
1465            bfd_sym_unparse_symbol_scope (entry->entry.scope));
1466 }
1467
1468 void
1469 bfd_sym_print_contained_types_table_entry (bfd *abfd ATTRIBUTE_UNUSED,
1470                                            FILE *f,
1471                                            bfd_sym_contained_types_table_entry *entry ATTRIBUTE_UNUSED)
1472 {
1473   fprintf (f, "[UNIMPLEMENTED]");
1474 }
1475
1476 const char *
1477 bfd_sym_type_operator_name (unsigned char num)
1478 {
1479   switch (num)
1480     {
1481     case 1: return "TTE";
1482     case 2: return "PointerTo";
1483     case 3: return "ScalarOf";
1484     case 4: return "ConstantOf";
1485     case 5: return "EnumerationOf";
1486     case 6: return "VectorOf";
1487     case 7: return "RecordOf";
1488     case 8: return "UnionOf";
1489     case 9: return "SubRangeOf";
1490     case 10: return "SetOf";
1491     case 11: return "NamedTypeOf";
1492     case 12: return "ProcOf";
1493     case 13: return "ValueOf";
1494     case 14: return "ArrayOf";
1495     default: return "[UNKNOWN OPERATOR]";
1496     }
1497 }
1498
1499 const char *
1500 bfd_sym_type_basic_name (unsigned char num)
1501 {
1502   switch (num)
1503     {
1504     case 0: return "void";
1505     case 1: return "pascal string";
1506     case 2: return "unsigned long";
1507     case 3: return "signed long";
1508     case 4: return "extended (10 bytes)";
1509     case 5: return "pascal boolean (1 byte)";
1510     case 6: return "unsigned byte";
1511     case 7: return "signed byte";
1512     case 8: return "character (1 byte)";
1513     case 9: return "wide character (2 bytes)";
1514     case 10: return "unsigned short";
1515     case 11: return "signed short";
1516     case 12: return "singled";
1517     case 13: return "double";
1518     case 14: return "extended (12 bytes)";
1519     case 15: return "computational (8 bytes)";
1520     case 16: return "c string";
1521     case 17: return "as-is string";
1522     default: return "[UNKNOWN BASIC TYPE]";
1523     }
1524 }
1525
1526 int
1527 bfd_sym_fetch_long (unsigned char *buf,
1528                     unsigned long len,
1529                     unsigned long offset,
1530                     unsigned long *offsetptr,
1531                     long *value)
1532 {
1533   int ret;
1534
1535   if (offset >= len)
1536     {
1537       *value = 0;
1538       offset += 0;
1539       ret = -1;
1540     }
1541   else if (! (buf[offset] & 0x80))
1542     {
1543       *value = buf[offset];
1544       offset += 1;
1545       ret = 0;
1546     }
1547   else if (buf[offset] == 0xc0)
1548     {
1549       if ((offset + 5) > len)
1550         {
1551           *value = 0;
1552           offset = len;
1553           ret = -1;
1554         }
1555       else
1556         {
1557           *value = bfd_getb32 (buf + offset + 1);
1558           offset += 5;
1559           ret = 0;
1560         }
1561     }
1562   else if ((buf[offset] & 0xc0) == 0xc0)
1563     {
1564       *value =  -(buf[offset] & 0x3f);
1565       offset += 1;
1566       ret = 0;
1567     }
1568   else if ((buf[offset] & 0xc0) == 0x80)
1569     {
1570       if ((offset + 2) > len)
1571         {
1572           *value = 0;
1573           offset = len;
1574           ret = -1;
1575         }
1576       else
1577         {
1578           *value = bfd_getb16 (buf + offset) & 0x3fff;
1579           offset += 2;
1580           ret = 0;
1581         }
1582     }
1583   else
1584     abort ();
1585
1586   if (offsetptr != NULL)
1587     *offsetptr = offset;
1588
1589   return ret;
1590 }
1591
1592 void
1593 bfd_sym_print_type_information (bfd *abfd,
1594                                 FILE *f,
1595                                 unsigned char *buf,
1596                                 unsigned long len,
1597                                 unsigned long offset,
1598                                 unsigned long *offsetptr)
1599 {
1600   unsigned int type;
1601
1602   if (offset >= len)
1603     {
1604       fprintf (f, "[NULL]");
1605
1606       if (offsetptr != NULL)
1607         *offsetptr = offset;
1608       return;
1609   }
1610
1611   type = buf[offset];
1612   offset++;
1613
1614   if (! (type & 0x80))
1615     {
1616       fprintf (f, "[%s] (0x%x)", bfd_sym_type_basic_name (type & 0x7f), type);
1617
1618       if (offsetptr != NULL)
1619         *offsetptr = offset;
1620       return;
1621     }
1622
1623   if (type & 0x40)
1624     fprintf (f, "[packed ");
1625   else
1626     fprintf (f, "[");
1627
1628   switch (type & 0x3f)
1629     {
1630     case 1:
1631       {
1632         long value;
1633         bfd_sym_type_information_table_entry tinfo;
1634
1635         bfd_sym_fetch_long (buf, len, offset, &offset, &value);
1636         if (value <= 0)
1637           fprintf (f, "[INVALID]");
1638         else
1639           {
1640             if (bfd_sym_fetch_type_table_information (abfd, &tinfo, value) < 0)
1641               fprintf (f, "[INVALID]");
1642             else
1643               fprintf (f, "\"%.*s\"",
1644                        bfd_sym_symbol_name (abfd, tinfo.nte_index)[0],
1645                        &bfd_sym_symbol_name (abfd, tinfo.nte_index)[1]);
1646           }
1647         fprintf (f, " (TTE %lu)", (unsigned long) value);
1648         break;
1649       }
1650
1651     case 2:
1652       fprintf (f, "pointer (0x%x) to ", type);
1653       bfd_sym_print_type_information (abfd, f, buf, len, offset, &offset);
1654       break;
1655
1656     case 3:
1657       {
1658         long value;
1659
1660         fprintf (f, "scalar (0x%x) of ", type);
1661         bfd_sym_print_type_information (abfd, f, buf, len, offset, &offset);
1662         bfd_sym_fetch_long (buf, len, offset, &offset, &value);
1663         fprintf (f, " (%lu)", (unsigned long) value);
1664         break;
1665       }
1666
1667     case 5:
1668       {
1669         long lower, upper, nelem;
1670         int i;
1671
1672         fprintf (f, "enumeration (0x%x) of ", type);
1673         bfd_sym_print_type_information (abfd, f, buf, len, offset, &offset);
1674         bfd_sym_fetch_long (buf, len, offset, &offset, &lower);
1675         bfd_sym_fetch_long (buf, len, offset, &offset, &upper);
1676         bfd_sym_fetch_long (buf, len, offset, &offset, &nelem);
1677         fprintf (f, " from %lu to %lu with %lu elements: ",
1678                  (unsigned long) lower, (unsigned long) upper,
1679                  (unsigned long) nelem);
1680
1681         for (i = 0; i < nelem; i++)
1682           {
1683             fprintf (f, "\n                    ");
1684             bfd_sym_print_type_information (abfd, f, buf, len, offset, &offset);
1685           }
1686         break;
1687       }
1688
1689     case 6:
1690       fprintf (f, "vector (0x%x)", type);
1691       fprintf (f, "\n                index ");
1692       bfd_sym_print_type_information (abfd, f, buf, len, offset, &offset);
1693       fprintf (f, "\n                target ");
1694       bfd_sym_print_type_information (abfd, f, buf, len, offset, &offset);
1695       break;
1696
1697     case 7:
1698     case 8:
1699       {
1700         long nrec, eloff, i;
1701
1702         if ((type & 0x3f) == 7)
1703           fprintf (f, "record (0x%x) of ", type);
1704         else
1705           fprintf (f, "union (0x%x) of ", type);
1706
1707         bfd_sym_fetch_long (buf, len, offset, &offset, &nrec);
1708         fprintf (f, "%lu elements: ", (unsigned long) nrec);
1709
1710         for (i = 0; i < nrec; i++)
1711           {
1712             bfd_sym_fetch_long (buf, len, offset, &offset, &eloff);
1713             fprintf (f, "\n                ");
1714             fprintf (f, "offset %lu: ", (unsigned long) eloff);
1715             bfd_sym_print_type_information (abfd, f, buf, len, offset, &offset);
1716           }
1717         break;
1718       }
1719
1720     case 9:
1721       fprintf (f, "subrange (0x%x) of ", type);
1722       bfd_sym_print_type_information (abfd, f, buf, len, offset, &offset);
1723       fprintf (f, " lower ");
1724       bfd_sym_print_type_information (abfd, f, buf, len, offset, &offset);
1725       fprintf (f, " upper ");
1726       bfd_sym_print_type_information (abfd, f, buf, len, offset, &offset);
1727       break;
1728
1729   case 11:
1730     {
1731       long value;
1732
1733       fprintf (f, "named type (0x%x) ", type);
1734       bfd_sym_fetch_long (buf, len, offset, &offset, &value);
1735       if (value <= 0)
1736         fprintf (f, "[INVALID]");
1737       else
1738         fprintf (f, "\"%.*s\"",
1739                  bfd_sym_symbol_name (abfd, value)[0],
1740                  &bfd_sym_symbol_name (abfd, value)[1]);
1741
1742       fprintf (f, " (NTE %lu) with type ", (unsigned long) value);
1743       bfd_sym_print_type_information (abfd, f, buf, len, offset, &offset);
1744       break;
1745     }
1746
1747   default:
1748     fprintf (f, "%s (0x%x)", bfd_sym_type_operator_name (type), type);
1749     break;
1750     }
1751
1752   if (type == (0x40 | 0x6))
1753     {
1754       /* Vector.  */
1755       long n, width, m;
1756       long l;
1757       long i;
1758
1759       bfd_sym_fetch_long (buf, len, offset, &offset, &n);
1760       bfd_sym_fetch_long (buf, len, offset, &offset, &width);
1761       bfd_sym_fetch_long (buf, len, offset, &offset, &m);
1762       /* fprintf (f, "\n                "); */
1763       fprintf (f, " N %ld, width %ld, M %ld, ", n, width, m);
1764       for (i = 0; i < m; i++)
1765         {
1766           bfd_sym_fetch_long (buf, len, offset, &offset, &l);
1767           if (i != 0)
1768             fprintf (f, " ");
1769           fprintf (f, "%ld", l);
1770         }
1771     }
1772   else  if (type & 0x40)
1773     {
1774       /* Other packed type.  */
1775       long msb, lsb;
1776
1777       bfd_sym_fetch_long (buf, len, offset, &offset, &msb);
1778       bfd_sym_fetch_long (buf, len, offset, &offset, &lsb);
1779       /* fprintf (f, "\n                "); */
1780       fprintf (f, " msb %ld, lsb %ld", msb, lsb);
1781     }
1782
1783   fprintf (f, "]");
1784
1785   if (offsetptr != NULL)
1786     *offsetptr = offset;
1787 }
1788
1789 void
1790 bfd_sym_print_type_information_table_entry (bfd *abfd,
1791                                             FILE *f,
1792                                             bfd_sym_type_information_table_entry *entry)
1793 {
1794   unsigned char *buf;
1795   unsigned long offset;
1796   unsigned int i;
1797
1798   fprintf (f, "\"%.*s\" (NTE %lu), %lu bytes at %lu, logical size %lu",
1799            bfd_sym_symbol_name (abfd, entry->nte_index)[0],
1800            &bfd_sym_symbol_name (abfd, entry->nte_index)[1],
1801            entry->nte_index,
1802            entry->physical_size, entry->offset, entry->logical_size);
1803
1804   fprintf (f, "\n            ");
1805
1806   buf = alloca (entry->physical_size);
1807   if (buf == NULL)
1808     {
1809       fprintf (f, "[ERROR]\n");
1810       return;
1811     }
1812   if (bfd_seek (abfd, entry->offset, SEEK_SET) < 0)
1813     {
1814       fprintf (f, "[ERROR]\n");
1815       return;
1816     }
1817   if (bfd_bread (buf, entry->physical_size, abfd) != entry->physical_size)
1818     {
1819       fprintf (f, "[ERROR]\n");
1820       return;
1821     }
1822
1823   fprintf (f, "[");
1824   for (i = 0; i < entry->physical_size; i++)
1825     {
1826       if (i == 0)
1827         fprintf (f, "0x%02x", buf[i]);
1828       else
1829         fprintf (f, " 0x%02x", buf[i]);
1830     }
1831
1832   fprintf (f, "]");
1833   fprintf (f, "\n            ");
1834
1835   bfd_sym_print_type_information (abfd, f, buf, entry->physical_size, 0, &offset);
1836
1837   if (offset != entry->physical_size)
1838     fprintf (f, "\n            [parser used %lu bytes instead of %lu]", offset, entry->physical_size);
1839 }
1840
1841 void
1842 bfd_sym_print_file_references_index_table_entry (bfd *abfd ATTRIBUTE_UNUSED,
1843                                                  FILE *f,
1844                                                  bfd_sym_file_references_index_table_entry *entry ATTRIBUTE_UNUSED)
1845 {
1846   fprintf (f, "[UNIMPLEMENTED]");
1847 }
1848
1849 void
1850 bfd_sym_print_constant_pool_entry (bfd *abfd ATTRIBUTE_UNUSED,
1851                                    FILE *f,
1852                                    bfd_sym_constant_pool_entry *entry ATTRIBUTE_UNUSED)
1853 {
1854   fprintf (f, "[UNIMPLEMENTED]");
1855 }
1856
1857 unsigned char *
1858 bfd_sym_display_name_table_entry (bfd *abfd,
1859                                   FILE *f,
1860                                   unsigned char *entry)
1861 {
1862   unsigned long sym_index;
1863   unsigned long offset;
1864   bfd_sym_data_struct *sdata = NULL;
1865
1866   BFD_ASSERT (bfd_sym_valid (abfd));
1867   sdata = abfd->tdata.sym_data;
1868   sym_index = (entry - sdata->name_table) / 2;
1869
1870   if (sdata->version >= BFD_SYM_VERSION_3_4 && entry[0] == 255 && entry[1] == 0)
1871     {
1872       unsigned short length = bfd_getb16 (entry + 2);
1873       fprintf (f, "[%8lu] \"%.*s\"\n", sym_index, length, entry + 4);
1874       offset = 2 + length + 1;
1875     }
1876   else
1877     {
1878       if (! (entry[0] == 0 || (entry[0] == 1 && entry[1] == '\0')))
1879         fprintf (f, "[%8lu] \"%.*s\"\n", sym_index, entry[0], entry + 1);
1880
1881       if (sdata->version >= BFD_SYM_VERSION_3_4)
1882         offset = entry[0] + 2;
1883       else
1884         offset = entry[0] + 1;
1885     }
1886
1887   return (entry + offset + (offset % 2));
1888 }
1889
1890 void
1891 bfd_sym_display_name_table (bfd *abfd, FILE *f)
1892 {
1893   unsigned long name_table_len;
1894   unsigned char *name_table, *name_table_end, *cur;
1895   bfd_sym_data_struct *sdata = NULL;
1896
1897   BFD_ASSERT (bfd_sym_valid (abfd));
1898   sdata = abfd->tdata.sym_data;
1899
1900   name_table_len = sdata->header.dshb_nte.dti_page_count * sdata->header.dshb_page_size;
1901   name_table = sdata->name_table;
1902   name_table_end = name_table + name_table_len;
1903
1904   fprintf (f, "name table (NTE) contains %lu bytes:\n\n", name_table_len);
1905
1906   cur = name_table;
1907   for (;;)
1908     {
1909       cur = bfd_sym_display_name_table_entry (abfd, f, cur);
1910       if (cur >= name_table_end)
1911         break;
1912     }
1913 }
1914
1915 void
1916 bfd_sym_display_resources_table (bfd *abfd, FILE *f)
1917 {
1918   unsigned long i;
1919   bfd_sym_resources_table_entry entry;
1920   bfd_sym_data_struct *sdata = NULL;
1921
1922   BFD_ASSERT (bfd_sym_valid (abfd));
1923   sdata = abfd->tdata.sym_data;
1924
1925   fprintf (f, "resource table (RTE) contains %lu objects:\n\n",
1926            sdata->header.dshb_rte.dti_object_count);
1927
1928   for (i = 1; i <= sdata->header.dshb_rte.dti_object_count; i++)
1929     {
1930       if (bfd_sym_fetch_resources_table_entry (abfd, &entry, i) < 0)
1931         fprintf (f, " [%8lu] [INVALID]\n", i);
1932       else
1933         {
1934           fprintf (f, " [%8lu] ", i);
1935           bfd_sym_print_resources_table_entry (abfd, f, &entry);
1936           fprintf (f, "\n");
1937         }
1938     }
1939 }
1940
1941 void
1942 bfd_sym_display_modules_table (bfd *abfd, FILE *f)
1943 {
1944   unsigned long i;
1945   bfd_sym_modules_table_entry entry;
1946   bfd_sym_data_struct *sdata = NULL;
1947
1948   BFD_ASSERT (bfd_sym_valid (abfd));
1949   sdata = abfd->tdata.sym_data;
1950
1951   fprintf (f, "module table (MTE) contains %lu objects:\n\n",
1952            sdata->header.dshb_mte.dti_object_count);
1953
1954   for (i = 1; i <= sdata->header.dshb_mte.dti_object_count; i++)
1955     {
1956       if (bfd_sym_fetch_modules_table_entry (abfd, &entry, i) < 0)
1957         fprintf (f, " [%8lu] [INVALID]\n", i);
1958       else
1959         {
1960           fprintf (f, " [%8lu] ", i);
1961           bfd_sym_print_modules_table_entry (abfd, f, &entry);
1962           fprintf (f, "\n");
1963         }
1964     }
1965 }
1966
1967 void
1968 bfd_sym_display_file_references_table (bfd *abfd, FILE *f)
1969 {
1970   unsigned long i;
1971   bfd_sym_file_references_table_entry entry;
1972   bfd_sym_data_struct *sdata = NULL;
1973
1974   BFD_ASSERT (bfd_sym_valid (abfd));
1975   sdata = abfd->tdata.sym_data;
1976
1977   fprintf (f, "file reference table (FRTE) contains %lu objects:\n\n",
1978            sdata->header.dshb_frte.dti_object_count);
1979
1980   for (i = 1; i <= sdata->header.dshb_frte.dti_object_count; i++)
1981     {
1982       if (bfd_sym_fetch_file_references_table_entry (abfd, &entry, i) < 0)
1983         fprintf (f, " [%8lu] [INVALID]\n", i);
1984       else
1985         {
1986           fprintf (f, " [%8lu] ", i);
1987           bfd_sym_print_file_references_table_entry (abfd, f, &entry);
1988           fprintf (f, "\n");
1989         }
1990     }
1991 }
1992
1993 void
1994 bfd_sym_display_contained_modules_table (bfd *abfd, FILE *f)
1995 {
1996   unsigned long i;
1997   bfd_sym_contained_modules_table_entry entry;
1998   bfd_sym_data_struct *sdata = NULL;
1999
2000   BFD_ASSERT (bfd_sym_valid (abfd));
2001   sdata = abfd->tdata.sym_data;
2002
2003   fprintf (f, "contained modules table (CMTE) contains %lu objects:\n\n",
2004            sdata->header.dshb_cmte.dti_object_count);
2005
2006   for (i = 1; i <= sdata->header.dshb_cmte.dti_object_count; i++)
2007     {
2008       if (bfd_sym_fetch_contained_modules_table_entry (abfd, &entry, i) < 0)
2009         fprintf (f, " [%8lu] [INVALID]\n", i);
2010       else
2011         {
2012           fprintf (f, " [%8lu] ", i);
2013           bfd_sym_print_contained_modules_table_entry (abfd, f, &entry);
2014           fprintf (f, "\n");
2015         }
2016     }
2017 }
2018
2019 void
2020 bfd_sym_display_contained_variables_table (bfd *abfd, FILE *f)
2021 {
2022   unsigned long i;
2023   bfd_sym_contained_variables_table_entry entry;
2024   bfd_sym_data_struct *sdata = NULL;
2025
2026   BFD_ASSERT (bfd_sym_valid (abfd));
2027   sdata = abfd->tdata.sym_data;
2028
2029   fprintf (f, "contained variables table (CVTE) contains %lu objects:\n\n",
2030            sdata->header.dshb_cvte.dti_object_count);
2031
2032   for (i = 1; i <= sdata->header.dshb_cvte.dti_object_count; i++)
2033     {
2034       if (bfd_sym_fetch_contained_variables_table_entry (abfd, &entry, i) < 0)
2035         fprintf (f, " [%8lu] [INVALID]\n", i);
2036       else
2037         {
2038           fprintf (f, " [%8lu] ", i);
2039           bfd_sym_print_contained_variables_table_entry (abfd, f, &entry);
2040           fprintf (f, "\n");
2041         }
2042     }
2043
2044   fprintf (f, "\n");
2045 }
2046
2047 void
2048 bfd_sym_display_contained_statements_table (bfd *abfd, FILE *f)
2049 {
2050   unsigned long i;
2051   bfd_sym_contained_statements_table_entry entry;
2052   bfd_sym_data_struct *sdata = NULL;
2053
2054   BFD_ASSERT (bfd_sym_valid (abfd));
2055   sdata = abfd->tdata.sym_data;
2056
2057   fprintf (f, "contained statements table (CSNTE) contains %lu objects:\n\n",
2058            sdata->header.dshb_csnte.dti_object_count);
2059
2060   for (i = 1; i <= sdata->header.dshb_csnte.dti_object_count; i++)
2061     {
2062       if (bfd_sym_fetch_contained_statements_table_entry (abfd, &entry, i) < 0)
2063         fprintf (f, " [%8lu] [INVALID]\n", i);
2064       else
2065         {
2066           fprintf (f, " [%8lu] ", i);
2067           bfd_sym_print_contained_statements_table_entry (abfd, f, &entry);
2068           fprintf (f, "\n");
2069         }
2070     }
2071 }
2072
2073 void
2074 bfd_sym_display_contained_labels_table (bfd *abfd, FILE *f)
2075 {
2076   unsigned long i;
2077   bfd_sym_contained_labels_table_entry entry;
2078   bfd_sym_data_struct *sdata = NULL;
2079
2080   BFD_ASSERT (bfd_sym_valid (abfd));
2081   sdata = abfd->tdata.sym_data;
2082
2083   fprintf (f, "contained labels table (CLTE) contains %lu objects:\n\n",
2084            sdata->header.dshb_clte.dti_object_count);
2085
2086   for (i = 1; i <= sdata->header.dshb_clte.dti_object_count; i++)
2087     {
2088       if (bfd_sym_fetch_contained_labels_table_entry (abfd, &entry, i) < 0)
2089         fprintf (f, " [%8lu] [INVALID]\n", i);
2090       else
2091         {
2092           fprintf (f, " [%8lu] ", i);
2093           bfd_sym_print_contained_labels_table_entry (abfd, f, &entry);
2094           fprintf (f, "\n");
2095         }
2096     }
2097 }
2098
2099 void
2100 bfd_sym_display_contained_types_table (bfd *abfd, FILE *f)
2101 {
2102   unsigned long i;
2103   bfd_sym_contained_types_table_entry entry;
2104   bfd_sym_data_struct *sdata = NULL;
2105
2106   BFD_ASSERT (bfd_sym_valid (abfd));
2107   sdata = abfd->tdata.sym_data;
2108
2109   fprintf (f, "contained types table (CTTE) contains %lu objects:\n\n",
2110            sdata->header.dshb_ctte.dti_object_count);
2111
2112   for (i = 1; i <= sdata->header.dshb_ctte.dti_object_count; i++)
2113     {
2114       if (bfd_sym_fetch_contained_types_table_entry (abfd, &entry, i) < 0)
2115         fprintf (f, " [%8lu] [INVALID]\n", i);
2116       else
2117         {
2118           fprintf (f, " [%8lu] ", i);
2119           bfd_sym_print_contained_types_table_entry (abfd, f, &entry);
2120           fprintf (f, "\n");
2121         }
2122     }
2123 }
2124
2125 void
2126 bfd_sym_display_file_references_index_table (bfd *abfd, FILE *f)
2127 {
2128   unsigned long i;
2129   bfd_sym_file_references_index_table_entry entry;
2130   bfd_sym_data_struct *sdata = NULL;
2131
2132   BFD_ASSERT (bfd_sym_valid (abfd));
2133   sdata = abfd->tdata.sym_data;
2134
2135   fprintf (f, "file references index table (FITE) contains %lu objects:\n\n",
2136            sdata->header.dshb_fite.dti_object_count);
2137
2138   for (i = 1; i <= sdata->header.dshb_fite.dti_object_count; i++)
2139     {
2140       if (bfd_sym_fetch_file_references_index_table_entry (abfd, &entry, i) < 0)
2141         fprintf (f, " [%8lu] [INVALID]\n", i);
2142       else
2143         {
2144           fprintf (f, " [%8lu] ", i);
2145           bfd_sym_print_file_references_index_table_entry (abfd, f, &entry);
2146           fprintf (f, "\n");
2147         }
2148     }
2149 }
2150
2151 void
2152 bfd_sym_display_constant_pool (bfd *abfd, FILE *f)
2153 {
2154   unsigned long i;
2155   bfd_sym_constant_pool_entry entry;
2156   bfd_sym_data_struct *sdata = NULL;
2157
2158   BFD_ASSERT (bfd_sym_valid (abfd));
2159   sdata = abfd->tdata.sym_data;
2160
2161   fprintf (f, "constant pool (CONST) contains %lu objects:\n\n",
2162            sdata->header.dshb_const.dti_object_count);
2163
2164   for (i = 1; i <= sdata->header.dshb_const.dti_object_count; i++)
2165     {
2166       if (bfd_sym_fetch_constant_pool_entry (abfd, &entry, i) < 0)
2167         fprintf (f, " [%8lu] [INVALID]\n", i);
2168       else
2169         {
2170           fprintf (f, " [%8lu] ", i);
2171           bfd_sym_print_constant_pool_entry (abfd, f, &entry);
2172           fprintf (f, "\n");
2173         }
2174     }
2175 }
2176
2177 void
2178 bfd_sym_display_type_information_table (bfd *abfd, FILE *f)
2179 {
2180   unsigned long i;
2181   bfd_sym_type_table_entry sym_index;
2182   bfd_sym_type_information_table_entry entry;
2183   bfd_sym_data_struct *sdata = NULL;
2184
2185   BFD_ASSERT (bfd_sym_valid (abfd));
2186   sdata = abfd->tdata.sym_data;
2187
2188   if (sdata->header.dshb_tte.dti_object_count > 99)
2189     fprintf (f, "type table (TINFO) contains %lu objects:\n\n",
2190              sdata->header.dshb_tte.dti_object_count - 99);
2191   else
2192     {
2193       fprintf (f, "type table (TINFO) contains [INVALID] objects:\n\n");
2194       return;
2195     }
2196
2197   for (i = 100; i <= sdata->header.dshb_tte.dti_object_count; i++)
2198     {
2199       if (bfd_sym_fetch_type_table_entry (abfd, &sym_index, i - 100) < 0)
2200         fprintf (f, " [%8lu] [INVALID]\n", i);
2201       else
2202         {
2203           fprintf (f, " [%8lu] (TINFO %lu) ", i, sym_index);
2204
2205           if (bfd_sym_fetch_type_information_table_entry (abfd, &entry, sym_index) < 0)
2206             fprintf (f, "[INVALID]");
2207           else
2208             bfd_sym_print_type_information_table_entry (abfd, f, &entry);
2209
2210           fprintf (f, "\n");
2211         }
2212     }
2213 }
2214
2215 int
2216 bfd_sym_scan (bfd *abfd, bfd_sym_version version, bfd_sym_data_struct *mdata)
2217 {
2218   asection *bfdsec;
2219   const char *name = "symbols";
2220
2221   mdata->name_table = 0;
2222   mdata->sbfd = abfd;
2223   mdata->version = version;
2224
2225   bfd_seek (abfd, 0, SEEK_SET);
2226   if (bfd_sym_read_header (abfd, &mdata->header, mdata->version) != 0)
2227     return -1;
2228
2229   mdata->name_table = bfd_sym_read_name_table (abfd, &mdata->header);
2230   if (mdata->name_table == NULL)
2231     return -1;
2232
2233   bfdsec = bfd_make_section_anyway_with_flags (abfd, name, SEC_HAS_CONTENTS);
2234   if (bfdsec == NULL)
2235     return -1;
2236
2237   bfdsec->vma = 0;
2238   bfdsec->lma = 0;
2239   bfdsec->size = 0;
2240   bfdsec->filepos = 0;
2241   bfdsec->alignment_power = 0;
2242
2243   abfd->tdata.sym_data = mdata;
2244
2245   return 0;
2246 }
2247
2248 const bfd_target *
2249 bfd_sym_object_p (bfd *abfd)
2250 {
2251   bfd_sym_version version = -1;
2252   bfd_sym_data_struct *mdata;
2253
2254   bfd_seek (abfd, 0, SEEK_SET);
2255   if (bfd_sym_read_version (abfd, &version) != 0)
2256     goto wrong;
2257
2258   mdata = (bfd_sym_data_struct *) bfd_alloc (abfd, sizeof (*mdata));
2259   if (mdata == NULL)
2260     goto fail;
2261
2262   if (bfd_sym_scan (abfd, version, mdata) != 0)
2263     goto wrong;
2264
2265   return abfd->xvec;
2266
2267  wrong:
2268   bfd_set_error (bfd_error_wrong_format);
2269
2270  fail:
2271   return NULL;
2272 }
2273
2274 #define bfd_sym_make_empty_symbol _bfd_generic_make_empty_symbol
2275
2276 void
2277 bfd_sym_get_symbol_info (bfd *abfd ATTRIBUTE_UNUSED, asymbol *symbol, symbol_info *ret)
2278 {
2279   bfd_symbol_info (symbol, ret);
2280 }
2281
2282 long
2283 bfd_sym_get_symtab_upper_bound (bfd *abfd ATTRIBUTE_UNUSED)
2284 {
2285   return 0;
2286 }
2287
2288 long
2289 bfd_sym_canonicalize_symtab (bfd *abfd ATTRIBUTE_UNUSED, asymbol **sym ATTRIBUTE_UNUSED)
2290 {
2291   return 0;
2292 }
2293
2294 int
2295 bfd_sym_sizeof_headers (bfd *abfd ATTRIBUTE_UNUSED,
2296                         struct bfd_link_info *info ATTRIBUTE_UNUSED)
2297 {
2298   return 0;
2299 }
2300
2301 const bfd_target sym_vec =
2302 {
2303   "sym",                        /* Name.  */
2304   bfd_target_sym_flavour,       /* Flavour.  */
2305   BFD_ENDIAN_BIG,               /* Byteorder.  */
2306   BFD_ENDIAN_BIG,               /* Header byteorder.  */
2307   (HAS_RELOC | EXEC_P |         /* Object flags.  */
2308    HAS_LINENO | HAS_DEBUG |
2309    HAS_SYMS | HAS_LOCALS | DYNAMIC | WP_TEXT | D_PAGED),
2310   (SEC_ALLOC | SEC_LOAD | SEC_READONLY | SEC_CODE | SEC_DATA
2311    | SEC_ROM | SEC_HAS_CONTENTS), /* Section_flags.  */
2312   0,                            /* Symbol_leading_char.  */
2313   ' ',                          /* AR_pad_char.  */
2314   16,                           /* AR_max_namelen.  */
2315   0,                            /* match priority.  */
2316   bfd_getb64, bfd_getb_signed_64, bfd_putb64,
2317   bfd_getb32, bfd_getb_signed_32, bfd_putb32,
2318   bfd_getb16, bfd_getb_signed_16, bfd_putb16,   /* Data.  */
2319   bfd_getb64, bfd_getb_signed_64, bfd_putb64,
2320   bfd_getb32, bfd_getb_signed_32, bfd_putb32,
2321   bfd_getb16, bfd_getb_signed_16, bfd_putb16,   /* Hdrs.  */
2322   {                             /* bfd_check_format.  */
2323     _bfd_dummy_target,
2324     bfd_sym_object_p,           /* bfd_check_format.  */
2325     _bfd_dummy_target,
2326     _bfd_dummy_target,
2327   },
2328   {                             /* bfd_set_format.  */
2329     bfd_false,
2330     bfd_sym_mkobject,
2331     bfd_false,
2332     bfd_false,
2333   },
2334   {                             /* bfd_write_contents.  */
2335     bfd_false,
2336     bfd_true,
2337     bfd_false,
2338     bfd_false,
2339   },
2340
2341   BFD_JUMP_TABLE_GENERIC (bfd_sym),
2342   BFD_JUMP_TABLE_COPY (_bfd_generic),
2343   BFD_JUMP_TABLE_CORE (_bfd_nocore),
2344   BFD_JUMP_TABLE_ARCHIVE (_bfd_noarchive),
2345   BFD_JUMP_TABLE_SYMBOLS (bfd_sym),
2346   BFD_JUMP_TABLE_RELOCS (_bfd_norelocs),
2347   BFD_JUMP_TABLE_WRITE (bfd_sym),
2348   BFD_JUMP_TABLE_LINK (bfd_sym),
2349   BFD_JUMP_TABLE_DYNAMIC (_bfd_nodynamic),
2350
2351   NULL,
2352
2353   NULL
2354 };