forked from Imagelibrary/binutils-gdb
* 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:
@@ -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
|
||||||
|
|||||||
2
gas/as.c
2
gas/as.c
@@ -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
|
||||||
|
|||||||
@@ -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;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -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:
|
||||||
|
|
||||||
|
|||||||
@@ -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;
|
||||||
|
|
||||||
|
|||||||
@@ -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 *);
|
||||||
|
|||||||
Reference in New Issue
Block a user