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