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