2000-08-10 Kazu Hirata <kazu@hxi.com>
* symbols.c: Fix formatting.
This commit is contained in:
parent
f1d7622b95
commit
7c743825ea
2 changed files with 190 additions and 219 deletions
|
@ -1,3 +1,7 @@
|
|||
2000-08-10 Kazu Hirata <kazu@hxi.com>
|
||||
|
||||
* symbols.c: Fix formatting.
|
||||
|
||||
2000-08-09 Alan Modra <alan@linuxcare.com.au>
|
||||
|
||||
From Rodney Brown <RodneyBrown@mynd.com>
|
||||
|
|
405
gas/symbols.c
405
gas/symbols.c
|
@ -19,7 +19,7 @@
|
|||
Software Foundation, 59 Temple Place - Suite 330, Boston, MA
|
||||
02111-1307, USA. */
|
||||
|
||||
/* #define DEBUG_SYMS / * to debug symbol list maintenance */
|
||||
/* #define DEBUG_SYMS / * to debug symbol list maintenance. */
|
||||
|
||||
#include <ctype.h>
|
||||
|
||||
|
@ -44,7 +44,7 @@ static struct hash_control *sy_hash;
|
|||
/* Table of local symbols. */
|
||||
static struct hash_control *local_hash;
|
||||
|
||||
/* Below are commented in "symbols.h". */
|
||||
/* Below are commented in "symbols.h". */
|
||||
symbolS *symbol_rootP;
|
||||
symbolS *symbol_lastP;
|
||||
symbolS abs_symbol;
|
||||
|
@ -63,12 +63,10 @@ static long fb_label_instance PARAMS ((long));
|
|||
|
||||
static void print_binary PARAMS ((FILE *, const char *, expressionS *));
|
||||
|
||||
/* symbol_new()
|
||||
|
||||
Return a pointer to a new symbol. Die if we can't make a new
|
||||
/* Return a pointer to a new symbol. Die if we can't make a new
|
||||
symbol. Fill in the symbol's values. Add symbol to end of symbol
|
||||
chain.
|
||||
|
||||
|
||||
This function should be called in the general case of creating a
|
||||
symbol. However, if the output file symbol table has already been
|
||||
set, and you are certain that this symbol won't be wanted in the
|
||||
|
@ -83,9 +81,7 @@ symbol_new (name, segment, valu, frag)
|
|||
{
|
||||
symbolS *symbolP = symbol_create (name, segment, valu, frag);
|
||||
|
||||
/*
|
||||
* Link to end of symbol chain.
|
||||
*/
|
||||
/* Link to end of symbol chain. */
|
||||
#ifdef BFD_ASSEMBLER
|
||||
{
|
||||
extern int symbol_table_frozen;
|
||||
|
@ -108,7 +104,7 @@ save_symbol_name (name)
|
|||
unsigned int name_length;
|
||||
char *ret;
|
||||
|
||||
name_length = strlen (name) + 1; /* +1 for \0 */
|
||||
name_length = strlen (name) + 1; /* +1 for \0. */
|
||||
obstack_grow (¬es, name, name_length);
|
||||
ret = obstack_finish (¬es);
|
||||
|
||||
|
@ -135,10 +131,10 @@ save_symbol_name (name)
|
|||
|
||||
symbolS *
|
||||
symbol_create (name, segment, valu, frag)
|
||||
const char *name; /* It is copied, the caller can destroy/modify */
|
||||
segT segment; /* Segment identifier (SEG_<something>) */
|
||||
valueT valu; /* Symbol value */
|
||||
fragS *frag; /* Associated fragment */
|
||||
const char *name; /* It is copied, the caller can destroy/modify. */
|
||||
segT segment; /* Segment identifier (SEG_<something>). */
|
||||
valueT valu; /* Symbol value. */
|
||||
fragS *frag; /* Associated fragment. */
|
||||
{
|
||||
char *preserved_copy_of_name;
|
||||
symbolS *symbolP;
|
||||
|
@ -147,7 +143,7 @@ symbol_create (name, segment, valu, frag)
|
|||
|
||||
symbolP = (symbolS *) obstack_alloc (¬es, sizeof (symbolS));
|
||||
|
||||
/* symbol must be born in some fixed state. This seems as good as any. */
|
||||
/* symbol must be born in some fixed state. This seems as good as any. */
|
||||
memset (symbolP, 0, sizeof (symbolS));
|
||||
|
||||
#ifdef BFD_ASSEMBLER
|
||||
|
@ -272,22 +268,17 @@ local_symbol_convert (locsym)
|
|||
|
||||
#endif /* ! BFD_ASSEMBLER */
|
||||
|
||||
/* We have just seen "<name>:".
|
||||
Creates a struct symbol unless it already exists.
|
||||
|
||||
Gripes if we are redefining a symbol incompatibly (and ignores it). */
|
||||
|
||||
/*
|
||||
* colon()
|
||||
*
|
||||
* We have just seen "<name>:".
|
||||
* Creates a struct symbol unless it already exists.
|
||||
*
|
||||
* Gripes if we are redefining a symbol incompatibly (and ignores it).
|
||||
*
|
||||
*/
|
||||
symbolS *
|
||||
colon (sym_name) /* just seen "x:" - rattle symbols & frags */
|
||||
const char *sym_name; /* symbol name, as a cannonical string */
|
||||
/* We copy this string: OK to alter later. */
|
||||
colon (sym_name) /* Just seen "x:" - rattle symbols & frags. */
|
||||
const char *sym_name; /* Symbol name, as a cannonical string. */
|
||||
/* We copy this string: OK to alter later. */
|
||||
{
|
||||
register symbolS *symbolP; /* symbol we are working with */
|
||||
register symbolS *symbolP; /* Symbol we are working with. */
|
||||
|
||||
/* Sun local labels go out of scope whenever a non-local symbol is
|
||||
defined. */
|
||||
|
@ -327,9 +318,9 @@ colon (sym_name) /* just seen "x:" - rattle symbols & frags */
|
|||
(offsetT) 0,
|
||||
NULL);
|
||||
|
||||
/* We want to store the pointer to where to insert the jump table in the
|
||||
fr_opcode of the rs_broken_word frag. This requires a little
|
||||
hackery. */
|
||||
/* We want to store the pointer to where to insert the jump
|
||||
table in the fr_opcode of the rs_broken_word frag. This
|
||||
requires a little hackery. */
|
||||
while (frag_tmp
|
||||
&& (frag_tmp->fr_type != rs_broken_word
|
||||
|| frag_tmp->fr_opcode))
|
||||
|
@ -349,9 +340,7 @@ colon (sym_name) /* just seen "x:" - rattle symbols & frags */
|
|||
if (RESOLVE_SYMBOL_REDEFINITION (symbolP))
|
||||
return symbolP;
|
||||
#endif
|
||||
/*
|
||||
* Now check for undefined symbols
|
||||
*/
|
||||
/* Now check for undefined symbols. */
|
||||
if (LOCAL_SYMBOL_CHECK (symbolP))
|
||||
{
|
||||
#ifdef BFD_ASSEMBLER
|
||||
|
@ -377,27 +366,27 @@ colon (sym_name) /* just seen "x:" - rattle symbols & frags */
|
|||
{
|
||||
symbolP->sy_frag = frag_now;
|
||||
#ifdef OBJ_VMS
|
||||
S_SET_OTHER(symbolP, const_flag);
|
||||
S_SET_OTHER (symbolP, const_flag);
|
||||
#endif
|
||||
S_SET_VALUE (symbolP, (valueT) frag_now_fix ());
|
||||
S_SET_SEGMENT (symbolP, now_seg);
|
||||
#ifdef N_UNDF
|
||||
know (N_UNDF == 0);
|
||||
#endif /* if we have one, it better be zero. */
|
||||
#endif /* if we have one, it better be zero. */
|
||||
|
||||
}
|
||||
else
|
||||
{
|
||||
/*
|
||||
* There are still several cases to check:
|
||||
* A .comm/.lcomm symbol being redefined as
|
||||
* initialized data is OK
|
||||
* A .comm/.lcomm symbol being redefined with
|
||||
* a larger size is also OK
|
||||
*
|
||||
* This only used to be allowed on VMS gas, but Sun cc
|
||||
* on the sparc also depends on it.
|
||||
*/
|
||||
/* There are still several cases to check:
|
||||
|
||||
A .comm/.lcomm symbol being redefined as initialized
|
||||
data is OK
|
||||
|
||||
A .comm/.lcomm symbol being redefined with a larger
|
||||
size is also OK
|
||||
|
||||
This only used to be allowed on VMS gas, but Sun cc
|
||||
on the sparc also depends on it. */
|
||||
|
||||
if (((!S_IS_DEBUG (symbolP)
|
||||
&& (!S_IS_DEFINED (symbolP) || S_IS_COMMON (symbolP))
|
||||
|
@ -406,17 +395,14 @@ colon (sym_name) /* just seen "x:" - rattle symbols & frags */
|
|||
&& (now_seg == data_section
|
||||
|| now_seg == S_GET_SEGMENT (symbolP)))
|
||||
{
|
||||
/*
|
||||
* Select which of the 2 cases this is
|
||||
*/
|
||||
/* Select which of the 2 cases this is. */
|
||||
if (now_seg != data_section)
|
||||
{
|
||||
/*
|
||||
* New .comm for prev .comm symbol.
|
||||
* If the new size is larger we just
|
||||
* change its value. If the new size
|
||||
* is smaller, we ignore this symbol
|
||||
*/
|
||||
/* New .comm for prev .comm symbol.
|
||||
|
||||
If the new size is larger we just change its
|
||||
value. If the new size is smaller, we ignore
|
||||
this symbol. */
|
||||
if (S_GET_VALUE (symbolP)
|
||||
< ((unsigned) frag_now_fix ()))
|
||||
{
|
||||
|
@ -429,10 +415,10 @@ colon (sym_name) /* just seen "x:" - rattle symbols & frags */
|
|||
data. */
|
||||
symbolP->sy_frag = frag_now;
|
||||
#ifdef OBJ_VMS
|
||||
S_SET_OTHER(symbolP, const_flag);
|
||||
S_SET_OTHER (symbolP, const_flag);
|
||||
#endif
|
||||
S_SET_VALUE (symbolP, (valueT) frag_now_fix ());
|
||||
S_SET_SEGMENT (symbolP, now_seg); /* keep N_EXT bit */
|
||||
S_SET_SEGMENT (symbolP, now_seg); /* Keep N_EXT bit. */
|
||||
}
|
||||
}
|
||||
else
|
||||
|
@ -456,16 +442,16 @@ colon (sym_name) /* just seen "x:" - rattle symbols & frags */
|
|||
od_buf,
|
||||
(long) S_GET_VALUE (symbolP));
|
||||
}
|
||||
} /* if the undefined symbol has no value */
|
||||
} /* if the undefined symbol has no value */
|
||||
}
|
||||
else
|
||||
{
|
||||
/* Don't blow up if the definition is the same */
|
||||
/* Don't blow up if the definition is the same. */
|
||||
if (!(frag_now == symbolP->sy_frag
|
||||
&& S_GET_VALUE (symbolP) == frag_now_fix ()
|
||||
&& S_GET_SEGMENT (symbolP) == now_seg))
|
||||
as_fatal (_("Symbol %s already defined."), sym_name);
|
||||
} /* if this symbol is not yet defined */
|
||||
} /* if this symbol is not yet defined */
|
||||
|
||||
}
|
||||
#ifdef BFD_ASSEMBLER
|
||||
|
@ -485,7 +471,7 @@ colon (sym_name) /* just seen "x:" - rattle symbols & frags */
|
|||
#endif /* OBJ_VMS */
|
||||
|
||||
symbol_table_insert (symbolP);
|
||||
} /* if we have seen this symbol before */
|
||||
} /* if we have seen this symbol before */
|
||||
|
||||
if (mri_common_symbol != NULL)
|
||||
{
|
||||
|
@ -511,15 +497,9 @@ colon (sym_name) /* just seen "x:" - rattle symbols & frags */
|
|||
return symbolP;
|
||||
}
|
||||
|
||||
/* Die if we can't insert the symbol. */
|
||||
|
||||
/*
|
||||
* symbol_table_insert()
|
||||
*
|
||||
* Die if we can't insert the symbol.
|
||||
*
|
||||
*/
|
||||
|
||||
void
|
||||
void
|
||||
symbol_table_insert (symbolP)
|
||||
symbolS *symbolP;
|
||||
{
|
||||
|
@ -542,15 +522,12 @@ symbol_table_insert (symbolP)
|
|||
{
|
||||
as_fatal (_("Inserting \"%s\" into symbol table failed: %s"),
|
||||
S_GET_NAME (symbolP), error_string);
|
||||
} /* on error */
|
||||
} /* symbol_table_insert() */
|
||||
} /* on error */
|
||||
}
|
||||
|
||||
/*
|
||||
* symbol_find_or_make()
|
||||
*
|
||||
* If a symbol name does not exist, create it as undefined, and insert
|
||||
* it into the symbol table. Return a pointer to it.
|
||||
*/
|
||||
/* If a symbol name does not exist, create it as undefined, and insert
|
||||
it into the symbol table. Return a pointer to it. */
|
||||
|
||||
symbolS *
|
||||
symbol_find_or_make (name)
|
||||
const char *name;
|
||||
|
@ -581,7 +558,7 @@ symbol_find_or_make (name)
|
|||
} /* if symbol wasn't found */
|
||||
|
||||
return (symbolP);
|
||||
} /* symbol_find_or_make() */
|
||||
}
|
||||
|
||||
symbolS *
|
||||
symbol_make (name)
|
||||
|
@ -589,23 +566,19 @@ symbol_make (name)
|
|||
{
|
||||
symbolS *symbolP;
|
||||
|
||||
/* Let the machine description default it, e.g. for register names. */
|
||||
/* Let the machine description default it, e.g. for register names. */
|
||||
symbolP = md_undefined_symbol ((char *) name);
|
||||
|
||||
if (!symbolP)
|
||||
symbolP = symbol_new (name, undefined_section, (valueT) 0, &zero_address_frag);
|
||||
|
||||
return (symbolP);
|
||||
} /* symbol_make() */
|
||||
}
|
||||
|
||||
/*
|
||||
* symbol_find()
|
||||
*
|
||||
* Implement symbol table lookup.
|
||||
* In: A symbol's name as a string: '\0' can't be part of a symbol name.
|
||||
* Out: NULL if the name was not in the symbol table, else the address
|
||||
* of a struct symbol associated with that name.
|
||||
*/
|
||||
/* Implement symbol table lookup.
|
||||
In: A symbol's name as a string: '\0' can't be part of a symbol name.
|
||||
Out: NULL if the name was not in the symbol table, else the address
|
||||
of a struct symbol associated with that name. */
|
||||
|
||||
symbolS *
|
||||
symbol_find (name)
|
||||
|
@ -616,7 +589,7 @@ symbol_find (name)
|
|||
#else /* STRIP_UNDERSCORE */
|
||||
return (symbol_find_base (name, 0));
|
||||
#endif /* STRIP_UNDERSCORE */
|
||||
} /* symbol_find() */
|
||||
}
|
||||
|
||||
symbolS *
|
||||
symbol_find_base (name, strip_underscore)
|
||||
|
@ -668,16 +641,15 @@ symbol_find_base (name, strip_underscore)
|
|||
return ((symbolS *) hash_find (sy_hash, name));
|
||||
}
|
||||
|
||||
/*
|
||||
* Once upon a time, symbols were kept in a singly linked list. At
|
||||
* least coff needs to be able to rearrange them from time to time, for
|
||||
* which a doubly linked list is much more convenient. Loic did these
|
||||
* as macros which seemed dangerous to me so they're now functions.
|
||||
* xoxorich.
|
||||
*/
|
||||
/* Once upon a time, symbols were kept in a singly linked list. At
|
||||
least coff needs to be able to rearrange them from time to time, for
|
||||
which a doubly linked list is much more convenient. Loic did these
|
||||
as macros which seemed dangerous to me so they're now functions.
|
||||
xoxorich. */
|
||||
|
||||
/* Link symbol ADDME after symbol TARGET in the chain. */
|
||||
void
|
||||
/* Link symbol ADDME after symbol TARGET in the chain. */
|
||||
|
||||
void
|
||||
symbol_append (addme, target, rootPP, lastPP)
|
||||
symbolS *addme;
|
||||
symbolS *target;
|
||||
|
@ -700,7 +672,7 @@ symbol_append (addme, target, rootPP, lastPP)
|
|||
*rootPP = addme;
|
||||
*lastPP = addme;
|
||||
return;
|
||||
} /* if the list is empty */
|
||||
} /* if the list is empty */
|
||||
|
||||
if (target->sy_next != NULL)
|
||||
{
|
||||
|
@ -712,7 +684,7 @@ symbol_append (addme, target, rootPP, lastPP)
|
|||
{
|
||||
know (*lastPP == target);
|
||||
*lastPP = addme;
|
||||
} /* if we have a next */
|
||||
} /* if we have a next */
|
||||
|
||||
addme->sy_next = target->sy_next;
|
||||
target->sy_next = addme;
|
||||
|
@ -724,8 +696,9 @@ symbol_append (addme, target, rootPP, lastPP)
|
|||
debug_verify_symchain (symbol_rootP, symbol_lastP);
|
||||
}
|
||||
|
||||
/* Set the chain pointers of SYMBOL to null. */
|
||||
void
|
||||
/* Set the chain pointers of SYMBOL to null. */
|
||||
|
||||
void
|
||||
symbol_clear_list_pointers (symbolP)
|
||||
symbolS *symbolP;
|
||||
{
|
||||
|
@ -738,8 +711,9 @@ symbol_clear_list_pointers (symbolP)
|
|||
}
|
||||
|
||||
#ifdef SYMBOLS_NEED_BACKPOINTERS
|
||||
/* Remove SYMBOLP from the list. */
|
||||
void
|
||||
/* Remove SYMBOLP from the list. */
|
||||
|
||||
void
|
||||
symbol_remove (symbolP, rootPP, lastPP)
|
||||
symbolS *symbolP;
|
||||
symbolS **rootPP;
|
||||
|
@ -751,28 +725,29 @@ symbol_remove (symbolP, rootPP, lastPP)
|
|||
if (symbolP == *rootPP)
|
||||
{
|
||||
*rootPP = symbolP->sy_next;
|
||||
} /* if it was the root */
|
||||
} /* if it was the root */
|
||||
|
||||
if (symbolP == *lastPP)
|
||||
{
|
||||
*lastPP = symbolP->sy_previous;
|
||||
} /* if it was the tail */
|
||||
} /* if it was the tail */
|
||||
|
||||
if (symbolP->sy_next != NULL)
|
||||
{
|
||||
symbolP->sy_next->sy_previous = symbolP->sy_previous;
|
||||
} /* if not last */
|
||||
} /* if not last */
|
||||
|
||||
if (symbolP->sy_previous != NULL)
|
||||
{
|
||||
symbolP->sy_previous->sy_next = symbolP->sy_next;
|
||||
} /* if not first */
|
||||
} /* if not first */
|
||||
|
||||
debug_verify_symchain (*rootPP, *lastPP);
|
||||
}
|
||||
|
||||
/* Link symbol ADDME before symbol TARGET in the chain. */
|
||||
void
|
||||
/* Link symbol ADDME before symbol TARGET in the chain. */
|
||||
|
||||
void
|
||||
symbol_insert (addme, target, rootPP, lastPP)
|
||||
symbolS *addme;
|
||||
symbolS *target;
|
||||
|
@ -792,7 +767,7 @@ symbol_insert (addme, target, rootPP, lastPP)
|
|||
{
|
||||
know (*rootPP == target);
|
||||
*rootPP = addme;
|
||||
} /* if not first */
|
||||
} /* if not first */
|
||||
|
||||
addme->sy_previous = target->sy_previous;
|
||||
target->sy_previous = addme;
|
||||
|
@ -803,7 +778,7 @@ symbol_insert (addme, target, rootPP, lastPP)
|
|||
|
||||
#endif /* SYMBOLS_NEED_BACKPOINTERS */
|
||||
|
||||
void
|
||||
void
|
||||
verify_symbol_chain (rootP, lastP)
|
||||
symbolS *rootP;
|
||||
symbolS *lastP;
|
||||
|
@ -891,7 +866,8 @@ resolve_symbol_value (symp, finalize)
|
|||
if (symp->sy_resolving)
|
||||
{
|
||||
if (finalize)
|
||||
as_bad (_("Symbol definition loop encountered at %s"), S_GET_NAME (symp));
|
||||
as_bad (_("Symbol definition loop encountered at %s"),
|
||||
S_GET_NAME (symp));
|
||||
final_val = 0;
|
||||
resolved = 1;
|
||||
}
|
||||
|
@ -1076,7 +1052,8 @@ resolve_symbol_value (symp, finalize)
|
|||
S_GET_NAME (symp->sy_value.X_op_symbol));
|
||||
if (seg_left != undefined_section
|
||||
&& seg_right != undefined_section)
|
||||
as_bad_where (file, line, _("invalid section for operation"));
|
||||
as_bad_where (file, line,
|
||||
_("invalid section for operation"));
|
||||
}
|
||||
else
|
||||
{
|
||||
|
@ -1144,7 +1121,7 @@ resolve_symbol_value (symp, finalize)
|
|||
final_seg = absolute_section;
|
||||
resolved = (symbol_resolved_p (add_symbol)
|
||||
&& symbol_resolved_p (op_symbol));
|
||||
break;
|
||||
break;
|
||||
|
||||
case O_register:
|
||||
case O_big:
|
||||
|
@ -1180,7 +1157,8 @@ exit_dont_set_value:
|
|||
symp->sy_resolved = 1;
|
||||
else if (S_GET_SEGMENT (symp) != expr_section)
|
||||
{
|
||||
as_bad (_("can't resolve value for symbol \"%s\""), S_GET_NAME (symp));
|
||||
as_bad (_("can't resolve value for symbol \"%s\""),
|
||||
S_GET_NAME (symp));
|
||||
symp->sy_resolved = 1;
|
||||
}
|
||||
}
|
||||
|
@ -1228,7 +1206,7 @@ static char *dollar_label_defines;
|
|||
static unsigned long dollar_label_count;
|
||||
static unsigned long dollar_label_max;
|
||||
|
||||
int
|
||||
int
|
||||
dollar_label_defined (label)
|
||||
long label;
|
||||
{
|
||||
|
@ -1240,9 +1218,9 @@ dollar_label_defined (label)
|
|||
if (*i == label)
|
||||
return dollar_label_defines[i - dollar_labels];
|
||||
|
||||
/* if we get here, label isn't defined */
|
||||
/* If we get here, label isn't defined. */
|
||||
return 0;
|
||||
} /* dollar_label_defined() */
|
||||
}
|
||||
|
||||
static long
|
||||
dollar_label_instance (label)
|
||||
|
@ -1256,12 +1234,12 @@ dollar_label_instance (label)
|
|||
if (*i == label)
|
||||
return (dollar_label_instances[i - dollar_labels]);
|
||||
|
||||
/* If we get here, we haven't seen the label before, therefore its instance
|
||||
count is zero. */
|
||||
/* If we get here, we haven't seen the label before.
|
||||
Therefore its instance count is zero. */
|
||||
return 0;
|
||||
}
|
||||
|
||||
void
|
||||
void
|
||||
dollar_label_clear ()
|
||||
{
|
||||
memset (dollar_label_defines, '\0', (unsigned int) dollar_label_count);
|
||||
|
@ -1269,7 +1247,7 @@ dollar_label_clear ()
|
|||
|
||||
#define DOLLAR_LABEL_BUMP_BY 10
|
||||
|
||||
void
|
||||
void
|
||||
define_dollar_label (label)
|
||||
long label;
|
||||
{
|
||||
|
@ -1283,7 +1261,7 @@ define_dollar_label (label)
|
|||
return;
|
||||
}
|
||||
|
||||
/* if we get to here, we don't have label listed yet. */
|
||||
/* If we get to here, we don't have label listed yet. */
|
||||
|
||||
if (dollar_labels == NULL)
|
||||
{
|
||||
|
@ -1301,7 +1279,7 @@ define_dollar_label (label)
|
|||
dollar_label_instances = (long *) xrealloc ((char *) dollar_label_instances,
|
||||
dollar_label_max * sizeof (long));
|
||||
dollar_label_defines = xrealloc (dollar_label_defines, dollar_label_max);
|
||||
} /* if we needed to grow */
|
||||
} /* if we needed to grow */
|
||||
|
||||
dollar_labels[dollar_label_count] = label;
|
||||
dollar_label_instances[dollar_label_count] = 1;
|
||||
|
@ -1309,31 +1287,28 @@ define_dollar_label (label)
|
|||
++dollar_label_count;
|
||||
}
|
||||
|
||||
/*
|
||||
* dollar_label_name()
|
||||
*
|
||||
* Caller must copy returned name: we re-use the area for the next name.
|
||||
*
|
||||
* The mth occurence of label n: is turned into the symbol "Ln^Am"
|
||||
* where n is the label number and m is the instance number. "L" makes
|
||||
* it a label discarded unless debugging and "^A"('\1') ensures no
|
||||
* ordinary symbol SHOULD get the same name as a local label
|
||||
* symbol. The first "4:" is "L4^A1" - the m numbers begin at 1.
|
||||
*
|
||||
* fb labels get the same treatment, except that ^B is used in place of ^A.
|
||||
*/
|
||||
/* Caller must copy returned name: we re-use the area for the next name.
|
||||
|
||||
char * /* Return local label name. */
|
||||
The mth occurence of label n: is turned into the symbol "Ln^Am"
|
||||
where n is the label number and m is the instance number. "L" makes
|
||||
it a label discarded unless debugging and "^A"('\1') ensures no
|
||||
ordinary symbol SHOULD get the same name as a local label
|
||||
symbol. The first "4:" is "L4^A1" - the m numbers begin at 1.
|
||||
|
||||
fb labels get the same treatment, except that ^B is used in place
|
||||
of ^A. */
|
||||
|
||||
char * /* Return local label name. */
|
||||
dollar_label_name (n, augend)
|
||||
register long n; /* we just saw "n$:" : n a number */
|
||||
register int augend; /* 0 for current instance, 1 for new instance */
|
||||
register long n; /* we just saw "n$:" : n a number. */
|
||||
register int augend; /* 0 for current instance, 1 for new instance. */
|
||||
{
|
||||
long i;
|
||||
/* Returned to caller, then copied. used for created names ("4f") */
|
||||
/* Returned to caller, then copied. Used for created names ("4f"). */
|
||||
static char symbol_name_build[24];
|
||||
register char *p;
|
||||
register char *q;
|
||||
char symbol_name_temporary[20]; /* build up a number, BACKWARDS */
|
||||
char symbol_name_temporary[20]; /* Build up a number, BACKWARDS. */
|
||||
|
||||
know (n >= 0);
|
||||
know (augend == 0 || augend == 1);
|
||||
|
@ -1343,8 +1318,8 @@ dollar_label_name (n, augend)
|
|||
#endif
|
||||
*p++ = 'L';
|
||||
|
||||
/* Next code just does sprintf( {}, "%d", n); */
|
||||
/* label number */
|
||||
/* Next code just does sprintf( {}, "%d", n); */
|
||||
/* Label number. */
|
||||
q = symbol_name_temporary;
|
||||
for (*q++ = 0, i = n; i; ++q)
|
||||
{
|
||||
|
@ -1354,9 +1329,9 @@ dollar_label_name (n, augend)
|
|||
while ((*p = *--q) != '\0')
|
||||
++p;
|
||||
|
||||
*p++ = 1; /* ^A */
|
||||
*p++ = 1; /* ^A */
|
||||
|
||||
/* instance number */
|
||||
/* Instance number. */
|
||||
q = symbol_name_temporary;
|
||||
for (*q++ = 0, i = dollar_label_instance (n) + augend; i; ++q)
|
||||
{
|
||||
|
@ -1365,27 +1340,26 @@ dollar_label_name (n, augend)
|
|||
}
|
||||
while ((*p++ = *--q) != '\0');;
|
||||
|
||||
/* The label, as a '\0' ended string, starts at symbol_name_build. */
|
||||
/* The label, as a '\0' ended string, starts at symbol_name_build. */
|
||||
return symbol_name_build;
|
||||
}
|
||||
|
||||
/*
|
||||
* Sombody else's idea of local labels. They are made by "n:" where n
|
||||
* is any decimal digit. Refer to them with
|
||||
* "nb" for previous (backward) n:
|
||||
* or "nf" for next (forward) n:.
|
||||
*
|
||||
* We do a little better and let n be any number, not just a single digit, but
|
||||
* since the other guy's assembler only does ten, we treat the first ten
|
||||
* specially.
|
||||
*
|
||||
* Like someone else's assembler, we have one set of local label counters for
|
||||
* entire assembly, not one set per (sub)segment like in most assemblers. This
|
||||
* implies that one can refer to a label in another segment, and indeed some
|
||||
* crufty compilers have done just that.
|
||||
*
|
||||
* Since there could be a LOT of these things, treat them as a sparse array.
|
||||
*/
|
||||
/* Sombody else's idea of local labels. They are made by "n:" where n
|
||||
is any decimal digit. Refer to them with
|
||||
"nb" for previous (backward) n:
|
||||
or "nf" for next (forward) n:.
|
||||
|
||||
We do a little better and let n be any number, not just a single digit, but
|
||||
since the other guy's assembler only does ten, we treat the first ten
|
||||
specially.
|
||||
|
||||
Like someone else's assembler, we have one set of local label counters for
|
||||
entire assembly, not one set per (sub)segment like in most assemblers. This
|
||||
implies that one can refer to a label in another segment, and indeed some
|
||||
crufty compilers have done just that.
|
||||
|
||||
Since there could be a LOT of these things, treat them as a sparse
|
||||
array. */
|
||||
|
||||
#define FB_LABEL_SPECIAL (10)
|
||||
|
||||
|
@ -1395,17 +1369,18 @@ static long *fb_label_instances;
|
|||
static long fb_label_count;
|
||||
static long fb_label_max;
|
||||
|
||||
/* this must be more than FB_LABEL_SPECIAL */
|
||||
/* This must be more than FB_LABEL_SPECIAL. */
|
||||
#define FB_LABEL_BUMP_BY (FB_LABEL_SPECIAL + 6)
|
||||
|
||||
static void
|
||||
static void
|
||||
fb_label_init ()
|
||||
{
|
||||
memset ((void *) fb_low_counter, '\0', sizeof (fb_low_counter));
|
||||
} /* fb_label_init() */
|
||||
}
|
||||
|
||||
/* add one to the instance number of this fb label */
|
||||
void
|
||||
/* Add one to the instance number of this fb label. */
|
||||
|
||||
void
|
||||
fb_label_instance_inc (label)
|
||||
long label;
|
||||
{
|
||||
|
@ -1426,11 +1401,11 @@ fb_label_instance_inc (label)
|
|||
{
|
||||
++fb_label_instances[i - fb_labels];
|
||||
return;
|
||||
} /* if we find it */
|
||||
} /* for each existing label */
|
||||
} /* if we find it */
|
||||
} /* for each existing label */
|
||||
}
|
||||
|
||||
/* if we get to here, we don't have label listed yet. */
|
||||
/* If we get to here, we don't have label listed yet. */
|
||||
|
||||
if (fb_labels == NULL)
|
||||
{
|
||||
|
@ -1447,14 +1422,14 @@ fb_label_instance_inc (label)
|
|||
fb_label_max * sizeof (long));
|
||||
fb_label_instances = (long *) xrealloc ((char *) fb_label_instances,
|
||||
fb_label_max * sizeof (long));
|
||||
} /* if we needed to grow */
|
||||
} /* if we needed to grow */
|
||||
|
||||
fb_labels[fb_label_count] = label;
|
||||
fb_label_instances[fb_label_count] = 1;
|
||||
++fb_label_count;
|
||||
}
|
||||
|
||||
static long
|
||||
static long
|
||||
fb_label_instance (label)
|
||||
long label;
|
||||
{
|
||||
|
@ -1473,8 +1448,8 @@ fb_label_instance (label)
|
|||
if (*i == label)
|
||||
{
|
||||
return (fb_label_instances[i - fb_labels]);
|
||||
} /* if we find it */
|
||||
} /* for each existing label */
|
||||
} /* if we find it */
|
||||
} /* for each existing label */
|
||||
}
|
||||
|
||||
/* We didn't find the label, so this must be a reference to the
|
||||
|
@ -1482,38 +1457,36 @@ fb_label_instance (label)
|
|||
return 0;
|
||||
}
|
||||
|
||||
/*
|
||||
* fb_label_name()
|
||||
*
|
||||
* Caller must copy returned name: we re-use the area for the next name.
|
||||
*
|
||||
* The mth occurence of label n: is turned into the symbol "Ln^Bm"
|
||||
* where n is the label number and m is the instance number. "L" makes
|
||||
* it a label discarded unless debugging and "^B"('\2') ensures no
|
||||
* ordinary symbol SHOULD get the same name as a local label
|
||||
* symbol. The first "4:" is "L4^B1" - the m numbers begin at 1.
|
||||
*
|
||||
* dollar labels get the same treatment, except that ^A is used in place of ^B. */
|
||||
/* Caller must copy returned name: we re-use the area for the next name.
|
||||
|
||||
char * /* Return local label name. */
|
||||
The mth occurence of label n: is turned into the symbol "Ln^Bm"
|
||||
where n is the label number and m is the instance number. "L" makes
|
||||
it a label discarded unless debugging and "^B"('\2') ensures no
|
||||
ordinary symbol SHOULD get the same name as a local label
|
||||
symbol. The first "4:" is "L4^B1" - the m numbers begin at 1.
|
||||
|
||||
dollar labels get the same treatment, except that ^A is used in
|
||||
place of ^B. */
|
||||
|
||||
char * /* Return local label name. */
|
||||
fb_label_name (n, augend)
|
||||
long n; /* we just saw "n:", "nf" or "nb" : n a number */
|
||||
long augend; /* 0 for nb, 1 for n:, nf */
|
||||
long n; /* We just saw "n:", "nf" or "nb" : n a number. */
|
||||
long augend; /* 0 for nb, 1 for n:, nf. */
|
||||
{
|
||||
long i;
|
||||
/* Returned to caller, then copied. used for created names ("4f") */
|
||||
/* Returned to caller, then copied. Used for created names ("4f"). */
|
||||
static char symbol_name_build[24];
|
||||
register char *p;
|
||||
register char *q;
|
||||
char symbol_name_temporary[20]; /* build up a number, BACKWARDS */
|
||||
char symbol_name_temporary[20]; /* Build up a number, BACKWARDS. */
|
||||
|
||||
know (n >= 0);
|
||||
know (augend == 0 || augend == 1);
|
||||
p = symbol_name_build;
|
||||
*p++ = 'L';
|
||||
|
||||
/* Next code just does sprintf( {}, "%d", n); */
|
||||
/* label number */
|
||||
/* Next code just does sprintf( {}, "%d", n); */
|
||||
/* Label number. */
|
||||
q = symbol_name_temporary;
|
||||
for (*q++ = 0, i = n; i; ++q)
|
||||
{
|
||||
|
@ -1523,9 +1496,9 @@ fb_label_name (n, augend)
|
|||
while ((*p = *--q) != '\0')
|
||||
++p;
|
||||
|
||||
*p++ = 2; /* ^B */
|
||||
*p++ = 2; /* ^B */
|
||||
|
||||
/* instance number */
|
||||
/* Instance number. */
|
||||
q = symbol_name_temporary;
|
||||
for (*q++ = 0, i = fb_label_instance (n) + augend; i; ++q)
|
||||
{
|
||||
|
@ -1534,15 +1507,13 @@ fb_label_name (n, augend)
|
|||
}
|
||||
while ((*p++ = *--q) != '\0');;
|
||||
|
||||
/* The label, as a '\0' ended string, starts at symbol_name_build. */
|
||||
/* The label, as a '\0' ended string, starts at symbol_name_build. */
|
||||
return (symbol_name_build);
|
||||
} /* fb_label_name() */
|
||||
}
|
||||
|
||||
/*
|
||||
* decode name that may have been generated by foo_label_name() above. If
|
||||
* the name wasn't generated by foo_label_name(), then return it unaltered.
|
||||
* This is used for error messages.
|
||||
*/
|
||||
/* Decode name that may have been generated by foo_label_name() above.
|
||||
If the name wasn't generated by foo_label_name(), then return it
|
||||
unaltered. This is used for error messages. */
|
||||
|
||||
char *
|
||||
decode_local_label_name (s)
|
||||
|
@ -1678,7 +1649,7 @@ S_IS_EXTERNAL (s)
|
|||
|
||||
flags = s->bsym->flags;
|
||||
|
||||
/* sanity check */
|
||||
/* Sanity check. */
|
||||
if ((flags & BSF_LOCAL) && (flags & BSF_GLOBAL))
|
||||
abort ();
|
||||
|
||||
|
@ -1735,7 +1706,7 @@ S_IS_LOCAL (s)
|
|||
|
||||
flags = s->bsym->flags;
|
||||
|
||||
/* sanity check */
|
||||
/* Sanity check. */
|
||||
if ((flags & BSF_LOCAL) && (flags & BSF_GLOBAL))
|
||||
abort ();
|
||||
|
||||
|
@ -1814,7 +1785,7 @@ S_SET_SEGMENT (s, seg)
|
|||
if (s->bsym->flags & BSF_SECTION_SYM)
|
||||
{
|
||||
if (s->bsym->section != seg)
|
||||
abort();
|
||||
abort ();
|
||||
}
|
||||
else
|
||||
s->bsym->section = seg;
|
||||
|
@ -1832,7 +1803,7 @@ S_SET_EXTERNAL (s)
|
|||
return;
|
||||
}
|
||||
s->bsym->flags |= BSF_GLOBAL;
|
||||
s->bsym->flags &= ~(BSF_LOCAL|BSF_WEAK);
|
||||
s->bsym->flags &= ~(BSF_LOCAL | BSF_WEAK);
|
||||
}
|
||||
|
||||
void
|
||||
|
@ -1847,7 +1818,7 @@ S_CLEAR_EXTERNAL (s)
|
|||
return;
|
||||
}
|
||||
s->bsym->flags |= BSF_LOCAL;
|
||||
s->bsym->flags &= ~(BSF_GLOBAL|BSF_WEAK);
|
||||
s->bsym->flags &= ~(BSF_GLOBAL | BSF_WEAK);
|
||||
}
|
||||
|
||||
void
|
||||
|
@ -1857,7 +1828,7 @@ S_SET_WEAK (s)
|
|||
if (LOCAL_SYMBOL_CHECK (s))
|
||||
s = local_symbol_convert ((struct local_symbol *) s);
|
||||
s->bsym->flags |= BSF_WEAK;
|
||||
s->bsym->flags &= ~(BSF_GLOBAL|BSF_LOCAL);
|
||||
s->bsym->flags &= ~(BSF_GLOBAL | BSF_LOCAL);
|
||||
}
|
||||
|
||||
void
|
||||
|
@ -2125,7 +2096,7 @@ symbol_section_p (s)
|
|||
#ifdef BFD_ASSEMBLER
|
||||
return (s->bsym->flags & BSF_SECTION_SYM) != 0;
|
||||
#else
|
||||
/* FIXME */
|
||||
/* FIXME. */
|
||||
return 0;
|
||||
#endif
|
||||
}
|
||||
|
@ -2237,7 +2208,7 @@ void
|
|||
symbol_begin ()
|
||||
{
|
||||
symbol_lastP = NULL;
|
||||
symbol_rootP = NULL; /* In case we have 0 symbols (!!) */
|
||||
symbol_rootP = NULL; /* In case we have 0 symbols (!!) */
|
||||
sy_hash = hash_new ();
|
||||
#ifdef BFD_ASSEMBLER
|
||||
local_hash = hash_new ();
|
||||
|
@ -2249,7 +2220,7 @@ symbol_begin ()
|
|||
abs_symbol.bsym = bfd_abs_section.symbol;
|
||||
#endif
|
||||
#else
|
||||
/* Can't initialise a union. Sigh. */
|
||||
/* Can't initialise a union. Sigh. */
|
||||
S_SET_SEGMENT (&abs_symbol, absolute_section);
|
||||
#endif
|
||||
abs_symbol.sy_value.X_op = O_constant;
|
||||
|
@ -2258,8 +2229,6 @@ symbol_begin ()
|
|||
if (LOCAL_LABELS_FB)
|
||||
fb_label_init ();
|
||||
}
|
||||
|
||||
|
||||
|
||||
int indent_level;
|
||||
|
||||
|
@ -2361,7 +2330,7 @@ print_symbol_value (sym)
|
|||
static void
|
||||
print_binary (file, name, exp)
|
||||
FILE *file;
|
||||
const char * name;
|
||||
const char *name;
|
||||
expressionS *exp;
|
||||
{
|
||||
indent_level++;
|
||||
|
@ -2506,5 +2475,3 @@ symbol_print_statistics (file)
|
|||
local_symbol_count, local_symbol_conversion_count);
|
||||
#endif
|
||||
}
|
||||
|
||||
/* end of symbols.c */
|
||||
|
|
Loading…
Reference in a new issue