remove maxq-coff port
[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,
aa820537 3 1999, 2000, 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2009
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
ec2655a6 10 the Free Software Foundation; either version 3, or (at your option)
252b5132
RH
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
4b4da160
NC
20 Software Foundation, 51 Franklin Street - Fifth Floor, Boston, MA
21 02110-1301, USA. */
252b5132
RH
22
23#ifndef OBJ_FORMAT_H
24#define OBJ_FORMAT_H
25
26#define OBJ_COFF 1
27
252b5132
RH
28#include "targ-cpu.h"
29
252b5132 30/* This internal_lineno crap is to stop namespace pollution from the
dcd619be 31 bfd internal coff headerfile. */
252b5132
RH
32#define internal_lineno bfd_internal_lineno
33#include "coff/internal.h"
34#undef internal_lineno
35
36/* CPU-specific setup: */
37
38#ifdef TC_ARM
39#include "coff/arm.h"
40#ifndef TARGET_FORMAT
41#define TARGET_FORMAT "coff-arm"
42#endif
43#endif
44
45#ifdef TC_PPC
46#ifdef TE_PE
47#include "coff/powerpc.h"
48#else
49#include "coff/rs6000.h"
50#endif
51#endif
52
53#ifdef TC_SPARC
54#include "coff/sparc.h"
55#endif
56
57#ifdef TC_I386
321098a5 58#ifdef TE_PEP
99ad8390
NC
59#include "coff/x86_64.h"
60#else
252b5132 61#include "coff/i386.h"
99ad8390 62#endif
252b5132 63
252b5132 64#ifndef TARGET_FORMAT
99ad8390
NC
65#ifdef TE_PEP
66#define TARGET_FORMAT "coff-x86-64"
67#else
252b5132
RH
68#define TARGET_FORMAT "coff-i386"
69#endif
70#endif
99ad8390 71#endif
252b5132
RH
72
73#ifdef TC_M68K
74#include "coff/m68k.h"
75#ifndef TARGET_FORMAT
76#define TARGET_FORMAT "coff-m68k"
77#endif
78#endif
79
3b16e843
NC
80#ifdef TC_OR32
81#include "coff/or32.h"
82#define TARGET_FORMAT "coff-or32-big"
83#endif
84
252b5132
RH
85#ifdef TC_I960
86#include "coff/i960.h"
87#define TARGET_FORMAT "coff-Intel-little"
88#endif
89
3c9b82ba
NC
90#ifdef TC_Z80
91#include "coff/z80.h"
92#define TARGET_FORMAT "coff-z80"
93#endif
94
252b5132
RH
95#ifdef TC_Z8K
96#include "coff/z8k.h"
97#define TARGET_FORMAT "coff-z8k"
98#endif
99
100#ifdef TC_H8300
101#include "coff/h8300.h"
102#define TARGET_FORMAT "coff-h8300"
103#endif
104
105#ifdef TC_H8500
106#include "coff/h8500.h"
107#define TARGET_FORMAT "coff-h8500"
108#endif
109
110#ifdef TC_SH
056350c6
NC
111
112#ifdef TE_PE
113#define COFF_WITH_PE
114#endif
115
252b5132 116#include "coff/sh.h"
056350c6
NC
117
118#ifdef TE_PE
119#define TARGET_FORMAT "pe-shl"
120#else
94f592af 121
252b5132 122#define TARGET_FORMAT \
a245a9aa 123 (!target_big_endian \
252b5132
RH
124 ? (sh_small ? "coff-shl-small" : "coff-shl") \
125 : (sh_small ? "coff-sh-small" : "coff-sh"))
94f592af 126
252b5132 127#endif
056350c6
NC
128#endif
129
130#ifdef TC_MIPS
131#define COFF_WITH_PE
132#include "coff/mipspe.h"
133#undef TARGET_FORMAT
134#define TARGET_FORMAT "pe-mips"
135#endif
252b5132 136
252b5132
RH
137#ifdef TC_TIC30
138#include "coff/tic30.h"
139#define TARGET_FORMAT "coff-tic30"
140#endif
141
026df7c5
NC
142#ifdef TC_TIC4X
143#include "coff/tic4x.h"
be33c5dd 144#define TARGET_FORMAT "coff2-tic4x"
026df7c5
NC
145#endif
146
39bec121
TW
147#ifdef TC_TIC54X
148#include "coff/tic54x.h"
149#define TARGET_FORMAT "coff1-c54x"
150#endif
151
252b5132
RH
152#ifdef TC_MCORE
153#include "coff/mcore.h"
154#ifndef TARGET_FORMAT
155#define TARGET_FORMAT "pe-mcore"
156#endif
157#endif
158
977cdf5a 159#ifdef TE_PE
06e77878
AO
160#define obj_set_weak_hook pecoff_obj_set_weak_hook
161#define obj_clear_weak_hook pecoff_obj_clear_weak_hook
977cdf5a
NC
162#endif
163
252b5132
RH
164#ifndef OBJ_COFF_MAX_AUXENTRIES
165#define OBJ_COFF_MAX_AUXENTRIES 1
977cdf5a 166#endif
252b5132 167
252b5132 168#define obj_symbol_new_hook coff_obj_symbol_new_hook
6a2b6326 169#define obj_symbol_clone_hook coff_obj_symbol_clone_hook
252b5132
RH
170#define obj_read_begin_hook coff_obj_read_begin_hook
171
252b5132
RH
172#include "bfd/libcoff.h"
173
174#define OUTPUT_FLAVOR bfd_target_coff_flavour
175
252b5132
RH
176/* Alter the field names, for now, until we've fixed up the other
177 references to use the new name. */
178#ifdef TC_I960
49309057 179#define TC_SYMFIELD_TYPE symbolS *
252b5132
RH
180#define sy_tc bal
181#endif
182
183#define OBJ_SYMFIELD_TYPE unsigned long
184#define sy_obj sy_flags
185
a161fe53
AM
186/* We can't use the predefined section symbols in bfd/section.c, as
187 COFF symbols have extra fields. See bfd/libcoff.h:coff_symbol_type. */
188#ifndef obj_sec_sym_ok_for_reloc
189#define obj_sec_sym_ok_for_reloc(SEC) ((SEC)->owner != 0)
190#endif
191
49309057
ILT
192#define SYM_AUXENT(S) \
193 (&coffsymbol (symbol_get_bfdsym (S))->native[1].u.auxent)
194#define SYM_AUXINFO(S) \
195 (&coffsymbol (symbol_get_bfdsym (S))->native[1])
252b5132 196
3b16e843 197/* The number of auxiliary entries. */
49309057
ILT
198#define S_GET_NUMBER_AUXILIARY(s) \
199 (coffsymbol (symbol_get_bfdsym (s))->native->u.syment.n_numaux)
3b16e843 200/* The number of auxiliary entries. */
a5324a3e 201#define S_SET_NUMBER_AUXILIARY(s, v) (S_GET_NUMBER_AUXILIARY (s) = (v))
252b5132 202
dcd619be 203/* True if a symbol name is in the string table, i.e. its length is > 8. */
a5324a3e 204#define S_IS_STRING(s) (strlen (S_GET_NAME (s)) > 8 ? 1 : 0)
252b5132 205
3b16e843
NC
206/* Auxiliary entry macros. SA_ stands for symbol auxiliary. */
207/* Omit the tv related fields. */
208/* Accessors. */
252b5132
RH
209
210#define SA_GET_SYM_TAGNDX(s) (SYM_AUXENT (s)->x_sym.x_tagndx.l)
211#define SA_GET_SYM_LNNO(s) (SYM_AUXENT (s)->x_sym.x_misc.x_lnsz.x_lnno)
212#define SA_GET_SYM_SIZE(s) (SYM_AUXENT (s)->x_sym.x_misc.x_lnsz.x_size)
213#define SA_GET_SYM_FSIZE(s) (SYM_AUXENT (s)->x_sym.x_misc.x_fsize)
214#define SA_GET_SYM_LNNOPTR(s) (SYM_AUXENT (s)->x_sym.x_fcnary.x_fcn.x_lnnoptr)
215#define SA_GET_SYM_ENDNDX(s) (SYM_AUXENT (s)->x_sym.x_fcnary.x_fcn.x_endndx)
216#define SA_GET_SYM_DIMEN(s,i) (SYM_AUXENT (s)->x_sym.x_fcnary.x_ary.x_dimen[(i)])
217#define SA_GET_FILE_FNAME(s) (SYM_AUXENT (s)->x_file.x_fname)
218#define SA_GET_SCN_SCNLEN(s) (SYM_AUXENT (s)->x_scn.x_scnlen)
219#define SA_GET_SCN_NRELOC(s) (SYM_AUXENT (s)->x_scn.x_nreloc)
220#define SA_GET_SCN_NLINNO(s) (SYM_AUXENT (s)->x_scn.x_nlinno)
221
a5324a3e
NC
222#define SA_SET_SYM_LNNO(s,v) (SYM_AUXENT (s)->x_sym.x_misc.x_lnsz.x_lnno = (v))
223#define SA_SET_SYM_SIZE(s,v) (SYM_AUXENT (s)->x_sym.x_misc.x_lnsz.x_size = (v))
224#define SA_SET_SYM_FSIZE(s,v) (SYM_AUXENT (s)->x_sym.x_misc.x_fsize = (v))
225#define SA_SET_SYM_LNNOPTR(s,v) (SYM_AUXENT (s)->x_sym.x_fcnary.x_fcn.x_lnnoptr = (v))
226#define SA_SET_SYM_DIMEN(s,i,v) (SYM_AUXENT (s)->x_sym.x_fcnary.x_ary.x_dimen[(i)] = (v))
227#define SA_SET_FILE_FNAME(s,v) strncpy (SYM_AUXENT (s)->x_file.x_fname, (v), FILNMLEN)
228#define SA_SET_SCN_SCNLEN(s,v) (SYM_AUXENT (s)->x_scn.x_scnlen = (v))
229#define SA_SET_SCN_NRELOC(s,v) (SYM_AUXENT (s)->x_scn.x_nreloc = (v))
230#define SA_SET_SCN_NLINNO(s,v) (SYM_AUXENT (s)->x_scn.x_nlinno = (v))
252b5132 231
3b16e843 232/* Internal use only definitions. SF_ stands for symbol flags.
5d6255fe 233
3b16e843 234 These values can be assigned to sy_symbol.ost_flags field of a symbolS.
5d6255fe 235
3b16e843
NC
236 You'll break i960 if you shift the SYSPROC bits anywhere else. for
237 more on the balname/callname hack, see tc-i960.h. b.out is done
238 differently. */
252b5132 239
a5324a3e
NC
240#define SF_I960_MASK 0x000001ff /* Bits 0-8 are used by the i960 port. */
241#define SF_SYSPROC 0x0000003f /* bits 0-5 are used to store the sysproc number. */
242#define SF_IS_SYSPROC 0x00000040 /* bit 6 marks symbols that are sysprocs. */
243#define SF_BALNAME 0x00000080 /* bit 7 marks BALNAME symbols. */
244#define SF_CALLNAME 0x00000100 /* bit 8 marks CALLNAME symbols. */
245
246#define SF_NORMAL_MASK 0x0000ffff /* bits 12-15 are general purpose. */
247
248#define SF_STATICS 0x00001000 /* Mark the .text & all symbols. */
249#define SF_DEFINED 0x00002000 /* Symbol is defined in this file. */
250#define SF_STRING 0x00004000 /* Symbol name length > 8. */
251#define SF_LOCAL 0x00008000 /* Symbol must not be emitted. */
252
253#define SF_DEBUG_MASK 0xffff0000 /* bits 16-31 are debug info. */
254
255#define SF_FUNCTION 0x00010000 /* The symbol is a function. */
256#define SF_PROCESS 0x00020000 /* Process symbol before write. */
257#define SF_TAGGED 0x00040000 /* Is associated with a tag. */
258#define SF_TAG 0x00080000 /* Is a tag. */
259#define SF_DEBUG 0x00100000 /* Is in debug or abs section. */
260#define SF_GET_SEGMENT 0x00200000 /* Get the section of the forward symbol. */
dcd619be 261/* All other bits are unused. */
252b5132 262
3b16e843 263/* Accessors. */
a5324a3e 264#define SF_GET(s) (* symbol_get_obj (s))
49309057
ILT
265#define SF_GET_DEBUG(s) (symbol_get_bfdsym (s)->flags & BSF_DEBUGGING)
266#define SF_SET_DEBUG(s) (symbol_get_bfdsym (s)->flags |= BSF_DEBUGGING)
252b5132
RH
267#define SF_GET_NORMAL_FIELD(s) (SF_GET (s) & SF_NORMAL_MASK)
268#define SF_GET_DEBUG_FIELD(s) (SF_GET (s) & SF_DEBUG_MASK)
269#define SF_GET_FILE(s) (SF_GET (s) & SF_FILE)
270#define SF_GET_STATICS(s) (SF_GET (s) & SF_STATICS)
271#define SF_GET_DEFINED(s) (SF_GET (s) & SF_DEFINED)
272#define SF_GET_STRING(s) (SF_GET (s) & SF_STRING)
273#define SF_GET_LOCAL(s) (SF_GET (s) & SF_LOCAL)
274#define SF_GET_FUNCTION(s) (SF_GET (s) & SF_FUNCTION)
275#define SF_GET_PROCESS(s) (SF_GET (s) & SF_PROCESS)
276#define SF_GET_TAGGED(s) (SF_GET (s) & SF_TAGGED)
277#define SF_GET_TAG(s) (SF_GET (s) & SF_TAG)
278#define SF_GET_GET_SEGMENT(s) (SF_GET (s) & SF_GET_SEGMENT)
a5324a3e
NC
279#define SF_GET_I960(s) (SF_GET (s) & SF_I960_MASK) /* Used by i960. */
280#define SF_GET_BALNAME(s) (SF_GET (s) & SF_BALNAME) /* Used by i960. */
281#define SF_GET_CALLNAME(s) (SF_GET (s) & SF_CALLNAME) /* Used by i960. */
282#define SF_GET_IS_SYSPROC(s) (SF_GET (s) & SF_IS_SYSPROC) /* Used by i960. */
283#define SF_GET_SYSPROC(s) (SF_GET (s) & SF_SYSPROC) /* Used by i960. */
252b5132 284
3b16e843 285/* Modifiers. */
252b5132 286#define SF_SET(s,v) (SF_GET (s) = (v))
a5324a3e 287#define SF_SET_NORMAL_FIELD(s,v)(SF_GET (s) |= ((v) & SF_NORMAL_MASK))
252b5132
RH
288#define SF_SET_DEBUG_FIELD(s,v) (SF_GET (s) |= ((v) & SF_DEBUG_MASK))
289#define SF_SET_FILE(s) (SF_GET (s) |= SF_FILE)
290#define SF_SET_STATICS(s) (SF_GET (s) |= SF_STATICS)
291#define SF_SET_DEFINED(s) (SF_GET (s) |= SF_DEFINED)
292#define SF_SET_STRING(s) (SF_GET (s) |= SF_STRING)
293#define SF_SET_LOCAL(s) (SF_GET (s) |= SF_LOCAL)
294#define SF_CLEAR_LOCAL(s) (SF_GET (s) &= ~SF_LOCAL)
295#define SF_SET_FUNCTION(s) (SF_GET (s) |= SF_FUNCTION)
296#define SF_SET_PROCESS(s) (SF_GET (s) |= SF_PROCESS)
297#define SF_SET_TAGGED(s) (SF_GET (s) |= SF_TAGGED)
298#define SF_SET_TAG(s) (SF_GET (s) |= SF_TAG)
299#define SF_SET_GET_SEGMENT(s) (SF_GET (s) |= SF_GET_SEGMENT)
a5324a3e
NC
300#define SF_SET_I960(s,v) (SF_GET (s) |= ((v) & SF_I960_MASK)) /* Used by i960. */
301#define SF_SET_BALNAME(s) (SF_GET (s) |= SF_BALNAME) /* Used by i960. */
302#define SF_SET_CALLNAME(s) (SF_GET (s) |= SF_CALLNAME) /* Used by i960. */
303#define SF_SET_IS_SYSPROC(s) (SF_GET (s) |= SF_IS_SYSPROC) /* Used by i960. */
304#define SF_SET_SYSPROC(s,v) (SF_GET (s) |= ((v) & SF_SYSPROC)) /* Used by i960. */
252b5132 305
a5324a3e
NC
306
307/* Line number handling. */
252b5132
RH
308extern int text_lineno_number;
309extern int coff_line_base;
310extern int coff_n_line_nos;
a5324a3e 311extern symbolS *coff_last_function;
252b5132 312
a5324a3e
NC
313#define obj_emit_lineno(WHERE, LINE, FILE_START) abort ()
314#define obj_app_file(name, app) c_dot_file_symbol (name, app)
315#define obj_frob_symbol(S,P) coff_frob_symbol (S, & P)
316#define obj_frob_section(S) coff_frob_section (S)
317#define obj_frob_file_after_relocs() coff_frob_file_after_relocs ()
252b5132 318#ifndef obj_adjust_symtab
a5324a3e 319#define obj_adjust_symtab() coff_adjust_symtab ()
252b5132 320#endif
252b5132
RH
321
322/* Forward the segment of a forwarded symbol, handle assignments that
323 just copy symbol values, etc. */
2c1c4c62 324#ifndef OBJ_COPY_SYMBOL_ATTRIBUTES
252b5132 325#ifndef TE_I386AIX
a5324a3e 326#define OBJ_COPY_SYMBOL_ATTRIBUTES(dest, src) \
252b5132
RH
327 (SF_GET_GET_SEGMENT (dest) \
328 ? (S_SET_SEGMENT (dest, S_GET_SEGMENT (src)), 0) \
329 : 0)
330#else
a5324a3e 331#define OBJ_COPY_SYMBOL_ATTRIBUTES(dest, src) \
252b5132
RH
332 (SF_GET_GET_SEGMENT (dest) && S_GET_SEGMENT (dest) == SEG_UNKNOWN \
333 ? (S_SET_SEGMENT (dest, S_GET_SEGMENT (src)), 0) \
334 : 0)
335#endif
2c1c4c62 336#endif
252b5132 337
3b16e843 338/* Sanity check. */
252b5132
RH
339
340#ifdef TC_I960
341#ifndef C_LEAFSTAT
342hey ! Where is the C_LEAFSTAT definition ? i960 - coff support is depending on it.
343#endif /* no C_LEAFSTAT */
344#endif /* TC_I960 */
345
4c63da97
AM
346extern const pseudo_typeS coff_pseudo_table[];
347
348#ifndef obj_pop_insert
349#define obj_pop_insert() pop_insert (coff_pseudo_table)
350#endif
351
252b5132
RH
352/* In COFF, if a symbol is defined using .def/.val SYM/.endef, it's OK
353 to redefine the symbol later on. This can happen if C symbols use
354 a prefix, and a symbol is defined both with and without the prefix,
355 as in start/_start/__start in gcc/libgcc1-test.c. */
356#define RESOLVE_SYMBOL_REDEFINITION(sym) \
357(SF_GET_GET_SEGMENT (sym) \
358 ? (sym->sy_frag = frag_now, \
359 S_SET_VALUE (sym, frag_now_fix ()), \
360 S_SET_SEGMENT (sym, now_seg), \
361 0) \
362 : 0)
363
364/* Stabs in a coff file go into their own section. */
365#define SEPARATE_STAB_SECTIONS 1
366
367/* We need 12 bytes at the start of the section to hold some initial
368 information. */
252b5132
RH
369#define INIT_STAB_SECTION(seg) obj_coff_init_stab_section (seg)
370
945a1a6b
ILT
371/* Store the number of relocations in the section aux entry. */
372#define SET_SECTION_RELOCS(sec, relocs, n) \
373 SA_SET_SCN_NRELOC (section_symbol (sec), n)
374
a5324a3e
NC
375#define obj_app_file(name, app) c_dot_file_symbol (name, app)
376
a5324a3e
NC
377extern int S_SET_DATA_TYPE (symbolS *, int);
378extern int S_SET_STORAGE_CLASS (symbolS *, int);
379extern int S_GET_STORAGE_CLASS (symbolS *);
380extern void SA_SET_SYM_ENDNDX (symbolS *, symbolS *);
381extern void coff_add_linesym (symbolS *);
382extern void c_dot_file_symbol (const char *, int);
383extern void coff_frob_symbol (symbolS *, int *);
384extern void coff_adjust_symtab (void);
385extern void coff_frob_section (segT);
386extern void coff_adjust_section_syms (bfd *, asection *, void *);
387extern void coff_frob_file_after_relocs (void);
a5324a3e 388extern void coff_obj_symbol_new_hook (symbolS *);
6a2b6326 389extern void coff_obj_symbol_clone_hook (symbolS *, symbolS *);
a5324a3e 390extern void coff_obj_read_begin_hook (void);
06e77878
AO
391#ifdef TE_PE
392extern void pecoff_obj_set_weak_hook (symbolS *);
393extern void pecoff_obj_clear_weak_hook (symbolS *);
394#endif
a5324a3e
NC
395extern void obj_coff_section (int);
396extern segT obj_coff_add_segment (const char *);
397extern void obj_coff_section (int);
398extern void c_dot_file_symbol (const char *, int);
399extern segT s_get_segment (symbolS *);
36bfbdd3 400#ifndef tc_coff_symbol_emit_hook
a5324a3e 401extern void tc_coff_symbol_emit_hook (symbolS *);
36bfbdd3 402#endif
a5324a3e
NC
403extern void obj_coff_pe_handle_link_once (void);
404extern void obj_coff_init_stab_section (segT);
405extern void c_section_header (struct internal_scnhdr *,
406 char *, long, long, long, long,
407 long, long, long, long);
f3d2b04b
KT
408extern void obj_coff_seh_do_final (void);
409
410#ifndef obj_coff_generate_pdata
411#define obj_coff_generate_pdata obj_coff_seh_do_final
412#endif
413
414
252b5132 415#endif /* OBJ_FORMAT_H */
This page took 0.630487 seconds and 4 git commands to generate.