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