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