Annotation of src/external/gpl3/binutils.old/dist/bfd/libxcoff.h, Revision 1.1.1.4
1.1 christos 1: /* BFD XCOFF object file private structure.
1.1.1.4 ! christos 2: Copyright (C) 2001-2018 Free Software Foundation, Inc.
1.1 christos 3: Written by Tom Rix, Redhat.
4:
5: This file is part of BFD, the Binary File Descriptor library.
6:
7: This program is free software; you can redistribute it and/or modify
8: it under the terms of the GNU General Public License as published by
9: the Free Software Foundation; either version 3 of the License, or
10: (at your option) any later version.
11:
12: This program is distributed in the hope that it will be useful,
13: but WITHOUT ANY WARRANTY; without even the implied warranty of
14: MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15: GNU General Public License for more details.
16:
17: You should have received a copy of the GNU General Public License
18: along with this program; if not, write to the Free Software
19: Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston,
20: MA 02110-1301, USA. */
21:
22: #ifndef LIBXCOFF_H
23: #define LIBXCOFF_H
24:
25: /* This is the backend information kept for XCOFF files. This
26: structure is constant for a particular backend. The first element
27: is the COFF backend data structure, so that XCOFF targets can use
28: the generic COFF code. */
29:
30: struct xcoff_backend_data_rec
31: {
32: /* COFF backend information. */
33: bfd_coff_backend_data coff;
34:
35: /* Magic number. */
36: unsigned short _xcoff_magic_number;
37:
38: /* Architecture and machine for coff_set_arch_mach_hook. */
39: enum bfd_architecture _xcoff_architecture;
40: long _xcoff_machine;
41:
42: /* Function pointers to xcoff specific swap routines. */
43: void (* _xcoff_swap_ldhdr_in) (bfd *, const void *, struct internal_ldhdr *);
44: void (* _xcoff_swap_ldhdr_out)(bfd *, const struct internal_ldhdr *, void *);
45: void (* _xcoff_swap_ldsym_in) (bfd *, const void *, struct internal_ldsym *);
46: void (* _xcoff_swap_ldsym_out)(bfd *, const struct internal_ldsym *, void *);
47: void (* _xcoff_swap_ldrel_in) (bfd *, const void *, struct internal_ldrel *);
48: void (* _xcoff_swap_ldrel_out)(bfd *, const struct internal_ldrel *, void *);
49:
50: /* Size of the external struct. */
51: unsigned int _xcoff_ldhdrsz;
52: unsigned int _xcoff_ldsymsz;
53: unsigned int _xcoff_ldrelsz;
54:
55: /* Size an entry in a descriptor section. */
56: unsigned int _xcoff_function_descriptor_size;
57:
58: /* Size of the small aout file header. */
59: unsigned int _xcoff_small_aout_header_size;
60:
61: /* Loader version
62: 1 : XCOFF32
63: 2 : XCOFF64. */
64: unsigned long _xcoff_ldhdr_version;
65:
66: bfd_boolean (* _xcoff_put_symbol_name)
1.1.1.3 christos 67: (struct bfd_link_info *, struct bfd_strtab_hash *,
68: struct internal_syment *, const char *);
1.1 christos 69:
70: bfd_boolean (* _xcoff_put_ldsymbol_name)
71: (bfd *, struct xcoff_loader_info *, struct internal_ldsym *,
72: const char *);
73:
74: reloc_howto_type *_xcoff_dynamic_reloc;
75:
76: asection * (* _xcoff_create_csect_from_smclas)
77: (bfd *, union internal_auxent *, const char *);
78:
79: /* Line number and relocation overflow.
1.1.1.2 christos 80: XCOFF32 overflows to another section when the line number or the
1.1 christos 81: relocation count exceeds 0xffff. XCOFF64 does not overflow. */
82: bfd_boolean (*_xcoff_is_lineno_count_overflow) (bfd *, bfd_vma);
83: bfd_boolean (*_xcoff_is_reloc_count_overflow) (bfd *, bfd_vma);
84:
85: /* Loader section symbol and relocation table offset
86: XCOFF32 is after the .loader header
87: XCOFF64 is offset in .loader header. */
88: bfd_vma (*_xcoff_loader_symbol_offset) (bfd *, struct internal_ldhdr *);
89: bfd_vma (*_xcoff_loader_reloc_offset) (bfd *, struct internal_ldhdr *);
1.1.1.2 christos 90:
91: /* Global linkage. The first word of global linkage code must be be
1.1 christos 92: modified by filling in the correct TOC offset. */
93: unsigned long *_xcoff_glink_code;
1.1.1.2 christos 94:
1.1 christos 95: /* Size of the global link code in bytes of the xcoff_glink_code table. */
96: unsigned long _xcoff_glink_size;
97:
98: /* rtinit. */
99: unsigned int _xcoff_rtinit_size;
100: bfd_boolean (*_xcoff_generate_rtinit)
101: (bfd *, const char *, const char *, bfd_boolean);
102: };
103:
104: /* Look up an entry in an XCOFF link hash table. */
105: #define xcoff_link_hash_lookup(table, string, create, copy, follow) \
106: ((struct xcoff_link_hash_entry *) \
107: bfd_link_hash_lookup (&(table)->root, (string), (create), (copy),\
108: (follow)))
109:
110: /* Traverse an XCOFF link hash table. */
111: #define xcoff_link_hash_traverse(table, func, info) \
112: (bfd_link_hash_traverse \
113: (&(table)->root, \
114: (bfd_boolean (*) (struct bfd_link_hash_entry *, void *)) (func), \
115: (info)))
116:
117: /* Get the XCOFF link hash table from the info structure. This is
118: just a cast. */
119: #define xcoff_hash_table(p) ((struct xcoff_link_hash_table *) ((p)->hash))
120:
121:
122: #define xcoff_backend(abfd) \
123: ((struct xcoff_backend_data_rec *) (abfd)->xvec->backend_data)
124:
125: #define bfd_xcoff_magic_number(a) ((xcoff_backend (a)->_xcoff_magic_number))
126: #define bfd_xcoff_architecture(a) ((xcoff_backend (a)->_xcoff_architecture))
127: #define bfd_xcoff_machine(a) ((xcoff_backend (a)->_xcoff_machine))
128:
129: #define bfd_xcoff_swap_ldhdr_in(a, b, c) \
130: ((xcoff_backend (a)->_xcoff_swap_ldhdr_in) ((a), (b), (c)))
131:
132: #define bfd_xcoff_swap_ldhdr_out(a, b, c) \
133: ((xcoff_backend (a)->_xcoff_swap_ldhdr_out) ((a), (b), (c)))
134:
135: #define bfd_xcoff_swap_ldsym_in(a, b, c) \
136: ((xcoff_backend (a)->_xcoff_swap_ldsym_in) ((a), (b), (c)))
137:
138: #define bfd_xcoff_swap_ldsym_out(a, b, c) \
139: ((xcoff_backend (a)->_xcoff_swap_ldsym_out) ((a), (b), (c)))
140:
141: #define bfd_xcoff_swap_ldrel_in(a, b, c) \
142: ((xcoff_backend (a)->_xcoff_swap_ldrel_in) ((a), (b), (c)))
143:
144: #define bfd_xcoff_swap_ldrel_out(a, b, c) \
145: ((xcoff_backend (a)->_xcoff_swap_ldrel_out) ((a), (b), (c)))
146:
147: #define bfd_xcoff_ldhdrsz(a) ((xcoff_backend (a)->_xcoff_ldhdrsz))
148: #define bfd_xcoff_ldsymsz(a) ((xcoff_backend (a)->_xcoff_ldsymsz))
149: #define bfd_xcoff_ldrelsz(a) ((xcoff_backend (a)->_xcoff_ldrelsz))
150: #define bfd_xcoff_function_descriptor_size(a) \
151: ((xcoff_backend (a)->_xcoff_function_descriptor_size))
152: #define bfd_xcoff_small_aout_header_size(a) \
153: ((xcoff_backend (a)->_xcoff_small_aout_header_size))
154:
155: #define bfd_xcoff_ldhdr_version(a) ((xcoff_backend (a)->_xcoff_ldhdr_version))
156:
1.1.1.3 christos 157: #define bfd_xcoff_put_symbol_name(a, b, c, d, e) \
158: ((xcoff_backend (a)->_xcoff_put_symbol_name) ((b), (c), (d), (e)))
1.1 christos 159:
160: #define bfd_xcoff_put_ldsymbol_name(a, b, c, d) \
161: ((xcoff_backend (a)->_xcoff_put_ldsymbol_name) ((a), (b), (c), (d)))
162:
163: /* Get the XCOFF hash table entries for a BFD. */
164: #define obj_xcoff_sym_hashes(bfd) \
165: ((struct xcoff_link_hash_entry **) obj_coff_sym_hashes (bfd))
166:
167: #define bfd_xcoff_dynamic_reloc_howto(a) \
168: ((xcoff_backend (a)->_xcoff_dynamic_reloc))
169:
170: #define bfd_xcoff_create_csect_from_smclas(a, b, c) \
171: ((xcoff_backend (a)->_xcoff_create_csect_from_smclas((a), (b), (c))))
172:
173: #define bfd_xcoff_is_lineno_count_overflow(a, b) \
174: ((xcoff_backend (a)->_xcoff_is_lineno_count_overflow((a), (b))))
175:
176: #define bfd_xcoff_is_reloc_count_overflow(a, b) \
177: ((xcoff_backend (a)->_xcoff_is_reloc_count_overflow((a), (b))))
178:
179: #define bfd_xcoff_loader_symbol_offset(a, b) \
180: ((xcoff_backend (a)->_xcoff_loader_symbol_offset((a), (b))))
181:
182: #define bfd_xcoff_loader_reloc_offset(a, b) \
183: ((xcoff_backend (a)->_xcoff_loader_reloc_offset((a), (b))))
184:
185: #define bfd_xcoff_glink_code(a, b) ((xcoff_backend (a)->_xcoff_glink_code[(b)]))
186: #define bfd_xcoff_glink_code_size(a) ((xcoff_backend (a)->_xcoff_glink_size))
187:
1.1.1.2 christos 188: /* Check for the magic number U803XTOCMAGIC or U64_TOCMAGIC for 64 bit
1.1 christos 189: targets. */
190: #define bfd_xcoff_is_xcoff64(a) \
191: ( (0x01EF == (bfd_xcoff_magic_number (a))) \
192: || (0x01F7 == (bfd_xcoff_magic_number (a))))
193:
194: /* Check for the magic number U802TOMAGIC for 32 bit targets. */
195: #define bfd_xcoff_is_xcoff32(a) (0x01DF == (bfd_xcoff_magic_number (a)))
196:
1.1.1.4 ! christos 197: #define bfd_xcoff_rtinit_size(a) ((xcoff_backend (a)->_xcoff_rtinit_size))
1.1 christos 198: #define bfd_xcoff_generate_rtinit(a, b, c, d) ((xcoff_backend (a)->_xcoff_generate_rtinit ((a), (b), (c), (d))))
199:
200: /* Accessor macros for tdata. */
201: #define bfd_xcoff_text_align_power(a) ((xcoff_data (a)->text_align_power))
202: #define bfd_xcoff_data_align_power(a) ((xcoff_data (a)->data_align_power))
203:
204: /* xcoff*_ppc_relocate_section macros */
205: #define XCOFF_MAX_CALCULATE_RELOCATION (0x1c)
206: #define XCOFF_MAX_COMPLAIN_OVERFLOW (4)
207: /* N_ONES produces N one bits, without overflowing machine arithmetic. */
208: #ifdef N_ONES
209: #undef N_ONES
210: #endif
211: #define N_ONES(n) (((((bfd_vma) 1 << ((n) - 1)) - 1) << 1) | 1)
212:
213: #define XCOFF_RELOC_FUNCTION_ARGS \
214: bfd *, asection *, bfd *, struct internal_reloc *, \
215: struct internal_syment *, struct reloc_howto_struct *, bfd_vma, bfd_vma, \
216: bfd_vma *relocation, bfd_byte *contents
217:
218: #define XCOFF_COMPLAIN_FUNCTION_ARGS \
219: bfd *, bfd_vma, bfd_vma, struct reloc_howto_struct *howto
220:
221: extern bfd_boolean (*xcoff_calculate_relocation[XCOFF_MAX_CALCULATE_RELOCATION])
222: (XCOFF_RELOC_FUNCTION_ARGS);
223: extern bfd_boolean (*xcoff_complain_overflow[XCOFF_MAX_COMPLAIN_OVERFLOW])
224: (XCOFF_COMPLAIN_FUNCTION_ARGS);
225:
226: #define XCOFF_NO_LONG_SECTION_NAMES (FALSE), bfd_coff_set_long_section_names_disallowed
227:
228: /* Relocation functions */
229: bfd_boolean xcoff_reloc_type_noop (XCOFF_RELOC_FUNCTION_ARGS);
230: bfd_boolean xcoff_reloc_type_fail (XCOFF_RELOC_FUNCTION_ARGS);
231: bfd_boolean xcoff_reloc_type_pos (XCOFF_RELOC_FUNCTION_ARGS);
232: bfd_boolean xcoff_reloc_type_neg (XCOFF_RELOC_FUNCTION_ARGS);
233: bfd_boolean xcoff_reloc_type_rel (XCOFF_RELOC_FUNCTION_ARGS);
234: bfd_boolean xcoff_reloc_type_toc (XCOFF_RELOC_FUNCTION_ARGS);
235: bfd_boolean xcoff_reloc_type_ba (XCOFF_RELOC_FUNCTION_ARGS);
236: bfd_boolean xcoff_reloc_type_crel (XCOFF_RELOC_FUNCTION_ARGS);
237:
238: /* Structure to describe dwarf sections.
239: Useful to convert from XCOFF section name to flag and vice-versa.
240: Also mark if section has a length field at the beginning. */
241: struct xcoff_dwsect_name {
242: /* A XCOFF dwarf section is identified by its name. */
243: unsigned int flag;
244:
245: /* Corresponding XCOFF section name. */
246: const char *name;
247:
248: /* True if size must be prepended. */
249: bfd_boolean def_size;
250: };
251:
252: /* Number of entries in the array. The number is known and public so that user
253: can 'extend' this array by index. */
254: #define XCOFF_DWSECT_NBR_NAMES 8
255:
256: /* The dwarf sections array. */
257: extern const struct xcoff_dwsect_name
258: xcoff_dwsect_names[XCOFF_DWSECT_NBR_NAMES];
259:
260: #endif /* LIBXCOFF_H */
CVSweb <webmaster@jp.NetBSD.org>