int function_lineoff = -1; /* Offset in line#s where the last function
started (the odd entry for line #0) */
-/* structure used to keep the filenames which
+/* Structure used to keep the filenames which
are too long around so that we can stick them
- into the string table */
+ into the string table. */
struct filename_list
{
char *filename;
/* Add 4 to the real value to get the index and compensate the
negatives. This vector is used by S_GET_SEGMENT to turn a coff
- section number into a segment number
-*/
-static symbolS *previous_file_symbol;
-void c_symbol_merge ();
-static int line_base;
+ section number into a segment number. */
-symbolS *c_section_symbol ();
bfd *abfd;
+static symbolS *previous_file_symbol;
+static int line_base;
-static void fixup_segment PARAMS ((segment_info_type *segP,
- segT this_segment_type));
-
-static void fixup_mdeps PARAMS ((fragS *,
- object_headers *,
- segT));
-
-static void fill_section PARAMS ((bfd * abfd,
- object_headers *,
- unsigned long *));
-
-static int c_line_new PARAMS ((symbolS * symbol, long paddr,
- int line_number,
- fragS * frag));
-
-static void w_symbols PARAMS ((bfd * abfd, char *where,
- symbolS * symbol_rootP));
-
-static void adjust_stab_section PARAMS ((bfd *abfd, segT seg));
-
+void c_symbol_merge PARAMS ((symbolS *, symbolS *));
+symbolS *c_section_symbol PARAMS ((char *, int));
+void obj_coff_section PARAMS ((int));
+void do_relocs_for PARAMS ((bfd *, object_headers *, unsigned long *));
+char * symbol_to_chars PARAMS ((bfd *, char *, symbolS *));
+void w_strings PARAMS ((char *));
+
+static void fixup_segment PARAMS ((segment_info_type *, segT));
+static void fixup_mdeps PARAMS ((fragS *, object_headers *, segT));
+static void fill_section PARAMS ((bfd *, object_headers *, unsigned long *));
+static int c_line_new PARAMS ((symbolS *, long, int, fragS *));
+static void w_symbols PARAMS ((bfd *, char *, symbolS *));
+static void adjust_stab_section PARAMS ((bfd *, segT));
static void obj_coff_lcomm PARAMS ((int));
static void obj_coff_text PARAMS ((int));
static void obj_coff_data PARAMS ((int));
-void obj_coff_section PARAMS ((int));
+static unsigned int count_entries_in_chain PARAMS ((unsigned int));
+static void coff_header_append PARAMS ((bfd *, object_headers *));
+static unsigned int yank_symbols PARAMS ((void));
+static unsigned int glue_symbols PARAMS ((symbolS **, symbolS **));
+static unsigned int tie_tags PARAMS ((void));
+static void crawl_symbols PARAMS ((object_headers *, bfd *));
+static void do_linenos_for PARAMS ((bfd *, object_headers *, unsigned long *));
+static void remove_subsegs PARAMS ((void));
+
+
/* When not using BFD_ASSEMBLER, we permit up to 40 sections.
#define SEG_INFO_FROM_SECTION_NUMBER(x) (seg_info_off_by_4[(x)+4])
+static relax_addressT relax_align PARAMS ((relax_addressT, long));
+
static relax_addressT
relax_align (address, alignment)
relax_addressT address;
return SEG_INFO_FROM_SECTION_NUMBER (x->sy_symbol.ost_entry.n_scnum);
}
-/* calculate the size of the frag chain and fill in the section header
- to contain all of it, also fill in the addr of the sections */
+static unsigned int size_section PARAMS ((bfd *, unsigned int));
+
+/* Calculate the size of the frag chain and fill in the section header
+ to contain all of it, also fill in the addr of the sections. */
+
static unsigned int
size_section (abfd, idx)
bfd *abfd ATTRIBUTE_UNUSED;
unsigned int size = 0;
fragS *frag = segment_info[idx].frchainP->frch_root;
+
while (frag)
{
size = frag->fr_address;
unsigned int nrelocs;
fixS *fixup_ptr;
- /* Count the relocations */
+ /* Count the relocations. */
fixup_ptr = segment_info[idx].fix_root;
nrelocs = 0;
while (fixup_ptr != (fixS *) NULL)
static int compare_external_relocs PARAMS ((const PTR, const PTR));
-/* AUX's ld expects relocations to be sorted */
+/* AUX's ld expects relocations to be sorted. */
+
static int
compare_external_relocs (x, y)
const PTR x;
#endif
-/* output all the relocations for a section */
+/* Output all the relocations for a section. */
+
void
do_relocs_for (abfd, h, file_cursor)
bfd * abfd;
{
struct internal_reloc intr;
- /* Only output some of the relocations */
+ /* Only output some of the relocations. */
if (fix_ptr->fx_done == 0 && TC_COUNT_RELOC (fix_ptr))
{
#ifdef TC_RELOC_MANGLE
TC_RELOC_MANGLE (&segment_info[idx], fix_ptr, &intr,
base);
-
#else
symbolS *dot;
symbolS *symbol_ptr = fix_ptr->fx_addsy;
as_bad (_("bad relocation: symbol `%s' not in symbol table"),
S_GET_NAME (symbol_ptr));
}
+
dot = segment_info[S_GET_SEGMENT (symbol_ptr)].dot;
if (dot)
- {
- intr.r_symndx = dot->sy_number;
- }
+ intr.r_symndx = dot->sy_number;
else
- {
- intr.r_symndx = symbol_ptr->sy_number;
- }
-
+ intr.r_symndx = symbol_ptr->sy_number;
}
else
- {
- intr.r_symndx = -1;
- }
+ intr.r_symndx = -1;
#endif
-
(void) bfd_coff_swap_reloc_out (abfd, &intr, ext_ptr);
ext_ptr++;
-
#if defined(TC_A29K)
-
/* The 29k has a special kludge for the high 16 bit
reloc. Two relocations are emited, R_IHIHALF,
and R_IHCONST. The second one doesn't contain a
symbol, but uses the value for offset. */
-
if (intr.r_type == R_IHIHALF)
{
- /* now emit the second bit */
+ /* Now emit the second bit. */
intr.r_type = R_IHCONST;
intr.r_symndx = fix_ptr->fx_addnumber;
(void) bfd_coff_swap_reloc_out (abfd, &intr, ext_ptr);
fix_ptr = fix_ptr->fx_next;
}
-
#ifdef TE_AUX
- /* Sort the reloc table */
+ /* Sort the reloc table. */
qsort ((PTR) external_reloc_vec, nrelocs,
sizeof (struct external_reloc), compare_external_relocs);
#endif
-
- /* Write out the reloc table */
+ /* Write out the reloc table. */
bfd_bwrite ((PTR) external_reloc_vec,
(bfd_size_type) external_reloc_size, abfd);
free (external_reloc_vec);
}
else
{
- /* No relocs */
+ /* No relocs. */
segment_info[idx].scnhdr.s_relptr = 0;
}
}
}
- /* Set relocation_size field in file headers */
+
+ /* Set relocation_size field in file headers. */
H_SET_RELOCATION_SIZE (h, *file_cursor - reloc_start, 0);
}
-/* run through a frag chain and write out the data to go with it, fill
- in the scnhdrs with the info on the file postions
-*/
+/* Run through a frag chain and write out the data to go with it, fill
+ in the scnhdrs with the info on the file postions. */
+
static void
fill_section (abfd, h, file_cursor)
bfd * abfd;
object_headers *h ATTRIBUTE_UNUSED;
unsigned long *file_cursor;
{
-
unsigned int i;
unsigned int paddr = 0;
}
}
-/* Coff file generation & utilities */
+/* Coff file generation & utilities. */
static void
coff_header_append (abfd, h)
string_size += strlen (segment_info[i].name) + 1;
}
#endif
-
size = bfd_coff_swap_scnhdr_out (abfd,
&(segment_info[i].scnhdr),
buffer);
unsigned int i;
valueT val;
- /* Turn any symbols with register attributes into abs symbols */
+ /* Turn any symbols with register attributes into abs symbols. */
if (S_GET_SEGMENT (symbolP) == reg_section)
- {
- S_SET_SEGMENT (symbolP, absolute_section);
- }
- /* At the same time, relocate all symbols to their output value */
+ S_SET_SEGMENT (symbolP, absolute_section);
+ /* At the same time, relocate all symbols to their output value. */
#ifndef TE_PE
val = (segment_info[S_GET_SEGMENT (symbolP)].scnhdr.s_paddr
+ S_GET_VALUE (symbolP));
S_GET_STORAGE_CLASS (symbolP),
i, numaux, where);
}
- return where;
+ return where;
}
void
coff_obj_symbol_new_hook (symbolP)
symbolS *symbolP;
{
- char underscore = 0; /* Symbol has leading _ */
+ char underscore = 0; /* Symbol has leading _ */
- /* Effective symbol */
+ /* Effective symbol. */
/* Store the pointer in the offset. */
S_SET_ZEROES (symbolP, 0L);
S_SET_DATA_TYPE (symbolP, T_NULL);
S_SET_STORAGE_CLASS (symbolP, 0);
S_SET_NUMBER_AUXILIARY (symbolP, 0);
- /* Additional information */
+ /* Additional information. */
symbolP->sy_symbol.ost_flags = 0;
- /* Auxiliary entries */
+ /* Auxiliary entries. */
memset ((char *) &symbolP->sy_symbol.ost_auxent[0], 0, AUXESZ);
if (S_IS_STRING (symbolP))
SF_SET_LOCAL (symbolP);
}
-/*
- * Handle .ln directives.
- */
+/* Handle .ln directives. */
static void
obj_coff_ln (appline)
if (! appline && def_symbol_in_progress != NULL)
{
+ /* Wrong context. */
as_warn (_(".ln pseudo-op inside .def/.endef: ignored."));
demand_empty_rest_of_line ();
return;
- } /* wrong context */
+ }
l = get_absolute_expression ();
c_line_new (0, frag_now_fix (), l, frag_now);
demand_empty_rest_of_line ();
}
-/*
- * def()
- *
- * Handle .def directives.
- *
- * One might ask : why can't we symbol_new if the symbol does not
- * already exist and fill it with debug information. Because of
- * the C_EFCN special symbol. It would clobber the value of the
- * function symbol before we have a chance to notice that it is
- * a C_EFCN. And a second reason is that the code is more clear this
- * way. (at least I think it is :-).
- *
- */
+/* Handle .def directives.
+
+ One might ask : why can't we symbol_new if the symbol does not
+ already exist and fill it with debug information. Because of
+ the C_EFCN special symbol. It would clobber the value of the
+ function symbol before we have a chance to notice that it is
+ a C_EFCN. And a second reason is that the code is more clear this
+ way. (at least I think it is :-). */
#define SKIP_SEMI_COLON() while (*input_line_pointer++ != ';')
#define SKIP_WHITESPACES() while (*input_line_pointer == ' ' || \
obj_coff_def (what)
int what ATTRIBUTE_UNUSED;
{
- char name_end; /* Char after the end of name */
- char *symbol_name; /* Name of the debug symbol */
- char *symbol_name_copy; /* Temporary copy of the name */
+ char name_end; /* Char after the end of name. */
+ char *symbol_name; /* Name of the debug symbol. */
+ char *symbol_name_copy; /* Temporary copy of the name. */
unsigned int symbol_name_length;
if (def_symbol_in_progress != NULL)
as_warn (_(".def pseudo-op used inside of .def/.endef: ignored."));
demand_empty_rest_of_line ();
return;
- } /* if not inside .def/.endef */
+ }
SKIP_WHITESPACES ();
symbol_name_copy = tc_canonicalize_symbol_name (symbol_name_copy);
#endif
- /* Initialize the new symbol */
+ /* Initialize the new symbol. */
#ifdef STRIP_UNDERSCORE
S_SET_NAME (def_symbol_in_progress, (*symbol_name_copy == '_'
? symbol_name_copy + 1
as_warn (_(".endef pseudo-op used outside of .def/.endef: ignored."));
demand_empty_rest_of_line ();
return;
- } /* if not inside .def/.endef */
+ }
/* Set the section number according to storage class. */
switch (S_GET_STORAGE_CLASS (def_symbol_in_progress))
case C_ENTAG:
case C_UNTAG:
SF_SET_TAG (def_symbol_in_progress);
- /* intentional fallthrough */
+ /* Intentional fallthrough. */
+
case C_FILE:
case C_TPDEF:
SF_SET_DEBUG (def_symbol_in_progress);
break;
case C_EFCN:
- SF_SET_LOCAL (def_symbol_in_progress); /* Do not emit this symbol. */
- /* intentional fallthrough */
+ /* Do not emit this symbol. */
+ SF_SET_LOCAL (def_symbol_in_progress);
+ /* Intentional fallthrough. */
+
case C_BLOCK:
- SF_SET_PROCESS (def_symbol_in_progress); /* Will need processing before writing */
- /* intentional fallthrough */
+ /* Will need processing before writing. */
+ SF_SET_PROCESS (def_symbol_in_progress);
+ /* Intentional fallthrough. */
+
case C_FCN:
S_SET_SEGMENT (def_symbol_in_progress, SEG_E0);
if (strcmp (S_GET_NAME (def_symbol_in_progress), ".bf") == 0)
{ /* .bf */
if (function_lineoff < 0)
- {
- fprintf (stderr, _("`.bf' symbol without preceding function\n"));
- } /* missing function symbol */
+ fprintf (stderr, _("`.bf' symbol without preceding function\n"));
+
SA_GET_SYM_LNNOPTR (last_line_symbol) = function_lineoff;
SF_SET_PROCESS (last_line_symbol);
SF_SET_PROCESS (def_symbol_in_progress);
function_lineoff = -1;
}
+
/* Value is always set to . */
def_symbol_in_progress->sy_frag = frag_now;
S_SET_VALUE (def_symbol_in_progress, (valueT) frag_now_fix ());
#endif
case C_STAT:
case C_LABEL:
- /* Valid but set somewhere else (s_comm, s_lcomm, colon) */
+ /* Valid but set somewhere else (s_comm, s_lcomm, colon). */
break;
case C_USTATIC:
case C_ULABEL:
as_warn (_("unexpected storage class %d"), S_GET_STORAGE_CLASS (def_symbol_in_progress));
break;
- } /* switch on storage class */
+ }
/* Now that we have built a debug symbol, try to find if we should
merge with an existing symbol or not. If a symbol is C_EFCN or
/* For functions, and tags, and static symbols, the symbol
*must* be where the debug symbol appears. Move the
existing symbol to the current place. */
- /* If it already is at the end of the symbol list, do nothing */
+ /* If it already is at the end of the symbol list, do nothing. */
if (def_symbol_in_progress != symbol_lastP)
{
symbol_remove (def_symbol_in_progress, &symbol_rootP,
&symbol_lastP);
symbol_append (def_symbol_in_progress, symbol_lastP,
&symbol_rootP, &symbol_lastP);
- } /* if not already in place */
- } /* if function */
- } /* normal or mergable */
+ }
+ }
+ }
if (SF_GET_TAG (def_symbol_in_progress))
{
/* That is, if this is the first time we've seen the
function... */
symbol_table_insert (def_symbol_in_progress);
- } /* definition follows debug */
- } /* Create the line number entry pointing to the function being defined */
+ }
+ }
def_symbol_in_progress = NULL;
demand_empty_rest_of_line ();
as_warn (_(".dim pseudo-op used outside of .def/.endef: ignored."));
demand_empty_rest_of_line ();
return;
- } /* if not inside .def/.endef */
+ }
S_SET_NUMBER_AUXILIARY (def_symbol_in_progress, 1);
default:
as_warn (_("badly formed .dim directive ignored"));
- /* intentional fallthrough */
+ /* Intentional fallthrough. */
+
case '\n':
case ';':
dim_index = DIMNUM;
#if 0 /* XXX Can we ever have line numbers going backwards? */
if (this_base > line_base)
#endif
- {
- line_base = this_base;
- }
+ line_base = this_base;
#ifndef NO_LISTING
{
extern int listing;
if (listing)
- {
- listing_source_line ((unsigned int) line_base);
- }
+ listing_source_line ((unsigned int) line_base);
}
#endif
}
as_warn (_(".size pseudo-op used outside of .def/.endef ignored."));
demand_empty_rest_of_line ();
return;
- } /* if not inside .def/.endef */
+ }
S_SET_NUMBER_AUXILIARY (def_symbol_in_progress, 1);
SA_SET_SYM_SIZE (def_symbol_in_progress, get_absolute_expression ());
as_warn (_(".scl pseudo-op used outside of .def/.endef ignored."));
demand_empty_rest_of_line ();
return;
- } /* if not inside .def/.endef */
+ }
S_SET_STORAGE_CLASS (def_symbol_in_progress, get_absolute_expression ());
demand_empty_rest_of_line ();
SA_SET_SYM_TAGNDX (def_symbol_in_progress,
(long) tag_find_or_make (symbol_name));
if (SA_GET_SYM_TAGNDX (def_symbol_in_progress) == 0L)
- {
- as_warn (_("tag not found for .tag %s"), symbol_name);
- } /* not defined */
+ as_warn (_("tag not found for .tag %s"), symbol_name);
SF_SET_TAGGED (def_symbol_in_progress);
*input_line_pointer = name_end;
as_warn (_(".type pseudo-op used outside of .def/.endef ignored."));
demand_empty_rest_of_line ();
return;
- } /* if not inside .def/.endef */
+ }
S_SET_DATA_TYPE (def_symbol_in_progress, get_absolute_expression ());
if (ISFCN (S_GET_DATA_TYPE (def_symbol_in_progress)) &&
S_GET_STORAGE_CLASS (def_symbol_in_progress) != C_TPDEF)
- {
- SF_SET_FUNCTION (def_symbol_in_progress);
- } /* is a function */
+ SF_SET_FUNCTION (def_symbol_in_progress);
demand_empty_rest_of_line ();
}
as_warn (_(".val pseudo-op used outside of .def/.endef ignored."));
demand_empty_rest_of_line ();
return;
- } /* if not inside .def/.endef */
+ }
if (is_name_beginner (*input_line_pointer))
{
{
def_symbol_in_progress->sy_frag = frag_now;
S_SET_VALUE (def_symbol_in_progress, (valueT) frag_now_fix ());
- /* If the .val is != from the .def (e.g. statics) */
+ /* If the .val is != from the .def (e.g. statics). */
}
else if (strcmp (S_GET_NAME (def_symbol_in_progress), symbol_name))
{
}
/* This function runs through the symbol table and puts all the
- externals onto another chain */
+ externals onto another chain. */
/* The chain of globals. */
symbolS *symbol_globalP;
symbolS *symbol_global_lastP;
-/* The chain of externals */
+/* The chain of externals. */
symbolS *symbol_externP;
symbolS *symbol_extern_lastP;
if (!SF_GET_DEBUG (symbolP))
{
- /* Debug symbols do not need all this rubbish */
+ /* Debug symbols do not need all this rubbish. */
symbolS *real_symbolP;
/* L* and C_EFCN symbols never merge. */
list.) Because some pointers refer to the real symbol
whereas no pointers refer to the debug symbol. */
c_symbol_merge (symbolP, real_symbolP);
- /* Replace the current symbol by the real one */
+ /* Replace the current symbol by the real one. */
/* The symbols will never be the last or the first
because : 1st symbol is .file and 3 last symbols are
- .text, .data, .bss */
+ .text, .data, .bss. */
symbol_remove (real_symbolP, &symbol_rootP, &symbol_lastP);
symbol_insert (real_symbolP, symbolP, &symbol_rootP, &symbol_lastP);
symbol_remove (symbolP, &symbol_rootP, &symbol_lastP);
symbolP = real_symbolP;
- } /* if not local but dup'd */
+ }
if (flag_readonly_data_in_text && (S_GET_SEGMENT (symbolP) == SEG_E1))
- {
- S_SET_SEGMENT (symbolP, SEG_E0);
- } /* push data into text */
+ S_SET_SEGMENT (symbolP, SEG_E0);
resolve_symbol_value (symbolP);
{
S_SET_EXTERNAL (symbolP);
}
+
else if (S_GET_SEGMENT (symbolP) == SEG_E0)
- {
- S_SET_STORAGE_CLASS (symbolP, C_LABEL);
- }
+ S_SET_STORAGE_CLASS (symbolP, C_LABEL);
+
else
- {
- S_SET_STORAGE_CLASS (symbolP, C_STAT);
- }
+ S_SET_STORAGE_CLASS (symbolP, C_STAT);
}
- /* Mainly to speed up if not -g */
+ /* Mainly to speed up if not -g. */
if (SF_GET_PROCESS (symbolP))
{
/* Handle the nested blocks auxiliary info. */
if (!strcmp (S_GET_NAME (symbolP), ".bb"))
stack_push (block_stack, (char *) &symbolP);
else
- { /* .eb */
- register symbolS *begin_symbolP;
+ {
+ /* .eb */
+ symbolS *begin_symbolP;
+
begin_symbolP = *(symbolS **) stack_pop (block_stack);
if (begin_symbolP == (symbolS *) 0)
as_warn (_("mismatched .eb"));
last_functionP = symbolP;
if (S_GET_NUMBER_AUXILIARY (symbolP) < 1)
- {
- S_SET_NUMBER_AUXILIARY (symbolP, 1);
- } /* make it at least 1 */
+ S_SET_NUMBER_AUXILIARY (symbolP, 1);
/* Clobber possible stale .dim information. */
#if 0
- /* Iffed out by steve - this fries the lnnoptr info too */
+ /* Iffed out by steve - this fries the lnnoptr info too. */
bzero (symbolP->sy_symbol.ost_auxent[0].x_sym.x_fcnary.x_ary.x_dimen,
sizeof (symbolP->sy_symbol.ost_auxent[0].x_sym.x_fcnary.x_ary.x_dimen));
#endif
else if (SF_GET_TAG (symbolP))
{
/* First descriptor of a structure must point to
- the first slot after the structure description. */
+ the first slot after the structure description. */
last_tagP = symbolP;
}
else if (S_GET_STORAGE_CLASS (symbolP) == C_EOS)
{
- /* +2 take in account the current symbol */
+ /* +2 take in account the current symbol. */
SA_SET_SYM_ENDNDX (last_tagP, symbol_number + 2);
}
else if (S_GET_STORAGE_CLASS (symbolP) == C_FILE)
{
/* If the filename was too long to fit in the
- auxent, put it in the string table */
+ auxent, put it in the string table. */
if (SA_GET_FILE_FNAME_ZEROS (symbolP) == 0
&& SA_GET_FILE_FNAME_OFFSET (symbolP) != 0)
{
{
S_SET_VALUE (symbolP, last_file_symno);
last_file_symno = symbol_number;
- } /* no one points at the first .file symbol */
- } /* if debug or tag or eos or file */
+ }
+ }
#ifdef tc_frob_coff_symbol
tc_frob_coff_symbol (symbolP);
if (SF_GET_LOCAL (symbolP))
{
- /* remove C_EFCN and LOCAL (L...) symbols */
- /* next pointer remains valid */
+ /* Remove C_EFCN and LOCAL (L...) symbols. */
+ /* Next pointer remains valid. */
symbol_remove (symbolP, &symbol_rootP, &symbol_lastP);
}
#endif
|| S_GET_STORAGE_CLASS (symbolP) == C_WEAKEXT))
{
- /* if external, Remove from the list */
+ /* If external, Remove from the list. */
symbolS *hold = symbol_previous (symbolP);
symbol_remove (symbolP, &symbol_rootP, &symbol_lastP);
/* The O'Reilly COFF book says that defined global symbols
come at the end of the symbol table, just before
undefined global symbols. */
-
symbol_remove (symbolP, &symbol_rootP, &symbol_lastP);
symbol_clear_list_pointers (symbolP);
symbol_append (symbolP, symbol_global_lastP, &symbol_globalP,
else
{
symbolP->sy_name_offset = 0;
- } /* fix "long" names */
+ }
symbolP->sy_number = symbol_number;
symbol_number += 1 + S_GET_NUMBER_AUXILIARY (symbolP);
- } /* if local symbol */
- } /* traverse the symbol list */
- return symbol_number;
+ }
+ }
+ return symbol_number;
}
static unsigned int
{
symbolS *tmp = *head;
- /* append */
+ /* Append. */
symbol_remove (tmp, head, tail);
symbol_append (tmp, symbol_lastP, &symbol_rootP, &symbol_lastP);
- /* and process */
+ /* Process. */
if (SF_GET_STRING (tmp))
{
tmp->sy_name_offset = string_byte_count;
}
else
{
+ /* Fix "long" names. */
tmp->sy_name_offset = 0;
- } /* fix "long" names */
+ }
tmp->sy_number = symbol_number;
symbol_number += 1 + S_GET_NUMBER_AUXILIARY (tmp);
- } /* append the entire extern chain */
+ }
return symbol_number;
}
return symbol_number;
}
+
static void
crawl_symbols (h, abfd)
object_headers *h;
{
unsigned int i;
- /* Initialize the stack used to keep track of the matching .bb .be */
+ /* Initialize the stack used to keep track of the matching .bb .be. */
block_stack = stack_init (512, sizeof (symbolS *));
/* The symbol list should be ordered according to the following sequence
- * order :
- * . .file symbol
- * . debug entries for functions
- * . fake symbols for the sections, including .text .data and .bss
- * . defined symbols
- * . undefined symbols
- * But this is not mandatory. The only important point is to put the
- * undefined symbols at the end of the list.
- */
+ order :
+ . .file symbol
+ . debug entries for functions
+ . fake symbols for the sections, including .text .data and .bss
+ . defined symbols
+ . undefined symbols
+ But this is not mandatory. The only important point is to put the
+ undefined symbols at the end of the list. */
/* Is there a .file symbol ? If not insert one at the beginning. */
if (symbol_rootP == NULL
|| S_GET_STORAGE_CLASS (symbol_rootP) != C_FILE)
- {
- c_dot_file_symbol ("fake");
- }
+ c_dot_file_symbol ("fake");
- /*
- * Build up static symbols for the sections, they are filled in later
- */
+ /* Build up static symbols for the sections, they are filled in later. */
for (i = SEG_E0; i < SEG_LAST; i++)
if (segment_info[i].scnhdr.s_name[0])
- segment_info[i].dot = c_section_symbol (segment_info[i].name,
+ segment_info[i].dot = c_section_symbol ((char *) segment_info[i].name,
i - SEG_E0 + 1);
- /* Take all the externals out and put them into another chain */
+ /* Take all the externals out and put them into another chain. */
H_SET_SYMBOL_TABLE_SIZE (h, yank_symbols ());
- /* Take the externals and glue them onto the end.*/
+ /* Take the externals and glue them onto the end. */
H_SET_SYMBOL_TABLE_SIZE (h,
(H_GET_SYMBOL_COUNT (h)
+ glue_symbols (&symbol_globalP,
know (symbol_extern_lastP == NULL);
}
-/*
- * Find strings by crawling along symbol table chain.
- */
+/* Find strings by crawling along symbol table chain. */
void
w_strings (where)
symbolS *symbolP;
struct filename_list *filename_list_scan = filename_list_head;
- /* Gotta do md_ byte-ordering stuff for string_byte_count first - KWK */
+ /* Gotta do md_ byte-ordering stuff for string_byte_count first - KWK. */
md_number_to_chars (where, (valueT) string_byte_count, 4);
where += 4;
struct external_lineno *dst = buffer;
/* Run through the table we've built and turn it into its external
- form, take this chance to remove duplicates */
+ form, take this chance to remove duplicates. */
for (line_ptr = s->lineno_list_head;
line_ptr != (struct lineno_list *) NULL;
((symbolS *) line_ptr->line.l_addr.l_symndx)->sy_number;
}
else
- {
- line_ptr->line.l_addr.l_paddr += ((struct frag *) (line_ptr->frag))->fr_address;
- }
+ line_ptr->line.l_addr.l_paddr += ((struct frag *) (line_ptr->frag))->fr_address;
(void) bfd_coff_swap_lineno_out (abfd, &(line_ptr->line), dst);
dst++;
-
}
s->scnhdr.s_lnnoptr = *file_cursor;
*file_cursor += s->scnhdr.s_nlnno * LINESZ;
}
}
+
H_SET_LINENO_SIZE (h, *file_cursor - start);
}
/* Now we run through the list of frag chains in a segment and
make all the subsegment frags appear at the end of the
- list, as if the seg 0 was extra long */
+ list, as if the seg 0 was extra long. */
static void
remove_subsegs ()
unsigned long machine;
int coff_flags;
+
extern void
write_object_file ()
{
remove_subsegs ();
for (i = SEG_E0; i < SEG_UNKNOWN; i++)
- {
- relax_segment (segment_info[i].frchainP->frch_root, i);
- }
+ relax_segment (segment_info[i].frchainP->frch_root, i);
/* Relaxation has completed. Freeze all syms. */
finalize_syms = 1;
H_SET_BSS_SIZE (&headers, size);
}
- /* Turn the gas native symbol table shape into a coff symbol table */
+ /* Turn the gas native symbol table shape into a coff symbol table. */
crawl_symbols (&headers, abfd);
if (string_byte_count == 4)
bfd_seek (abfd, (file_ptr) file_cursor, 0);
- /* Plant the data */
-
+ /* Plant the data. */
fill_section (abfd, &headers, &file_cursor);
do_relocs_for (abfd, &headers, &file_cursor);
return (segT) i;
}
-/*
- * implement the .section pseudo op:
- * .section name {, "flags"}
- * ^ ^
- * | +--- optional flags: 'b' for bss
- * | 'i' for info
- * +-- section name 'l' for lib
- * 'n' for noload
- * 'o' for over
- * 'w' for data
- * 'd' (apparently m88k for data)
- * 'x' for text
- * 'r' for read-only data
- * But if the argument is not a quoted string, treat it as a
- * subsegment number.
- */
+/* Implement the .section pseudo op:
+ .section name {, "flags"}
+ ^ ^
+ | +--- optional flags: 'b' for bss
+ | 'i' for info
+ +-- section name 'l' for lib
+ 'n' for noload
+ 'o' for over
+ 'w' for data
+ 'd' (apparently m88k for data)
+ 'x' for text
+ 'r' for read-only data
+ But if the argument is not a quoted string, treat it as a
+ subsegment number. */
void
obj_coff_section (ignore)
int ignore ATTRIBUTE_UNUSED;
{
- /* Strip out the section name */
+ /* Strip out the section name. */
char *section_name, *name;
char c;
unsigned int exp;
obj_coff_ident (ignore)
int ignore ATTRIBUTE_UNUSED;
{
- segT current_seg = now_seg; /* save current seg */
+ segT current_seg = now_seg; /* Save current seg. */
subsegT current_subseg = now_subseg;
- subseg_new (".comment", 0); /* .comment seg */
- stringer (1); /* read string */
- subseg_set (current_seg, current_subseg); /* restore current seg */
+
+ subseg_new (".comment", 0); /* .comment seg. */
+ stringer (1); /* Read string. */
+ subseg_set (current_seg, current_subseg); /* Restore current seg. */
}
void
S_SET_STORAGE_CLASS (normal, S_GET_STORAGE_CLASS (debug));
if (S_GET_NUMBER_AUXILIARY (debug) > S_GET_NUMBER_AUXILIARY (normal))
- {
- S_SET_NUMBER_AUXILIARY (normal, S_GET_NUMBER_AUXILIARY (debug));
- } /* take the most we have */
+ S_SET_NUMBER_AUXILIARY (normal, S_GET_NUMBER_AUXILIARY (debug));
if (S_GET_NUMBER_AUXILIARY (debug) > 0)
- {
- memcpy ((char *) &normal->sy_symbol.ost_auxent[0],
- (char *) &debug->sy_symbol.ost_auxent[0],
- (unsigned int) (S_GET_NUMBER_AUXILIARY (debug) * AUXESZ));
- } /* Move all the auxiliary information */
+ memcpy ((char *) &normal->sy_symbol.ost_auxent[0],
+ (char *) &debug->sy_symbol.ost_auxent[0],
+ (unsigned int) (S_GET_NUMBER_AUXILIARY (debug) * AUXESZ));
/* Move the debug flags. */
SF_SET_DEBUG_FIELD (normal, SF_GET_DEBUG_FIELD (debug));
-} /* c_symbol_merge() */
+}
static int
c_line_new (symbol, paddr, line_number, frag)
new_line->next = (struct lineno_list *) NULL;
if (s->lineno_list_head == (struct lineno_list *) NULL)
- {
- s->lineno_list_head = new_line;
- }
+ s->lineno_list_head = new_line;
else
- {
- s->lineno_list_tail->next = new_line;
- }
+ s->lineno_list_tail->next = new_line;
+
s->lineno_list_tail = new_line;
return LINESZ * s->scnhdr.s_nlnno++;
}
/* Filename is too long to fit into an auxent,
we stick it into the string table instead. We keep
a linked list of the filenames we find so we can emit
- them later.*/
+ them later. */
struct filename_list *f = ((struct filename_list *)
xmalloc (sizeof (struct filename_list)));
{
extern int listing;
if (listing)
- {
- listing_source_file (filename);
- }
-
+ listing_source_file (filename);
}
-
#endif
SF_SET_DEBUG (symbolP);
S_SET_VALUE (symbolP, (valueT) previous_file_symbol);
previous_file_symbol = symbolP;
- /* Make sure that the symbol is first on the symbol chain */
+ /* Make sure that the symbol is first on the symbol chain. */
if (symbol_rootP != symbolP)
{
symbol_remove (symbolP, &symbol_rootP, &symbol_lastP);
symbol_insert (symbolP, symbol_rootP, &symbol_rootP, &symbol_lastP);
}
-} /* c_dot_file_symbol() */
+}
-/*
- * Build a 'section static' symbol.
- */
+/* Build a 'section static' symbol. */
symbolS *
c_section_symbol (name, idx)
#endif /* TE_PE */
return symbolP;
-} /* c_section_symbol() */
+}
static void
w_symbols (abfd, where, symbol_rootP)
symbolS *symbolP;
unsigned int i;
- /* First fill in those values we have only just worked out */
+ /* First fill in those values we have only just worked out. */
for (i = SEG_E0; i < SEG_LAST; i++)
{
symbolP = segment_info[i].dot;
}
}
- /*
- * Emit all symbols left in the symbol chain.
- */
+ /* Emit all symbols left in the symbol chain. */
for (symbolP = symbol_rootP; symbolP; symbolP = symbol_next (symbolP))
{
/* Used to save the offset of the name. It is used to point
- to the string in memory but must be a file offset. */
- register char *temp;
+ to the string in memory but must be a file offset. */
+ char *temp;
/* We can't fix the lnnoptr field in yank_symbols with the other
adjustments, because we have to wait until we know where they
go in the file. */
if (SF_GET_ADJ_LNNOPTR (symbolP))
- {
- SA_GET_SYM_LNNOPTR (symbolP) +=
- segment_info[S_GET_SEGMENT (symbolP)].scnhdr.s_lnnoptr;
- }
+ SA_GET_SYM_LNNOPTR (symbolP) +=
+ segment_info[S_GET_SEGMENT (symbolP)].scnhdr.s_lnnoptr;
tc_coff_symbol_emit_hook (symbolP);
where = symbol_to_chars (abfd, where, symbolP);
S_SET_NAME (symbolP, temp);
}
-
-} /* w_symbols() */
+}
static void
obj_coff_lcomm (ignore)
if (! need_pass_2)
{
char *p;
- segT current_seg = now_seg; /* save current seg */
+ segT current_seg = now_seg; /* Save current seg. */
subsegT current_subseg = now_subseg;
subseg_set (SEG_E2, 1);
p = frag_var(rs_org, 1, 1, (relax_substateT)0, symbolP,
(offsetT) temp, (char *) 0);
*p = 0;
- subseg_set (current_seg, current_subseg); /* restore current seg */
+ subseg_set (current_seg, current_subseg); /* Restore current seg. */
S_SET_SEGMENT (symbolP, SEG_E2);
S_SET_STORAGE_CLASS (symbolP, C_STAT);
}
segT this_segment;
{
subseg_change (this_segment, 0);
+
while (frags)
{
switch (frags->fr_type)
segment_info_type * segP;
segT this_segment_type;
{
- register fixS * fixP;
- register symbolS *add_symbolP;
- register symbolS *sub_symbolP;
+ fixS * fixP;
+ symbolS *add_symbolP;
+ symbolS *sub_symbolP;
long add_number;
- register int size;
- register char *place;
- register long where;
- register char pcrel;
- register fragS *fragP;
- register segT add_symbol_segment = absolute_section;
+ int size;
+ char *place;
+ long where;
+ char pcrel;
+ fragS *fragP;
+ segT add_symbol_segment = absolute_section;
for (fixP = segP->fix_root; fixP; fixP = fixP->fx_next)
{
}
if (add_symbolP)
- {
- add_symbol_segment = S_GET_SEGMENT (add_symbolP);
- } /* if there is an addend */
+ add_symbol_segment = S_GET_SEGMENT (add_symbolP);
if (sub_symbolP)
{
} /* not absolute */
/* if sub_symbol is in the same segment that add_symbol
- and add_symbol is either in DATA, TEXT, BSS or ABSOLUTE */
+ and add_symbol is either in DATA, TEXT, BSS or ABSOLUTE. */
}
else if (S_GET_SEGMENT (sub_symbolP) == add_symbol_segment
&& SEG_NORMAL (add_symbol_segment))
/* Makes no sense to use the difference of 2 arbitrary symbols
as the target of a call instruction. */
if (fixP->fx_tcbit)
- {
- as_bad_where (fixP->fx_file, fixP->fx_line,
- _("callj to difference of 2 symbols"));
- }
+ as_bad_where (fixP->fx_file, fixP->fx_line,
+ _("callj to difference of 2 symbols"));
#endif /* TC_I960 */
add_number += S_GET_VALUE (add_symbolP) -
S_GET_VALUE (sub_symbolP);
know (!(S_IS_EXTERNAL (sub_symbolP) && (S_GET_SEGMENT (sub_symbolP) == absolute_section)));
if ((S_GET_SEGMENT (sub_symbolP) == absolute_section))
- {
- add_number -= S_GET_VALUE (sub_symbolP);
- }
+ add_number -= S_GET_VALUE (sub_symbolP);
+
#ifdef DIFF_EXPR_OK
else if (S_GET_SEGMENT (sub_symbolP) == this_segment_type
#if 0 /* Okay for 68k, at least... */
segment_name (S_GET_SEGMENT (sub_symbolP)),
S_GET_NAME (sub_symbolP),
(long) (fragP->fr_address + where));
- } /* if absolute */
+ }
}
- } /* if sub_symbolP */
+ }
if (add_symbolP)
{
if (add_symbol_segment == this_segment_type && pcrel)
{
- /*
- * This fixup was made when the symbol's segment was
- * SEG_UNKNOWN, but it is now in the local segment.
- * So we know how to do the address without relocation.
- */
+ /* This fixup was made when the symbol's segment was
+ SEG_UNKNOWN, but it is now in the local segment.
+ So we know how to do the address without relocation. */
#ifdef TC_I960
/* reloc_callj() may replace a 'call' with a 'calls' or a 'bal',
- * in which cases it modifies *fixP as appropriate. In the case
- * of a 'calls', no further work is required, and *fixP has been
- * set up to make the rest of the code below a no-op.
- */
+ in which cases it modifies *fixP as appropriate. In the case
+ of a 'calls', no further work is required, and *fixP has been
+ set up to make the rest of the code below a no-op. */
reloc_callj (fixP);
#endif /* TC_I960 */
{
case absolute_section:
#ifdef TC_I960
- reloc_callj (fixP); /* See comment about reloc_callj() above*/
+ /* See comment about reloc_callj() above. */
+ reloc_callj (fixP);
#endif /* TC_I960 */
add_number += S_GET_VALUE (add_symbolP);
add_symbolP = NULL;
if ((int) fixP->fx_bit_fixP == 13)
{
/* This is a COBR instruction. They have only a
- * 13-bit displacement and are only to be used
- * for local branches: flag as error, don't generate
- * relocation.
- */
+ 13-bit displacement and are only to be used
+ for local branches: flag as error, don't generate
+ relocation. */
as_bad_where (fixP->fx_file, fixP->fx_line,
_("can't use COBR format with external label"));
fixP->fx_addsy = NULL;
fixP->fx_done = 1;
continue;
- } /* COBR */
+ }
#endif /* TC_I960 */
#if ((defined (TC_I386) || defined (TE_LYNX) || defined (TE_AUX)) && !defined(TE_PE)) || defined (COFF_COMMON_ADDEND)
/* 386 COFF uses a peculiar format in which the
#endif
break;
- } /* switch on symbol seg */
- } /* if not in local seg */
- } /* if there was a + symbol */
+ }
+ }
+ }
if (pcrel)
{
add_number -= md_pcrel_from (fixP);
#endif
if (add_symbolP == 0)
- {
- fixP->fx_addsy = &abs_symbol;
- } /* if there's an add_symbol */
+ fixP->fx_addsy = &abs_symbol;
#if defined (TC_I386) || defined (TE_LYNX) || defined (TC_I960) || defined (TC_M68K)
/* On the 386 we must adjust by the segment vaddr as well.
Ian Taylor.
add_number -= segP->scnhdr.s_vaddr;
#endif
- } /* if pcrel */
+ }
md_apply_fix3 (fixP, (valueT *) & add_number, this_segment_type);
(long) add_number,
(unsigned long) (fragP->fr_address + where));
#endif
- } /* not a bit fix */
- } /* For each fixS in this segment. */
-} /* fixup_segment() */
+ }
+ }
+}
#endif