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