133965Sjdp/* symbols.h -
2104834Sobrien   Copyright 1987, 1990, 1992, 1993, 1994, 1995, 1997, 1999, 2000, 2001,
3218822Sdim   2002, 2003, 2004, 2005 Free Software Foundation, Inc.
433965Sjdp
533965Sjdp   This file is part of GAS, the GNU Assembler.
633965Sjdp
733965Sjdp   GAS is free software; you can redistribute it and/or modify
833965Sjdp   it under the terms of the GNU General Public License as published by
933965Sjdp   the Free Software Foundation; either version 2, or (at your option)
1033965Sjdp   any later version.
1133965Sjdp
1233965Sjdp   GAS is distributed in the hope that it will be useful,
1333965Sjdp   but WITHOUT ANY WARRANTY; without even the implied warranty of
1433965Sjdp   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
1533965Sjdp   GNU General Public License for more details.
1633965Sjdp
1733965Sjdp   You should have received a copy of the GNU General Public License
1833965Sjdp   along with GAS; see the file COPYING.  If not, write to the Free
19218822Sdim   Software Foundation, 51 Franklin Street - Fifth Floor, Boston, MA
20218822Sdim   02110-1301, USA.  */
2133965Sjdp
2277298Sobrienextern struct obstack notes;	/* eg FixS live here.  */
2333965Sjdp
2433965Sjdpextern struct obstack cond_obstack;	/* this is where we track .ifdef/.endif
2533965Sjdp				       (if we do that at all).  */
2633965Sjdp
2733965Sjdpextern symbolS *symbol_rootP;	/* all the symbol nodes */
2833965Sjdpextern symbolS *symbol_lastP;	/* last struct symbol we made, or NULL */
2933965Sjdp
3033965Sjdpextern symbolS abs_symbol;
3133965Sjdp
3233965Sjdpextern int symbol_table_frozen;
3333965Sjdp
3433965Sjdp/* This is non-zero if symbols are case sensitive, which is the
3533965Sjdp   default.  */
3633965Sjdpextern int symbols_case_sensitive;
3733965Sjdp
38218822Sdimchar * symbol_relc_make_expr  (expressionS *);
39218822Sdimchar * symbol_relc_make_sym   (symbolS *);
40218822Sdimchar * symbol_relc_make_value (offsetT);
41130561Sobrienchar *decode_local_label_name (char *s);
42130561SobriensymbolS *symbol_find (const char *name);
43218822SdimsymbolS *symbol_find_noref (const char *name, int noref);
44130561SobriensymbolS *symbol_find_exact (const char *name);
45218822SdimsymbolS *symbol_find_exact_noref (const char *name, int noref);
46130561SobriensymbolS *symbol_find_or_make (const char *name);
47130561SobriensymbolS *symbol_make (const char *name);
48130561SobriensymbolS *symbol_new (const char *name, segT segment, valueT value,
49130561Sobrien		     fragS * frag);
50130561SobriensymbolS *symbol_create (const char *name, segT segment, valueT value,
51130561Sobrien			fragS * frag);
52218822SdimsymbolS *symbol_clone (symbolS *, int);
53218822Sdim#undef symbol_clone_if_forward_ref
54218822SdimsymbolS *symbol_clone_if_forward_ref (symbolS *, int);
55218822Sdim#define symbol_clone_if_forward_ref(s) symbol_clone_if_forward_ref (s, 0)
56130561SobriensymbolS *symbol_temp_new (segT, valueT, fragS *);
57130561SobriensymbolS *symbol_temp_new_now (void);
58130561SobriensymbolS *symbol_temp_make (void);
5933965Sjdp
60130561SobriensymbolS *colon (const char *sym_name);
61130561Sobrienvoid local_colon (int n);
62130561Sobrienvoid symbol_begin (void);
63130561Sobrienvoid symbol_print_statistics (FILE *);
64130561Sobrienvoid symbol_table_insert (symbolS * symbolP);
65130561SobrienvalueT resolve_symbol_value (symbolS *);
66130561Sobrienvoid resolve_local_symbol_values (void);
67218822Sdimint snapshot_symbol (symbolS **, valueT *, segT *, fragS **);
6833965Sjdp
69130561Sobrienvoid print_symbol_value (symbolS *);
70130561Sobrienvoid print_expr (expressionS *);
71130561Sobrienvoid print_expr_1 (FILE *, expressionS *);
72130561Sobrienvoid print_symbol_value_1 (FILE *, symbolS *);
7333965Sjdp
74130561Sobrienint dollar_label_defined (long l);
75130561Sobrienvoid dollar_label_clear (void);
76130561Sobrienvoid define_dollar_label (long l);
77130561Sobrienchar *dollar_label_name (long l, int augend);
7833965Sjdp
79130561Sobrienvoid fb_label_instance_inc (long label);
80130561Sobrienchar *fb_label_name (long n, long augend);
8133965Sjdp
82130561Sobrienextern void copy_symbol_attributes (symbolS *, symbolS *);
83130561Sobrien
8433965Sjdp/* Get and set the values of symbols.  These used to be macros.  */
85130561Sobrienextern valueT S_GET_VALUE (symbolS *);
86130561Sobrienextern void S_SET_VALUE (symbolS *, valueT);
8733965Sjdp
88130561Sobrienextern int S_IS_FUNCTION (symbolS *);
89130561Sobrienextern int S_IS_EXTERNAL (symbolS *);
90130561Sobrienextern int S_IS_WEAK (symbolS *);
91218822Sdimextern int S_IS_WEAKREFR (symbolS *);
92218822Sdimextern int S_IS_WEAKREFD (symbolS *);
93130561Sobrienextern int S_IS_COMMON (symbolS *);
94130561Sobrienextern int S_IS_DEFINED (symbolS *);
95130561Sobrienextern int S_FORCE_RELOC (symbolS *, int);
96130561Sobrienextern int S_IS_DEBUG (symbolS *);
97130561Sobrienextern int S_IS_LOCAL (symbolS *);
98130561Sobrienextern int S_IS_STABD (symbolS *);
99218822Sdimextern int S_IS_VOLATILE (const symbolS *);
100218822Sdimextern int S_IS_FORWARD_REF (const symbolS *);
101130561Sobrienextern const char *S_GET_NAME (symbolS *);
102130561Sobrienextern segT S_GET_SEGMENT (symbolS *);
103130561Sobrienextern void S_SET_SEGMENT (symbolS *, segT);
104130561Sobrienextern void S_SET_EXTERNAL (symbolS *);
105218822Sdimextern void S_SET_NAME (symbolS *, const char *);
106130561Sobrienextern void S_CLEAR_EXTERNAL (symbolS *);
107130561Sobrienextern void S_SET_WEAK (symbolS *);
108218822Sdimextern void S_SET_WEAKREFR (symbolS *);
109218822Sdimextern void S_CLEAR_WEAKREFR (symbolS *);
110218822Sdimextern void S_SET_WEAKREFD (symbolS *);
111218822Sdimextern void S_CLEAR_WEAKREFD (symbolS *);
112130561Sobrienextern void S_SET_THREAD_LOCAL (symbolS *);
113218822Sdimextern void S_SET_VOLATILE (symbolS *);
114218822Sdimextern void S_CLEAR_VOLATILE (symbolS *);
115218822Sdimextern void S_SET_FORWARD_REF (symbolS *);
11633965Sjdp
11760484Sobrien#ifndef WORKING_DOT_WORD
11860484Sobrienstruct broken_word
11960484Sobrien  {
12060484Sobrien    /* Linked list -- one of these structures per ".word x-y+C"
12160484Sobrien       expression.  */
12260484Sobrien    struct broken_word *next_broken_word;
12360484Sobrien    /* Segment and subsegment for broken word.  */
12460484Sobrien    segT seg;
12560484Sobrien    subsegT subseg;
12660484Sobrien    /* Which frag is this broken word in?  */
12760484Sobrien    fragS *frag;
12860484Sobrien    /* Where in the frag is it?  */
12960484Sobrien    char *word_goes_here;
13060484Sobrien    /* Where to add the break.  */
13160484Sobrien    fragS *dispfrag;		/* where to add the break */
13260484Sobrien    /* Operands of expression.  */
13360484Sobrien    symbolS *add;
13460484Sobrien    symbolS *sub;
13560484Sobrien    offsetT addnum;
13660484Sobrien
137130561Sobrien    int added;			/* nasty thing happened yet? */
13860484Sobrien    /* 1: added and has a long-jump */
13960484Sobrien    /* 2: added but uses someone elses long-jump */
14060484Sobrien
14160484Sobrien    /* Pointer to broken_word with a similar long-jump.  */
14260484Sobrien    struct broken_word *use_jump;
14360484Sobrien  };
14460484Sobrienextern struct broken_word *broken_words;
14560484Sobrien#endif /* ndef WORKING_DOT_WORD */
14660484Sobrien
14760484Sobrien/*
14860484Sobrien * Current means for getting from symbols to segments and vice verse.
14960484Sobrien * This will change for infinite-segments support (e.g. COFF).
15060484Sobrien */
15160484Sobrienextern const segT N_TYPE_seg[];	/* subseg.c */
15260484Sobrien
15360484Sobrien#define	SEGMENT_TO_SYMBOL_TYPE(seg)  ( seg_N_TYPE [(int) (seg)] )
15460484Sobrienextern const short seg_N_TYPE[];/* subseg.c */
15560484Sobrien
15660484Sobrien#define	N_REGISTER	30	/* Fake N_TYPE value for SEG_REGISTER */
15760484Sobrien
158130561Sobrienvoid symbol_clear_list_pointers (symbolS * symbolP);
15960484Sobrien
160130561Sobrienvoid symbol_insert (symbolS * addme, symbolS * target,
161130561Sobrien		    symbolS ** rootP, symbolS ** lastP);
162130561Sobrienvoid symbol_remove (symbolS * symbolP, symbolS ** rootP,
163130561Sobrien		    symbolS ** lastP);
16460484Sobrien
165130561Sobrienextern symbolS *symbol_previous (symbolS *);
16660484Sobrien
167130561Sobrienvoid verify_symbol_chain (symbolS * rootP, symbolS * lastP);
16860484Sobrien
169130561Sobrienvoid symbol_append (symbolS * addme, symbolS * target,
170130561Sobrien		    symbolS ** rootP, symbolS ** lastP);
17160484Sobrien
172130561Sobrienextern symbolS *symbol_next (symbolS *);
17360484Sobrien
174130561Sobrienextern expressionS *symbol_get_value_expression (symbolS *);
175130561Sobrienextern void symbol_set_value_expression (symbolS *, const expressionS *);
176218822Sdimextern offsetT *symbol_X_add_number (symbolS *);
177130561Sobrienextern void symbol_set_value_now (symbolS *);
178130561Sobrienextern void symbol_set_frag (symbolS *, fragS *);
179130561Sobrienextern fragS *symbol_get_frag (symbolS *);
180130561Sobrienextern void symbol_mark_used (symbolS *);
181130561Sobrienextern void symbol_clear_used (symbolS *);
182130561Sobrienextern int symbol_used_p (symbolS *);
183130561Sobrienextern void symbol_mark_used_in_reloc (symbolS *);
184130561Sobrienextern void symbol_clear_used_in_reloc (symbolS *);
185130561Sobrienextern int symbol_used_in_reloc_p (symbolS *);
186130561Sobrienextern void symbol_mark_mri_common (symbolS *);
187130561Sobrienextern void symbol_clear_mri_common (symbolS *);
188130561Sobrienextern int symbol_mri_common_p (symbolS *);
189130561Sobrienextern void symbol_mark_written (symbolS *);
190130561Sobrienextern void symbol_clear_written (symbolS *);
191130561Sobrienextern int symbol_written_p (symbolS *);
192130561Sobrienextern void symbol_mark_resolved (symbolS *);
193130561Sobrienextern int symbol_resolved_p (symbolS *);
194130561Sobrienextern int symbol_section_p (symbolS *);
195130561Sobrienextern int symbol_equated_p (symbolS *);
196130561Sobrienextern int symbol_equated_reloc_p (symbolS *);
197130561Sobrienextern int symbol_constant_p (symbolS *);
198218822Sdimextern int symbol_shadow_p (symbolS *);
199130561Sobrienextern asymbol *symbol_get_bfdsym (symbolS *);
200130561Sobrienextern void symbol_set_bfdsym (symbolS *, asymbol *);
20160484Sobrien
20260484Sobrien#ifdef OBJ_SYMFIELD_TYPE
203130561SobrienOBJ_SYMFIELD_TYPE *symbol_get_obj (symbolS *);
204130561Sobrienvoid symbol_set_obj (symbolS *, OBJ_SYMFIELD_TYPE *);
20560484Sobrien#endif
20660484Sobrien
20760484Sobrien#ifdef TC_SYMFIELD_TYPE
208130561SobrienTC_SYMFIELD_TYPE *symbol_get_tc (symbolS *);
209130561Sobrienvoid symbol_set_tc (symbolS *, TC_SYMFIELD_TYPE *);
21060484Sobrien#endif
211