2000-08-10 Kazu Hirata <kazu@hxi.com>

* symbols.c: Fix formatting.
This commit is contained in:
Kazu Hirata 2000-08-10 19:00:08 +00:00
parent f1d7622b95
commit 7c743825ea
2 changed files with 190 additions and 219 deletions

View file

@ -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> 2000-08-09 Alan Modra <alan@linuxcare.com.au>
From Rodney Brown <RodneyBrown@mynd.com> From Rodney Brown <RodneyBrown@mynd.com>

View file

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