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