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