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