xref: /dflybsd-src/contrib/gdb-7/bfd/verilog.c (revision 5796c8dc12c637f18a1740c26afd8d40ffa9b719)
1*5796c8dcSSimon Schubert /* BFD back-end for verilog hex memory dump files.
2*5796c8dcSSimon Schubert    Copyright 2009
3*5796c8dcSSimon Schubert    Free Software Foundation, Inc.
4*5796c8dcSSimon Schubert    Written by Anthony Green <green@moxielogic.com>
5*5796c8dcSSimon Schubert 
6*5796c8dcSSimon Schubert    This file is part of BFD, the Binary File Descriptor library.
7*5796c8dcSSimon Schubert 
8*5796c8dcSSimon Schubert    This program is free software; you can redistribute it and/or modify
9*5796c8dcSSimon Schubert    it under the terms of the GNU General Public License as published by
10*5796c8dcSSimon Schubert    the Free Software Foundation; either version 3 of the License, or
11*5796c8dcSSimon Schubert    (at your option) any later version.
12*5796c8dcSSimon Schubert 
13*5796c8dcSSimon Schubert    This program is distributed in the hope that it will be useful,
14*5796c8dcSSimon Schubert    but WITHOUT ANY WARRANTY; without even the implied warranty of
15*5796c8dcSSimon Schubert    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
16*5796c8dcSSimon Schubert    GNU General Public License for more details.
17*5796c8dcSSimon Schubert 
18*5796c8dcSSimon Schubert    You should have received a copy of the GNU General Public License
19*5796c8dcSSimon Schubert    along with this program; if not, write to the Free Software
20*5796c8dcSSimon Schubert    Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston,
21*5796c8dcSSimon Schubert    MA 02110-1301, USA.  */
22*5796c8dcSSimon Schubert 
23*5796c8dcSSimon Schubert 
24*5796c8dcSSimon Schubert /* SUBSECTION
25*5796c8dcSSimon Schubert 	Verilog hex memory file handling
26*5796c8dcSSimon Schubert 
27*5796c8dcSSimon Schubert    DESCRIPTION
28*5796c8dcSSimon Schubert 
29*5796c8dcSSimon Schubert 	Verilog hex memory files cannot hold anything but addresses
30*5796c8dcSSimon Schubert 	and data, so that's all that we implement.
31*5796c8dcSSimon Schubert 
32*5796c8dcSSimon Schubert 	The syntax of the text file is described in the IEEE standard
33*5796c8dcSSimon Schubert 	for Verilog.  Briefly, the file contains two types of tokens:
34*5796c8dcSSimon Schubert 	data and optional addresses.  The tokens are separated by
35*5796c8dcSSimon Schubert 	whitespace and comments.  Comments may be single line or
36*5796c8dcSSimon Schubert 	multiline, using syntax similar to C++.  Addresses are
37*5796c8dcSSimon Schubert 	specified by a leading "at" character (@) and are always
38*5796c8dcSSimon Schubert 	hexadecimal strings.  Data and addresses may contain
39*5796c8dcSSimon Schubert 	underscore (_) characters.
40*5796c8dcSSimon Schubert 
41*5796c8dcSSimon Schubert 	If no address is specified, the data is assumed to start at
42*5796c8dcSSimon Schubert 	address 0.  Similarly, if data exists before the first
43*5796c8dcSSimon Schubert 	specified address, then that data is assumed to start at
44*5796c8dcSSimon Schubert 	address 0.
45*5796c8dcSSimon Schubert 
46*5796c8dcSSimon Schubert 
47*5796c8dcSSimon Schubert    EXAMPLE
48*5796c8dcSSimon Schubert 	@1000
49*5796c8dcSSimon Schubert         01 ae 3f 45 12
50*5796c8dcSSimon Schubert 
51*5796c8dcSSimon Schubert    DESCRIPTION
52*5796c8dcSSimon Schubert 	@1000 specifies the starting address for the memory data.
53*5796c8dcSSimon Schubert 	The following characters describe the 5 bytes at 0x1000.  */
54*5796c8dcSSimon Schubert 
55*5796c8dcSSimon Schubert 
56*5796c8dcSSimon Schubert #include "sysdep.h"
57*5796c8dcSSimon Schubert #include "bfd.h"
58*5796c8dcSSimon Schubert #include "libbfd.h"
59*5796c8dcSSimon Schubert #include "libiberty.h"
60*5796c8dcSSimon Schubert #include "safe-ctype.h"
61*5796c8dcSSimon Schubert 
62*5796c8dcSSimon Schubert /* Macros for converting between hex and binary.  */
63*5796c8dcSSimon Schubert 
64*5796c8dcSSimon Schubert static const char digs[] = "0123456789ABCDEF";
65*5796c8dcSSimon Schubert 
66*5796c8dcSSimon Schubert #define NIBBLE(x)    hex_value(x)
67*5796c8dcSSimon Schubert #define HEX(buffer) ((NIBBLE ((buffer)[0])<<4) + NIBBLE ((buffer)[1]))
68*5796c8dcSSimon Schubert #define TOHEX(d, x) \
69*5796c8dcSSimon Schubert 	d[1] = digs[(x) & 0xf]; \
70*5796c8dcSSimon Schubert 	d[0] = digs[((x) >> 4) & 0xf];
71*5796c8dcSSimon Schubert 
72*5796c8dcSSimon Schubert /* When writing a verilog memory dump file, we write them in the order
73*5796c8dcSSimon Schubert    in which they appear in memory. This structure is used to hold them
74*5796c8dcSSimon Schubert    in memory.  */
75*5796c8dcSSimon Schubert 
76*5796c8dcSSimon Schubert struct verilog_data_list_struct
77*5796c8dcSSimon Schubert {
78*5796c8dcSSimon Schubert   struct verilog_data_list_struct *next;
79*5796c8dcSSimon Schubert   bfd_byte * data;
80*5796c8dcSSimon Schubert   bfd_vma where;
81*5796c8dcSSimon Schubert   bfd_size_type size;
82*5796c8dcSSimon Schubert };
83*5796c8dcSSimon Schubert 
84*5796c8dcSSimon Schubert typedef struct verilog_data_list_struct verilog_data_list_type;
85*5796c8dcSSimon Schubert 
86*5796c8dcSSimon Schubert /* The verilog tdata information.  */
87*5796c8dcSSimon Schubert 
88*5796c8dcSSimon Schubert typedef struct verilog_data_struct
89*5796c8dcSSimon Schubert {
90*5796c8dcSSimon Schubert   verilog_data_list_type *head;
91*5796c8dcSSimon Schubert   verilog_data_list_type *tail;
92*5796c8dcSSimon Schubert }
93*5796c8dcSSimon Schubert tdata_type;
94*5796c8dcSSimon Schubert 
95*5796c8dcSSimon Schubert static bfd_boolean
96*5796c8dcSSimon Schubert verilog_set_arch_mach (bfd *abfd, enum bfd_architecture arch, unsigned long mach)
97*5796c8dcSSimon Schubert {
98*5796c8dcSSimon Schubert   if (arch != bfd_arch_unknown)
99*5796c8dcSSimon Schubert     return bfd_default_set_arch_mach (abfd, arch, mach);
100*5796c8dcSSimon Schubert 
101*5796c8dcSSimon Schubert   abfd->arch_info = & bfd_default_arch_struct;
102*5796c8dcSSimon Schubert   return TRUE;
103*5796c8dcSSimon Schubert }
104*5796c8dcSSimon Schubert 
105*5796c8dcSSimon Schubert /* We have to save up all the outpu for a splurge before output.  */
106*5796c8dcSSimon Schubert 
107*5796c8dcSSimon Schubert static bfd_boolean
108*5796c8dcSSimon Schubert verilog_set_section_contents (bfd *abfd,
109*5796c8dcSSimon Schubert 			      sec_ptr section,
110*5796c8dcSSimon Schubert 			      const void * location,
111*5796c8dcSSimon Schubert 			      file_ptr offset,
112*5796c8dcSSimon Schubert 			      bfd_size_type bytes_to_do)
113*5796c8dcSSimon Schubert {
114*5796c8dcSSimon Schubert   tdata_type *tdata = abfd->tdata.verilog_data;
115*5796c8dcSSimon Schubert   verilog_data_list_type *entry;
116*5796c8dcSSimon Schubert 
117*5796c8dcSSimon Schubert   entry = (verilog_data_list_type *) bfd_alloc (abfd, sizeof (* entry));
118*5796c8dcSSimon Schubert   if (entry == NULL)
119*5796c8dcSSimon Schubert     return FALSE;
120*5796c8dcSSimon Schubert 
121*5796c8dcSSimon Schubert   if (bytes_to_do
122*5796c8dcSSimon Schubert       && (section->flags & SEC_ALLOC)
123*5796c8dcSSimon Schubert       && (section->flags & SEC_LOAD))
124*5796c8dcSSimon Schubert     {
125*5796c8dcSSimon Schubert       bfd_byte *data;
126*5796c8dcSSimon Schubert 
127*5796c8dcSSimon Schubert       data = (bfd_byte *) bfd_alloc (abfd, bytes_to_do);
128*5796c8dcSSimon Schubert       if (data == NULL)
129*5796c8dcSSimon Schubert 	return FALSE;
130*5796c8dcSSimon Schubert       memcpy ((void *) data, location, (size_t) bytes_to_do);
131*5796c8dcSSimon Schubert 
132*5796c8dcSSimon Schubert       entry->data = data;
133*5796c8dcSSimon Schubert       entry->where = section->lma + offset;
134*5796c8dcSSimon Schubert       entry->size = bytes_to_do;
135*5796c8dcSSimon Schubert 
136*5796c8dcSSimon Schubert       /* Sort the records by address.  Optimize for the common case of
137*5796c8dcSSimon Schubert 	 adding a record to the end of the list.  */
138*5796c8dcSSimon Schubert       if (tdata->tail != NULL
139*5796c8dcSSimon Schubert 	  && entry->where >= tdata->tail->where)
140*5796c8dcSSimon Schubert 	{
141*5796c8dcSSimon Schubert 	  tdata->tail->next = entry;
142*5796c8dcSSimon Schubert 	  entry->next = NULL;
143*5796c8dcSSimon Schubert 	  tdata->tail = entry;
144*5796c8dcSSimon Schubert 	}
145*5796c8dcSSimon Schubert       else
146*5796c8dcSSimon Schubert 	{
147*5796c8dcSSimon Schubert 	  verilog_data_list_type **look;
148*5796c8dcSSimon Schubert 
149*5796c8dcSSimon Schubert 	  for (look = &tdata->head;
150*5796c8dcSSimon Schubert 	       *look != NULL && (*look)->where < entry->where;
151*5796c8dcSSimon Schubert 	       look = &(*look)->next)
152*5796c8dcSSimon Schubert 	    ;
153*5796c8dcSSimon Schubert 	  entry->next = *look;
154*5796c8dcSSimon Schubert 	  *look = entry;
155*5796c8dcSSimon Schubert 	  if (entry->next == NULL)
156*5796c8dcSSimon Schubert 	    tdata->tail = entry;
157*5796c8dcSSimon Schubert 	}
158*5796c8dcSSimon Schubert     }
159*5796c8dcSSimon Schubert   return TRUE;
160*5796c8dcSSimon Schubert }
161*5796c8dcSSimon Schubert 
162*5796c8dcSSimon Schubert static bfd_boolean
163*5796c8dcSSimon Schubert verilog_write_address (bfd *abfd, bfd_vma address)
164*5796c8dcSSimon Schubert {
165*5796c8dcSSimon Schubert   char buffer[12];
166*5796c8dcSSimon Schubert   char *dst = buffer;
167*5796c8dcSSimon Schubert   bfd_size_type wrlen;
168*5796c8dcSSimon Schubert 
169*5796c8dcSSimon Schubert   /* Write the address.  */
170*5796c8dcSSimon Schubert   *dst++ = '@';
171*5796c8dcSSimon Schubert   TOHEX (dst, (address >> 24));
172*5796c8dcSSimon Schubert   dst += 2;
173*5796c8dcSSimon Schubert   TOHEX (dst, (address >> 16));
174*5796c8dcSSimon Schubert   dst += 2;
175*5796c8dcSSimon Schubert   TOHEX (dst, (address >> 8));
176*5796c8dcSSimon Schubert   dst += 2;
177*5796c8dcSSimon Schubert   TOHEX (dst, (address));
178*5796c8dcSSimon Schubert   dst += 2;
179*5796c8dcSSimon Schubert   *dst++ = '\r';
180*5796c8dcSSimon Schubert   *dst++ = '\n';
181*5796c8dcSSimon Schubert   wrlen = dst - buffer;
182*5796c8dcSSimon Schubert 
183*5796c8dcSSimon Schubert   return bfd_bwrite ((void *) buffer, wrlen, abfd) == wrlen;
184*5796c8dcSSimon Schubert }
185*5796c8dcSSimon Schubert 
186*5796c8dcSSimon Schubert /* Write a record of type, of the supplied number of bytes. The
187*5796c8dcSSimon Schubert    supplied bytes and length don't have a checksum. That's worked out
188*5796c8dcSSimon Schubert    here.  */
189*5796c8dcSSimon Schubert 
190*5796c8dcSSimon Schubert static bfd_boolean
191*5796c8dcSSimon Schubert verilog_write_record (bfd *abfd,
192*5796c8dcSSimon Schubert 		      const bfd_byte *data,
193*5796c8dcSSimon Schubert 		      const bfd_byte *end)
194*5796c8dcSSimon Schubert {
195*5796c8dcSSimon Schubert   char buffer[48];
196*5796c8dcSSimon Schubert   const bfd_byte *src = data;
197*5796c8dcSSimon Schubert   char *dst = buffer;
198*5796c8dcSSimon Schubert   bfd_size_type wrlen;
199*5796c8dcSSimon Schubert 
200*5796c8dcSSimon Schubert   /* Write the data.  */
201*5796c8dcSSimon Schubert   for (src = data; src < end; src++)
202*5796c8dcSSimon Schubert     {
203*5796c8dcSSimon Schubert       TOHEX (dst, *src);
204*5796c8dcSSimon Schubert       dst += 2;
205*5796c8dcSSimon Schubert       *dst++ = ' ';
206*5796c8dcSSimon Schubert     }
207*5796c8dcSSimon Schubert   *dst++ = '\r';
208*5796c8dcSSimon Schubert   *dst++ = '\n';
209*5796c8dcSSimon Schubert   wrlen = dst - buffer;
210*5796c8dcSSimon Schubert 
211*5796c8dcSSimon Schubert   return bfd_bwrite ((void *) buffer, wrlen, abfd) == wrlen;
212*5796c8dcSSimon Schubert }
213*5796c8dcSSimon Schubert 
214*5796c8dcSSimon Schubert static bfd_boolean
215*5796c8dcSSimon Schubert verilog_write_section (bfd *abfd,
216*5796c8dcSSimon Schubert 		       tdata_type *tdata ATTRIBUTE_UNUSED,
217*5796c8dcSSimon Schubert 		       verilog_data_list_type *list)
218*5796c8dcSSimon Schubert {
219*5796c8dcSSimon Schubert   unsigned int octets_written = 0;
220*5796c8dcSSimon Schubert   bfd_byte *location = list->data;
221*5796c8dcSSimon Schubert 
222*5796c8dcSSimon Schubert   verilog_write_address (abfd, list->where);
223*5796c8dcSSimon Schubert   while (octets_written < list->size)
224*5796c8dcSSimon Schubert     {
225*5796c8dcSSimon Schubert       bfd_vma address;
226*5796c8dcSSimon Schubert       unsigned int octets_this_chunk = list->size - octets_written;
227*5796c8dcSSimon Schubert 
228*5796c8dcSSimon Schubert       if (octets_this_chunk > 16)
229*5796c8dcSSimon Schubert 	octets_this_chunk = 16;
230*5796c8dcSSimon Schubert 
231*5796c8dcSSimon Schubert       address = list->where + octets_written / bfd_octets_per_byte (abfd);
232*5796c8dcSSimon Schubert 
233*5796c8dcSSimon Schubert       if (! verilog_write_record (abfd,
234*5796c8dcSSimon Schubert 				  location,
235*5796c8dcSSimon Schubert 				  location + octets_this_chunk))
236*5796c8dcSSimon Schubert 	return FALSE;
237*5796c8dcSSimon Schubert 
238*5796c8dcSSimon Schubert       octets_written += octets_this_chunk;
239*5796c8dcSSimon Schubert       location += octets_this_chunk;
240*5796c8dcSSimon Schubert     }
241*5796c8dcSSimon Schubert 
242*5796c8dcSSimon Schubert   return TRUE;
243*5796c8dcSSimon Schubert }
244*5796c8dcSSimon Schubert 
245*5796c8dcSSimon Schubert static bfd_boolean
246*5796c8dcSSimon Schubert verilog_write_object_contents (bfd *abfd)
247*5796c8dcSSimon Schubert {
248*5796c8dcSSimon Schubert   tdata_type *tdata = abfd->tdata.verilog_data;
249*5796c8dcSSimon Schubert   verilog_data_list_type *list;
250*5796c8dcSSimon Schubert 
251*5796c8dcSSimon Schubert   /* Now wander though all the sections provided and output them.  */
252*5796c8dcSSimon Schubert   list = tdata->head;
253*5796c8dcSSimon Schubert 
254*5796c8dcSSimon Schubert   while (list != (verilog_data_list_type *) NULL)
255*5796c8dcSSimon Schubert     {
256*5796c8dcSSimon Schubert       if (! verilog_write_section (abfd, tdata, list))
257*5796c8dcSSimon Schubert 	return FALSE;
258*5796c8dcSSimon Schubert       list = list->next;
259*5796c8dcSSimon Schubert     }
260*5796c8dcSSimon Schubert   return TRUE;
261*5796c8dcSSimon Schubert }
262*5796c8dcSSimon Schubert 
263*5796c8dcSSimon Schubert /* Initialize by filling in the hex conversion array.  */
264*5796c8dcSSimon Schubert 
265*5796c8dcSSimon Schubert static void
266*5796c8dcSSimon Schubert verilog_init (void)
267*5796c8dcSSimon Schubert {
268*5796c8dcSSimon Schubert   static bfd_boolean inited = FALSE;
269*5796c8dcSSimon Schubert 
270*5796c8dcSSimon Schubert   if (! inited)
271*5796c8dcSSimon Schubert     {
272*5796c8dcSSimon Schubert       inited = TRUE;
273*5796c8dcSSimon Schubert       hex_init ();
274*5796c8dcSSimon Schubert     }
275*5796c8dcSSimon Schubert }
276*5796c8dcSSimon Schubert 
277*5796c8dcSSimon Schubert /* Set up the verilog tdata information.  */
278*5796c8dcSSimon Schubert 
279*5796c8dcSSimon Schubert static bfd_boolean
280*5796c8dcSSimon Schubert verilog_mkobject (bfd *abfd)
281*5796c8dcSSimon Schubert {
282*5796c8dcSSimon Schubert   tdata_type *tdata;
283*5796c8dcSSimon Schubert 
284*5796c8dcSSimon Schubert   verilog_init ();
285*5796c8dcSSimon Schubert 
286*5796c8dcSSimon Schubert   tdata = (tdata_type *) bfd_alloc (abfd, sizeof (tdata_type));
287*5796c8dcSSimon Schubert   if (tdata == NULL)
288*5796c8dcSSimon Schubert     return FALSE;
289*5796c8dcSSimon Schubert 
290*5796c8dcSSimon Schubert   abfd->tdata.verilog_data = tdata;
291*5796c8dcSSimon Schubert   tdata->head = NULL;
292*5796c8dcSSimon Schubert   tdata->tail = NULL;
293*5796c8dcSSimon Schubert 
294*5796c8dcSSimon Schubert   return TRUE;
295*5796c8dcSSimon Schubert }
296*5796c8dcSSimon Schubert 
297*5796c8dcSSimon Schubert #define	verilog_close_and_cleanup                    _bfd_generic_close_and_cleanup
298*5796c8dcSSimon Schubert #define verilog_bfd_free_cached_info                 _bfd_generic_bfd_free_cached_info
299*5796c8dcSSimon Schubert #define verilog_new_section_hook                     _bfd_generic_new_section_hook
300*5796c8dcSSimon Schubert #define verilog_bfd_is_target_special_symbol         ((bfd_boolean (*) (bfd *, asymbol *)) bfd_false)
301*5796c8dcSSimon Schubert #define verilog_bfd_is_local_label_name              bfd_generic_is_local_label_name
302*5796c8dcSSimon Schubert #define verilog_get_lineno                           _bfd_nosymbols_get_lineno
303*5796c8dcSSimon Schubert #define verilog_find_nearest_line                    _bfd_nosymbols_find_nearest_line
304*5796c8dcSSimon Schubert #define verilog_find_inliner_info                    _bfd_nosymbols_find_inliner_info
305*5796c8dcSSimon Schubert #define verilog_make_empty_symbol                    _bfd_generic_make_empty_symbol
306*5796c8dcSSimon Schubert #define verilog_bfd_make_debug_symbol                _bfd_nosymbols_bfd_make_debug_symbol
307*5796c8dcSSimon Schubert #define verilog_read_minisymbols                     _bfd_generic_read_minisymbols
308*5796c8dcSSimon Schubert #define verilog_minisymbol_to_symbol                 _bfd_generic_minisymbol_to_symbol
309*5796c8dcSSimon Schubert #define verilog_get_section_contents_in_window       _bfd_generic_get_section_contents_in_window
310*5796c8dcSSimon Schubert #define verilog_bfd_get_relocated_section_contents   bfd_generic_get_relocated_section_contents
311*5796c8dcSSimon Schubert #define verilog_bfd_relax_section                    bfd_generic_relax_section
312*5796c8dcSSimon Schubert #define verilog_bfd_gc_sections                      bfd_generic_gc_sections
313*5796c8dcSSimon Schubert #define verilog_bfd_merge_sections                   bfd_generic_merge_sections
314*5796c8dcSSimon Schubert #define verilog_bfd_is_group_section                 bfd_generic_is_group_section
315*5796c8dcSSimon Schubert #define verilog_bfd_discard_group                    bfd_generic_discard_group
316*5796c8dcSSimon Schubert #define verilog_section_already_linked               _bfd_generic_section_already_linked
317*5796c8dcSSimon Schubert #define verilog_bfd_link_hash_table_create           _bfd_generic_link_hash_table_create
318*5796c8dcSSimon Schubert #define verilog_bfd_link_hash_table_free             _bfd_generic_link_hash_table_free
319*5796c8dcSSimon Schubert #define verilog_bfd_link_add_symbols                 _bfd_generic_link_add_symbols
320*5796c8dcSSimon Schubert #define verilog_bfd_link_just_syms                   _bfd_generic_link_just_syms
321*5796c8dcSSimon Schubert #define verilog_bfd_final_link                       _bfd_generic_final_link
322*5796c8dcSSimon Schubert #define verilog_bfd_link_split_section               _bfd_generic_link_split_section
323*5796c8dcSSimon Schubert 
324*5796c8dcSSimon Schubert const bfd_target verilog_vec =
325*5796c8dcSSimon Schubert {
326*5796c8dcSSimon Schubert   "verilog",			/* Name.  */
327*5796c8dcSSimon Schubert   bfd_target_verilog_flavour,
328*5796c8dcSSimon Schubert   BFD_ENDIAN_UNKNOWN,		/* Target byte order.  */
329*5796c8dcSSimon Schubert   BFD_ENDIAN_UNKNOWN,		/* Target headers byte order.  */
330*5796c8dcSSimon Schubert   (HAS_RELOC | EXEC_P |		/* Object flags.  */
331*5796c8dcSSimon Schubert    HAS_LINENO | HAS_DEBUG |
332*5796c8dcSSimon Schubert    HAS_SYMS | HAS_LOCALS | WP_TEXT | D_PAGED),
333*5796c8dcSSimon Schubert   (SEC_CODE | SEC_DATA | SEC_ROM | SEC_HAS_CONTENTS
334*5796c8dcSSimon Schubert    | SEC_ALLOC | SEC_LOAD | SEC_RELOC),	/* Section flags.  */
335*5796c8dcSSimon Schubert   0,				/* Leading underscore.  */
336*5796c8dcSSimon Schubert   ' ',				/* AR_pad_char.  */
337*5796c8dcSSimon Schubert   16,				/* AR_max_namelen.  */
338*5796c8dcSSimon Schubert   bfd_getb64, bfd_getb_signed_64, bfd_putb64,
339*5796c8dcSSimon Schubert   bfd_getb32, bfd_getb_signed_32, bfd_putb32,
340*5796c8dcSSimon Schubert   bfd_getb16, bfd_getb_signed_16, bfd_putb16,	/* Data.  */
341*5796c8dcSSimon Schubert   bfd_getb64, bfd_getb_signed_64, bfd_putb64,
342*5796c8dcSSimon Schubert   bfd_getb32, bfd_getb_signed_32, bfd_putb32,
343*5796c8dcSSimon Schubert   bfd_getb16, bfd_getb_signed_16, bfd_putb16,	/* Hdrs.  */
344*5796c8dcSSimon Schubert 
345*5796c8dcSSimon Schubert   {
346*5796c8dcSSimon Schubert     _bfd_dummy_target,
347*5796c8dcSSimon Schubert     _bfd_dummy_target,
348*5796c8dcSSimon Schubert     _bfd_dummy_target,
349*5796c8dcSSimon Schubert     _bfd_dummy_target,
350*5796c8dcSSimon Schubert   },
351*5796c8dcSSimon Schubert   {
352*5796c8dcSSimon Schubert     bfd_false,
353*5796c8dcSSimon Schubert     verilog_mkobject,
354*5796c8dcSSimon Schubert     bfd_false,
355*5796c8dcSSimon Schubert     bfd_false,
356*5796c8dcSSimon Schubert   },
357*5796c8dcSSimon Schubert   {				/* bfd_write_contents.  */
358*5796c8dcSSimon Schubert     bfd_false,
359*5796c8dcSSimon Schubert     verilog_write_object_contents,
360*5796c8dcSSimon Schubert     bfd_false,
361*5796c8dcSSimon Schubert     bfd_false,
362*5796c8dcSSimon Schubert   },
363*5796c8dcSSimon Schubert 
364*5796c8dcSSimon Schubert   BFD_JUMP_TABLE_GENERIC (_bfd_generic),
365*5796c8dcSSimon Schubert   BFD_JUMP_TABLE_COPY (_bfd_generic),
366*5796c8dcSSimon Schubert   BFD_JUMP_TABLE_CORE (_bfd_nocore),
367*5796c8dcSSimon Schubert   BFD_JUMP_TABLE_ARCHIVE (_bfd_noarchive),
368*5796c8dcSSimon Schubert   BFD_JUMP_TABLE_SYMBOLS (_bfd_nosymbols),
369*5796c8dcSSimon Schubert   BFD_JUMP_TABLE_RELOCS (_bfd_norelocs),
370*5796c8dcSSimon Schubert   BFD_JUMP_TABLE_WRITE (verilog),
371*5796c8dcSSimon Schubert   BFD_JUMP_TABLE_LINK (_bfd_nolink),
372*5796c8dcSSimon Schubert   BFD_JUMP_TABLE_DYNAMIC (_bfd_nodynamic),
373*5796c8dcSSimon Schubert 
374*5796c8dcSSimon Schubert   NULL,
375*5796c8dcSSimon Schubert 
376*5796c8dcSSimon Schubert   NULL
377*5796c8dcSSimon Schubert };
378