xref: /dflybsd-src/contrib/gdb-7/bfd/verilog.c (revision ec70266467411565ead9166ad4c1dbb79ff7cd77)
15796c8dcSSimon Schubert /* BFD back-end for verilog hex memory dump files.
2*a45ae5f8SJohn Marino    Copyright 2009, 2010, 2011
35796c8dcSSimon Schubert    Free Software Foundation, Inc.
45796c8dcSSimon Schubert    Written by Anthony Green <green@moxielogic.com>
55796c8dcSSimon Schubert 
65796c8dcSSimon Schubert    This file is part of BFD, the Binary File Descriptor library.
75796c8dcSSimon Schubert 
85796c8dcSSimon Schubert    This program is free software; you can redistribute it and/or modify
95796c8dcSSimon Schubert    it under the terms of the GNU General Public License as published by
105796c8dcSSimon Schubert    the Free Software Foundation; either version 3 of the License, or
115796c8dcSSimon Schubert    (at your option) any later version.
125796c8dcSSimon Schubert 
135796c8dcSSimon Schubert    This program is distributed in the hope that it will be useful,
145796c8dcSSimon Schubert    but WITHOUT ANY WARRANTY; without even the implied warranty of
155796c8dcSSimon Schubert    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
165796c8dcSSimon Schubert    GNU General Public License for more details.
175796c8dcSSimon Schubert 
185796c8dcSSimon Schubert    You should have received a copy of the GNU General Public License
195796c8dcSSimon Schubert    along with this program; if not, write to the Free Software
205796c8dcSSimon Schubert    Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston,
215796c8dcSSimon Schubert    MA 02110-1301, USA.  */
225796c8dcSSimon Schubert 
235796c8dcSSimon Schubert 
245796c8dcSSimon Schubert /* SUBSECTION
255796c8dcSSimon Schubert 	Verilog hex memory file handling
265796c8dcSSimon Schubert 
275796c8dcSSimon Schubert    DESCRIPTION
285796c8dcSSimon Schubert 
295796c8dcSSimon Schubert 	Verilog hex memory files cannot hold anything but addresses
305796c8dcSSimon Schubert 	and data, so that's all that we implement.
315796c8dcSSimon Schubert 
325796c8dcSSimon Schubert 	The syntax of the text file is described in the IEEE standard
335796c8dcSSimon Schubert 	for Verilog.  Briefly, the file contains two types of tokens:
345796c8dcSSimon Schubert 	data and optional addresses.  The tokens are separated by
355796c8dcSSimon Schubert 	whitespace and comments.  Comments may be single line or
365796c8dcSSimon Schubert 	multiline, using syntax similar to C++.  Addresses are
375796c8dcSSimon Schubert 	specified by a leading "at" character (@) and are always
385796c8dcSSimon Schubert 	hexadecimal strings.  Data and addresses may contain
395796c8dcSSimon Schubert 	underscore (_) characters.
405796c8dcSSimon Schubert 
415796c8dcSSimon Schubert 	If no address is specified, the data is assumed to start at
425796c8dcSSimon Schubert 	address 0.  Similarly, if data exists before the first
435796c8dcSSimon Schubert 	specified address, then that data is assumed to start at
445796c8dcSSimon Schubert 	address 0.
455796c8dcSSimon Schubert 
465796c8dcSSimon Schubert 
475796c8dcSSimon Schubert    EXAMPLE
485796c8dcSSimon Schubert 	@1000
495796c8dcSSimon Schubert         01 ae 3f 45 12
505796c8dcSSimon Schubert 
515796c8dcSSimon Schubert    DESCRIPTION
525796c8dcSSimon Schubert 	@1000 specifies the starting address for the memory data.
535796c8dcSSimon Schubert 	The following characters describe the 5 bytes at 0x1000.  */
545796c8dcSSimon Schubert 
555796c8dcSSimon Schubert 
565796c8dcSSimon Schubert #include "sysdep.h"
575796c8dcSSimon Schubert #include "bfd.h"
585796c8dcSSimon Schubert #include "libbfd.h"
595796c8dcSSimon Schubert #include "libiberty.h"
605796c8dcSSimon Schubert #include "safe-ctype.h"
615796c8dcSSimon Schubert 
625796c8dcSSimon Schubert /* Macros for converting between hex and binary.  */
635796c8dcSSimon Schubert 
645796c8dcSSimon Schubert static const char digs[] = "0123456789ABCDEF";
655796c8dcSSimon Schubert 
665796c8dcSSimon Schubert #define NIBBLE(x)    hex_value(x)
675796c8dcSSimon Schubert #define HEX(buffer) ((NIBBLE ((buffer)[0])<<4) + NIBBLE ((buffer)[1]))
685796c8dcSSimon Schubert #define TOHEX(d, x) \
695796c8dcSSimon Schubert 	d[1] = digs[(x) & 0xf]; \
705796c8dcSSimon Schubert 	d[0] = digs[((x) >> 4) & 0xf];
715796c8dcSSimon Schubert 
725796c8dcSSimon Schubert /* When writing a verilog memory dump file, we write them in the order
735796c8dcSSimon Schubert    in which they appear in memory. This structure is used to hold them
745796c8dcSSimon Schubert    in memory.  */
755796c8dcSSimon Schubert 
765796c8dcSSimon Schubert struct verilog_data_list_struct
775796c8dcSSimon Schubert {
785796c8dcSSimon Schubert   struct verilog_data_list_struct *next;
795796c8dcSSimon Schubert   bfd_byte * data;
805796c8dcSSimon Schubert   bfd_vma where;
815796c8dcSSimon Schubert   bfd_size_type size;
825796c8dcSSimon Schubert };
835796c8dcSSimon Schubert 
845796c8dcSSimon Schubert typedef struct verilog_data_list_struct verilog_data_list_type;
855796c8dcSSimon Schubert 
865796c8dcSSimon Schubert /* The verilog tdata information.  */
875796c8dcSSimon Schubert 
885796c8dcSSimon Schubert typedef struct verilog_data_struct
895796c8dcSSimon Schubert {
905796c8dcSSimon Schubert   verilog_data_list_type *head;
915796c8dcSSimon Schubert   verilog_data_list_type *tail;
925796c8dcSSimon Schubert }
935796c8dcSSimon Schubert tdata_type;
945796c8dcSSimon Schubert 
955796c8dcSSimon Schubert static bfd_boolean
verilog_set_arch_mach(bfd * abfd,enum bfd_architecture arch,unsigned long mach)965796c8dcSSimon Schubert verilog_set_arch_mach (bfd *abfd, enum bfd_architecture arch, unsigned long mach)
975796c8dcSSimon Schubert {
985796c8dcSSimon Schubert   if (arch != bfd_arch_unknown)
995796c8dcSSimon Schubert     return bfd_default_set_arch_mach (abfd, arch, mach);
1005796c8dcSSimon Schubert 
1015796c8dcSSimon Schubert   abfd->arch_info = & bfd_default_arch_struct;
1025796c8dcSSimon Schubert   return TRUE;
1035796c8dcSSimon Schubert }
1045796c8dcSSimon Schubert 
1055796c8dcSSimon Schubert /* We have to save up all the outpu for a splurge before output.  */
1065796c8dcSSimon Schubert 
1075796c8dcSSimon Schubert static bfd_boolean
verilog_set_section_contents(bfd * abfd,sec_ptr section,const void * location,file_ptr offset,bfd_size_type bytes_to_do)1085796c8dcSSimon Schubert verilog_set_section_contents (bfd *abfd,
1095796c8dcSSimon Schubert 			      sec_ptr section,
1105796c8dcSSimon Schubert 			      const void * location,
1115796c8dcSSimon Schubert 			      file_ptr offset,
1125796c8dcSSimon Schubert 			      bfd_size_type bytes_to_do)
1135796c8dcSSimon Schubert {
1145796c8dcSSimon Schubert   tdata_type *tdata = abfd->tdata.verilog_data;
1155796c8dcSSimon Schubert   verilog_data_list_type *entry;
1165796c8dcSSimon Schubert 
1175796c8dcSSimon Schubert   entry = (verilog_data_list_type *) bfd_alloc (abfd, sizeof (* entry));
1185796c8dcSSimon Schubert   if (entry == NULL)
1195796c8dcSSimon Schubert     return FALSE;
1205796c8dcSSimon Schubert 
1215796c8dcSSimon Schubert   if (bytes_to_do
1225796c8dcSSimon Schubert       && (section->flags & SEC_ALLOC)
1235796c8dcSSimon Schubert       && (section->flags & SEC_LOAD))
1245796c8dcSSimon Schubert     {
1255796c8dcSSimon Schubert       bfd_byte *data;
1265796c8dcSSimon Schubert 
1275796c8dcSSimon Schubert       data = (bfd_byte *) bfd_alloc (abfd, bytes_to_do);
1285796c8dcSSimon Schubert       if (data == NULL)
1295796c8dcSSimon Schubert 	return FALSE;
1305796c8dcSSimon Schubert       memcpy ((void *) data, location, (size_t) bytes_to_do);
1315796c8dcSSimon Schubert 
1325796c8dcSSimon Schubert       entry->data = data;
1335796c8dcSSimon Schubert       entry->where = section->lma + offset;
1345796c8dcSSimon Schubert       entry->size = bytes_to_do;
1355796c8dcSSimon Schubert 
1365796c8dcSSimon Schubert       /* Sort the records by address.  Optimize for the common case of
1375796c8dcSSimon Schubert 	 adding a record to the end of the list.  */
1385796c8dcSSimon Schubert       if (tdata->tail != NULL
1395796c8dcSSimon Schubert 	  && entry->where >= tdata->tail->where)
1405796c8dcSSimon Schubert 	{
1415796c8dcSSimon Schubert 	  tdata->tail->next = entry;
1425796c8dcSSimon Schubert 	  entry->next = NULL;
1435796c8dcSSimon Schubert 	  tdata->tail = entry;
1445796c8dcSSimon Schubert 	}
1455796c8dcSSimon Schubert       else
1465796c8dcSSimon Schubert 	{
1475796c8dcSSimon Schubert 	  verilog_data_list_type **look;
1485796c8dcSSimon Schubert 
1495796c8dcSSimon Schubert 	  for (look = &tdata->head;
1505796c8dcSSimon Schubert 	       *look != NULL && (*look)->where < entry->where;
1515796c8dcSSimon Schubert 	       look = &(*look)->next)
1525796c8dcSSimon Schubert 	    ;
1535796c8dcSSimon Schubert 	  entry->next = *look;
1545796c8dcSSimon Schubert 	  *look = entry;
1555796c8dcSSimon Schubert 	  if (entry->next == NULL)
1565796c8dcSSimon Schubert 	    tdata->tail = entry;
1575796c8dcSSimon Schubert 	}
1585796c8dcSSimon Schubert     }
1595796c8dcSSimon Schubert   return TRUE;
1605796c8dcSSimon Schubert }
1615796c8dcSSimon Schubert 
1625796c8dcSSimon Schubert static bfd_boolean
verilog_write_address(bfd * abfd,bfd_vma address)1635796c8dcSSimon Schubert verilog_write_address (bfd *abfd, bfd_vma address)
1645796c8dcSSimon Schubert {
1655796c8dcSSimon Schubert   char buffer[12];
1665796c8dcSSimon Schubert   char *dst = buffer;
1675796c8dcSSimon Schubert   bfd_size_type wrlen;
1685796c8dcSSimon Schubert 
1695796c8dcSSimon Schubert   /* Write the address.  */
1705796c8dcSSimon Schubert   *dst++ = '@';
1715796c8dcSSimon Schubert   TOHEX (dst, (address >> 24));
1725796c8dcSSimon Schubert   dst += 2;
1735796c8dcSSimon Schubert   TOHEX (dst, (address >> 16));
1745796c8dcSSimon Schubert   dst += 2;
1755796c8dcSSimon Schubert   TOHEX (dst, (address >> 8));
1765796c8dcSSimon Schubert   dst += 2;
1775796c8dcSSimon Schubert   TOHEX (dst, (address));
1785796c8dcSSimon Schubert   dst += 2;
1795796c8dcSSimon Schubert   *dst++ = '\r';
1805796c8dcSSimon Schubert   *dst++ = '\n';
1815796c8dcSSimon Schubert   wrlen = dst - buffer;
1825796c8dcSSimon Schubert 
1835796c8dcSSimon Schubert   return bfd_bwrite ((void *) buffer, wrlen, abfd) == wrlen;
1845796c8dcSSimon Schubert }
1855796c8dcSSimon Schubert 
1865796c8dcSSimon Schubert /* Write a record of type, of the supplied number of bytes. The
1875796c8dcSSimon Schubert    supplied bytes and length don't have a checksum. That's worked out
1885796c8dcSSimon Schubert    here.  */
1895796c8dcSSimon Schubert 
1905796c8dcSSimon Schubert static bfd_boolean
verilog_write_record(bfd * abfd,const bfd_byte * data,const bfd_byte * end)1915796c8dcSSimon Schubert verilog_write_record (bfd *abfd,
1925796c8dcSSimon Schubert 		      const bfd_byte *data,
1935796c8dcSSimon Schubert 		      const bfd_byte *end)
1945796c8dcSSimon Schubert {
1955796c8dcSSimon Schubert   char buffer[48];
1965796c8dcSSimon Schubert   const bfd_byte *src = data;
1975796c8dcSSimon Schubert   char *dst = buffer;
1985796c8dcSSimon Schubert   bfd_size_type wrlen;
1995796c8dcSSimon Schubert 
2005796c8dcSSimon Schubert   /* Write the data.  */
2015796c8dcSSimon Schubert   for (src = data; src < end; src++)
2025796c8dcSSimon Schubert     {
2035796c8dcSSimon Schubert       TOHEX (dst, *src);
2045796c8dcSSimon Schubert       dst += 2;
2055796c8dcSSimon Schubert       *dst++ = ' ';
2065796c8dcSSimon Schubert     }
2075796c8dcSSimon Schubert   *dst++ = '\r';
2085796c8dcSSimon Schubert   *dst++ = '\n';
2095796c8dcSSimon Schubert   wrlen = dst - buffer;
2105796c8dcSSimon Schubert 
2115796c8dcSSimon Schubert   return bfd_bwrite ((void *) buffer, wrlen, abfd) == wrlen;
2125796c8dcSSimon Schubert }
2135796c8dcSSimon Schubert 
2145796c8dcSSimon Schubert static bfd_boolean
verilog_write_section(bfd * abfd,tdata_type * tdata ATTRIBUTE_UNUSED,verilog_data_list_type * list)2155796c8dcSSimon Schubert verilog_write_section (bfd *abfd,
2165796c8dcSSimon Schubert 		       tdata_type *tdata ATTRIBUTE_UNUSED,
2175796c8dcSSimon Schubert 		       verilog_data_list_type *list)
2185796c8dcSSimon Schubert {
2195796c8dcSSimon Schubert   unsigned int octets_written = 0;
2205796c8dcSSimon Schubert   bfd_byte *location = list->data;
2215796c8dcSSimon Schubert 
2225796c8dcSSimon Schubert   verilog_write_address (abfd, list->where);
2235796c8dcSSimon Schubert   while (octets_written < list->size)
2245796c8dcSSimon Schubert     {
2255796c8dcSSimon Schubert       unsigned int octets_this_chunk = list->size - octets_written;
2265796c8dcSSimon Schubert 
2275796c8dcSSimon Schubert       if (octets_this_chunk > 16)
2285796c8dcSSimon Schubert 	octets_this_chunk = 16;
2295796c8dcSSimon Schubert 
2305796c8dcSSimon Schubert       if (! verilog_write_record (abfd,
2315796c8dcSSimon Schubert 				  location,
2325796c8dcSSimon Schubert 				  location + octets_this_chunk))
2335796c8dcSSimon Schubert 	return FALSE;
2345796c8dcSSimon Schubert 
2355796c8dcSSimon Schubert       octets_written += octets_this_chunk;
2365796c8dcSSimon Schubert       location += octets_this_chunk;
2375796c8dcSSimon Schubert     }
2385796c8dcSSimon Schubert 
2395796c8dcSSimon Schubert   return TRUE;
2405796c8dcSSimon Schubert }
2415796c8dcSSimon Schubert 
2425796c8dcSSimon Schubert static bfd_boolean
verilog_write_object_contents(bfd * abfd)2435796c8dcSSimon Schubert verilog_write_object_contents (bfd *abfd)
2445796c8dcSSimon Schubert {
2455796c8dcSSimon Schubert   tdata_type *tdata = abfd->tdata.verilog_data;
2465796c8dcSSimon Schubert   verilog_data_list_type *list;
2475796c8dcSSimon Schubert 
2485796c8dcSSimon Schubert   /* Now wander though all the sections provided and output them.  */
2495796c8dcSSimon Schubert   list = tdata->head;
2505796c8dcSSimon Schubert 
2515796c8dcSSimon Schubert   while (list != (verilog_data_list_type *) NULL)
2525796c8dcSSimon Schubert     {
2535796c8dcSSimon Schubert       if (! verilog_write_section (abfd, tdata, list))
2545796c8dcSSimon Schubert 	return FALSE;
2555796c8dcSSimon Schubert       list = list->next;
2565796c8dcSSimon Schubert     }
2575796c8dcSSimon Schubert   return TRUE;
2585796c8dcSSimon Schubert }
2595796c8dcSSimon Schubert 
2605796c8dcSSimon Schubert /* Initialize by filling in the hex conversion array.  */
2615796c8dcSSimon Schubert 
2625796c8dcSSimon Schubert static void
verilog_init(void)2635796c8dcSSimon Schubert verilog_init (void)
2645796c8dcSSimon Schubert {
2655796c8dcSSimon Schubert   static bfd_boolean inited = FALSE;
2665796c8dcSSimon Schubert 
2675796c8dcSSimon Schubert   if (! inited)
2685796c8dcSSimon Schubert     {
2695796c8dcSSimon Schubert       inited = TRUE;
2705796c8dcSSimon Schubert       hex_init ();
2715796c8dcSSimon Schubert     }
2725796c8dcSSimon Schubert }
2735796c8dcSSimon Schubert 
2745796c8dcSSimon Schubert /* Set up the verilog tdata information.  */
2755796c8dcSSimon Schubert 
2765796c8dcSSimon Schubert static bfd_boolean
verilog_mkobject(bfd * abfd)2775796c8dcSSimon Schubert verilog_mkobject (bfd *abfd)
2785796c8dcSSimon Schubert {
2795796c8dcSSimon Schubert   tdata_type *tdata;
2805796c8dcSSimon Schubert 
2815796c8dcSSimon Schubert   verilog_init ();
2825796c8dcSSimon Schubert 
2835796c8dcSSimon Schubert   tdata = (tdata_type *) bfd_alloc (abfd, sizeof (tdata_type));
2845796c8dcSSimon Schubert   if (tdata == NULL)
2855796c8dcSSimon Schubert     return FALSE;
2865796c8dcSSimon Schubert 
2875796c8dcSSimon Schubert   abfd->tdata.verilog_data = tdata;
2885796c8dcSSimon Schubert   tdata->head = NULL;
2895796c8dcSSimon Schubert   tdata->tail = NULL;
2905796c8dcSSimon Schubert 
2915796c8dcSSimon Schubert   return TRUE;
2925796c8dcSSimon Schubert }
2935796c8dcSSimon Schubert 
2945796c8dcSSimon Schubert #define	verilog_close_and_cleanup                    _bfd_generic_close_and_cleanup
2955796c8dcSSimon Schubert #define verilog_bfd_free_cached_info                 _bfd_generic_bfd_free_cached_info
2965796c8dcSSimon Schubert #define verilog_new_section_hook                     _bfd_generic_new_section_hook
2975796c8dcSSimon Schubert #define verilog_bfd_is_target_special_symbol         ((bfd_boolean (*) (bfd *, asymbol *)) bfd_false)
2985796c8dcSSimon Schubert #define verilog_bfd_is_local_label_name              bfd_generic_is_local_label_name
2995796c8dcSSimon Schubert #define verilog_get_lineno                           _bfd_nosymbols_get_lineno
3005796c8dcSSimon Schubert #define verilog_find_nearest_line                    _bfd_nosymbols_find_nearest_line
3015796c8dcSSimon Schubert #define verilog_find_inliner_info                    _bfd_nosymbols_find_inliner_info
3025796c8dcSSimon Schubert #define verilog_make_empty_symbol                    _bfd_generic_make_empty_symbol
3035796c8dcSSimon Schubert #define verilog_bfd_make_debug_symbol                _bfd_nosymbols_bfd_make_debug_symbol
3045796c8dcSSimon Schubert #define verilog_read_minisymbols                     _bfd_generic_read_minisymbols
3055796c8dcSSimon Schubert #define verilog_minisymbol_to_symbol                 _bfd_generic_minisymbol_to_symbol
3065796c8dcSSimon Schubert #define verilog_get_section_contents_in_window       _bfd_generic_get_section_contents_in_window
3075796c8dcSSimon Schubert #define verilog_bfd_get_relocated_section_contents   bfd_generic_get_relocated_section_contents
3085796c8dcSSimon Schubert #define verilog_bfd_relax_section                    bfd_generic_relax_section
3095796c8dcSSimon Schubert #define verilog_bfd_gc_sections                      bfd_generic_gc_sections
3105796c8dcSSimon Schubert #define verilog_bfd_merge_sections                   bfd_generic_merge_sections
3115796c8dcSSimon Schubert #define verilog_bfd_is_group_section                 bfd_generic_is_group_section
3125796c8dcSSimon Schubert #define verilog_bfd_discard_group                    bfd_generic_discard_group
3135796c8dcSSimon Schubert #define verilog_section_already_linked               _bfd_generic_section_already_linked
3145796c8dcSSimon Schubert #define verilog_bfd_link_hash_table_create           _bfd_generic_link_hash_table_create
3155796c8dcSSimon Schubert #define verilog_bfd_link_hash_table_free             _bfd_generic_link_hash_table_free
3165796c8dcSSimon Schubert #define verilog_bfd_link_add_symbols                 _bfd_generic_link_add_symbols
3175796c8dcSSimon Schubert #define verilog_bfd_link_just_syms                   _bfd_generic_link_just_syms
3185796c8dcSSimon Schubert #define verilog_bfd_final_link                       _bfd_generic_final_link
3195796c8dcSSimon Schubert #define verilog_bfd_link_split_section               _bfd_generic_link_split_section
3205796c8dcSSimon Schubert 
3215796c8dcSSimon Schubert const bfd_target verilog_vec =
3225796c8dcSSimon Schubert {
3235796c8dcSSimon Schubert   "verilog",			/* Name.  */
3245796c8dcSSimon Schubert   bfd_target_verilog_flavour,
3255796c8dcSSimon Schubert   BFD_ENDIAN_UNKNOWN,		/* Target byte order.  */
3265796c8dcSSimon Schubert   BFD_ENDIAN_UNKNOWN,		/* Target headers byte order.  */
3275796c8dcSSimon Schubert   (HAS_RELOC | EXEC_P |		/* Object flags.  */
3285796c8dcSSimon Schubert    HAS_LINENO | HAS_DEBUG |
3295796c8dcSSimon Schubert    HAS_SYMS | HAS_LOCALS | WP_TEXT | D_PAGED),
3305796c8dcSSimon Schubert   (SEC_CODE | SEC_DATA | SEC_ROM | SEC_HAS_CONTENTS
3315796c8dcSSimon Schubert    | SEC_ALLOC | SEC_LOAD | SEC_RELOC),	/* Section flags.  */
3325796c8dcSSimon Schubert   0,				/* Leading underscore.  */
3335796c8dcSSimon Schubert   ' ',				/* AR_pad_char.  */
3345796c8dcSSimon Schubert   16,				/* AR_max_namelen.  */
335*a45ae5f8SJohn Marino   0,				/* match priority.  */
3365796c8dcSSimon Schubert   bfd_getb64, bfd_getb_signed_64, bfd_putb64,
3375796c8dcSSimon Schubert   bfd_getb32, bfd_getb_signed_32, bfd_putb32,
3385796c8dcSSimon Schubert   bfd_getb16, bfd_getb_signed_16, bfd_putb16,	/* Data.  */
3395796c8dcSSimon Schubert   bfd_getb64, bfd_getb_signed_64, bfd_putb64,
3405796c8dcSSimon Schubert   bfd_getb32, bfd_getb_signed_32, bfd_putb32,
3415796c8dcSSimon Schubert   bfd_getb16, bfd_getb_signed_16, bfd_putb16,	/* Hdrs.  */
3425796c8dcSSimon Schubert 
3435796c8dcSSimon Schubert   {
3445796c8dcSSimon Schubert     _bfd_dummy_target,
3455796c8dcSSimon Schubert     _bfd_dummy_target,
3465796c8dcSSimon Schubert     _bfd_dummy_target,
3475796c8dcSSimon Schubert     _bfd_dummy_target,
3485796c8dcSSimon Schubert   },
3495796c8dcSSimon Schubert   {
3505796c8dcSSimon Schubert     bfd_false,
3515796c8dcSSimon Schubert     verilog_mkobject,
3525796c8dcSSimon Schubert     bfd_false,
3535796c8dcSSimon Schubert     bfd_false,
3545796c8dcSSimon Schubert   },
3555796c8dcSSimon Schubert   {				/* bfd_write_contents.  */
3565796c8dcSSimon Schubert     bfd_false,
3575796c8dcSSimon Schubert     verilog_write_object_contents,
3585796c8dcSSimon Schubert     bfd_false,
3595796c8dcSSimon Schubert     bfd_false,
3605796c8dcSSimon Schubert   },
3615796c8dcSSimon Schubert 
3625796c8dcSSimon Schubert   BFD_JUMP_TABLE_GENERIC (_bfd_generic),
3635796c8dcSSimon Schubert   BFD_JUMP_TABLE_COPY (_bfd_generic),
3645796c8dcSSimon Schubert   BFD_JUMP_TABLE_CORE (_bfd_nocore),
3655796c8dcSSimon Schubert   BFD_JUMP_TABLE_ARCHIVE (_bfd_noarchive),
3665796c8dcSSimon Schubert   BFD_JUMP_TABLE_SYMBOLS (_bfd_nosymbols),
3675796c8dcSSimon Schubert   BFD_JUMP_TABLE_RELOCS (_bfd_norelocs),
3685796c8dcSSimon Schubert   BFD_JUMP_TABLE_WRITE (verilog),
3695796c8dcSSimon Schubert   BFD_JUMP_TABLE_LINK (_bfd_nolink),
3705796c8dcSSimon Schubert   BFD_JUMP_TABLE_DYNAMIC (_bfd_nodynamic),
3715796c8dcSSimon Schubert 
3725796c8dcSSimon Schubert   NULL,
3735796c8dcSSimon Schubert 
3745796c8dcSSimon Schubert   NULL
3755796c8dcSSimon Schubert };
376