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