* 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.
This commit is contained in:
Maciej W. Rozycki
2010-12-01 21:34:10 +00:00
parent 3df4e177c9
commit 4a826962e7
6 changed files with 43 additions and 3 deletions

View File

@@ -1,3 +1,17 @@
2010-12-01 Maciej W. Rozycki <macro@codesourcery.com>
* 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 <macro@codesourcery.com> 2010-12-01 Maciej W. Rozycki <macro@codesourcery.com>
* symbols.c (symbol_clone_if_forward_ref): Don't limit cloning * symbols.c (symbol_clone_if_forward_ref): Don't limit cloning

View File

@@ -1181,6 +1181,8 @@ main (int argc, char ** argv)
output_file_create (out_file_name); output_file_create (out_file_name);
gas_assert (stdoutput != 0); gas_assert (stdoutput != 0);
dot_symbol_init ();
#ifdef tc_init_after_args #ifdef tc_init_after_args
tc_init_after_args (); tc_init_after_args ();
#endif #endif

View File

@@ -705,7 +705,7 @@ current_location (expressionS *expressionp)
else else
{ {
expressionp->X_op = O_symbol; expressionp->X_op = O_symbol;
expressionp->X_add_symbol = symbol_temp_new_now (); expressionp->X_add_symbol = &dot_symbol;
expressionp->X_add_number = 0; expressionp->X_add_number = 0;
} }
} }

View File

@@ -629,6 +629,7 @@ read_a_source_file (char *name)
was_new_line = is_end_of_line[(unsigned char) input_line_pointer[-1]]; was_new_line = is_end_of_line[(unsigned char) input_line_pointer[-1]];
if (was_new_line) if (was_new_line)
{ {
symbol_set_value_now (&dot_symbol);
#ifdef md_start_line_hook #ifdef md_start_line_hook
md_start_line_hook (); md_start_line_hook ();
#endif #endif
@@ -1128,6 +1129,7 @@ read_a_source_file (char *name)
md_after_pass_hook (); md_after_pass_hook ();
#endif #endif
} }
symbol_set_value_now (&dot_symbol);
quit: quit:

View File

@@ -48,6 +48,7 @@ static struct hash_control *local_hash;
symbolS *symbol_rootP; symbolS *symbol_rootP;
symbolS *symbol_lastP; symbolS *symbol_lastP;
symbolS abs_symbol; symbolS abs_symbol;
symbolS dot_symbol;
#ifdef DEBUG_SYMS #ifdef DEBUG_SYMS
#define debug_verify_symchain verify_symbol_chain #define debug_verify_symchain verify_symbol_chain
@@ -557,6 +558,9 @@ symbol_clone (symbolS *orgsymP, int replace)
symbolS *newsymP; symbolS *newsymP;
asymbol *bsymorg, *bsymnew; 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 /* Running local_symbol_convert on a clone that's not the one currently
in local_hash would incorrectly replace the hash entry. Thus the in local_hash would incorrectly replace the hash entry. Thus the
symbol must be converted here. Note that the rest of the function 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 || add_symbol != symbolP->sy_value.X_add_symbol
|| op_symbol != symbolP->sy_value.X_op_symbol) || op_symbol != symbolP->sy_value.X_op_symbol)
{ {
symbolP = symbol_clone (symbolP, 0); if (symbolP != &dot_symbol)
symbolP->sy_resolving = 0; {
symbolP = symbol_clone (symbolP, 0);
symbolP->sy_resolving = 0;
}
else
symbolP = symbol_temp_new_now ();
} }
symbolP->sy_value.X_add_symbol = add_symbol; symbolP->sy_value.X_add_symbol = add_symbol;
@@ -2749,6 +2758,17 @@ symbol_begin (void)
if (LOCAL_LABELS_FB) if (LOCAL_LABELS_FB)
fb_label_init (); 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; int indent_level;

View File

@@ -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 *symbol_lastP; /* last struct symbol we made, or NULL */
extern symbolS abs_symbol; extern symbolS abs_symbol;
extern symbolS dot_symbol;
extern int symbol_table_frozen; extern int symbol_table_frozen;
@@ -60,6 +61,7 @@ symbolS *symbol_temp_make (void);
symbolS *colon (const char *sym_name); symbolS *colon (const char *sym_name);
void local_colon (int n); void local_colon (int n);
void symbol_begin (void); void symbol_begin (void);
void dot_symbol_init (void);
void symbol_print_statistics (FILE *); void symbol_print_statistics (FILE *);
void symbol_table_insert (symbolS * symbolP); void symbol_table_insert (symbolS * symbolP);
valueT resolve_symbol_value (symbolS *); valueT resolve_symbol_value (symbolS *);