1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
|
/* $OpenBSD: struc-symbol.h,v 1.2 1998/02/15 18:48:59 niklas Exp $ */
/* struct_symbol.h - Internal symbol structure
Copyright (C) 1987, 1992 Free Software Foundation, Inc.
This file is part of GAS, the GNU Assembler.
GAS is free software; you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation; either version 2, or (at your option)
any later version.
GAS is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
oYou should have received a copy of the GNU General Public License
along with GAS; see the file COPYING. If not, write to
the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA. */
#ifndef __struc_symbol_h__
#define __struc_symbol_h__
struct symbol /* our version of an nlist node */
{
obj_symbol_type sy_symbol; /* what we write in .o file (if permitted) */
unsigned long sy_name_offset; /* 4-origin position of sy_name in symbols */
/* part of object file. */
/* 0 for (nameless) .stabd symbols. */
/* Not used until write_object_file() time. */
long sy_number; /* 24 bit symbol number. */
/* Symbol numbers start at 0 and are */
/* unsigned. */
struct symbol *sy_next; /* forward chain, or NULL */
#ifdef SYMBOLS_NEED_BACKPOINTERS
struct symbol *sy_previous; /* backward chain, or NULL */
#endif /* SYMBOLS_NEED_BACKPOINTERS */
struct frag *sy_frag; /* NULL or -> frag this symbol attaches to. */
struct symbol *sy_forward; /* value is really that of this other symbol */
/* We will probably want to add a sy_segment here soon. */
#ifdef PIC
/* Force symbol into symbol table, even if local */
int sy_forceout;
#endif
/* Size of symbol as given by the .size directive */
void *sy_sizexp; /* (expressionS *) */
/* Auxiliary type information as given by the .type directive */
unsigned char sy_aux;
#define AUX_OBJECT 1
#define AUX_FUNC 2
unsigned char sy_bind;
#define BIND_LOCAL 0 /* currently not used */
#define BIND_GLOBAL 1 /* currently not used */
#define BIND_WEAK 2
};
typedef struct symbol symbolS;
#ifdef PIC
symbolS *GOT_symbol; /* Pre-defined "__GLOBAL_OFFSET_TABLE" */
int got_referenced;
#endif
typedef unsigned valueT; /* The type of n_value. Helps casting. */
#ifndef WORKING_DOT_WORD
struct broken_word {
struct broken_word *next_broken_word;/* One of these strucs per .word x-y */
fragS *frag; /* Which frag its in */
char *word_goes_here;/* Where in the frag it is */
fragS *dispfrag; /* where to add the break */
symbolS *add; /* symbol_x */
symbolS *sub; /* - symbol_y */
long addnum; /* + addnum */
int added; /* nasty thing happend yet? */
/* 1: added and has a long-jump */
/* 2: added but uses someone elses long-jump */
struct broken_word *use_jump; /* points to broken_word with a similar
long-jump */
};
extern struct broken_word *broken_words;
#endif /* ndef WORKING_DOT_WORD */
#define SEGMENT_TO_SYMBOL_TYPE(seg) (seg_N_TYPE[(int) (seg)])
extern const short seg_N_TYPE[]; /* subseg.c */
#ifdef SYMBOLS_NEED_BACKPOINTERS
#if __STDC__ == 1
void symbol_clear_list_pointers(symbolS *symbolP);
void symbol_insert(symbolS *addme, symbolS *target, symbolS **rootP, symbolS **lastP);
void symbol_remove(symbolS *symbolP, symbolS **rootP, symbolS **lastP);
void verify_symbol_chain(symbolS *rootP, symbolS *lastP);
#else /* not __STDC__ */
void symbol_clear_list_pointers();
void symbol_insert();
void symbol_remove();
void verify_symbol_chain();
#endif /* not __STDC__ */
#define symbol_previous(s) ((s)->sy_previous)
#else /* SYMBOLS_NEED_BACKPOINTERS */
#define symbol_clear_list_pointers(clearme) {clearme->sy_next = NULL;}
#endif /* SYMBOLS_NEED_BACKPOINTERS */
#if __STDC__ == 1
void symbol_append(symbolS *addme, symbolS *target, symbolS **rootP, symbolS **lastP);
#else /* not __STDC__ */
void symbol_append();
#endif /* not __STDC__ */
#define symbol_next(s) ((s)->sy_next)
#endif /* __struc_symbol_h__ */
/*
* Local Variables:
* comment-column: 0
* fill-column: 131
* End:
*/
/* end of struc-symbol.h */
|