* v850-opc.c: Close unterminated comment.
[deliverable/binutils-gdb.git] / gas / config / obj-coff.h
1 /* coff object file format
2 Copyright (C) 1989, 1990, 1991, 1992, 1994 Free Software Foundation, Inc.
3
4 This file is part of GAS.
5
6 GAS is free software; you can redistribute it and/or modify
7 it under the terms of the GNU General Public License as published by
8 the Free Software Foundation; either version 2, or (at your option)
9 any later version.
10
11 GAS is distributed in the hope that it will be useful,
12 but WITHOUT ANY WARRANTY; without even the implied warranty of
13 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
14 GNU General Public License for more details.
15
16 You should have received a copy of the GNU General Public License
17 along with GAS; see the file COPYING. If not, write to
18 the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA. */
19
20 #ifndef OBJ_FORMAT_H
21 #define OBJ_FORMAT_H
22
23 #define OBJ_COFF 1
24
25 #ifndef BFD_ASSEMBLER
26
27 #define WORKING_DOT_WORD
28 #define WARN_SIGNED_OVERFLOW_WORD
29 #define OBJ_COFF_OMIT_OPTIONAL_HEADER
30 #define BFD_HEADERS
31 #define BFD
32
33 #endif
34
35 #include "targ-cpu.h"
36
37 #include "bfd.h"
38
39 /* This internal_lineno crap is to stop namespace pollution from the
40 bfd internal coff headerfile. */
41 #define internal_lineno bfd_internal_lineno
42 #include "coff/internal.h"
43 #undef internal_lineno
44
45 /* CPU-specific setup: */
46
47 #ifdef TC_ARM
48 #include "coff/arm.h"
49
50 #ifdef TE_PE
51 #define TARGET_FORMAT "pe-arm"
52 #endif
53 #ifndef TARGET_FORMAT
54 #define TARGET_FORMAT "coff-arm"
55 #endif
56 #endif
57
58 #ifdef TC_PPC
59 #include "coff/rs6000.h"
60 #endif
61
62 #ifdef TC_SPARC
63 #include "coff/sparc.h"
64 #ifdef TE_LYNX
65 #define TARGET_FORMAT "coff-sparc-lynx"
66 #else
67 #define TARGET_FORMAT "coff-sparc"
68 #endif
69 #endif
70
71 #ifdef TC_I386
72 #include "coff/i386.h"
73
74 #ifdef TE_PE
75 #define TARGET_FORMAT "pe-i386"
76 #endif
77
78 #ifndef TARGET_FORMAT
79 #define TARGET_FORMAT "coff-i386"
80 #endif
81 #endif
82
83 #ifdef TC_M68K
84 #include "coff/m68k.h"
85 #ifndef TARGET_FORMAT
86 #define TARGET_FORMAT "coff-m68k"
87 #endif
88 #endif
89
90 #ifdef TC_A29K
91 #include "coff/a29k.h"
92 #define TARGET_FORMAT "coff-a29k-big"
93 #endif
94
95 #ifdef TC_I960
96 #include "coff/i960.h"
97 #define TARGET_FORMAT "coff-Intel-little"
98 #endif
99
100 #ifdef TC_Z8K
101 #include "coff/z8k.h"
102 #define TARGET_FORMAT "coff-z8k"
103 #endif
104
105 #ifdef TC_H8300
106 #include "coff/h8300.h"
107 #define TARGET_FORMAT "coff-h8300"
108 #endif
109
110 #ifdef TC_H8500
111 #include "coff/h8500.h"
112 #define TARGET_FORMAT "coff-h8500"
113 #endif
114
115 #ifdef TC_SH
116 #include "coff/sh.h"
117 #define TARGET_FORMAT (shl ? "coff-shl" : "coff-sh")
118 #endif
119
120 #ifdef TC_M88K
121 #include "coff/m88k.h"
122 #define TARGET_FORMAT "coff-m88kbcs"
123 #endif
124
125 #ifdef TC_W65
126 #include "coff/w65.h"
127 #define TARGET_FORMAT "coff-w65"
128 #endif
129
130 /* Targets may also set this. Also, if BFD_ASSEMBLER is defined, this
131 will already have been defined. */
132 #undef SYMBOLS_NEED_BACKPOINTERS
133 #define SYMBOLS_NEED_BACKPOINTERS 1
134
135 #ifndef OBJ_COFF_MAX_AUXENTRIES
136 #define OBJ_COFF_MAX_AUXENTRIES 1
137 #endif /* OBJ_COFF_MAX_AUXENTRIES */
138
139 /* ***********************************************************************
140
141 This file really contains two implementations of the COFF back end.
142 They are in the process of being merged, but this is only a
143 preliminary, mechanical merging. Many definitions that are
144 identical between the two are still found in both versions.
145
146 The first version, with BFD_ASSEMBLER defined, uses high-level BFD
147 interfaces and data structures. The second version, with
148 BFD_ASSEMBLER not defined, also uses BFD, but mostly for swapping
149 data structures and for doing the actual I/O. The latter defines
150 the preprocessor symbols BFD and BFD_HEADERS. Try not to let this
151 confuse you.
152
153 These two are in the process of being merged, and eventually the
154 BFD_ASSEMBLER version should take over completely. Release timing
155 issues and namespace problems convinced me to merge the two
156 together in this fashion, a little sooner than I would have liked.
157 The real merge should be much better done by the time the next
158 release comes out.
159
160 For now, the structure of this file is:
161 <common>
162 #ifdef BFD_ASSEMBLER
163 <one version>
164 #else
165 <other version>
166 #endif
167 <common>
168 Unfortunately, the common portions are very small at the moment,
169 and many declarations or definitions are duplicated. The structure
170 of obj-coff.c is similar.
171
172 See doc/internals.texi for a brief discussion of the history, if
173 you care.
174
175 Ken Raeburn, 5 May 1994
176
177 *********************************************************************** */
178
179 #ifdef BFD_ASSEMBLER
180
181 #include "bfd/libcoff.h"
182
183 #define OUTPUT_FLAVOR bfd_target_coff_flavour
184
185 /* SYMBOL TABLE */
186
187 /* Alter the field names, for now, until we've fixed up the other
188 references to use the new name. */
189 #ifdef TC_I960
190 #define TC_SYMFIELD_TYPE struct symbol *
191 #define sy_tc bal
192 #endif
193
194 #define OBJ_SYMFIELD_TYPE unsigned long
195 #define sy_obj sy_flags
196
197 #define SYM_AUXENT(S) (&coffsymbol ((S)->bsym)->native[1].u.auxent)
198
199 #define DO_NOT_STRIP 0
200 #define DO_STRIP 1
201
202 extern void obj_coff_section PARAMS ((int));
203
204 /* The number of auxiliary entries */
205 #define S_GET_NUMBER_AUXILIARY(s) (coffsymbol((s)->bsym)->native->u.syment.n_numaux)
206 /* The number of auxiliary entries */
207 #define S_SET_NUMBER_AUXILIARY(s,v) (S_GET_NUMBER_AUXILIARY (s) = (v))
208
209 /* True if a symbol name is in the string table, i.e. its length is > 8. */
210 #define S_IS_STRING(s) (strlen(S_GET_NAME(s)) > 8 ? 1 : 0)
211
212 extern int S_SET_DATA_TYPE PARAMS ((struct symbol *, int));
213 extern int S_SET_STORAGE_CLASS PARAMS ((struct symbol *, int));
214 extern int S_GET_STORAGE_CLASS PARAMS ((struct symbol *));
215 extern void SA_SET_SYM_ENDNDX PARAMS ((struct symbol *, struct symbol *));
216
217 /* Auxiliary entry macros. SA_ stands for symbol auxiliary */
218 /* Omit the tv related fields */
219 /* Accessors */
220
221 #define SA_GET_SYM_TAGNDX(s) (SYM_AUXENT (s)->x_sym.x_tagndx.l)
222 #define SA_GET_SYM_LNNO(s) (SYM_AUXENT (s)->x_sym.x_misc.x_lnsz.x_lnno)
223 #define SA_GET_SYM_SIZE(s) (SYM_AUXENT (s)->x_sym.x_misc.x_lnsz.x_size)
224 #define SA_GET_SYM_FSIZE(s) (SYM_AUXENT (s)->x_sym.x_misc.x_fsize)
225 #define SA_GET_SYM_LNNOPTR(s) (SYM_AUXENT (s)->x_sym.x_fcnary.x_fcn.x_lnnoptr)
226 #define SA_GET_SYM_ENDNDX(s) (SYM_AUXENT (s)->x_sym.x_fcnary.x_fcn.x_endndx)
227 #define SA_GET_SYM_DIMEN(s,i) (SYM_AUXENT (s)->x_sym.x_fcnary.x_ary.x_dimen[(i)])
228 #define SA_GET_FILE_FNAME(s) (SYM_AUXENT (s)->x_file.x_fname)
229 #define SA_GET_SCN_SCNLEN(s) (SYM_AUXENT (s)->x_scn.x_scnlen)
230 #define SA_GET_SCN_NRELOC(s) (SYM_AUXENT (s)->x_scn.x_nreloc)
231 #define SA_GET_SCN_NLINNO(s) (SYM_AUXENT (s)->x_scn.x_nlinno)
232
233 #define SA_SET_SYM_LNNO(s,v) (SYM_AUXENT (s)->x_sym.x_misc.x_lnsz.x_lnno=(v))
234 #define SA_SET_SYM_SIZE(s,v) (SYM_AUXENT (s)->x_sym.x_misc.x_lnsz.x_size=(v))
235 #define SA_SET_SYM_FSIZE(s,v) (SYM_AUXENT (s)->x_sym.x_misc.x_fsize=(v))
236 #define SA_SET_SYM_LNNOPTR(s,v) (SYM_AUXENT (s)->x_sym.x_fcnary.x_fcn.x_lnnoptr=(v))
237 #define SA_SET_SYM_DIMEN(s,i,v) (SYM_AUXENT (s)->x_sym.x_fcnary.x_ary.x_dimen[(i)]=(v))
238 #define SA_SET_FILE_FNAME(s,v) strncpy(SYM_AUXENT (s)->x_file.x_fname,(v),FILNMLEN)
239 #define SA_SET_SCN_SCNLEN(s,v) (SYM_AUXENT (s)->x_scn.x_scnlen=(v))
240 #define SA_SET_SCN_NRELOC(s,v) (SYM_AUXENT (s)->x_scn.x_nreloc=(v))
241 #define SA_SET_SCN_NLINNO(s,v) (SYM_AUXENT (s)->x_scn.x_nlinno=(v))
242
243 /*
244 * Internal use only definitions. SF_ stands for symbol flags.
245 *
246 * These values can be assigned to sy_symbol.ost_flags field of a symbolS.
247 *
248 * You'll break i960 if you shift the SYSPROC bits anywhere else. for
249 * more on the balname/callname hack, see tc-i960.h. b.out is done
250 * differently.
251 */
252
253 #define SF_I960_MASK (0x000001ff) /* Bits 0-8 are used by the i960 port. */
254 #define SF_SYSPROC (0x0000003f) /* bits 0-5 are used to store the sysproc number */
255 #define SF_IS_SYSPROC (0x00000040) /* bit 6 marks symbols that are sysprocs */
256 #define SF_BALNAME (0x00000080) /* bit 7 marks BALNAME symbols */
257 #define SF_CALLNAME (0x00000100) /* bit 8 marks CALLNAME symbols */
258
259 #define SF_NORMAL_MASK (0x0000ffff) /* bits 12-15 are general purpose. */
260
261 #define SF_STATICS (0x00001000) /* Mark the .text & all symbols */
262 #define SF_DEFINED (0x00002000) /* Symbol is defined in this file */
263 #define SF_STRING (0x00004000) /* Symbol name length > 8 */
264 #define SF_LOCAL (0x00008000) /* Symbol must not be emitted */
265
266 #define SF_DEBUG_MASK (0xffff0000) /* bits 16-31 are debug info */
267
268 #define SF_FUNCTION (0x00010000) /* The symbol is a function */
269 #define SF_PROCESS (0x00020000) /* Process symbol before write */
270 #define SF_TAGGED (0x00040000) /* Is associated with a tag */
271 #define SF_TAG (0x00080000) /* Is a tag */
272 #define SF_DEBUG (0x00100000) /* Is in debug or abs section */
273 #define SF_GET_SEGMENT (0x00200000) /* Get the section of the forward symbol. */
274 /* All other bits are unused. */
275
276 /* Accessors */
277 #define SF_GET(s) ((s)->sy_flags)
278 #define SF_GET_DEBUG(s) ((s)->bsym->flags & BSF_DEBUGGING)
279 #define SF_SET_DEBUG(s) ((s)->bsym->flags |= BSF_DEBUGGING)
280 #define SF_GET_NORMAL_FIELD(s) (SF_GET (s) & SF_NORMAL_MASK)
281 #define SF_GET_DEBUG_FIELD(s) (SF_GET (s) & SF_DEBUG_MASK)
282 #define SF_GET_FILE(s) (SF_GET (s) & SF_FILE)
283 #define SF_GET_STATICS(s) (SF_GET (s) & SF_STATICS)
284 #define SF_GET_DEFINED(s) (SF_GET (s) & SF_DEFINED)
285 #define SF_GET_STRING(s) (SF_GET (s) & SF_STRING)
286 #define SF_GET_LOCAL(s) (SF_GET (s) & SF_LOCAL)
287 #define SF_GET_FUNCTION(s) (SF_GET (s) & SF_FUNCTION)
288 #define SF_GET_PROCESS(s) (SF_GET (s) & SF_PROCESS)
289 #define SF_GET_TAGGED(s) (SF_GET (s) & SF_TAGGED)
290 #define SF_GET_TAG(s) (SF_GET (s) & SF_TAG)
291 #define SF_GET_GET_SEGMENT(s) (SF_GET (s) & SF_GET_SEGMENT)
292 #define SF_GET_I960(s) (SF_GET (s) & SF_I960_MASK) /* used by i960 */
293 #define SF_GET_BALNAME(s) (SF_GET (s) & SF_BALNAME) /* used by i960 */
294 #define SF_GET_CALLNAME(s) (SF_GET (s) & SF_CALLNAME) /* used by i960 */
295 #define SF_GET_IS_SYSPROC(s) (SF_GET (s) & SF_IS_SYSPROC) /* used by i960 */
296 #define SF_GET_SYSPROC(s) (SF_GET (s) & SF_SYSPROC) /* used by i960 */
297
298 /* Modifiers */
299 #define SF_SET(s,v) (SF_GET (s) = (v))
300 #define SF_SET_NORMAL_FIELD(s,v)(SF_GET (s) |= ((v) & SF_NORMAL_MASK))
301 #define SF_SET_DEBUG_FIELD(s,v) (SF_GET (s) |= ((v) & SF_DEBUG_MASK))
302 #define SF_SET_FILE(s) (SF_GET (s) |= SF_FILE)
303 #define SF_SET_STATICS(s) (SF_GET (s) |= SF_STATICS)
304 #define SF_SET_DEFINED(s) (SF_GET (s) |= SF_DEFINED)
305 #define SF_SET_STRING(s) (SF_GET (s) |= SF_STRING)
306 #define SF_SET_LOCAL(s) (SF_GET (s) |= SF_LOCAL)
307 #define SF_CLEAR_LOCAL(s) (SF_GET (s) &= ~SF_LOCAL)
308 #define SF_SET_FUNCTION(s) (SF_GET (s) |= SF_FUNCTION)
309 #define SF_SET_PROCESS(s) (SF_GET (s) |= SF_PROCESS)
310 #define SF_SET_TAGGED(s) (SF_GET (s) |= SF_TAGGED)
311 #define SF_SET_TAG(s) (SF_GET (s) |= SF_TAG)
312 #define SF_SET_GET_SEGMENT(s) (SF_GET (s) |= SF_GET_SEGMENT)
313 #define SF_SET_I960(s,v) (SF_GET (s) |= ((v) & SF_I960_MASK)) /* used by i960 */
314 #define SF_SET_BALNAME(s) (SF_GET (s) |= SF_BALNAME) /* used by i960 */
315 #define SF_SET_CALLNAME(s) (SF_GET (s) |= SF_CALLNAME) /* used by i960 */
316 #define SF_SET_IS_SYSPROC(s) (SF_GET (s) |= SF_IS_SYSPROC) /* used by i960 */
317 #define SF_SET_SYSPROC(s,v) (SF_GET (s) |= ((v) & SF_SYSPROC)) /* used by i960 */
318
319 /* -------------- Line number handling ------- */
320 extern int text_lineno_number;
321 extern int coff_line_base;
322
323 #define obj_emit_lineno(WHERE,LINE,FILE_START) abort ()
324 extern void coff_add_linesym PARAMS ((struct symbol *));
325
326
327 void c_dot_file_symbol PARAMS ((char *filename));
328 #define obj_app_file c_dot_file_symbol
329
330 extern void coff_frob_symbol PARAMS ((struct symbol *, int *));
331 extern void coff_adjust_symtab PARAMS ((void));
332 extern void coff_frob_section PARAMS ((segT));
333 extern void coff_adjust_section_syms PARAMS ((bfd *, asection *, PTR));
334 extern void coff_frob_file PARAMS ((void));
335 #define obj_frob_symbol(S,P) coff_frob_symbol(S,&P)
336 #define obj_adjust_symtab() coff_adjust_symtab()
337 #define obj_frob_section(S) coff_frob_section (S)
338 #define obj_frob_file() coff_frob_file ()
339
340 extern struct symbol *coff_last_function;
341
342 /* Forward the segment of a forwarded symbol, handle assignments that
343 just copy symbol values, etc. */
344 #ifndef TE_I386AIX
345 #define OBJ_COPY_SYMBOL_ATTRIBUTES(dest,src) \
346 (SF_GET_GET_SEGMENT (dest) \
347 ? (S_SET_SEGMENT (dest, S_GET_SEGMENT (src)), 0) \
348 : 0)
349 #else
350 #define OBJ_COPY_SYMBOL_ATTRIBUTES(dest,src) \
351 (SF_GET_GET_SEGMENT (dest) && S_GET_SEGMENT (dest) == SEG_UNKNOWN \
352 ? (S_SET_SEGMENT (dest, S_GET_SEGMENT (src)), 0) \
353 : 0)
354 #endif
355
356 /* sanity check */
357
358 #ifdef TC_I960
359 #ifndef C_LEAFSTAT
360 hey ! Where is the C_LEAFSTAT definition ? i960 - coff support is depending on it.
361 #endif /* no C_LEAFSTAT */
362 #endif /* TC_I960 */
363
364 #else /* not BFD_ASSEMBLER */
365
366 #ifdef TC_A29K
367 /* Allow translate from aout relocs to coff relocs */
368 #define NO_RELOC 20
369 #define RELOC_32 1
370 #define RELOC_8 2
371 #define RELOC_CONST 3
372 #define RELOC_CONSTH 4
373 #define RELOC_JUMPTARG 5
374 #define RELOC_BASE22 6
375 #define RELOC_HI22 7
376 #define RELOC_LO10 8
377 #define RELOC_BASE13 9
378 #define RELOC_WDISP22 10
379 #define RELOC_WDISP30 11
380 #endif
381
382 extern const segT N_TYPE_seg[];
383
384 /* Magic number of paged executable. */
385 #define DEFAULT_MAGIC_NUMBER_FOR_OBJECT_FILE 0x8300
386
387
388 /* SYMBOL TABLE */
389
390 /* Symbol table entry data type */
391
392 typedef struct
393 {
394 /* Basic symbol */
395 struct internal_syment ost_entry;
396 /* Auxiliary entry. */
397 union internal_auxent ost_auxent[OBJ_COFF_MAX_AUXENTRIES];
398 /* obj_coff internal use only flags */
399 unsigned int ost_flags;
400 } obj_symbol_type;
401
402 #ifndef DO_NOT_STRIP
403 #define DO_NOT_STRIP 0
404 #define DO_STRIP 1
405 #endif
406 /* Symbol table macros and constants */
407
408 /* Possible and usefull section number in symbol table
409 * The values of TEXT, DATA and BSS may not be portable.
410 */
411
412 #define C_ABS_SECTION N_ABS
413 #define C_UNDEF_SECTION N_UNDEF
414 #define C_DEBUG_SECTION N_DEBUG
415 #define C_NTV_SECTION N_TV
416 #define C_PTV_SECTION P_TV
417 #define C_REGISTER_SECTION 20
418
419 /*
420 * Macros to extract information from a symbol table entry.
421 * This syntaxic indirection allows independence regarding a.out or coff.
422 * The argument (s) of all these macros is a pointer to a symbol table entry.
423 */
424
425 /* Predicates */
426 /* True if the symbol is external */
427 #define S_IS_EXTERNAL(s) ((s)->sy_symbol.ost_entry.n_scnum == C_UNDEF_SECTION)
428 /* True if symbol has been defined, ie :
429 section > 0 (DATA, TEXT or BSS)
430 section == 0 and value > 0 (external bss symbol) */
431 #define S_IS_DEFINED(s) \
432 ((s)->sy_symbol.ost_entry.n_scnum > C_UNDEF_SECTION \
433 || ((s)->sy_symbol.ost_entry.n_scnum == C_UNDEF_SECTION \
434 && S_GET_VALUE (s) > 0) \
435 || ((s)->sy_symbol.ost_entry.n_scnum == C_ABS_SECTION))
436 /* True if a debug special symbol entry */
437 #define S_IS_DEBUG(s) ((s)->sy_symbol.ost_entry.n_scnum == C_DEBUG_SECTION)
438 /* True if a symbol is local symbol name */
439 /* A symbol name whose name includes ^A is a gas internal pseudo symbol */
440 #define S_IS_LOCAL(s) \
441 ((s)->sy_symbol.ost_entry.n_scnum == C_REGISTER_SECTION \
442 || (S_LOCAL_NAME(s) && !flag_keep_locals) \
443 || (strchr (S_GET_NAME (s), '\001') != NULL))
444 /* True if a symbol is not defined in this file */
445 #define S_IS_EXTERN(s) ((s)->sy_symbol.ost_entry.n_scnum == 0 \
446 && S_GET_VALUE (s) == 0)
447 /*
448 * True if a symbol can be multiply defined (bss symbols have this def
449 * though it is bad practice)
450 */
451 #define S_IS_COMMON(s) ((s)->sy_symbol.ost_entry.n_scnum == 0 \
452 && S_GET_VALUE (s) != 0)
453 /* True if a symbol name is in the string table, i.e. its length is > 8. */
454 #define S_IS_STRING(s) (strlen(S_GET_NAME(s)) > 8 ? 1 : 0)
455
456 /* Accessors */
457 /* The name of the symbol */
458 #define S_GET_NAME(s) ((char*)(s)->sy_symbol.ost_entry.n_offset)
459 /* The pointer to the string table */
460 #define S_GET_OFFSET(s) ((s)->sy_symbol.ost_entry.n_offset)
461 /* The numeric value of the segment */
462 #define S_GET_SEGMENT(s) s_get_segment(s)
463 /* The data type */
464 #define S_GET_DATA_TYPE(s) ((s)->sy_symbol.ost_entry.n_type)
465 /* The storage class */
466 #define S_GET_STORAGE_CLASS(s) ((s)->sy_symbol.ost_entry.n_sclass)
467 /* The number of auxiliary entries */
468 #define S_GET_NUMBER_AUXILIARY(s) ((s)->sy_symbol.ost_entry.n_numaux)
469
470 /* Modifiers */
471 /* Set the name of the symbol */
472 #define S_SET_NAME(s,v) ((s)->sy_symbol.ost_entry.n_offset = (unsigned long)(v))
473 /* Set the offset of the symbol */
474 #define S_SET_OFFSET(s,v) ((s)->sy_symbol.ost_entry.n_offset = (v))
475 /* The numeric value of the segment */
476 #define S_SET_SEGMENT(s,v) ((s)->sy_symbol.ost_entry.n_scnum = SEGMENT_TO_SYMBOL_TYPE(v))
477 /* The data type */
478 #define S_SET_DATA_TYPE(s,v) ((s)->sy_symbol.ost_entry.n_type = (v))
479 /* The storage class */
480 #define S_SET_STORAGE_CLASS(s,v) ((s)->sy_symbol.ost_entry.n_sclass = (v))
481 /* The number of auxiliary entries */
482 #define S_SET_NUMBER_AUXILIARY(s,v) ((s)->sy_symbol.ost_entry.n_numaux = (v))
483
484 /* Additional modifiers */
485 /* The symbol is external (does not mean undefined) */
486 #define S_SET_EXTERNAL(s) { S_SET_STORAGE_CLASS(s, C_EXT) ; SF_CLEAR_LOCAL(s); }
487
488 /* Auxiliary entry macros. SA_ stands for symbol auxiliary */
489 /* Omit the tv related fields */
490 /* Accessors */
491 #define SYM_AUXENT(S) (&(S)->sy_symbol.ost_auxent[0])
492
493 #define SA_GET_SYM_TAGNDX(s) (SYM_AUXENT (s)->x_sym.x_tagndx.l)
494 #define SA_GET_SYM_LNNO(s) (SYM_AUXENT (s)->x_sym.x_misc.x_lnsz.x_lnno)
495 #define SA_GET_SYM_SIZE(s) (SYM_AUXENT (s)->x_sym.x_misc.x_lnsz.x_size)
496 #define SA_GET_SYM_FSIZE(s) (SYM_AUXENT (s)->x_sym.x_misc.x_fsize)
497 #define SA_GET_SYM_LNNOPTR(s) (SYM_AUXENT (s)->x_sym.x_fcnary.x_fcn.x_lnnoptr)
498 #define SA_GET_SYM_ENDNDX(s) (SYM_AUXENT (s)->x_sym.x_fcnary.x_fcn.x_endndx.l)
499 #define SA_GET_SYM_DIMEN(s,i) (SYM_AUXENT (s)->x_sym.x_fcnary.x_ary.x_dimen[(i)])
500 #define SA_GET_FILE_FNAME(s) (SYM_AUXENT (s)->x_file.x_fname)
501 #define SA_GET_FILE_FNAME_OFFSET(s) (SYM_AUXENT (s)->x_file.x_n.x_offset)
502 #define SA_GET_FILE_FNAME_ZEROS(s) (SYM_AUXENT (s)->x_file.x_n.x_zeroes)
503 #define SA_GET_SCN_SCNLEN(s) (SYM_AUXENT (s)->x_scn.x_scnlen)
504 #define SA_GET_SCN_NRELOC(s) (SYM_AUXENT (s)->x_scn.x_nreloc)
505 #define SA_GET_SCN_NLINNO(s) (SYM_AUXENT (s)->x_scn.x_nlinno)
506
507 /* Modifiers */
508 #define SA_SET_SYM_TAGNDX(s,v) (SYM_AUXENT (s)->x_sym.x_tagndx.l=(v))
509 #define SA_SET_SYM_LNNO(s,v) (SYM_AUXENT (s)->x_sym.x_misc.x_lnsz.x_lnno=(v))
510 #define SA_SET_SYM_SIZE(s,v) (SYM_AUXENT (s)->x_sym.x_misc.x_lnsz.x_size=(v))
511 #define SA_SET_SYM_FSIZE(s,v) (SYM_AUXENT (s)->x_sym.x_misc.x_fsize=(v))
512 #define SA_SET_SYM_LNNOPTR(s,v) (SYM_AUXENT (s)->x_sym.x_fcnary.x_fcn.x_lnnoptr=(v))
513 #define SA_SET_SYM_ENDNDX(s,v) (SYM_AUXENT (s)->x_sym.x_fcnary.x_fcn.x_endndx.l=(v))
514 #define SA_SET_SYM_DIMEN(s,i,v) (SYM_AUXENT (s)->x_sym.x_fcnary.x_ary.x_dimen[(i)]=(v))
515 #define SA_SET_FILE_FNAME(s,v) strncpy(SYM_AUXENT (s)->x_file.x_fname,(v),FILNMLEN)
516 #define SA_SET_FILE_FNAME_OFFSET(s,v) (SYM_AUXENT (s)->x_file.x_n.x_offset=(v))
517 #define SA_SET_FILE_FNAME_ZEROS(s,v) (SYM_AUXENT (s)->x_file.x_n.x_zeroes=(v))
518 #define SA_SET_SCN_SCNLEN(s,v) (SYM_AUXENT (s)->x_scn.x_scnlen=(v))
519 #define SA_SET_SCN_NRELOC(s,v) (SYM_AUXENT (s)->x_scn.x_nreloc=(v))
520 #define SA_SET_SCN_NLINNO(s,v) (SYM_AUXENT (s)->x_scn.x_nlinno=(v))
521
522 /*
523 * Internal use only definitions. SF_ stands for symbol flags.
524 *
525 * These values can be assigned to sy_symbol.ost_flags field of a symbolS.
526 *
527 * You'll break i960 if you shift the SYSPROC bits anywhere else. for
528 * more on the balname/callname hack, see tc-i960.h. b.out is done
529 * differently.
530 */
531
532 #define SF_I960_MASK (0x000001ff) /* Bits 0-8 are used by the i960 port. */
533 #define SF_SYSPROC (0x0000003f) /* bits 0-5 are used to store the sysproc number */
534 #define SF_IS_SYSPROC (0x00000040) /* bit 6 marks symbols that are sysprocs */
535 #define SF_BALNAME (0x00000080) /* bit 7 marks BALNAME symbols */
536 #define SF_CALLNAME (0x00000100) /* bit 8 marks CALLNAME symbols */
537
538 #define SF_NORMAL_MASK (0x0000ffff) /* bits 12-15 are general purpose. */
539
540 #define SF_STATICS (0x00001000) /* Mark the .text & all symbols */
541 #define SF_DEFINED (0x00002000) /* Symbol is defined in this file */
542 #define SF_STRING (0x00004000) /* Symbol name length > 8 */
543 #define SF_LOCAL (0x00008000) /* Symbol must not be emitted */
544
545 #define SF_DEBUG_MASK (0xffff0000) /* bits 16-31 are debug info */
546
547 #define SF_FUNCTION (0x00010000) /* The symbol is a function */
548 #define SF_PROCESS (0x00020000) /* Process symbol before write */
549 #define SF_TAGGED (0x00040000) /* Is associated with a tag */
550 #define SF_TAG (0x00080000) /* Is a tag */
551 #define SF_DEBUG (0x00100000) /* Is in debug or abs section */
552 #define SF_GET_SEGMENT (0x00200000) /* Get the section of the forward symbol. */
553 /* All other bits are unused. */
554
555 /* Accessors */
556 #define SF_GET(s) ((s)->sy_symbol.ost_flags)
557 #define SF_GET_NORMAL_FIELD(s) (SF_GET (s) & SF_NORMAL_MASK)
558 #define SF_GET_DEBUG_FIELD(s) (SF_GET (s) & SF_DEBUG_MASK)
559 #define SF_GET_FILE(s) (SF_GET (s) & SF_FILE)
560 #define SF_GET_STATICS(s) (SF_GET (s) & SF_STATICS)
561 #define SF_GET_DEFINED(s) (SF_GET (s) & SF_DEFINED)
562 #define SF_GET_STRING(s) (SF_GET (s) & SF_STRING)
563 #define SF_GET_LOCAL(s) (SF_GET (s) & SF_LOCAL)
564 #define SF_GET_FUNCTION(s) (SF_GET (s) & SF_FUNCTION)
565 #define SF_GET_PROCESS(s) (SF_GET (s) & SF_PROCESS)
566 #define SF_GET_DEBUG(s) (SF_GET (s) & SF_DEBUG)
567 #define SF_GET_TAGGED(s) (SF_GET (s) & SF_TAGGED)
568 #define SF_GET_TAG(s) (SF_GET (s) & SF_TAG)
569 #define SF_GET_GET_SEGMENT(s) (SF_GET (s) & SF_GET_SEGMENT)
570 #define SF_GET_I960(s) (SF_GET (s) & SF_I960_MASK) /* used by i960 */
571 #define SF_GET_BALNAME(s) (SF_GET (s) & SF_BALNAME) /* used by i960 */
572 #define SF_GET_CALLNAME(s) (SF_GET (s) & SF_CALLNAME) /* used by i960 */
573 #define SF_GET_IS_SYSPROC(s) (SF_GET (s) & SF_IS_SYSPROC) /* used by i960 */
574 #define SF_GET_SYSPROC(s) (SF_GET (s) & SF_SYSPROC) /* used by i960 */
575
576 /* Modifiers */
577 #define SF_SET(s,v) (SF_GET (s) = (v))
578 #define SF_SET_NORMAL_FIELD(s,v)(SF_GET (s) |= ((v) & SF_NORMAL_MASK))
579 #define SF_SET_DEBUG_FIELD(s,v) (SF_GET (s) |= ((v) & SF_DEBUG_MASK))
580 #define SF_SET_FILE(s) (SF_GET (s) |= SF_FILE)
581 #define SF_SET_STATICS(s) (SF_GET (s) |= SF_STATICS)
582 #define SF_SET_DEFINED(s) (SF_GET (s) |= SF_DEFINED)
583 #define SF_SET_STRING(s) (SF_GET (s) |= SF_STRING)
584 #define SF_SET_LOCAL(s) (SF_GET (s) |= SF_LOCAL)
585 #define SF_CLEAR_LOCAL(s) (SF_GET (s) &= ~SF_LOCAL)
586 #define SF_SET_FUNCTION(s) (SF_GET (s) |= SF_FUNCTION)
587 #define SF_SET_PROCESS(s) (SF_GET (s) |= SF_PROCESS)
588 #define SF_SET_DEBUG(s) (SF_GET (s) |= SF_DEBUG)
589 #define SF_SET_TAGGED(s) (SF_GET (s) |= SF_TAGGED)
590 #define SF_SET_TAG(s) (SF_GET (s) |= SF_TAG)
591 #define SF_SET_GET_SEGMENT(s) (SF_GET (s) |= SF_GET_SEGMENT)
592 #define SF_SET_I960(s,v) (SF_GET (s) |= ((v) & SF_I960_MASK)) /* used by i960 */
593 #define SF_SET_BALNAME(s) (SF_GET (s) |= SF_BALNAME) /* used by i960 */
594 #define SF_SET_CALLNAME(s) (SF_GET (s) |= SF_CALLNAME) /* used by i960 */
595 #define SF_SET_IS_SYSPROC(s) (SF_GET (s) |= SF_IS_SYSPROC) /* used by i960 */
596 #define SF_SET_SYSPROC(s,v) (SF_GET (s) |= ((v) & SF_SYSPROC)) /* used by i960 */
597
598 /* File header macro and type definition */
599
600 /*
601 * File position calculators. Beware to use them when all the
602 * appropriate fields are set in the header.
603 */
604
605 #ifdef OBJ_COFF_OMIT_OPTIONAL_HEADER
606 #define OBJ_COFF_AOUTHDRSZ (0)
607 #else
608 #define OBJ_COFF_AOUTHDRSZ (AOUTHDRSZ)
609 #endif /* OBJ_COFF_OMIT_OPTIONAL_HEADER */
610
611 #define H_GET_FILE_SIZE(h) \
612 (long)(FILHSZ + OBJ_COFF_AOUTHDRSZ + \
613 H_GET_NUMBER_OF_SECTIONS(h) * SCNHSZ + \
614 H_GET_TEXT_SIZE(h) + H_GET_DATA_SIZE(h) + \
615 H_GET_RELOCATION_SIZE(h) + H_GET_LINENO_SIZE(h) + \
616 H_GET_SYMBOL_TABLE_SIZE(h) + \
617 (h)->string_table_size)
618 #define H_GET_TEXT_FILE_OFFSET(h) \
619 (long)(FILHSZ + OBJ_COFF_AOUTHDRSZ + \
620 H_GET_NUMBER_OF_SECTIONS(h) * SCNHSZ)
621 #define H_GET_DATA_FILE_OFFSET(h) \
622 (long)(FILHSZ + OBJ_COFF_AOUTHDRSZ + \
623 H_GET_NUMBER_OF_SECTIONS(h) * SCNHSZ + \
624 H_GET_TEXT_SIZE(h))
625 #define H_GET_BSS_FILE_OFFSET(h) 0
626 #define H_GET_RELOCATION_FILE_OFFSET(h) \
627 (long)(FILHSZ + OBJ_COFF_AOUTHDRSZ + \
628 H_GET_NUMBER_OF_SECTIONS(h) * SCNHSZ + \
629 H_GET_TEXT_SIZE(h) + H_GET_DATA_SIZE(h))
630 #define H_GET_LINENO_FILE_OFFSET(h) \
631 (long)(FILHSZ + OBJ_COFF_AOUTHDRSZ + \
632 H_GET_NUMBER_OF_SECTIONS(h) * SCNHSZ + \
633 H_GET_TEXT_SIZE(h) + H_GET_DATA_SIZE(h) + \
634 H_GET_RELOCATION_SIZE(h))
635 #define H_GET_SYMBOL_TABLE_FILE_OFFSET(h) \
636 (long)(FILHSZ + OBJ_COFF_AOUTHDRSZ + \
637 H_GET_NUMBER_OF_SECTIONS(h) * SCNHSZ + \
638 H_GET_TEXT_SIZE(h) + H_GET_DATA_SIZE(h) + \
639 H_GET_RELOCATION_SIZE(h) + H_GET_LINENO_SIZE(h))
640
641 /* Accessors */
642 /* aouthdr */
643 #define H_GET_MAGIC_NUMBER(h) ((h)->aouthdr.magic)
644 #define H_GET_VERSION_STAMP(h) ((h)->aouthdr.vstamp)
645 #define H_GET_TEXT_SIZE(h) ((h)->aouthdr.tsize)
646 #define H_GET_DATA_SIZE(h) ((h)->aouthdr.dsize)
647 #define H_GET_BSS_SIZE(h) ((h)->aouthdr.bsize)
648 #define H_GET_ENTRY_POINT(h) ((h)->aouthdr.entry)
649 #define H_GET_TEXT_START(h) ((h)->aouthdr.text_start)
650 #define H_GET_DATA_START(h) ((h)->aouthdr.data_start)
651 /* filehdr */
652 #define H_GET_FILE_MAGIC_NUMBER(h) ((h)->filehdr.f_magic)
653 #define H_GET_NUMBER_OF_SECTIONS(h) ((h)->filehdr.f_nscns)
654 #define H_GET_TIME_STAMP(h) ((h)->filehdr.f_timdat)
655 #define H_GET_SYMBOL_TABLE_POINTER(h) ((h)->filehdr.f_symptr)
656 #define H_GET_SYMBOL_COUNT(h) ((h)->filehdr.f_nsyms)
657 #define H_GET_SYMBOL_TABLE_SIZE(h) (H_GET_SYMBOL_COUNT(h) * SYMESZ)
658 #define H_GET_SIZEOF_OPTIONAL_HEADER(h) ((h)->filehdr.f_opthdr)
659 #define H_GET_FLAGS(h) ((h)->filehdr.f_flags)
660 /* Extra fields to achieve bsd a.out compatibility and for convenience */
661 #define H_GET_RELOCATION_SIZE(h) ((h)->relocation_size)
662 #define H_GET_STRING_SIZE(h) ((h)->string_table_size)
663 #define H_GET_LINENO_SIZE(h) ((h)->lineno_size)
664
665 #ifndef OBJ_COFF_OMIT_OPTIONAL_HEADER
666 #define H_GET_HEADER_SIZE(h) (sizeof(FILHDR) \
667 + sizeof(AOUTHDR)\
668 + (H_GET_NUMBER_OF_SECTIONS(h) * SCNHSZ))
669 #else /* OBJ_COFF_OMIT_OPTIONAL_HEADER */
670 #define H_GET_HEADER_SIZE(h) (sizeof(FILHDR) \
671 + (H_GET_NUMBER_OF_SECTIONS(h) * SCNHSZ))
672 #endif /* OBJ_COFF_OMIT_OPTIONAL_HEADER */
673
674 #define H_GET_TEXT_RELOCATION_SIZE(h) (text_section_header.s_nreloc * RELSZ)
675 #define H_GET_DATA_RELOCATION_SIZE(h) (data_section_header.s_nreloc * RELSZ)
676
677 /* Modifiers */
678 /* aouthdr */
679 #define H_SET_MAGIC_NUMBER(h,v) ((h)->aouthdr.magic = (v))
680 #define H_SET_VERSION_STAMP(h,v) ((h)->aouthdr.vstamp = (v))
681 #define H_SET_TEXT_SIZE(h,v) ((h)->aouthdr.tsize = (v))
682 #define H_SET_DATA_SIZE(h,v) ((h)->aouthdr.dsize = (v))
683 #define H_SET_BSS_SIZE(h,v) ((h)->aouthdr.bsize = (v))
684 #define H_SET_ENTRY_POINT(h,v) ((h)->aouthdr.entry = (v))
685 #define H_SET_TEXT_START(h,v) ((h)->aouthdr.text_start = (v))
686 #define H_SET_DATA_START(h,v) ((h)->aouthdr.data_start = (v))
687 /* filehdr */
688 #define H_SET_FILE_MAGIC_NUMBER(h,v) ((h)->filehdr.f_magic = (v))
689 #define H_SET_NUMBER_OF_SECTIONS(h,v) ((h)->filehdr.f_nscns = (v))
690 #define H_SET_TIME_STAMP(h,v) ((h)->filehdr.f_timdat = (v))
691 #define H_SET_SYMBOL_TABLE_POINTER(h,v) ((h)->filehdr.f_symptr = (v))
692 #define H_SET_SYMBOL_TABLE_SIZE(h,v) ((h)->filehdr.f_nsyms = (v))
693 #define H_SET_SIZEOF_OPTIONAL_HEADER(h,v) ((h)->filehdr.f_opthdr = (v))
694 #define H_SET_FLAGS(h,v) ((h)->filehdr.f_flags = (v))
695 /* Extra fields to achieve bsd a.out compatibility and for convinience */
696 #define H_SET_RELOCATION_SIZE(h,t,d) ((h)->relocation_size = (t)+(d))
697 #define H_SET_STRING_SIZE(h,v) ((h)->string_table_size = (v))
698 #define H_SET_LINENO_SIZE(h,v) ((h)->lineno_size = (v))
699
700 /* Segment flipping */
701
702 typedef struct
703 {
704 struct internal_aouthdr aouthdr; /* a.out header */
705 struct internal_filehdr filehdr; /* File header, not machine dep. */
706 long string_table_size; /* names + '\0' + sizeof(int) */
707 long relocation_size; /* Cumulated size of relocation
708 information for all sections in
709 bytes. */
710 long lineno_size; /* Size of the line number information
711 table in bytes */
712 } object_headers;
713
714
715
716 struct lineno_list
717 {
718 struct bfd_internal_lineno line;
719 char *frag; /* Frag to which the line number is related */
720 struct lineno_list *next; /* Forward chain pointer */
721 };
722
723
724
725
726 #define obj_segment_name(i) (segment_info[(int) (i)].scnhdr.s_name)
727
728 #define obj_add_segment(s) obj_coff_add_segment (s)
729
730 extern segT obj_coff_add_segment PARAMS ((const char *));
731
732 extern void obj_coff_section PARAMS ((int));
733
734 extern void c_dot_file_symbol PARAMS ((char *filename));
735 #define obj_app_file c_dot_file_symbol
736 extern void obj_extra_stuff PARAMS ((object_headers * headers));
737
738 extern segT s_get_segment PARAMS ((struct symbol * ptr));
739
740 extern void c_section_header PARAMS ((struct internal_scnhdr * header,
741 char *name,
742 long core_address,
743 long size,
744 long data_ptr,
745 long reloc_ptr,
746 long lineno_ptr,
747 long reloc_number,
748 long lineno_number,
749 long alignment));
750
751 #ifndef tc_coff_symbol_emit_hook
752 void tc_coff_symbol_emit_hook PARAMS ((struct symbol *));
753 #endif
754
755 /* sanity check */
756
757 #ifdef TC_I960
758 #ifndef C_LEAFSTAT
759 hey ! Where is the C_LEAFSTAT definition ? i960 - coff support is depending on it.
760 #endif /* no C_LEAFSTAT */
761 #endif /* TC_I960 */
762 extern struct internal_scnhdr data_section_header;
763 extern struct internal_scnhdr text_section_header;
764
765 /* Forward the segment of a forwarded symbol. */
766 #define OBJ_COPY_SYMBOL_ATTRIBUTES(dest,src) \
767 (SF_GET_GET_SEGMENT (dest) \
768 ? (S_SET_SEGMENT (dest, S_GET_SEGMENT (src)), 0) \
769 : 0)
770
771 #endif /* not BFD_ASSEMBLER */
772
773 /* Stabs in a coff file go into their own section. */
774 #define SEPARATE_STAB_SECTIONS 1
775
776 /* We need 12 bytes at the start of the section to hold some initial
777 information. */
778 extern void obj_coff_init_stab_section PARAMS ((segT));
779 #define INIT_STAB_SECTION(seg) obj_coff_init_stab_section (seg)
780
781 #endif /* OBJ_FORMAT_H */
This page took 0.050296 seconds and 4 git commands to generate.