From: Maciej W. Rozycki Date: Wed, 1 Dec 2010 21:34:10 +0000 (+0000) Subject: * symbols.h (dot_symbol): New declaration. X-Git-Url: https://git.libre-soc.org/?a=commitdiff_plain;h=4a826962e76042a7ec1126e1e24b1850faa52443;p=binutils-gdb.git * symbols.h (dot_symbol): New declaration. (dot_symbol_init): New prototype. * symbols.c (dot_symbol): New variable. (symbol_clone): Assert it's not dot_symbol being cloned. (dot_symbol_init): New function. (symbol_clone_if_forward_ref): Create a new temporary symbol when trying to clone dot_symbol. * expr.c (current_location): Refer to dot_symbol instead of making a new temporary symbol. * read.c (read_a_source_file): Update dot_symbol as we go. * as.c (main): Call dot_symbol_init. --- diff --git a/gas/ChangeLog b/gas/ChangeLog index 374c60e3a33..e8e58fdac68 100644 --- a/gas/ChangeLog +++ b/gas/ChangeLog @@ -1,3 +1,17 @@ +2010-12-01 Maciej W. Rozycki + + * symbols.h (dot_symbol): New declaration. + (dot_symbol_init): New prototype. + * symbols.c (dot_symbol): New variable. + (symbol_clone): Assert it's not dot_symbol being cloned. + (dot_symbol_init): New function. + (symbol_clone_if_forward_ref): Create a new temporary symbol + when trying to clone dot_symbol. + * expr.c (current_location): Refer to dot_symbol instead of + making a new temporary symbol. + * read.c (read_a_source_file): Update dot_symbol as we go. + * as.c (main): Call dot_symbol_init. + 2010-12-01 Maciej W. Rozycki * symbols.c (symbol_clone_if_forward_ref): Don't limit cloning diff --git a/gas/as.c b/gas/as.c index d9aa6e276f2..4937351c9f4 100644 --- a/gas/as.c +++ b/gas/as.c @@ -1181,6 +1181,8 @@ main (int argc, char ** argv) output_file_create (out_file_name); gas_assert (stdoutput != 0); + dot_symbol_init (); + #ifdef tc_init_after_args tc_init_after_args (); #endif diff --git a/gas/expr.c b/gas/expr.c index 620fdce31d7..215b2bad7c4 100644 --- a/gas/expr.c +++ b/gas/expr.c @@ -705,7 +705,7 @@ current_location (expressionS *expressionp) else { expressionp->X_op = O_symbol; - expressionp->X_add_symbol = symbol_temp_new_now (); + expressionp->X_add_symbol = &dot_symbol; expressionp->X_add_number = 0; } } diff --git a/gas/read.c b/gas/read.c index bd3fa58bbec..ad9363a6044 100644 --- a/gas/read.c +++ b/gas/read.c @@ -629,6 +629,7 @@ read_a_source_file (char *name) was_new_line = is_end_of_line[(unsigned char) input_line_pointer[-1]]; if (was_new_line) { + symbol_set_value_now (&dot_symbol); #ifdef md_start_line_hook md_start_line_hook (); #endif @@ -1128,6 +1129,7 @@ read_a_source_file (char *name) md_after_pass_hook (); #endif } + symbol_set_value_now (&dot_symbol); quit: diff --git a/gas/symbols.c b/gas/symbols.c index e432b8603f6..5fae5471b14 100644 --- a/gas/symbols.c +++ b/gas/symbols.c @@ -48,6 +48,7 @@ static struct hash_control *local_hash; symbolS *symbol_rootP; symbolS *symbol_lastP; symbolS abs_symbol; +symbolS dot_symbol; #ifdef DEBUG_SYMS #define debug_verify_symchain verify_symbol_chain @@ -557,6 +558,9 @@ symbol_clone (symbolS *orgsymP, int replace) symbolS *newsymP; asymbol *bsymorg, *bsymnew; + /* Make sure we never clone the dot special symbol. */ + gas_assert (orgsymP != &dot_symbol); + /* Running local_symbol_convert on a clone that's not the one currently in local_hash would incorrectly replace the hash entry. Thus the symbol must be converted here. Note that the rest of the function @@ -658,8 +662,13 @@ symbol_clone_if_forward_ref (symbolS *symbolP, int is_forward) || add_symbol != symbolP->sy_value.X_add_symbol || op_symbol != symbolP->sy_value.X_op_symbol) { - symbolP = symbol_clone (symbolP, 0); - symbolP->sy_resolving = 0; + if (symbolP != &dot_symbol) + { + symbolP = symbol_clone (symbolP, 0); + symbolP->sy_resolving = 0; + } + else + symbolP = symbol_temp_new_now (); } symbolP->sy_value.X_add_symbol = add_symbol; @@ -2749,6 +2758,17 @@ symbol_begin (void) if (LOCAL_LABELS_FB) fb_label_init (); } + +void +dot_symbol_init (void) +{ + dot_symbol.bsym = bfd_make_empty_symbol (stdoutput); + if (dot_symbol.bsym == NULL) + as_fatal ("bfd_make_empty_symbol: %s", bfd_errmsg (bfd_get_error ())); + dot_symbol.bsym->name = "."; + dot_symbol.sy_forward_ref = 1; + dot_symbol.sy_value.X_op = O_constant; +} int indent_level; diff --git a/gas/symbols.h b/gas/symbols.h index 377a130074b..1d5b2a3ca63 100644 --- a/gas/symbols.h +++ b/gas/symbols.h @@ -28,6 +28,7 @@ extern symbolS *symbol_rootP; /* all the symbol nodes */ extern symbolS *symbol_lastP; /* last struct symbol we made, or NULL */ extern symbolS abs_symbol; +extern symbolS dot_symbol; extern int symbol_table_frozen; @@ -60,6 +61,7 @@ symbolS *symbol_temp_make (void); symbolS *colon (const char *sym_name); void local_colon (int n); void symbol_begin (void); +void dot_symbol_init (void); void symbol_print_statistics (FILE *); void symbol_table_insert (symbolS * symbolP); valueT resolve_symbol_value (symbolS *);