xref: /netbsd-src/external/gpl3/binutils.old/dist/bfd/verilog.c (revision e992f068c547fd6e84b3f104dc2340adcc955732)
175fd0b74Schristos /* BFD back-end for verilog hex memory dump files.
2*e992f068Schristos    Copyright (C) 2009-2022 Free Software Foundation, Inc.
375fd0b74Schristos    Written by Anthony Green <green@moxielogic.com>
475fd0b74Schristos 
575fd0b74Schristos    This file is part of BFD, the Binary File Descriptor library.
675fd0b74Schristos 
775fd0b74Schristos    This program is free software; you can redistribute it and/or modify
875fd0b74Schristos    it under the terms of the GNU General Public License as published by
975fd0b74Schristos    the Free Software Foundation; either version 3 of the License, or
1075fd0b74Schristos    (at your option) any later version.
1175fd0b74Schristos 
1275fd0b74Schristos    This program is distributed in the hope that it will be useful,
1375fd0b74Schristos    but WITHOUT ANY WARRANTY; without even the implied warranty of
1475fd0b74Schristos    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
1575fd0b74Schristos    GNU General Public License for more details.
1675fd0b74Schristos 
1775fd0b74Schristos    You should have received a copy of the GNU General Public License
1875fd0b74Schristos    along with this program; if not, write to the Free Software
1975fd0b74Schristos    Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston,
2075fd0b74Schristos    MA 02110-1301, USA.  */
2175fd0b74Schristos 
2275fd0b74Schristos 
2375fd0b74Schristos /* SUBSECTION
2475fd0b74Schristos 	Verilog hex memory file handling
2575fd0b74Schristos 
2675fd0b74Schristos    DESCRIPTION
2775fd0b74Schristos 
2875fd0b74Schristos 	Verilog hex memory files cannot hold anything but addresses
2975fd0b74Schristos 	and data, so that's all that we implement.
3075fd0b74Schristos 
3175fd0b74Schristos 	The syntax of the text file is described in the IEEE standard
3275fd0b74Schristos 	for Verilog.  Briefly, the file contains two types of tokens:
3375fd0b74Schristos 	data and optional addresses.  The tokens are separated by
3475fd0b74Schristos 	whitespace and comments.  Comments may be single line or
3575fd0b74Schristos 	multiline, using syntax similar to C++.  Addresses are
3675fd0b74Schristos 	specified by a leading "at" character (@) and are always
3775fd0b74Schristos 	hexadecimal strings.  Data and addresses may contain
3875fd0b74Schristos 	underscore (_) characters.
3975fd0b74Schristos 
4075fd0b74Schristos 	If no address is specified, the data is assumed to start at
4175fd0b74Schristos 	address 0.  Similarly, if data exists before the first
4275fd0b74Schristos 	specified address, then that data is assumed to start at
4375fd0b74Schristos 	address 0.
4475fd0b74Schristos 
4575fd0b74Schristos 
4675fd0b74Schristos    EXAMPLE
4775fd0b74Schristos 	@1000
4875fd0b74Schristos 	01 ae 3f 45 12
4975fd0b74Schristos 
5075fd0b74Schristos    DESCRIPTION
5175fd0b74Schristos 	@1000 specifies the starting address for the memory data.
5275fd0b74Schristos 	The following characters describe the 5 bytes at 0x1000.  */
5375fd0b74Schristos 
5475fd0b74Schristos 
5575fd0b74Schristos #include "sysdep.h"
5675fd0b74Schristos #include "bfd.h"
5775fd0b74Schristos #include "libbfd.h"
5875fd0b74Schristos #include "libiberty.h"
5975fd0b74Schristos #include "safe-ctype.h"
6075fd0b74Schristos 
61012573ebSchristos /* Modified by obcopy.c
62012573ebSchristos    Data width in bytes.  */
63012573ebSchristos unsigned int VerilogDataWidth = 1;
64012573ebSchristos 
6575fd0b74Schristos /* Macros for converting between hex and binary.  */
6675fd0b74Schristos 
6775fd0b74Schristos static const char digs[] = "0123456789ABCDEF";
6875fd0b74Schristos 
6975fd0b74Schristos #define NIBBLE(x)    hex_value (x)
7075fd0b74Schristos #define HEX(buffer) ((NIBBLE ((buffer)[0]) << 4) + NIBBLE ((buffer)[1]))
7175fd0b74Schristos #define TOHEX(d, x) \
7275fd0b74Schristos 	d[1] = digs[(x) & 0xf]; \
7375fd0b74Schristos 	d[0] = digs[((x) >> 4) & 0xf];
7475fd0b74Schristos 
7575fd0b74Schristos /* When writing a verilog memory dump file, we write them in the order
7675fd0b74Schristos    in which they appear in memory. This structure is used to hold them
7775fd0b74Schristos    in memory.  */
7875fd0b74Schristos 
7975fd0b74Schristos struct verilog_data_list_struct
8075fd0b74Schristos {
8175fd0b74Schristos   struct verilog_data_list_struct *next;
8275fd0b74Schristos   bfd_byte * data;
8375fd0b74Schristos   bfd_vma where;
8475fd0b74Schristos   bfd_size_type size;
8575fd0b74Schristos };
8675fd0b74Schristos 
8775fd0b74Schristos typedef struct verilog_data_list_struct verilog_data_list_type;
8875fd0b74Schristos 
8975fd0b74Schristos /* The verilog tdata information.  */
9075fd0b74Schristos 
9175fd0b74Schristos typedef struct verilog_data_struct
9275fd0b74Schristos {
9375fd0b74Schristos   verilog_data_list_type *head;
9475fd0b74Schristos   verilog_data_list_type *tail;
9575fd0b74Schristos }
9675fd0b74Schristos tdata_type;
9775fd0b74Schristos 
98*e992f068Schristos static bool
verilog_set_arch_mach(bfd * abfd,enum bfd_architecture arch,unsigned long mach)9975fd0b74Schristos verilog_set_arch_mach (bfd *abfd, enum bfd_architecture arch, unsigned long mach)
10075fd0b74Schristos {
10175fd0b74Schristos   if (arch != bfd_arch_unknown)
10275fd0b74Schristos     return bfd_default_set_arch_mach (abfd, arch, mach);
10375fd0b74Schristos 
10475fd0b74Schristos   abfd->arch_info = & bfd_default_arch_struct;
105*e992f068Schristos   return true;
10675fd0b74Schristos }
10775fd0b74Schristos 
10875fd0b74Schristos /* We have to save up all the outpu for a splurge before output.  */
10975fd0b74Schristos 
110*e992f068Schristos static bool
verilog_set_section_contents(bfd * abfd,sec_ptr section,const void * location,file_ptr offset,bfd_size_type bytes_to_do)11175fd0b74Schristos verilog_set_section_contents (bfd *abfd,
11275fd0b74Schristos 			      sec_ptr section,
11375fd0b74Schristos 			      const void * location,
11475fd0b74Schristos 			      file_ptr offset,
11575fd0b74Schristos 			      bfd_size_type bytes_to_do)
11675fd0b74Schristos {
11775fd0b74Schristos   tdata_type *tdata = abfd->tdata.verilog_data;
11875fd0b74Schristos   verilog_data_list_type *entry;
11975fd0b74Schristos 
12075fd0b74Schristos   entry = (verilog_data_list_type *) bfd_alloc (abfd, sizeof (* entry));
12175fd0b74Schristos   if (entry == NULL)
122*e992f068Schristos     return false;
12375fd0b74Schristos 
12475fd0b74Schristos   if (bytes_to_do
12575fd0b74Schristos       && (section->flags & SEC_ALLOC)
12675fd0b74Schristos       && (section->flags & SEC_LOAD))
12775fd0b74Schristos     {
12875fd0b74Schristos       bfd_byte *data;
12975fd0b74Schristos 
13075fd0b74Schristos       data = (bfd_byte *) bfd_alloc (abfd, bytes_to_do);
13175fd0b74Schristos       if (data == NULL)
132*e992f068Schristos 	return false;
13375fd0b74Schristos       memcpy ((void *) data, location, (size_t) bytes_to_do);
13475fd0b74Schristos 
13575fd0b74Schristos       entry->data = data;
13675fd0b74Schristos       entry->where = section->lma + offset;
13775fd0b74Schristos       entry->size = bytes_to_do;
13875fd0b74Schristos 
13975fd0b74Schristos       /* Sort the records by address.  Optimize for the common case of
14075fd0b74Schristos 	 adding a record to the end of the list.  */
14175fd0b74Schristos       if (tdata->tail != NULL
14275fd0b74Schristos 	  && entry->where >= tdata->tail->where)
14375fd0b74Schristos 	{
14475fd0b74Schristos 	  tdata->tail->next = entry;
14575fd0b74Schristos 	  entry->next = NULL;
14675fd0b74Schristos 	  tdata->tail = entry;
14775fd0b74Schristos 	}
14875fd0b74Schristos       else
14975fd0b74Schristos 	{
15075fd0b74Schristos 	  verilog_data_list_type **look;
15175fd0b74Schristos 
15275fd0b74Schristos 	  for (look = &tdata->head;
15375fd0b74Schristos 	       *look != NULL && (*look)->where < entry->where;
15475fd0b74Schristos 	       look = &(*look)->next)
15575fd0b74Schristos 	    ;
15675fd0b74Schristos 	  entry->next = *look;
15775fd0b74Schristos 	  *look = entry;
15875fd0b74Schristos 	  if (entry->next == NULL)
15975fd0b74Schristos 	    tdata->tail = entry;
16075fd0b74Schristos 	}
16175fd0b74Schristos     }
162*e992f068Schristos   return true;
16375fd0b74Schristos }
16475fd0b74Schristos 
165*e992f068Schristos static bool
verilog_write_address(bfd * abfd,bfd_vma address)16675fd0b74Schristos verilog_write_address (bfd *abfd, bfd_vma address)
16775fd0b74Schristos {
168*e992f068Schristos   char buffer[20];
16975fd0b74Schristos   char *dst = buffer;
17075fd0b74Schristos   bfd_size_type wrlen;
17175fd0b74Schristos 
17275fd0b74Schristos   /* Write the address.  */
17375fd0b74Schristos   *dst++ = '@';
174*e992f068Schristos #ifdef BFD64
175*e992f068Schristos   if (address >= (bfd_vma)1 << 32)
176*e992f068Schristos     {
177*e992f068Schristos       TOHEX (dst, (address >> 56));
178*e992f068Schristos       dst += 2;
179*e992f068Schristos       TOHEX (dst, (address >> 48));
180*e992f068Schristos       dst += 2;
181*e992f068Schristos       TOHEX (dst, (address >> 40));
182*e992f068Schristos       dst += 2;
183*e992f068Schristos       TOHEX (dst, (address >> 32));
184*e992f068Schristos       dst += 2;
185*e992f068Schristos     }
186*e992f068Schristos #endif
18775fd0b74Schristos   TOHEX (dst, (address >> 24));
18875fd0b74Schristos   dst += 2;
18975fd0b74Schristos   TOHEX (dst, (address >> 16));
19075fd0b74Schristos   dst += 2;
19175fd0b74Schristos   TOHEX (dst, (address >> 8));
19275fd0b74Schristos   dst += 2;
19375fd0b74Schristos   TOHEX (dst, (address));
19475fd0b74Schristos   dst += 2;
19575fd0b74Schristos   *dst++ = '\r';
19675fd0b74Schristos   *dst++ = '\n';
19775fd0b74Schristos   wrlen = dst - buffer;
19875fd0b74Schristos 
19975fd0b74Schristos   return bfd_bwrite ((void *) buffer, wrlen, abfd) == wrlen;
20075fd0b74Schristos }
20175fd0b74Schristos 
20275fd0b74Schristos /* Write a record of type, of the supplied number of bytes. The
203012573ebSchristos    supplied bytes and length don't have a checksum.  That's worked
204012573ebSchristos    out here.  */
20575fd0b74Schristos 
206*e992f068Schristos static bool
verilog_write_record(bfd * abfd,const bfd_byte * data,const bfd_byte * end)20775fd0b74Schristos verilog_write_record (bfd *abfd,
20875fd0b74Schristos 		      const bfd_byte *data,
20975fd0b74Schristos 		      const bfd_byte *end)
21075fd0b74Schristos {
211012573ebSchristos   char buffer[52];
21275fd0b74Schristos   const bfd_byte *src = data;
21375fd0b74Schristos   char *dst = buffer;
21475fd0b74Schristos   bfd_size_type wrlen;
21575fd0b74Schristos 
216012573ebSchristos   /* Paranoia - check that we will not overflow "buffer".  */
217012573ebSchristos   if (((end - data) * 2) /* Number of hex characters we want to emit.  */
218012573ebSchristos       + ((end - data) / VerilogDataWidth) /* Number of spaces we want to emit.  */
219012573ebSchristos       + 2 /* The carriage return & line feed characters.  */
220012573ebSchristos       > (long) sizeof (buffer))
221012573ebSchristos     {
222012573ebSchristos       /* FIXME: Should we generate an error message ?  */
223*e992f068Schristos       return false;
224012573ebSchristos     }
225012573ebSchristos 
226012573ebSchristos   /* Write the data.
227012573ebSchristos      FIXME: Under some circumstances we can emit a space at the end of
228012573ebSchristos      the line.  This is not really necessary, but catching these cases
229012573ebSchristos      would make the code more complicated.  */
230012573ebSchristos   if (VerilogDataWidth == 1)
231012573ebSchristos     {
232012573ebSchristos       for (src = data; src < end;)
23375fd0b74Schristos 	{
23475fd0b74Schristos 	  TOHEX (dst, *src);
23575fd0b74Schristos 	  dst += 2;
236012573ebSchristos 	  src ++;
237012573ebSchristos 	  if (src < end)
23875fd0b74Schristos 	    *dst++ = ' ';
23975fd0b74Schristos 	}
240012573ebSchristos     }
241012573ebSchristos   else if (bfd_little_endian (abfd))
242012573ebSchristos     {
243012573ebSchristos       /* If the input byte stream contains:
244012573ebSchristos 	   05 04 03 02 01 00
245012573ebSchristos 	 and VerilogDataWidth is 4 then we want to emit:
246012573ebSchristos            02030405 0001  */
247012573ebSchristos       int i;
248012573ebSchristos 
249012573ebSchristos       for (src = data; src < (end - VerilogDataWidth); src += VerilogDataWidth)
250012573ebSchristos 	{
251012573ebSchristos 	  for (i = VerilogDataWidth - 1; i >= 0; i--)
252012573ebSchristos 	    {
253012573ebSchristos 	      TOHEX (dst, src[i]);
254012573ebSchristos 	      dst += 2;
255012573ebSchristos 	    }
256012573ebSchristos 	  *dst++ = ' ';
257012573ebSchristos 	}
258012573ebSchristos 
259012573ebSchristos       /* Emit any remaining bytes.  Be careful not to read beyond "end".  */
260012573ebSchristos       while (end > src)
261012573ebSchristos 	{
262012573ebSchristos 	  -- end;
263012573ebSchristos 	  TOHEX (dst, *end);
264012573ebSchristos 	  dst += 2;
265012573ebSchristos 	}
266012573ebSchristos     }
267012573ebSchristos   else
268012573ebSchristos     {
269012573ebSchristos       for (src = data; src < end;)
270012573ebSchristos 	{
271012573ebSchristos 	  TOHEX (dst, *src);
272012573ebSchristos 	  dst += 2;
273012573ebSchristos 	  ++ src;
274012573ebSchristos 	  if ((src - data) % VerilogDataWidth == 0)
275012573ebSchristos 	    *dst++ = ' ';
276012573ebSchristos 	}
277012573ebSchristos     }
278012573ebSchristos 
27975fd0b74Schristos   *dst++ = '\r';
28075fd0b74Schristos   *dst++ = '\n';
28175fd0b74Schristos   wrlen = dst - buffer;
28275fd0b74Schristos 
28375fd0b74Schristos   return bfd_bwrite ((void *) buffer, wrlen, abfd) == wrlen;
28475fd0b74Schristos }
28575fd0b74Schristos 
286*e992f068Schristos static bool
verilog_write_section(bfd * abfd,tdata_type * tdata ATTRIBUTE_UNUSED,verilog_data_list_type * list)28775fd0b74Schristos verilog_write_section (bfd *abfd,
28875fd0b74Schristos 		       tdata_type *tdata ATTRIBUTE_UNUSED,
28975fd0b74Schristos 		       verilog_data_list_type *list)
29075fd0b74Schristos {
29175fd0b74Schristos   unsigned int octets_written = 0;
29275fd0b74Schristos   bfd_byte *location = list->data;
29375fd0b74Schristos 
29475fd0b74Schristos   verilog_write_address (abfd, list->where);
29575fd0b74Schristos   while (octets_written < list->size)
29675fd0b74Schristos     {
29775fd0b74Schristos       unsigned int octets_this_chunk = list->size - octets_written;
29875fd0b74Schristos 
29975fd0b74Schristos       if (octets_this_chunk > 16)
30075fd0b74Schristos 	octets_this_chunk = 16;
30175fd0b74Schristos 
30275fd0b74Schristos       if (! verilog_write_record (abfd,
30375fd0b74Schristos 				  location,
30475fd0b74Schristos 				  location + octets_this_chunk))
305*e992f068Schristos 	return false;
30675fd0b74Schristos 
30775fd0b74Schristos       octets_written += octets_this_chunk;
30875fd0b74Schristos       location += octets_this_chunk;
30975fd0b74Schristos     }
31075fd0b74Schristos 
311*e992f068Schristos   return true;
31275fd0b74Schristos }
31375fd0b74Schristos 
314*e992f068Schristos static bool
verilog_write_object_contents(bfd * abfd)31575fd0b74Schristos verilog_write_object_contents (bfd *abfd)
31675fd0b74Schristos {
31775fd0b74Schristos   tdata_type *tdata = abfd->tdata.verilog_data;
31875fd0b74Schristos   verilog_data_list_type *list;
31975fd0b74Schristos 
32075fd0b74Schristos   /* Now wander though all the sections provided and output them.  */
32175fd0b74Schristos   list = tdata->head;
32275fd0b74Schristos 
32375fd0b74Schristos   while (list != (verilog_data_list_type *) NULL)
32475fd0b74Schristos     {
32575fd0b74Schristos       if (! verilog_write_section (abfd, tdata, list))
326*e992f068Schristos 	return false;
32775fd0b74Schristos       list = list->next;
32875fd0b74Schristos     }
329*e992f068Schristos   return true;
33075fd0b74Schristos }
33175fd0b74Schristos 
33275fd0b74Schristos /* Initialize by filling in the hex conversion array.  */
33375fd0b74Schristos 
33475fd0b74Schristos static void
verilog_init(void)33575fd0b74Schristos verilog_init (void)
33675fd0b74Schristos {
337*e992f068Schristos   static bool inited = false;
33875fd0b74Schristos 
33975fd0b74Schristos   if (! inited)
34075fd0b74Schristos     {
341*e992f068Schristos       inited = true;
34275fd0b74Schristos       hex_init ();
34375fd0b74Schristos     }
34475fd0b74Schristos }
34575fd0b74Schristos 
34675fd0b74Schristos /* Set up the verilog tdata information.  */
34775fd0b74Schristos 
348*e992f068Schristos static bool
verilog_mkobject(bfd * abfd)34975fd0b74Schristos verilog_mkobject (bfd *abfd)
35075fd0b74Schristos {
35175fd0b74Schristos   tdata_type *tdata;
35275fd0b74Schristos 
35375fd0b74Schristos   verilog_init ();
35475fd0b74Schristos 
35575fd0b74Schristos   tdata = (tdata_type *) bfd_alloc (abfd, sizeof (tdata_type));
35675fd0b74Schristos   if (tdata == NULL)
357*e992f068Schristos     return false;
35875fd0b74Schristos 
35975fd0b74Schristos   abfd->tdata.verilog_data = tdata;
36075fd0b74Schristos   tdata->head = NULL;
36175fd0b74Schristos   tdata->tail = NULL;
36275fd0b74Schristos 
363*e992f068Schristos   return true;
36475fd0b74Schristos }
36575fd0b74Schristos 
36675fd0b74Schristos #define verilog_close_and_cleanup		     _bfd_generic_close_and_cleanup
36775fd0b74Schristos #define verilog_bfd_free_cached_info		     _bfd_generic_bfd_free_cached_info
36875fd0b74Schristos #define verilog_new_section_hook		     _bfd_generic_new_section_hook
369ede78133Schristos #define verilog_bfd_is_target_special_symbol	     _bfd_bool_bfd_asymbol_false
37075fd0b74Schristos #define verilog_bfd_is_local_label_name		     bfd_generic_is_local_label_name
37175fd0b74Schristos #define verilog_get_lineno			     _bfd_nosymbols_get_lineno
37275fd0b74Schristos #define verilog_find_nearest_line		     _bfd_nosymbols_find_nearest_line
37375fd0b74Schristos #define verilog_find_inliner_info		     _bfd_nosymbols_find_inliner_info
37475fd0b74Schristos #define verilog_make_empty_symbol		     _bfd_generic_make_empty_symbol
37575fd0b74Schristos #define verilog_bfd_make_debug_symbol		     _bfd_nosymbols_bfd_make_debug_symbol
37675fd0b74Schristos #define verilog_read_minisymbols		     _bfd_generic_read_minisymbols
37775fd0b74Schristos #define verilog_minisymbol_to_symbol		     _bfd_generic_minisymbol_to_symbol
37875fd0b74Schristos #define verilog_get_section_contents_in_window	     _bfd_generic_get_section_contents_in_window
37975fd0b74Schristos #define verilog_bfd_get_relocated_section_contents   bfd_generic_get_relocated_section_contents
38075fd0b74Schristos #define verilog_bfd_relax_section		     bfd_generic_relax_section
38175fd0b74Schristos #define verilog_bfd_gc_sections			     bfd_generic_gc_sections
38275fd0b74Schristos #define verilog_bfd_merge_sections		     bfd_generic_merge_sections
38375fd0b74Schristos #define verilog_bfd_is_group_section		     bfd_generic_is_group_section
384012573ebSchristos #define verilog_bfd_group_name			     bfd_generic_group_name
38575fd0b74Schristos #define verilog_bfd_discard_group		     bfd_generic_discard_group
38675fd0b74Schristos #define verilog_section_already_linked		     _bfd_generic_section_already_linked
38775fd0b74Schristos #define verilog_bfd_link_hash_table_create	     _bfd_generic_link_hash_table_create
38875fd0b74Schristos #define verilog_bfd_link_add_symbols		     _bfd_generic_link_add_symbols
38975fd0b74Schristos #define verilog_bfd_link_just_syms		     _bfd_generic_link_just_syms
39075fd0b74Schristos #define verilog_bfd_final_link			     _bfd_generic_final_link
39175fd0b74Schristos #define verilog_bfd_link_split_section		     _bfd_generic_link_split_section
39275fd0b74Schristos 
39375fd0b74Schristos const bfd_target verilog_vec =
39475fd0b74Schristos {
39575fd0b74Schristos   "verilog",			/* Name.  */
39675fd0b74Schristos   bfd_target_verilog_flavour,
39775fd0b74Schristos   BFD_ENDIAN_UNKNOWN,		/* Target byte order.  */
39875fd0b74Schristos   BFD_ENDIAN_UNKNOWN,		/* Target headers byte order.  */
39975fd0b74Schristos   (HAS_RELOC | EXEC_P |		/* Object flags.  */
40075fd0b74Schristos    HAS_LINENO | HAS_DEBUG |
40175fd0b74Schristos    HAS_SYMS | HAS_LOCALS | WP_TEXT | D_PAGED),
40275fd0b74Schristos   (SEC_CODE | SEC_DATA | SEC_ROM | SEC_HAS_CONTENTS
40375fd0b74Schristos    | SEC_ALLOC | SEC_LOAD | SEC_RELOC),	/* Section flags.  */
40475fd0b74Schristos   0,				/* Leading underscore.  */
40575fd0b74Schristos   ' ',				/* AR_pad_char.  */
40675fd0b74Schristos   16,				/* AR_max_namelen.  */
40775fd0b74Schristos   0,				/* match priority.  */
408*e992f068Schristos   TARGET_KEEP_UNUSED_SECTION_SYMBOLS, /* keep unused section symbols.  */
40975fd0b74Schristos   bfd_getb64, bfd_getb_signed_64, bfd_putb64,
41075fd0b74Schristos   bfd_getb32, bfd_getb_signed_32, bfd_putb32,
41175fd0b74Schristos   bfd_getb16, bfd_getb_signed_16, bfd_putb16,	/* Data.  */
41275fd0b74Schristos   bfd_getb64, bfd_getb_signed_64, bfd_putb64,
41375fd0b74Schristos   bfd_getb32, bfd_getb_signed_32, bfd_putb32,
41475fd0b74Schristos   bfd_getb16, bfd_getb_signed_16, bfd_putb16,	/* Hdrs.  */
41575fd0b74Schristos 
41675fd0b74Schristos   {
41775fd0b74Schristos     _bfd_dummy_target,
41875fd0b74Schristos     _bfd_dummy_target,
41975fd0b74Schristos     _bfd_dummy_target,
42075fd0b74Schristos     _bfd_dummy_target,
42175fd0b74Schristos   },
42275fd0b74Schristos   {
423ede78133Schristos     _bfd_bool_bfd_false_error,
42475fd0b74Schristos     verilog_mkobject,
425ede78133Schristos     _bfd_bool_bfd_false_error,
426ede78133Schristos     _bfd_bool_bfd_false_error,
42775fd0b74Schristos   },
42875fd0b74Schristos   {				/* bfd_write_contents.  */
429ede78133Schristos     _bfd_bool_bfd_false_error,
43075fd0b74Schristos     verilog_write_object_contents,
431ede78133Schristos     _bfd_bool_bfd_false_error,
432ede78133Schristos     _bfd_bool_bfd_false_error,
43375fd0b74Schristos   },
43475fd0b74Schristos 
43575fd0b74Schristos   BFD_JUMP_TABLE_GENERIC (_bfd_generic),
43675fd0b74Schristos   BFD_JUMP_TABLE_COPY (_bfd_generic),
43775fd0b74Schristos   BFD_JUMP_TABLE_CORE (_bfd_nocore),
43875fd0b74Schristos   BFD_JUMP_TABLE_ARCHIVE (_bfd_noarchive),
43975fd0b74Schristos   BFD_JUMP_TABLE_SYMBOLS (_bfd_nosymbols),
44075fd0b74Schristos   BFD_JUMP_TABLE_RELOCS (_bfd_norelocs),
44175fd0b74Schristos   BFD_JUMP_TABLE_WRITE (verilog),
44275fd0b74Schristos   BFD_JUMP_TABLE_LINK (_bfd_nolink),
44375fd0b74Schristos   BFD_JUMP_TABLE_DYNAMIC (_bfd_nodynamic),
44475fd0b74Schristos 
44575fd0b74Schristos   NULL,
44675fd0b74Schristos 
44775fd0b74Schristos   NULL
44875fd0b74Schristos };
449