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