From a5324a3e50c3f59e7d547aec300819c07b026979 Mon Sep 17 00:00:00 2001 From: Nick Clifton Date: Wed, 16 Mar 2005 14:57:00 +0000 Subject: [PATCH] Convert to ISO C90 formatting --- gas/ChangeLog | 5 + gas/config/obj-coff.c | 2524 ++++++++++++++++++++++--------------------------- gas/config/obj-coff.h | 369 ++++---- 3 files changed, 1334 insertions(+), 1564 deletions(-) diff --git a/gas/ChangeLog b/gas/ChangeLog index ce3663d..1afcabf 100644 --- a/gas/ChangeLog +++ b/gas/ChangeLog @@ -1,3 +1,8 @@ +2005-03-16 Nick Clifton + + * config/obj-coff.h: Convert to ISO C90 formatting. + * config/obj-coff.c: Convert to ISO C90 formatting. + 2005-03-15 Zack Weinberg * config/tc-arm.c (do_mla): Rename to do_mlas, take second diff --git a/gas/config/obj-coff.c b/gas/config/obj-coff.c index 3e947eb..dc03b62 100644 --- a/gas/config/obj-coff.c +++ b/gas/config/obj-coff.c @@ -30,6 +30,9 @@ #include "coff/pe.h" #endif +#define streq(a,b) (strcmp ((a), (b)) == 0) +#define strneq(a,b,n) (strncmp ((a), (b), (n)) == 0) + /* I think this is probably always correct. */ #ifndef KEEP_RELOC_INFO #define KEEP_RELOC_INFO @@ -60,50 +63,23 @@ typedef struct } stack; -static stack *stack_init PARAMS ((unsigned long, unsigned long)); -static char *stack_push PARAMS ((stack *, char *)); -static char *stack_pop PARAMS ((stack *)); -static void tag_init PARAMS ((void)); -static void tag_insert PARAMS ((const char *, symbolS *)); -static symbolS *tag_find PARAMS ((char *)); -static symbolS *tag_find_or_make PARAMS ((char *)); -static void obj_coff_bss PARAMS ((int)); -#ifdef BFD_ASSEMBLER -static void obj_coff_weak PARAMS ((int)); -#endif -const char *s_get_name PARAMS ((symbolS * s)); -static void obj_coff_ln PARAMS ((int)); -static void obj_coff_def PARAMS ((int)); -static void obj_coff_endef PARAMS ((int)); -static void obj_coff_dim PARAMS ((int)); -static void obj_coff_line PARAMS ((int)); -static void obj_coff_size PARAMS ((int)); -static void obj_coff_scl PARAMS ((int)); -static void obj_coff_tag PARAMS ((int)); -static void obj_coff_val PARAMS ((int)); -static void obj_coff_type PARAMS ((int)); -static void obj_coff_ident PARAMS ((int)); -#ifdef BFD_ASSEMBLER -static void obj_coff_loc PARAMS((int)); -#endif -/* stack stuff */ +/* Stack stuff. */ static stack * -stack_init (chunk_size, element_size) - unsigned long chunk_size; - unsigned long element_size; +stack_init (unsigned long chunk_size, + unsigned long element_size) { stack *st; - st = (stack *) malloc (sizeof (stack)); + st = malloc (sizeof (* st)); if (!st) - return 0; + return NULL; st->data = malloc (chunk_size); if (!st->data) { free (st); - return 0; + return NULL; } st->pointer = 0; st->size = chunk_size; @@ -113,15 +89,13 @@ stack_init (chunk_size, element_size) } static char * -stack_push (st, element) - stack *st; - char *element; +stack_push (stack *st, char *element) { if (st->pointer + st->element_size >= st->size) { st->size += st->chunk_size; - if ((st->data = xrealloc (st->data, st->size)) == (char *) 0) - return (char *) 0; + if ((st->data = xrealloc (st->data, st->size)) == NULL) + return NULL; } memcpy (st->data + st->pointer, element, st->element_size); st->pointer += st->element_size; @@ -129,47 +103,39 @@ stack_push (st, element) } static char * -stack_pop (st) - stack *st; +stack_pop (stack *st) { if (st->pointer < st->element_size) { st->pointer = 0; - return (char *) 0; + return NULL; } st->pointer -= st->element_size; return st->data + st->pointer; } -/* - * Maintain a list of the tagnames of the structures. - */ +/* Maintain a list of the tagnames of the structures. */ static struct hash_control *tag_hash; static void -tag_init () +tag_init (void) { tag_hash = hash_new (); } static void -tag_insert (name, symbolP) - const char *name; - symbolS *symbolP; +tag_insert (const char *name, symbolS *symbolP) { const char *error_string; if ((error_string = hash_jam (tag_hash, name, (char *) symbolP))) - { - as_fatal (_("Inserting \"%s\" into structure table failed: %s"), - name, error_string); - } + as_fatal (_("Inserting \"%s\" into structure table failed: %s"), + name, error_string); } static symbolS * -tag_find (name) - char *name; +tag_find (char *name) { #ifdef STRIP_UNDERSCORE if (*name == '_') @@ -179,8 +145,7 @@ tag_find (name) } static symbolS * -tag_find_or_make (name) - char *name; +tag_find_or_make (char *name) { symbolS *symbolP; @@ -193,7 +158,7 @@ tag_find_or_make (name) #ifdef BFD_ASSEMBLER symbol_table_insert (symbolP); #endif - } /* not found */ + } return symbolP; } @@ -202,8 +167,7 @@ tag_find_or_make (name) compatibility with earlier versions of gas. */ static void -obj_coff_bss (ignore) - int ignore ATTRIBUTE_UNUSED; +obj_coff_bss (int ignore ATTRIBUTE_UNUSED) { if (*input_line_pointer == '\n') subseg_new (".bss", get_absolute_expression ()); @@ -213,24 +177,20 @@ obj_coff_bss (ignore) #ifdef BFD_ASSEMBLER -static segT fetch_coff_debug_section PARAMS ((void)); -static void SA_SET_SYM_TAGNDX PARAMS ((symbolS *, symbolS *)); -static int S_GET_DATA_TYPE PARAMS ((symbolS *)); -void c_symbol_merge PARAMS ((symbolS *, symbolS *)); -static void add_lineno PARAMS ((fragS *, addressT, int)); - #define GET_FILENAME_STRING(X) \ -((char*) (&((X)->sy_symbol.ost_auxent->x_file.x_n.x_offset))[1]) + ((char *) (&((X)->sy_symbol.ost_auxent->x_file.x_n.x_offset))[1]) /* @@ Ick. */ static segT -fetch_coff_debug_section () +fetch_coff_debug_section (void) { static segT debug_section; + if (!debug_section) { const asymbol *s; - s = bfd_make_debug_symbol (stdoutput, (char *) 0, 0); + + s = bfd_make_debug_symbol (stdoutput, NULL, 0); assert (s != 0); debug_section = s->section; } @@ -238,9 +198,7 @@ fetch_coff_debug_section () } void -SA_SET_SYM_ENDNDX (sym, val) - symbolS *sym; - symbolS *val; +SA_SET_SYM_ENDNDX (symbolS *sym, symbolS *val) { combined_entry_type *entry, *p; @@ -251,9 +209,7 @@ SA_SET_SYM_ENDNDX (sym, val) } static void -SA_SET_SYM_TAGNDX (sym, val) - symbolS *sym; - symbolS *val; +SA_SET_SYM_TAGNDX (symbolS *sym, symbolS *val) { combined_entry_type *entry, *p; @@ -264,32 +220,26 @@ SA_SET_SYM_TAGNDX (sym, val) } static int -S_GET_DATA_TYPE (sym) - symbolS *sym; +S_GET_DATA_TYPE (symbolS *sym) { return coffsymbol (symbol_get_bfdsym (sym))->native->u.syment.n_type; } int -S_SET_DATA_TYPE (sym, val) - symbolS *sym; - int val; +S_SET_DATA_TYPE (symbolS *sym, int val) { coffsymbol (symbol_get_bfdsym (sym))->native->u.syment.n_type = val; return val; } int -S_GET_STORAGE_CLASS (sym) - symbolS *sym; +S_GET_STORAGE_CLASS (symbolS *sym) { return coffsymbol (symbol_get_bfdsym (sym))->native->u.syment.n_sclass; } int -S_SET_STORAGE_CLASS (sym, val) - symbolS *sym; - int val; +S_SET_STORAGE_CLASS (symbolS *sym, int val) { coffsymbol (symbol_get_bfdsym (sym))->native->u.syment.n_sclass = val; return val; @@ -297,27 +247,21 @@ S_SET_STORAGE_CLASS (sym, val) /* Merge a debug symbol containing debug information into a normal symbol. */ -void -c_symbol_merge (debug, normal) - symbolS *debug; - symbolS *normal; +static void +c_symbol_merge (symbolS *debug, symbolS *normal) { S_SET_DATA_TYPE (normal, S_GET_DATA_TYPE (debug)); S_SET_STORAGE_CLASS (normal, S_GET_STORAGE_CLASS (debug)); if (S_GET_NUMBER_AUXILIARY (debug) > S_GET_NUMBER_AUXILIARY (normal)) - { - /* take the most we have */ - 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) - { - /* Move all the auxiliary information. */ - memcpy (SYM_AUXINFO (normal), SYM_AUXINFO (debug), - (S_GET_NUMBER_AUXILIARY (debug) - * sizeof (*SYM_AUXINFO (debug)))); - } + /* Move all the auxiliary information. */ + memcpy (SYM_AUXINFO (normal), SYM_AUXINFO (debug), + (S_GET_NUMBER_AUXILIARY (debug) + * sizeof (*SYM_AUXINFO (debug)))); /* Move the debug flags. */ SF_SET_DEBUG_FIELD (normal, SF_GET_DEBUG_FIELD (debug)); @@ -340,24 +284,24 @@ c_dot_file_symbol (const char *filename, int appfile ATTRIBUTE_UNUSED) #ifndef NO_LISTING { extern int listing; + if (listing) - { - listing_source_file (filename); - } + listing_source_file (filename); } #endif - /* 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); - } /* if not first on the list */ + } } -/* Line number handling */ +/* Line number handling. */ -struct line_no { +struct line_no +{ struct line_no *next; fragS *frag; alent l; @@ -374,11 +318,10 @@ static symbolS *line_fsym; void -coff_obj_symbol_new_hook (symbolP) - symbolS *symbolP; +coff_obj_symbol_new_hook (symbolS *symbolP) { long sz = (OBJ_COFF_MAX_AUXENTRIES + 1) * sizeof (combined_entry_type); - char * s = (char *) xmalloc (sz); + char * s = xmalloc (sz); memset (s, 0, sz); coffsymbol (symbol_get_bfdsym (symbolP))->native = (combined_entry_type *) s; @@ -395,30 +338,23 @@ coff_obj_symbol_new_hook (symbolP) } -/* - * Handle .ln directives. - */ +/* Handle .ln directives. */ static symbolS *current_lineno_sym; static struct line_no *line_nos; -/* @@ Blindly assume all .ln directives will be in the .text section... */ +/* FIXME: Blindly assume all .ln directives will be in the .text section. */ int coff_n_line_nos; static void -add_lineno (frag, offset, num) - fragS *frag; - addressT offset; - int num; +add_lineno (fragS * frag, addressT offset, int num) { - struct line_no *new_line = - (struct line_no *) xmalloc (sizeof (struct line_no)); + struct line_no * new_line = xmalloc (sizeof (* new_line)); + if (!current_lineno_sym) - { - abort (); - } + abort (); #ifndef OBJ_XCOFF - /* The native aix assembler accepts negative line number */ + /* The native aix assembler accepts negative line number. */ if (num <= 0) { @@ -436,8 +372,7 @@ add_lineno (frag, offset, num) } void -coff_add_linesym (sym) - symbolS *sym; +coff_add_linesym (symbolS *sym) { if (line_nos) { @@ -450,8 +385,7 @@ coff_add_linesym (sym) } static void -obj_coff_ln (appline) - int appline; +obj_coff_ln (int appline) { int l; @@ -491,8 +425,7 @@ obj_coff_ln (appline) compatibility. */ static void -obj_coff_loc (ignore) - int ignore ATTRIBUTE_UNUSED; +obj_coff_loc (int ignore ATTRIBUTE_UNUSED) { int lineno; @@ -539,8 +472,7 @@ obj_coff_loc (ignore) /* Handle the .ident pseudo-op. */ static void -obj_coff_ident (ignore) - int ignore ATTRIBUTE_UNUSED; +obj_coff_ident (int ignore ATTRIBUTE_UNUSED) { segT current_seg = now_seg; subsegT current_subseg = now_subseg; @@ -565,32 +497,26 @@ obj_coff_ident (ignore) subseg_set (current_seg, current_subseg); } -/* - * 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 == ' ' || \ - *input_line_pointer == '\t') \ - input_line_pointer++; + *input_line_pointer == '\t') \ + input_line_pointer++; static void -obj_coff_def (what) - int what ATTRIBUTE_UNUSED; +obj_coff_def (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) @@ -598,7 +524,7 @@ obj_coff_def (what) as_warn (_(".def pseudo-op used inside of .def/.endef: ignored.")); demand_empty_rest_of_line (); return; - } /* if not inside .def/.endef */ + } SKIP_WHITESPACES (); @@ -606,7 +532,7 @@ obj_coff_def (what) #ifdef STRIP_UNDERSCORE if (symbol_name[0] == '_' && symbol_name[1] != 0) symbol_name++; -#endif /* STRIP_UNDERSCORE */ +#endif name_end = get_symbol_end (); symbol_name_length = strlen (symbol_name); @@ -616,7 +542,7 @@ obj_coff_def (what) symbol_name_copy = tc_canonicalize_symbol_name (symbol_name_copy); #endif - /* Initialize the new symbol */ + /* Initialize the new symbol. */ def_symbol_in_progress = symbol_make (symbol_name_copy); symbol_set_frag (def_symbol_in_progress, &zero_address_frag); S_SET_VALUE (def_symbol_in_progress, 0); @@ -632,19 +558,17 @@ obj_coff_def (what) unsigned int dim_index; static void -obj_coff_endef (ignore) - int ignore ATTRIBUTE_UNUSED; +obj_coff_endef (int ignore ATTRIBUTE_UNUSED) { symbolS *symbolP = NULL; - /* DIM BUG FIX sac@cygnus.com */ dim_index = 0; if (def_symbol_in_progress == NULL) { 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)) @@ -653,7 +577,7 @@ obj_coff_endef (ignore) case C_ENTAG: case C_UNTAG: SF_SET_TAG (def_symbol_in_progress); - /* intentional fallthrough */ + /* Fall through. */ case C_FILE: case C_TPDEF: SF_SET_DEBUG (def_symbol_in_progress); @@ -662,13 +586,14 @@ obj_coff_endef (ignore) case C_EFCN: SF_SET_LOCAL (def_symbol_in_progress); /* Do not emit this symbol. */ - /* intentional fallthrough */ + /* Fall through. */ case C_BLOCK: - SF_SET_PROCESS (def_symbol_in_progress); /* Will need processing before writing */ - /* intentional fallthrough */ + SF_SET_PROCESS (def_symbol_in_progress); /* Will need processing before writing. */ + /* Fall through. */ case C_FCN: { const char *name; + S_SET_SEGMENT (def_symbol_in_progress, text_section); name = S_GET_NAME (def_symbol_in_progress); @@ -759,7 +684,7 @@ obj_coff_endef (ignore) #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; default: @@ -769,7 +694,7 @@ obj_coff_endef (ignore) 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 @@ -792,9 +717,9 @@ obj_coff_endef (ignore) if (S_GET_STORAGE_CLASS (def_symbol_in_progress) == C_EFCN || S_GET_STORAGE_CLASS (def_symbol_in_progress) == C_LABEL - || (!strcmp (bfd_get_section_name (stdoutput, - S_GET_SEGMENT (def_symbol_in_progress)), - "*DEBUG*") + || (streq (bfd_get_section_name (stdoutput, + S_GET_SEGMENT (def_symbol_in_progress)), + "*DEBUG*") && !SF_GET_TAG (def_symbol_in_progress)) || S_GET_SEGMENT (def_symbol_in_progress) == absolute_section || ! symbol_constant_p (def_symbol_in_progress) @@ -816,7 +741,7 @@ obj_coff_endef (ignore) into the old one. This is not mandatory. The linker can handle duplicate symbols correctly. But I guess that it save a *lot* of space if the assembly file defines a lot of - symbols. [loic] */ + symbols. [loic] */ /* The debug entry (def_symbol_in_progress) is merged into the previous definition. */ @@ -833,7 +758,7 @@ obj_coff_endef (ignore) /* 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); @@ -860,20 +785,18 @@ obj_coff_endef (ignore) SF_SET_PROCESS (def_symbol_in_progress); if (symbolP == NULL) - { - /* 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 */ + /* That is, if this is the first time we've seen the + function. */ + symbol_table_insert (def_symbol_in_progress); + + } def_symbol_in_progress = NULL; demand_empty_rest_of_line (); } static void -obj_coff_dim (ignore) - int ignore ATTRIBUTE_UNUSED; +obj_coff_dim (int ignore ATTRIBUTE_UNUSED) { int dim_index; @@ -882,7 +805,7 @@ obj_coff_dim (ignore) 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); @@ -900,7 +823,7 @@ obj_coff_dim (ignore) default: as_warn (_("badly formed .dim directive ignored")); - /* intentional fallthrough */ + /* Fall through. */ case '\n': case ';': dim_index = DIMNUM; @@ -912,8 +835,7 @@ obj_coff_dim (ignore) } static void -obj_coff_line (ignore) - int ignore ATTRIBUTE_UNUSED; +obj_coff_line (int ignore ATTRIBUTE_UNUSED) { int this_base; @@ -925,7 +847,7 @@ obj_coff_line (ignore) } this_base = get_absolute_expression (); - if (!strcmp (".bf", S_GET_NAME (def_symbol_in_progress))) + if (streq (".bf", S_GET_NAME (def_symbol_in_progress))) coff_line_base = this_base; S_SET_NUMBER_AUXILIARY (def_symbol_in_progress, 1); @@ -934,7 +856,7 @@ obj_coff_line (ignore) demand_empty_rest_of_line (); #ifndef NO_LISTING - if (strcmp (".bf", S_GET_NAME (def_symbol_in_progress)) == 0) + if (streq (".bf", S_GET_NAME (def_symbol_in_progress))) { extern int listing; @@ -945,15 +867,14 @@ obj_coff_line (ignore) } static void -obj_coff_size (ignore) - int ignore ATTRIBUTE_UNUSED; +obj_coff_size (int ignore ATTRIBUTE_UNUSED) { if (def_symbol_in_progress == NULL) { 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 ()); @@ -961,23 +882,21 @@ obj_coff_size (ignore) } static void -obj_coff_scl (ignore) - int ignore ATTRIBUTE_UNUSED; +obj_coff_scl (int ignore ATTRIBUTE_UNUSED) { if (def_symbol_in_progress == NULL) { 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 (); } static void -obj_coff_tag (ignore) - int ignore ATTRIBUTE_UNUSED; +obj_coff_tag (int ignore ATTRIBUTE_UNUSED) { char *symbol_name; char name_end; @@ -1002,9 +921,7 @@ obj_coff_tag (ignore) SA_SET_SYM_TAGNDX (def_symbol_in_progress, 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; @@ -1013,37 +930,33 @@ obj_coff_tag (ignore) } static void -obj_coff_type (ignore) - int ignore ATTRIBUTE_UNUSED; +obj_coff_type (int ignore ATTRIBUTE_UNUSED) { if (def_symbol_in_progress == NULL) { 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 (); } static void -obj_coff_val (ignore) - int ignore ATTRIBUTE_UNUSED; +obj_coff_val (int ignore ATTRIBUTE_UNUSED) { if (def_symbol_in_progress == NULL) { 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)) { @@ -1053,13 +966,13 @@ obj_coff_val (ignore) #ifdef tc_canonicalize_symbol_name symbol_name = tc_canonicalize_symbol_name (symbol_name); #endif - if (!strcmp (symbol_name, ".")) + if (streq (symbol_name, ".")) { + /* If the .val is != from the .def (e.g. statics). */ symbol_set_frag (def_symbol_in_progress, frag_now); S_SET_VALUE (def_symbol_in_progress, (valueT) frag_now_fix ()); - /* If the .val is != from the .def (e.g. statics) */ } - else if (strcmp (S_GET_NAME (def_symbol_in_progress), symbol_name)) + else if (! streq (S_GET_NAME (def_symbol_in_progress), symbol_name)) { expressionS exp; @@ -1087,7 +1000,7 @@ obj_coff_val (ignore) else { S_SET_VALUE (def_symbol_in_progress, get_absolute_expression ()); - } /* if symbol based */ + } demand_empty_rest_of_line (); } @@ -1099,7 +1012,7 @@ obj_coff_val (ignore) static int weak_is_altname (const char * name) { - return ! strncmp (name, weak_altprefix, sizeof (weak_altprefix) - 1); + return strneq (name, weak_altprefix, sizeof (weak_altprefix) - 1); } /* Return the name of the alternate symbol @@ -1115,7 +1028,7 @@ weak_name2altname (const char * name) return strcat (alt_name, name); } -/* Return the name of the weak symbol corresponding to an +/* Return the name of the weak symbol corresponding to an alterate symbol. */ static const char * @@ -1222,7 +1135,7 @@ obj_coff_weak (int ignore ATTRIBUTE_UNUSED) } void -coff_obj_read_begin_hook () +coff_obj_read_begin_hook (void) { /* These had better be the same. Usually 18 bytes. */ #ifndef BFD_HEADERS @@ -1238,9 +1151,7 @@ static symbolS *coff_last_bf; #endif void -coff_frob_symbol (symp, punt) - symbolS *symp; - int *punt; +coff_frob_symbol (symbolS *symp, int *punt) { static symbolS *last_tagP; static stack *block_stack; @@ -1254,7 +1165,7 @@ coff_frob_symbol (symp, punt) } if (current_lineno_sym) - coff_add_linesym ((symbolS *) 0); + coff_add_linesym (NULL); if (!block_stack) block_stack = stack_init (512, sizeof (symbolS*)); @@ -1333,7 +1244,7 @@ coff_frob_symbol (symp, punt) if (!SF_GET_LOCAL (symp) && !SF_GET_STATICS (symp) && S_GET_STORAGE_CLASS (symp) != C_LABEL - && symbol_constant_p(symp) + && symbol_constant_p (symp) && (real = symbol_find_base (S_GET_NAME (symp), DO_NOT_STRIP)) && S_GET_STORAGE_CLASS (real) == C_NULL && real != symp) @@ -1361,7 +1272,7 @@ coff_frob_symbol (symp, punt) { if (S_GET_STORAGE_CLASS (symp) == C_BLOCK) { - if (!strcmp (S_GET_NAME (symp), ".bb")) + if (streq (S_GET_NAME (symp), ".bb")) stack_push (block_stack, (char *) &symp); else { @@ -1406,8 +1317,6 @@ coff_frob_symbol (symp, punt) if (SF_GET_FUNCTION (symp)) symbol_get_bfdsym (symp)->flags |= BSF_FUNCTION; - - /* more ... */ } /* Double check weak symbols. */ @@ -1453,7 +1362,7 @@ coff_frob_symbol (symp, punt) #ifndef OBJ_XCOFF if (! *punt && S_GET_STORAGE_CLASS (symp) == C_FCN - && strcmp (S_GET_NAME (symp), ".bf") == 0) + && streq (S_GET_NAME (symp), ".bf")) { if (coff_last_bf != NULL) SA_SET_SYM_ENDNDX (coff_last_bf, symp); @@ -1474,7 +1383,7 @@ coff_frob_symbol (symp, punt) /* We need i entries for line numbers, plus 1 for the first entry which BFD will override, plus 1 for the last zero entry (a marker for BFD). */ - l = (alent *) xmalloc ((i + 2) * sizeof (alent)); + l = xmalloc ((i + 2) * sizeof (* l)); coffsymbol (symbol_get_bfdsym (symp))->lineno = l; l[i + 1].line_number = 0; l[i + 1].u.sym = NULL; @@ -1489,10 +1398,9 @@ coff_frob_symbol (symp, punt) } void -coff_adjust_section_syms (abfd, sec, x) - bfd *abfd ATTRIBUTE_UNUSED; - asection *sec; - PTR x ATTRIBUTE_UNUSED; +coff_adjust_section_syms (bfd *abfd ATTRIBUTE_UNUSED, + asection *sec, + void * x ATTRIBUTE_UNUSED) { symbolS *secsym; segment_info_type *seginfo = seg_info (sec); @@ -1503,7 +1411,7 @@ coff_adjust_section_syms (abfd, sec, x) if (seginfo == NULL) return; - if (!strcmp (sec->name, ".text")) + if (streq (sec->name, ".text")) nlnno = coff_n_line_nos; else nlnno = 0; @@ -1525,6 +1433,7 @@ coff_adjust_section_syms (abfd, sec, x) && sec != data_section && sec != bss_section) return; + secsym = section_symbol (sec); /* This is an estimate; we'll plug in the real value using SET_SECTION_RELOCS later */ @@ -1533,9 +1442,9 @@ coff_adjust_section_syms (abfd, sec, x) } void -coff_frob_file_after_relocs () +coff_frob_file_after_relocs (void) { - bfd_map_over_sections (stdoutput, coff_adjust_section_syms, (char*) 0); + bfd_map_over_sections (stdoutput, coff_adjust_section_syms, NULL); } /* Implement the .section pseudo op: @@ -1558,10 +1467,9 @@ coff_frob_file_after_relocs () .section directive to be parsed in both ELF and COFF formats. */ void -obj_coff_section (ignore) - int ignore ATTRIBUTE_UNUSED; +obj_coff_section (int ignore ATTRIBUTE_UNUSED) { - /* Strip out the section name */ + /* Strip out the section name. */ char *section_name; char c; char *name; @@ -1607,8 +1515,8 @@ obj_coff_section (ignore) case 'b': flags |= SEC_ALLOC; flags &=~ SEC_LOAD; break; case 'n': flags &=~ SEC_LOAD; flags |= SEC_NEVER_LOAD; break; - case 's': flags |= SEC_COFF_SHARED; /* fall through */ - case 'd': flags |= SEC_DATA | SEC_LOAD; /* fall through */ + case 's': flags |= SEC_COFF_SHARED; /* Fall through. */ + case 'd': flags |= SEC_DATA | SEC_LOAD; /* Fall through. */ case 'w': flags &=~ SEC_READONLY; break; case 'a': break; /* For compatibility with ELF. */ @@ -1623,8 +1531,8 @@ obj_coff_section (ignore) break; default: - as_warn(_("unknown section attribute '%c'"), - *input_line_pointer); + as_warn (_("unknown section attribute '%c'"), + *input_line_pointer); break; } ++input_line_pointer; @@ -1648,7 +1556,7 @@ obj_coff_section (ignore) /* Add SEC_LINK_ONCE and SEC_LINK_DUPLICATES_DISCARD to .gnu.linkonce sections so adjust_reloc_syms in write.c will correctly handle relocs which refer to non-local symbols in these sections. */ - if (strncmp (name, ".gnu.linkonce", sizeof (".gnu.linkonce") - 1) == 0) + if (strneq (name, ".gnu.linkonce", sizeof (".gnu.linkonce") - 1)) flags |= SEC_LINK_ONCE | SEC_LINK_DUPLICATES_DISCARD; #endif @@ -1659,7 +1567,7 @@ obj_coff_section (ignore) } else if (flags != SEC_NO_FLAGS) { - /* This section's attributes have already been set. Warn if the + /* This section's attributes have already been set. Warn if the attributes don't match. */ flagword matchflags = (SEC_ALLOC | SEC_LOAD | SEC_READONLY | SEC_CODE | SEC_DATA | SEC_COFF_SHARED | SEC_NEVER_LOAD); @@ -1671,7 +1579,7 @@ obj_coff_section (ignore) } void -coff_adjust_symtab () +coff_adjust_symtab (void) { if (symbol_rootP == NULL || S_GET_STORAGE_CLASS (symbol_rootP) != C_FILE) @@ -1679,8 +1587,7 @@ coff_adjust_symtab () } void -coff_frob_section (sec) - segT sec; +coff_frob_section (segT sec) { segT strsec; char *p; @@ -1733,14 +1640,14 @@ coff_frob_section (sec) SA_SET_SCN_SCNLEN (secsym, size); } - /* @@ these should be in a "stabs.h" file, or maybe as.h */ + /* FIXME: These should be in a "stabs.h" file, or maybe as.h. */ #ifndef STAB_SECTION_NAME #define STAB_SECTION_NAME ".stab" #endif #ifndef STAB_STRING_SECTION_NAME #define STAB_STRING_SECTION_NAME ".stabstr" #endif - if (strcmp (STAB_STRING_SECTION_NAME, sec->name)) + if (! streq (STAB_STRING_SECTION_NAME, sec->name)) return; strsec = sec; @@ -1763,8 +1670,7 @@ coff_frob_section (sec) } void -obj_coff_init_stab_section (seg) - segT seg; +obj_coff_init_stab_section (segT seg) { char *file; char *p; @@ -1776,7 +1682,7 @@ obj_coff_init_stab_section (seg) /* Zero it out. */ memset (p, 0, 12); as_where (&file, (unsigned int *) NULL); - stabstr_name = (char *) xmalloc (strlen (seg->name) + 4); + stabstr_name = xmalloc (strlen (seg->name) + 4); strcpy (stabstr_name, seg->name); strcat (stabstr_name, "str"); stroff = get_stab_string_offset (file, stabstr_name); @@ -1785,28 +1691,24 @@ obj_coff_init_stab_section (seg) } #ifdef DEBUG -/* for debugging */ const char * -s_get_name (s) - symbolS *s; +s_get_name (symbolS *s) { return ((s == NULL) ? "(NULL)" : S_GET_NAME (s)); } void -symbol_dump () +symbol_dump (void) { symbolS *symbolP; for (symbolP = symbol_rootP; symbolP; symbolP = symbol_next (symbolP)) - { - printf (_("0x%lx: \"%s\" type = %ld, class = %d, segment = %d\n"), - (unsigned long) symbolP, - S_GET_NAME(symbolP), - (long) S_GET_DATA_TYPE(symbolP), - S_GET_STORAGE_CLASS(symbolP), - (int) S_GET_SEGMENT(symbolP)); - } + printf (_("0x%lx: \"%s\" type = %ld, class = %d, segment = %d\n"), + (unsigned long) symbolP, + S_GET_NAME (symbolP), + (long) S_GET_DATA_TYPE (symbolP), + S_GET_STORAGE_CLASS (symbolP), + (int) S_GET_SEGMENT (symbolP)); } #endif /* DEBUG */ @@ -1876,33 +1778,6 @@ bfd *abfd; static symbolS *previous_file_symbol; static int line_base; -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)); -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. This array maps a COFF section number into a gas section number. @@ -1940,37 +1815,29 @@ static const segT seg_info_off_by_4[] = #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; - long alignment; +relax_align (relax_addressT address, long alignment) { relax_addressT mask; relax_addressT new_address; mask = ~((~0) << alignment); new_address = (address + mask) & (~mask); - return (new_address - address); + + return new_address - address; } segT -s_get_segment (x) - symbolS * x; +s_get_segment (symbolS * x) { return SEG_INFO_FROM_SECTION_NUMBER (x->sy_symbol.ost_entry.n_scnum); } -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 idx; +size_section (bfd *abfd ATTRIBUTE_UNUSED, unsigned int idx) { unsigned int size = 0; fragS *frag = segment_info[idx].frchainP->frch_root; @@ -2021,8 +1888,7 @@ size_section (abfd, idx) } static unsigned int -count_entries_in_chain (idx) - unsigned int idx; +count_entries_in_chain (unsigned int idx) { unsigned int nrelocs; fixS *fixup_ptr; @@ -2051,19 +1917,16 @@ count_entries_in_chain (idx) #ifdef TE_AUX -static int compare_external_relocs PARAMS ((const PTR, const PTR)); - /* AUX's ld expects relocations to be sorted. */ static int -compare_external_relocs (x, y) - const PTR x; - const PTR y; +compare_external_relocs (const void * x, const void * y) { struct external_reloc *a = (struct external_reloc *) x; struct external_reloc *b = (struct external_reloc *) y; bfd_vma aadr = bfd_getb32 (a->r_vaddr); bfd_vma badr = bfd_getb32 (b->r_vaddr); + return (aadr < badr ? -1 : badr < aadr ? 1 : 0); } @@ -2071,11 +1934,8 @@ compare_external_relocs (x, y) /* Output all the relocations for a section. */ -void -do_relocs_for (abfd, h, file_cursor) - bfd * abfd; - object_headers * h; - unsigned long *file_cursor; +static void +do_relocs_for (bfd * abfd, object_headers * h, unsigned long *file_cursor) { unsigned int nrelocs; unsigned int idx; @@ -2090,6 +1950,7 @@ do_relocs_for (abfd, h, file_cursor) unsigned int external_reloc_size; unsigned int base = segment_info[idx].scnhdr.s_paddr; fixS *fix_ptr = segment_info[idx].fix_root; + nrelocs = count_entries_in_chain (idx); if (nrelocs) @@ -2097,8 +1958,7 @@ do_relocs_for (abfd, h, file_cursor) avoids a SCO bug, where free(malloc(0)) tends to crash. */ { external_reloc_size = nrelocs * RELSZ; - external_reloc_vec = - (struct external_reloc *) malloc (external_reloc_size); + external_reloc_vec = malloc (external_reloc_size); ext_ptr = external_reloc_vec; @@ -2204,11 +2064,11 @@ do_relocs_for (abfd, h, file_cursor) } #ifdef TE_AUX /* Sort the reloc table. */ - qsort ((PTR) external_reloc_vec, nrelocs, + qsort ((void *) external_reloc_vec, nrelocs, sizeof (struct external_reloc), compare_external_relocs); #endif /* Write out the reloc table. */ - bfd_bwrite ((PTR) external_reloc_vec, + bfd_bwrite ((void *) external_reloc_vec, (bfd_size_type) external_reloc_size, abfd); free (external_reloc_vec); @@ -2233,10 +2093,9 @@ do_relocs_for (abfd, h, file_cursor) in the scnhdrs with the info on the file positions. */ static void -fill_section (abfd, h, file_cursor) - bfd * abfd; - object_headers *h ATTRIBUTE_UNUSED; - unsigned long *file_cursor; +fill_section (bfd * abfd, + object_headers *h ATTRIBUTE_UNUSED, + unsigned long *file_cursor) { unsigned int i; unsigned int paddr = 0; @@ -2262,11 +2121,11 @@ fill_section (abfd, h, file_cursor) } know (s->s_paddr == paddr); - if (strcmp (s->s_name, ".text") == 0) + if (streq (s->s_name, ".text")) s->s_flags |= STYP_TEXT; - else if (strcmp (s->s_name, ".data") == 0) + else if (streq (s->s_name, ".data")) s->s_flags |= STYP_DATA; - else if (strcmp (s->s_name, ".bss") == 0) + else if (streq (s->s_name, ".bss")) { s->s_scnptr = 0; s->s_flags |= STYP_BSS; @@ -2285,18 +2144,19 @@ fill_section (abfd, h, file_cursor) #endif #endif } - else if (strcmp (s->s_name, ".lit") == 0) + else if (streq (s->s_name, ".lit")) s->s_flags = STYP_LIT | STYP_TEXT; - else if (strcmp (s->s_name, ".init") == 0) + else if (streq (s->s_name, ".init")) s->s_flags |= STYP_TEXT; - else if (strcmp (s->s_name, ".fini") == 0) + else if (streq (s->s_name, ".fini")) s->s_flags |= STYP_TEXT; - else if (strncmp (s->s_name, ".comment", 8) == 0) + else if (strneq (s->s_name, ".comment", 8)) s->s_flags |= STYP_INFO; while (frag) { unsigned int fill_size; + switch (frag->fr_type) { case rs_machine_dependent: @@ -2328,6 +2188,7 @@ fill_section (abfd, h, file_cursor) { unsigned int count; unsigned int off = frag->fr_fix; + for (count = frag->fr_offset; count; count--) { if (fill_size + frag->fr_address + off <= s->s_size) @@ -2366,9 +2227,7 @@ fill_section (abfd, h, file_cursor) /* Coff file generation & utilities. */ static void -coff_header_append (abfd, h) - bfd * abfd; - object_headers * h; +coff_header_append (bfd * abfd, object_headers * h) { unsigned int i; char buffer[1000]; @@ -2377,7 +2236,7 @@ coff_header_append (abfd, h) unsigned long string_size = 4; #endif - bfd_seek (abfd, (file_ptr) 0, 0); + bfd_seek (abfd, 0, 0); #ifndef OBJ_COFF_OMIT_OPTIONAL_HEADER H_SET_MAGIC_NUMBER (h, COFF_MAGIC); @@ -2385,8 +2244,8 @@ coff_header_append (abfd, h) H_SET_ENTRY_POINT (h, 0); H_SET_TEXT_START (h, segment_info[SEG_E0].frchainP->frch_root->fr_address); H_SET_DATA_START (h, segment_info[SEG_E1].frchainP->frch_root->fr_address); - H_SET_SIZEOF_OPTIONAL_HEADER (h, bfd_coff_swap_aouthdr_out(abfd, &h->aouthdr, - buffero)); + H_SET_SIZEOF_OPTIONAL_HEADER (h, bfd_coff_swap_aouthdr_out (abfd, &h->aouthdr, + buffero)); #else /* defined (OBJ_COFF_OMIT_OPTIONAL_HEADER) */ H_SET_SIZEOF_OPTIONAL_HEADER (h, 0); #endif /* defined (OBJ_COFF_OMIT_OPTIONAL_HEADER) */ @@ -2423,11 +2282,8 @@ coff_header_append (abfd, h) } } -char * -symbol_to_chars (abfd, where, symbolP) - bfd * abfd; - char *where; - symbolS * symbolP; +static char * +symbol_to_chars (bfd * abfd, char * where, symbolS * symbolP) { unsigned int numaux = symbolP->sy_symbol.ost_entry.n_numaux; unsigned int i; @@ -2465,8 +2321,7 @@ symbol_to_chars (abfd, where, symbolP) } void -coff_obj_symbol_new_hook (symbolP) - symbolS *symbolP; +coff_obj_symbol_new_hook (symbolS *symbolP) { char underscore = 0; /* Symbol has leading _ */ @@ -2487,11 +2342,40 @@ coff_obj_symbol_new_hook (symbolP) SF_SET_LOCAL (symbolP); } +static int +c_line_new (symbolS * symbol, long paddr, int line_number, fragS * frag) +{ + struct lineno_list *new_line = xmalloc (sizeof (* new_line)); + + segment_info_type *s = segment_info + now_seg; + new_line->line.l_lnno = line_number; + + if (line_number == 0) + { + last_line_symbol = symbol; + new_line->line.l_addr.l_symndx = (long) symbol; + } + else + { + new_line->line.l_addr.l_paddr = paddr; + } + + new_line->frag = (char *) frag; + new_line->next = NULL; + + if (s->lineno_list_head == NULL) + s->lineno_list_head = new_line; + else + s->lineno_list_tail->next = new_line; + + s->lineno_list_tail = new_line; + return LINESZ * s->scnhdr.s_nlnno++; +} + /* Handle .ln directives. */ static void -obj_coff_ln (appline) - int appline; +obj_coff_ln (int appline) { int l; @@ -2519,14 +2403,13 @@ obj_coff_ln (appline) l += line_base - 1; listing_source_line ((unsigned int) l); } - } #endif demand_empty_rest_of_line (); } /* 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 @@ -2536,12 +2419,11 @@ obj_coff_ln (appline) #define SKIP_SEMI_COLON() while (*input_line_pointer++ != ';') #define SKIP_WHITESPACES() while (*input_line_pointer == ' ' || \ - *input_line_pointer == '\t') \ - input_line_pointer++; + *input_line_pointer == '\t') \ + input_line_pointer++; static void -obj_coff_def (what) - int what ATTRIBUTE_UNUSED; +obj_coff_def (int what ATTRIBUTE_UNUSED) { char name_end; /* Char after the end of name. */ char *symbol_name; /* Name of the debug symbol. */ @@ -2557,7 +2439,7 @@ obj_coff_def (what) SKIP_WHITESPACES (); - def_symbol_in_progress = (symbolS *) obstack_alloc (¬es, sizeof (*def_symbol_in_progress)); + def_symbol_in_progress = obstack_alloc (¬es, sizeof (*def_symbol_in_progress)); memset (def_symbol_in_progress, 0, sizeof (*def_symbol_in_progress)); symbol_name = input_line_pointer; @@ -2591,14 +2473,31 @@ obj_coff_def (what) demand_empty_rest_of_line (); } +static void +c_symbol_merge (symbolS *debug, symbolS *normal) +{ + S_SET_DATA_TYPE (normal, S_GET_DATA_TYPE (debug)); + 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)); + + 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 the debug flags. */ + SF_SET_DEBUG_FIELD (normal, SF_GET_DEBUG_FIELD (debug)); +} + unsigned int dim_index; static void -obj_coff_endef (ignore) - int ignore ATTRIBUTE_UNUSED; +obj_coff_endef (int ignore ATTRIBUTE_UNUSED) { symbolS *symbolP = 0; - /* DIM BUG FIX sac@cygnus.com */ + dim_index = 0; if (def_symbol_in_progress == NULL) { @@ -2614,7 +2513,7 @@ obj_coff_endef (ignore) case C_ENTAG: case C_UNTAG: SF_SET_TAG (def_symbol_in_progress); - /* Intentional fallthrough. */ + /* Fall through. */ case C_FILE: case C_TPDEF: @@ -2625,18 +2524,18 @@ obj_coff_endef (ignore) case C_EFCN: /* Do not emit this symbol. */ SF_SET_LOCAL (def_symbol_in_progress); - /* Intentional fallthrough. */ - + /* Fall through. */ + case C_BLOCK: /* Will need processing before writing. */ SF_SET_PROCESS (def_symbol_in_progress); - /* Intentional fallthrough. */ + /* Fall through. */ 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 (streq (S_GET_NAME (def_symbol_in_progress), ".bf")) + { if (function_lineoff < 0) fprintf (stderr, _("`.bf' symbol without preceding function\n")); @@ -2770,11 +2669,8 @@ obj_coff_endef (ignore) SF_SET_PROCESS (def_symbol_in_progress); if (symbolP == NULL) - { - /* That is, if this is the first time we've seen the - function... */ - symbol_table_insert (def_symbol_in_progress); - } + /* That is, if this is the first time we've seen the function. */ + symbol_table_insert (def_symbol_in_progress); } def_symbol_in_progress = NULL; @@ -2782,8 +2678,7 @@ obj_coff_endef (ignore) } static void -obj_coff_dim (ignore) - int ignore ATTRIBUTE_UNUSED; +obj_coff_dim (int ignore ATTRIBUTE_UNUSED) { int dim_index; @@ -2810,7 +2705,7 @@ obj_coff_dim (ignore) default: as_warn (_("badly formed .dim directive ignored")); - /* Intentional fallthrough. */ + /* Fall through. */ case '\n': case ';': @@ -2823,8 +2718,7 @@ obj_coff_dim (ignore) } static void -obj_coff_line (ignore) - int ignore ATTRIBUTE_UNUSED; +obj_coff_line (int ignore ATTRIBUTE_UNUSED) { int this_base; const char *name; @@ -2841,7 +2735,7 @@ obj_coff_line (ignore) /* Only .bf symbols indicate the use of a new base line number; the line numbers associated with .ef, .bb, .eb are relative to the start of the containing function. */ - if (!strcmp (".bf", name)) + if (streq (".bf", name)) { line_base = this_base; @@ -2861,8 +2755,7 @@ obj_coff_line (ignore) } static void -obj_coff_size (ignore) - int ignore ATTRIBUTE_UNUSED; +obj_coff_size (int ignore ATTRIBUTE_UNUSED) { if (def_symbol_in_progress == NULL) { @@ -2877,8 +2770,7 @@ obj_coff_size (ignore) } static void -obj_coff_scl (ignore) - int ignore ATTRIBUTE_UNUSED; +obj_coff_scl (int ignore ATTRIBUTE_UNUSED) { if (def_symbol_in_progress == NULL) { @@ -2892,8 +2784,7 @@ obj_coff_scl (ignore) } static void -obj_coff_tag (ignore) - int ignore ATTRIBUTE_UNUSED; +obj_coff_tag (int ignore ATTRIBUTE_UNUSED) { char *symbol_name; char name_end; @@ -2926,8 +2817,7 @@ obj_coff_tag (ignore) } static void -obj_coff_type (ignore) - int ignore ATTRIBUTE_UNUSED; +obj_coff_type (int ignore ATTRIBUTE_UNUSED) { if (def_symbol_in_progress == NULL) { @@ -2946,8 +2836,7 @@ obj_coff_type (ignore) } static void -obj_coff_val (ignore) - int ignore ATTRIBUTE_UNUSED; +obj_coff_val (int ignore ATTRIBUTE_UNUSED) { if (def_symbol_in_progress == NULL) { @@ -2965,13 +2854,13 @@ obj_coff_val (ignore) symbol_name = tc_canonicalize_symbol_name (symbol_name); #endif - if (!strcmp (symbol_name, ".")) + if (streq (symbol_name, ".")) { 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). */ } - else if (strcmp (S_GET_NAME (def_symbol_in_progress), symbol_name)) + else if (! streq (S_GET_NAME (def_symbol_in_progress), symbol_name)) { def_symbol_in_progress->sy_value.X_op = O_symbol; def_symbol_in_progress->sy_value.X_add_symbol = @@ -3003,7 +2892,7 @@ obj_coff_val (ignore) { S_SET_VALUE (def_symbol_in_progress, (valueT) get_absolute_expression ()); - } /* if symbol based */ + } demand_empty_rest_of_line (); } @@ -3014,8 +2903,7 @@ obj_coff_val (ignore) read.c, which then calls this object file format specific routine. */ void -obj_coff_pe_handle_link_once (type) - enum linkonce_type type; +obj_coff_pe_handle_link_once (enum linkonce_type type) { seg_info (now_seg)->scnhdr.s_flags |= IMAGE_SCN_LNK_COMDAT; @@ -3027,7 +2915,7 @@ obj_coff_pe_handle_link_once (type) #endif /* TE_PE */ void -coff_obj_read_begin_hook () +coff_obj_read_begin_hook (void) { /* These had better be the same. Usually 18 bytes. */ #ifndef BFD_HEADERS @@ -3054,12 +2942,11 @@ static symbolS *last_bfP; symbolS *last_tagP; static unsigned int -yank_symbols () +yank_symbols (void) { symbolS *symbolP; unsigned int symbol_number = 0; unsigned int last_file_symno = 0; - struct filename_list *filename_list_scan = filename_list_head; for (symbolP = symbol_rootP; @@ -3118,9 +3005,7 @@ yank_symbols () if (S_GET_STORAGE_CLASS (symbolP) == C_NULL) { if (!S_IS_DEFINED (symbolP) && !SF_GET_LOCAL (symbolP)) - { - S_SET_EXTERNAL (symbolP); - } + S_SET_EXTERNAL (symbolP); else if (S_GET_SEGMENT (symbolP) == SEG_E0) S_SET_STORAGE_CLASS (symbolP, C_LABEL); @@ -3135,7 +3020,7 @@ yank_symbols () /* Handle the nested blocks auxiliary info. */ if (S_GET_STORAGE_CLASS (symbolP) == C_BLOCK) { - if (!strcmp (S_GET_NAME (symbolP), ".bb")) + if (streq (S_GET_NAME (symbolP), ".bb")) stack_push (block_stack, (char *) &symbolP); else { @@ -3143,27 +3028,28 @@ yank_symbols () symbolS *begin_symbolP; begin_symbolP = *(symbolS **) stack_pop (block_stack); - if (begin_symbolP == (symbolS *) 0) + if (begin_symbolP == NULL) as_warn (_("mismatched .eb")); else SA_SET_SYM_ENDNDX (begin_symbolP, symbol_number + 2); } } + /* If we are able to identify the type of a function, and we are out of a function (last_functionP == 0) then, the function symbol will be associated with an auxiliary entry. */ - if (last_functionP == (symbolS *) 0 && - SF_GET_FUNCTION (symbolP)) + if (last_functionP == NULL && SF_GET_FUNCTION (symbolP)) { last_functionP = symbolP; if (S_GET_NUMBER_AUXILIARY (symbolP) < 1) S_SET_NUMBER_AUXILIARY (symbolP, 1); } + if (S_GET_STORAGE_CLASS (symbolP) == C_FCN) { - if (strcmp (S_GET_NAME (symbolP), ".bf") == 0) + if (streq (S_GET_NAME (symbolP), ".bf")) { if (last_bfP != NULL) SA_SET_SYM_ENDNDX (last_bfP, symbol_number); @@ -3174,28 +3060,25 @@ yank_symbols () { /* I don't even know if this is needed for sdb. But the standard assembler generates it, so... */ - if (last_functionP == (symbolS *) 0) + if (last_functionP == NULL) as_fatal (_("C_EFCN symbol out of scope")); SA_SET_SYM_FSIZE (last_functionP, (long) (S_GET_VALUE (symbolP) - S_GET_VALUE (last_functionP))); SA_SET_SYM_ENDNDX (last_functionP, symbol_number); - last_functionP = (symbolS *) 0; + last_functionP = NULL; } } } else if (SF_GET_TAG (symbolP)) - { - /* First descriptor of a structure must point to - the first slot after the structure description. */ - last_tagP = symbolP; + /* First descriptor of a structure must point to + 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. */ - SA_SET_SYM_ENDNDX (last_tagP, symbol_number + 2); - } + /* +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 @@ -3230,19 +3113,16 @@ yank_symbols () endndx will still be 22 instead of 21. */ if (SF_GET_LOCAL (symbolP)) - { - /* Remove C_EFCN and LOCAL (L...) symbols. */ - /* Next pointer remains valid. */ - symbol_remove (symbolP, &symbol_rootP, &symbol_lastP); + /* Remove C_EFCN and LOCAL (L...) symbols. */ + /* Next pointer remains valid. */ + symbol_remove (symbolP, &symbol_rootP, &symbol_lastP); - } else if (symbolP->sy_value.X_op == O_symbol && (! S_IS_DEFINED (symbolP) || S_IS_COMMON (symbolP))) - { - /* Skip symbols which were equated to undefined or common - symbols. */ - symbol_remove (symbolP, &symbol_rootP, &symbol_lastP); - } + /* Skip symbols which were equated to undefined or common + symbols. */ + symbol_remove (symbolP, &symbol_rootP, &symbol_lastP); + else if (!S_IS_DEFINED (symbolP) && !S_IS_DEBUG (symbolP) && !SF_GET_STATICS (symbolP) @@ -3288,9 +3168,7 @@ yank_symbols () string_byte_count += strlen (S_GET_NAME (symbolP)) + 1; } else - { - symbolP->sy_name_offset = 0; - } + symbolP->sy_name_offset = 0; symbolP->sy_number = symbol_number; symbol_number += 1 + S_GET_NUMBER_AUXILIARY (symbolP); @@ -3301,9 +3179,7 @@ yank_symbols () } static unsigned int -glue_symbols (head, tail) - symbolS **head; - symbolS **tail; +glue_symbols (symbolS **head, symbolS **tail) { unsigned int symbol_number = 0; @@ -3322,10 +3198,8 @@ glue_symbols (head, tail) string_byte_count += strlen (S_GET_NAME (tmp)) + 1; } else - { - /* Fix "long" names. */ - tmp->sy_name_offset = 0; - } + /* Fix "long" names. */ + tmp->sy_name_offset = 0; tmp->sy_number = symbol_number; symbol_number += 1 + S_GET_NUMBER_AUXILIARY (tmp); @@ -3335,7 +3209,7 @@ glue_symbols (head, tail) } static unsigned int -tie_tags () +tie_tags (void) { unsigned int symbol_number = 0; symbolS *symbolP; @@ -3358,15 +3232,72 @@ tie_tags () } +/* Build a 'section static' symbol. */ + +static symbolS * +c_section_symbol (char *name, int idx) +{ + symbolS *symbolP; + + symbolP = symbol_find_base (name, DO_NOT_STRIP); + if (symbolP == NULL) + symbolP = symbol_new (name, idx, 0, &zero_address_frag); + else + { + /* Mmmm. I just love violating interfaces. Makes me feel...dirty. */ + S_SET_SEGMENT (symbolP, idx); + symbolP->sy_frag = &zero_address_frag; + } + + S_SET_STORAGE_CLASS (symbolP, C_STAT); + S_SET_NUMBER_AUXILIARY (symbolP, 1); + + SF_SET_STATICS (symbolP); + +#ifdef TE_DELTA + /* manfred@s-direktnet.de: section symbols *must* have the LOCAL bit cleared, + which is set by the new definition of LOCAL_LABEL in tc-m68k.h. */ + SF_CLEAR_LOCAL (symbolP); +#endif +#ifdef TE_PE + /* If the .linkonce pseudo-op was used for this section, we must + store the information in the auxiliary entry for the section + symbol. */ + if (segment_info[idx].linkonce != LINKONCE_UNSET) + { + int type; + + switch (segment_info[idx].linkonce) + { + default: + abort (); + case LINKONCE_DISCARD: + type = IMAGE_COMDAT_SELECT_ANY; + break; + case LINKONCE_ONE_ONLY: + type = IMAGE_COMDAT_SELECT_NODUPLICATES; + break; + case LINKONCE_SAME_SIZE: + type = IMAGE_COMDAT_SELECT_SAME_SIZE; + break; + case LINKONCE_SAME_CONTENTS: + type = IMAGE_COMDAT_SELECT_EXACT_MATCH; + break; + } + + SYM_AUXENT (symbolP)->x_scn.x_comdat = type; + } +#endif /* TE_PE */ + + return symbolP; +} + static void -crawl_symbols (h, abfd) - object_headers *h; - bfd *abfd ATTRIBUTE_UNUSED; +crawl_symbols (object_headers *h, bfd *abfd ATTRIBUTE_UNUSED) { unsigned int i; /* 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 @@ -3385,7 +3316,6 @@ crawl_symbols (h, abfd) c_dot_file_symbol ("fake", 0); /* 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 ((char *) segment_info[i].name, @@ -3410,9 +3340,8 @@ crawl_symbols (h, abfd) /* Find strings by crawling along symbol table chain. */ -void -w_strings (where) - char *where; +static void +w_strings (char *where) { symbolS *symbolP; struct filename_list *filename_list_scan = filename_list_head; @@ -3467,10 +3396,9 @@ w_strings (where) } static void -do_linenos_for (abfd, h, file_cursor) - bfd * abfd; - object_headers * h; - unsigned long *file_cursor; +do_linenos_for (bfd * abfd, + object_headers * h, + unsigned long *file_cursor) { unsigned int idx; unsigned long start = *file_cursor; @@ -3482,10 +3410,7 @@ do_linenos_for (abfd, h, file_cursor) if (s->scnhdr.s_nlnno != 0) { struct lineno_list *line_ptr; - - struct external_lineno *buffer = - (struct external_lineno *) xmalloc (s->scnhdr.s_nlnno * LINESZ); - + struct external_lineno *buffer = xmalloc (s->scnhdr.s_nlnno * LINESZ); struct external_lineno *dst = buffer; /* Run through the table we've built and turn it into its external @@ -3527,7 +3452,7 @@ do_linenos_for (abfd, h, file_cursor) list, as if the seg 0 was extra long. */ static void -remove_subsegs () +remove_subsegs (void) { unsigned int i; @@ -3563,1011 +3488,922 @@ int coff_flags; #endif #endif -extern void -write_object_file () +static void +w_symbols (bfd * abfd, char *where, symbolS * symbol_rootP) { - int i; - const char *name; - struct frchain *frchain_ptr; - - object_headers headers; - unsigned long file_cursor; - bfd *abfd; - unsigned int addr; - abfd = bfd_openw (out_file_name, TARGET_FORMAT); + symbolS *symbolP; + unsigned int i; - if (abfd == 0) + /* First fill in those values we have only just worked out. */ + for (i = SEG_E0; i < SEG_LAST; i++) { - as_perror (_("FATAL: Can't create %s"), out_file_name); - exit (EXIT_FAILURE); + symbolP = segment_info[i].dot; + if (symbolP) + { + SA_SET_SCN_SCNLEN (symbolP, segment_info[i].scnhdr.s_size); + SA_SET_SCN_NRELOC (symbolP, segment_info[i].scnhdr.s_nreloc); + SA_SET_SCN_NLINNO (symbolP, segment_info[i].scnhdr.s_nlnno); + } } - bfd_set_format (abfd, bfd_object); - bfd_set_arch_mach (abfd, BFD_ARCH, machine); - - string_byte_count = 4; - /* Run through all the sub-segments and align them up. Also - close any open frags. We tack a .fill onto the end of the - frag chain so that any .align's size can be worked by looking - at the next frag. */ - for (frchain_ptr = frchain_root; - frchain_ptr != (struct frchain *) NULL; - frchain_ptr = frchain_ptr->frch_next) + /* Emit all symbols left in the symbol chain. */ + for (symbolP = symbol_rootP; symbolP; symbolP = symbol_next (symbolP)) { - int alignment; + /* Used to save the offset of the name. It is used to point + to the string in memory but must be a file offset. */ + char *temp; - subseg_set (frchain_ptr->frch_seg, frchain_ptr->frch_subseg); + /* 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; - alignment = SUB_SEGMENT_ALIGN (now_seg, frchain_ptr); + tc_coff_symbol_emit_hook (symbolP); -#ifdef md_do_align - md_do_align (alignment, (char *) NULL, 0, 0, alignment_done); -#endif - if (subseg_text_p (now_seg)) - frag_align_code (alignment, 0); + temp = S_GET_NAME (symbolP); + if (SF_GET_STRING (symbolP)) + { + S_SET_OFFSET (symbolP, symbolP->sy_name_offset); + S_SET_ZEROES (symbolP, 0); + } else - frag_align (alignment, 0, 0); - -#ifdef md_do_align - alignment_done: -#endif - - frag_wane (frag_now); - frag_now->fr_fix = 0; - know (frag_now->fr_next == NULL); + { + memset (symbolP->sy_symbol.ost_entry.n_name, 0, SYMNMLEN); + strncpy (symbolP->sy_symbol.ost_entry.n_name, temp, SYMNMLEN); + } + where = symbol_to_chars (abfd, where, symbolP); + S_SET_NAME (symbolP, temp); } +} - remove_subsegs (); - - for (i = SEG_E0; i < SEG_UNKNOWN; i++) - relax_segment (segment_info[i].frchainP->frch_root, i); - - /* Relaxation has completed. Freeze all syms. */ - finalize_syms = 1; - - H_SET_NUMBER_OF_SECTIONS (&headers, 0); +static void +fixup_mdeps (fragS *frags, + object_headers *h ATTRIBUTE_UNUSED, + segT this_segment) +{ + subseg_change (this_segment, 0); - /* Find out how big the sections are, and set the addresses. */ - addr = 0; - for (i = SEG_E0; i < SEG_UNKNOWN; i++) + while (frags) { - long size; - - segment_info[i].scnhdr.s_paddr = addr; - segment_info[i].scnhdr.s_vaddr = addr; - - if (segment_info[i].scnhdr.s_name[0]) + switch (frags->fr_type) { - H_SET_NUMBER_OF_SECTIONS (&headers, - H_GET_NUMBER_OF_SECTIONS (&headers) + 1); - -#ifdef COFF_LONG_SECTION_NAMES - /* Support long section names as found in PE. This code - must coordinate with that in coff_header_append and - w_strings. */ - { - unsigned int len; - - len = strlen (segment_info[i].name); - if (len > SCNNMLEN) - string_byte_count += len + 1; - } -#endif /* COFF_LONG_SECTION_NAMES */ + case rs_align: + case rs_align_code: + case rs_align_test: + case rs_org: +#ifdef HANDLE_ALIGN + HANDLE_ALIGN (frags); +#endif + frags->fr_type = rs_fill; + frags->fr_offset = + ((frags->fr_next->fr_address - frags->fr_address - frags->fr_fix) + / frags->fr_var); + break; + case rs_machine_dependent: + md_convert_frag (h, this_segment, frags); + frag_wane (frags); + break; + default: + ; } + frags = frags->fr_next; + } +} - size = size_section (abfd, (unsigned int) i); - addr += size; - - /* I think the section alignment is only used on the i960; the - i960 needs it, and it should do no harm on other targets. */ -#ifdef ALIGNMENT_IN_S_FLAGS - segment_info[i].scnhdr.s_flags |= (section_alignment[i] & 0xF) << 8; -#else - segment_info[i].scnhdr.s_align = 1 << section_alignment[i]; +#ifndef TC_FORCE_RELOCATION +#define TC_FORCE_RELOCATION(fix) 0 #endif - if (i == SEG_E0) - H_SET_TEXT_SIZE (&headers, size); - else if (i == SEG_E1) - H_SET_DATA_SIZE (&headers, size); - else if (i == SEG_E2) - H_SET_BSS_SIZE (&headers, size); - } +static void +fixup_segment (segment_info_type * segP, segT this_segment_type) +{ + fixS * fixP; + symbolS *add_symbolP; + symbolS *sub_symbolP; + long add_number; + int size; + char *place; + long where; + char pcrel; + fragS *fragP; + segT add_symbol_segment = absolute_section; - /* Turn the gas native symbol table shape into a coff symbol table. */ - crawl_symbols (&headers, abfd); + for (fixP = segP->fix_root; fixP; fixP = fixP->fx_next) + { + fragP = fixP->fx_frag; + know (fragP); + where = fixP->fx_where; + place = fragP->fr_literal + where; + size = fixP->fx_size; + add_symbolP = fixP->fx_addsy; + sub_symbolP = fixP->fx_subsy; + add_number = fixP->fx_offset; + pcrel = fixP->fx_pcrel; - if (string_byte_count == 4) - string_byte_count = 0; + /* We want function-relative stabs to work on systems which + may use a relaxing linker; thus we must handle the sym1-sym2 + fixups function-relative stabs generates. - H_SET_STRING_SIZE (&headers, string_byte_count); + Of course, if you actually enable relaxing in the linker, the + line and block scoping information is going to be incorrect + in some cases. The only way to really fix this is to support + a reloc involving the difference of two symbols. */ + if (linkrelax + && (!sub_symbolP || pcrel)) + continue; -#ifdef tc_frob_file - tc_frob_file (); +#ifdef TC_I960 + if (fixP->fx_tcbit && SF_GET_CALLNAME (add_symbolP)) + { + /* Relocation should be done via the associated 'bal' entry + point symbol. */ + if (!SF_GET_BALNAME (tc_get_bal_of_call (add_symbolP))) + { + as_bad_where (fixP->fx_file, fixP->fx_line, + _("No 'bal' entry point for leafproc %s"), + S_GET_NAME (add_symbolP)); + continue; + } + fixP->fx_addsy = add_symbolP = tc_get_bal_of_call (add_symbolP); + } #endif - for (i = SEG_E0; i < SEG_UNKNOWN; i++) - { - fixup_mdeps (segment_info[i].frchainP->frch_root, &headers, i); - fixup_segment (&segment_info[i], i); - } - - /* Look for ".stab" segments and fill in their initial symbols - correctly. */ - for (i = SEG_E0; i < SEG_UNKNOWN; i++) - { - name = segment_info[i].name; + /* Make sure the symbols have been resolved; this may not have + happened if these are expression symbols. */ + if (add_symbolP != NULL && ! add_symbolP->sy_resolved) + resolve_symbol_value (add_symbolP); - if (name != NULL - && strncmp (".stab", name, 5) == 0 - && strncmp (".stabstr", name, 8) != 0) - adjust_stab_section (abfd, i); - } + if (add_symbolP != NULL) + { + /* If this fixup is against a symbol which has been equated + to another symbol, convert it to the other symbol. */ + if (add_symbolP->sy_value.X_op == O_symbol + && (! S_IS_DEFINED (add_symbolP) + || S_IS_COMMON (add_symbolP))) + { + while (add_symbolP->sy_value.X_op == O_symbol + && (! S_IS_DEFINED (add_symbolP) + || S_IS_COMMON (add_symbolP))) + { + symbolS *n; - file_cursor = H_GET_TEXT_FILE_OFFSET (&headers); + /* We must avoid looping, as that can occur with a + badly written program. */ + n = add_symbolP->sy_value.X_add_symbol; + if (n == add_symbolP) + break; + add_number += add_symbolP->sy_value.X_add_number; + add_symbolP = n; + } + fixP->fx_addsy = add_symbolP; + fixP->fx_offset = add_number; + } + } - bfd_seek (abfd, (file_ptr) file_cursor, 0); + if (sub_symbolP != NULL && ! sub_symbolP->sy_resolved) + resolve_symbol_value (sub_symbolP); - /* Plant the data. */ - fill_section (abfd, &headers, &file_cursor); + if (add_symbolP != NULL + && add_symbolP->sy_mri_common) + { + add_number += S_GET_VALUE (add_symbolP); + fixP->fx_offset = add_number; + add_symbolP = fixP->fx_addsy = add_symbolP->sy_value.X_add_symbol; + } - do_relocs_for (abfd, &headers, &file_cursor); + if (add_symbolP) + add_symbol_segment = S_GET_SEGMENT (add_symbolP); - do_linenos_for (abfd, &headers, &file_cursor); + if (sub_symbolP) + { + if (add_symbolP == NULL || add_symbol_segment == absolute_section) + { + if (add_symbolP != NULL) + { + add_number += S_GET_VALUE (add_symbolP); + add_symbolP = NULL; + fixP->fx_addsy = NULL; + } - H_SET_FILE_MAGIC_NUMBER (&headers, COFF_MAGIC); -#ifndef OBJ_COFF_OMIT_TIMESTAMP - H_SET_TIME_STAMP (&headers, (long)time((time_t *)0)); -#else - H_SET_TIME_STAMP (&headers, 0); -#endif -#ifdef TC_COFF_SET_MACHINE - TC_COFF_SET_MACHINE (&headers); + /* It's just -sym. */ + if (S_GET_SEGMENT (sub_symbolP) == absolute_section) + { + add_number -= S_GET_VALUE (sub_symbolP); + fixP->fx_subsy = 0; + fixP->fx_done = 1; + } + else + { +#ifndef TC_M68K + as_bad_where (fixP->fx_file, fixP->fx_line, + _("Negative of non-absolute symbol %s"), + S_GET_NAME (sub_symbolP)); #endif + add_number -= S_GET_VALUE (sub_symbolP); + } /* not absolute */ -#ifndef COFF_FLAGS -#define COFF_FLAGS 0 -#endif + /* If sub_symbol is in the same segment that add_symbol + 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)) + { + /* Difference of 2 symbols from same segment. Can't + make difference of 2 undefineds: 'value' means + something different for N_UNDF. */ +#ifdef TC_I960 + /* 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")); +#endif /* TC_I960 */ + add_number += S_GET_VALUE (add_symbolP) - + S_GET_VALUE (sub_symbolP); + add_symbolP = NULL; -#ifdef KEEP_RELOC_INFO - H_SET_FLAGS (&headers, ((H_GET_LINENO_SIZE(&headers) ? 0 : F_LNNO) | - COFF_FLAGS | coff_flags)); -#else - H_SET_FLAGS (&headers, ((H_GET_LINENO_SIZE(&headers) ? 0 : F_LNNO) | - (H_GET_RELOCATION_SIZE(&headers) ? 0 : F_RELFLG) | - COFF_FLAGS | coff_flags)); + if (!TC_FORCE_RELOCATION (fixP)) + { + fixP->fx_addsy = NULL; + fixP->fx_subsy = NULL; + fixP->fx_done = 1; +#ifdef TC_M68K /* FIXME: Is this right? */ + pcrel = 0; + fixP->fx_pcrel = 0; #endif + } + } + else + { + /* Different segments in subtraction. */ + know (!(S_IS_EXTERNAL (sub_symbolP) && (S_GET_SEGMENT (sub_symbolP) == absolute_section))); - { - unsigned int symtable_size = H_GET_SYMBOL_TABLE_SIZE (&headers); - char *buffer1 = xmalloc (symtable_size + string_byte_count + 1); + if ((S_GET_SEGMENT (sub_symbolP) == absolute_section)) + add_number -= S_GET_VALUE (sub_symbolP); - H_SET_SYMBOL_TABLE_POINTER (&headers, bfd_tell (abfd)); - w_symbols (abfd, buffer1, symbol_rootP); - if (string_byte_count > 0) - w_strings (buffer1 + symtable_size); - bfd_bwrite (buffer1, (bfd_size_type) symtable_size + string_byte_count, - abfd); - free (buffer1); - } +#ifdef DIFF_EXPR_OK + else if (S_GET_SEGMENT (sub_symbolP) == this_segment_type) + { + /* Make it pc-relative. */ + add_number += (md_pcrel_from (fixP) + - S_GET_VALUE (sub_symbolP)); + pcrel = 1; + fixP->fx_pcrel = 1; + sub_symbolP = 0; + fixP->fx_subsy = 0; + } +#endif + else + { + as_bad_where (fixP->fx_file, fixP->fx_line, + _("Can't emit reloc {- %s-seg symbol \"%s\"} @ file address %ld."), + segment_name (S_GET_SEGMENT (sub_symbolP)), + S_GET_NAME (sub_symbolP), + (long) (fragP->fr_address + where)); + } + } + } - coff_header_append (abfd, &headers); - { - extern bfd *stdoutput; - stdoutput = abfd; - } -} + 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. */ +#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. */ + reloc_callj (fixP); +#endif -/* Add a new segment. This is called from subseg_new via the - obj_new_segment macro. */ + add_number += S_GET_VALUE (add_symbolP); + add_number -= md_pcrel_from (fixP); -segT -obj_coff_add_segment (name) - const char *name; -{ - unsigned int i; + /* We used to do + add_number -= segP->scnhdr.s_vaddr; + if defined (TC_I386) || defined (TE_LYNX). I now + think that was an error propagated from the case when + we are going to emit the relocation. If we are not + going to emit the relocation, then we just want to + set add_number to the difference between the symbols. + This is a case that would only arise when there is a + PC relative reference from a section other than .text + to a symbol defined in the same section, and the + reference is not relaxed. Since jump instructions on + the i386 are relaxed, this could only arise with a + call instruction. */ -#ifndef COFF_LONG_SECTION_NAMES - char buf[SCNNMLEN + 1]; + /* Lie. Don't want further pcrel processing. */ + pcrel = 0; + if (!TC_FORCE_RELOCATION (fixP)) + { + fixP->fx_addsy = NULL; + fixP->fx_done = 1; + } + } + else + { + switch (add_symbol_segment) + { + case absolute_section: +#ifdef TC_I960 + /* See comment about reloc_callj() above. */ + reloc_callj (fixP); +#endif /* TC_I960 */ + add_number += S_GET_VALUE (add_symbolP); + add_symbolP = NULL; - strncpy (buf, name, SCNNMLEN); - buf[SCNNMLEN] = '\0'; - name = buf; + if (!TC_FORCE_RELOCATION (fixP)) + { + fixP->fx_addsy = NULL; + fixP->fx_done = 1; + } + break; + default: + +#if defined(TC_A29K) || (defined(TE_PE) && defined(TC_I386)) || defined(TC_M88K) || defined(TC_OR32) + /* This really should be handled in the linker, but + backward compatibility forbids. */ + add_number += S_GET_VALUE (add_symbolP); +#else + add_number += S_GET_VALUE (add_symbolP) + + segment_info[S_GET_SEGMENT (add_symbolP)].scnhdr.s_paddr; #endif + break; - for (i = SEG_E0; i < SEG_LAST && segment_info[i].scnhdr.s_name[0]; i++) - if (strcmp (name, segment_info[i].name) == 0) - return (segT) i; + case SEG_UNKNOWN: +#ifdef TC_I960 + 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. */ + 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; + } +#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 + value of a common symbol is stored in the .text + segment (I've checked this on SVR3.2 and SCO + 3.2.2) Ian Taylor . */ + /* This is also true for 68k COFF on sysv machines + (Checked on Motorola sysv68 R3V6 and R3V7.1, and also on + UNIX System V/M68000, Release 1.0 from ATT/Bell Labs) + Philippe De Muyter . */ + if (S_IS_COMMON (add_symbolP)) + add_number += S_GET_VALUE (add_symbolP); +#endif + break; - if (i == SEG_LAST) - { - as_bad (_("Too many new sections; can't add \"%s\""), name); - return now_seg; - } + } + } + } - /* Add a new section. */ - strncpy (segment_info[i].scnhdr.s_name, name, - sizeof (segment_info[i].scnhdr.s_name)); - segment_info[i].scnhdr.s_flags = STYP_REG; - segment_info[i].name = xstrdup (name); + if (pcrel) + { +#if !defined(TC_M88K) && !(defined(TE_PE) && defined(TC_I386)) && !defined(TC_A29K) && !defined(TC_OR32) + /* This adjustment is not correct on the m88k, for which the + linker does all the computation. */ + add_number -= md_pcrel_from (fixP); +#endif + if (add_symbolP == 0) + 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. - return (segT) i; -} + I changed the i960 to work this way as well. This is + compatible with the current GNU linker behaviour. I do + not know what other i960 COFF assemblers do. This is not + a common case: normally, only assembler code will contain + a PC relative reloc, and only branches which do not + originate in the .text section will have a non-zero + address. -/* 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. */ + I changed the m68k to work this way as well. This will + break existing PC relative relocs from sections which do + not start at address 0, but it will make ld -r work. + Ian Taylor, 4 Oct 96. */ -void -obj_coff_section (ignore) - int ignore ATTRIBUTE_UNUSED; -{ - /* Strip out the section name. */ - char *section_name, *name; - char c; - unsigned int exp; - long flags; + add_number -= segP->scnhdr.s_vaddr; +#endif + } - if (flag_mri) - { - char type; + md_apply_fix3 (fixP, (valueT *) & add_number, this_segment_type); - s_mri_sect (&type); - flags = 0; - if (type == 'C') - flags = STYP_TEXT; - else if (type == 'D') - flags = STYP_DATA; - segment_info[now_seg].scnhdr.s_flags |= flags; - - return; - } - - section_name = input_line_pointer; - c = get_symbol_end (); - - name = xmalloc (input_line_pointer - section_name + 1); - strcpy (name, section_name); - - *input_line_pointer = c; - - exp = 0; - flags = 0; - - SKIP_WHITESPACE (); - if (*input_line_pointer == ',') - { - ++input_line_pointer; - SKIP_WHITESPACE (); - - if (*input_line_pointer != '"') - exp = get_absolute_expression (); - else + if (!fixP->fx_bit_fixP && ! fixP->fx_no_overflow) { - ++input_line_pointer; - while (*input_line_pointer != '"' - && ! is_end_of_line[(unsigned char) *input_line_pointer]) +#ifndef TC_M88K + /* The m88k uses the offset field of the reloc to get around + this problem. */ + if ((size == 1 + && ((add_number & ~0xFF) + || (fixP->fx_signed && (add_number & 0x80))) + && ((add_number & ~0xFF) != (-1 & ~0xFF) + || (add_number & 0x80) == 0)) + || (size == 2 + && ((add_number & ~0xFFFF) + || (fixP->fx_signed && (add_number & 0x8000))) + && ((add_number & ~0xFFFF) != (-1 & ~0xFFFF) + || (add_number & 0x8000) == 0))) { - switch (*input_line_pointer) - { - case 'b': flags |= STYP_BSS; break; - case 'i': flags |= STYP_INFO; break; - case 'l': flags |= STYP_LIB; break; - case 'n': flags |= STYP_NOLOAD; break; - case 'o': flags |= STYP_OVER; break; - case 'd': - case 'w': flags |= STYP_DATA; break; - case 'x': flags |= STYP_TEXT; break; - case 'r': flags |= STYP_LIT; break; - default: - as_warn(_("unknown section attribute '%c'"), - *input_line_pointer); - break; - } - ++input_line_pointer; + as_bad_where (fixP->fx_file, fixP->fx_line, + _("Value of %ld too large for field of %d bytes at 0x%lx"), + (long) add_number, size, + (unsigned long) (fragP->fr_address + where)); } - if (*input_line_pointer == '"') - ++input_line_pointer; +#endif +#ifdef WARN_SIGNED_OVERFLOW_WORD + /* Warn if a .word value is too large when treated as a + signed number. We already know it is not too negative. + This is to catch over-large switches generated by gcc on + the 68k. */ + if (!flag_signed_overflow_ok + && size == 2 + && add_number > 0x7fff) + as_bad_where (fixP->fx_file, fixP->fx_line, + _("Signed .word overflow; switch may be too large; %ld at 0x%lx"), + (long) add_number, + (unsigned long) (fragP->fr_address + where)); +#endif } } - - subseg_new (name, (subsegT) exp); - - segment_info[now_seg].scnhdr.s_flags |= flags; - - demand_empty_rest_of_line (); -} - -static void -obj_coff_text (ignore) - int ignore ATTRIBUTE_UNUSED; -{ - subseg_new (".text", get_absolute_expression ()); } -static void -obj_coff_data (ignore) - int ignore ATTRIBUTE_UNUSED; -{ - if (flag_readonly_data_in_text) - subseg_new (".text", get_absolute_expression () + 1000); - else - subseg_new (".data", get_absolute_expression ()); -} +/* Fill in the counts in the first entry in a .stab section. */ static void -obj_coff_ident (ignore) - int ignore ATTRIBUTE_UNUSED; -{ - 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. */ -} - -void -c_symbol_merge (debug, normal) - symbolS *debug; - symbolS *normal; +adjust_stab_section (bfd *abfd, segT seg) { - S_SET_DATA_TYPE (normal, S_GET_DATA_TYPE (debug)); - 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)); - - 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 the debug flags. */ - SF_SET_DEBUG_FIELD (normal, SF_GET_DEBUG_FIELD (debug)); -} + segT stabstrseg = SEG_UNKNOWN; + const char *secname, *name2; + char *name; + char *p = NULL; + int i, strsz = 0, nsyms; + fragS *frag = segment_info[seg].frchainP->frch_root; -static int -c_line_new (symbol, paddr, line_number, frag) - symbolS * symbol; - long paddr; - int line_number; - fragS * frag; -{ - struct lineno_list *new_line = - (struct lineno_list *) xmalloc (sizeof (struct lineno_list)); + /* Look for the associated string table section. */ - segment_info_type *s = segment_info + now_seg; - new_line->line.l_lnno = line_number; + secname = segment_info[seg].name; + name = alloca (strlen (secname) + 4); + strcpy (name, secname); + strcat (name, "str"); - if (line_number == 0) - { - last_line_symbol = symbol; - new_line->line.l_addr.l_symndx = (long) symbol; - } - else + for (i = SEG_E0; i < SEG_UNKNOWN; i++) { - new_line->line.l_addr.l_paddr = paddr; + name2 = segment_info[i].name; + if (name2 != NULL && strneq (name2, name, 8)) + { + stabstrseg = i; + break; + } } - new_line->frag = (char *) frag; - new_line->next = (struct lineno_list *) NULL; + /* If we found the section, get its size. */ + if (stabstrseg != SEG_UNKNOWN) + strsz = size_section (abfd, stabstrseg); - if (s->lineno_list_head == (struct lineno_list *) NULL) - s->lineno_list_head = new_line; - else - s->lineno_list_tail->next = new_line; + nsyms = size_section (abfd, seg) / 12 - 1; - s->lineno_list_tail = new_line; - return LINESZ * s->scnhdr.s_nlnno++; + /* Look for the first frag of sufficient size for the initial stab + symbol, and collect a pointer to it. */ + while (frag && frag->fr_fix < 12) + frag = frag->fr_next; + assert (frag != 0); + p = frag->fr_literal; + assert (p != 0); + + /* Write in the number of stab symbols and the size of the string + table. */ + bfd_h_put_16 (abfd, (bfd_vma) nsyms, (bfd_byte *) p + 6); + bfd_h_put_32 (abfd, (bfd_vma) strsz, (bfd_byte *) p + 8); } void -c_dot_file_symbol (const char *filename, int appfile ATTRIBUTE_UNUSED) +write_object_file (void) { - symbolS *symbolP; + int i; + const char *name; + struct frchain *frchain_ptr; + object_headers headers; + unsigned long file_cursor; + bfd *abfd; + unsigned int addr; + abfd = bfd_openw (out_file_name, TARGET_FORMAT); - symbolP = symbol_new (".file", - SEG_DEBUG, - 0, - &zero_address_frag); + if (abfd == 0) + { + as_perror (_("FATAL: Can't create %s"), out_file_name); + exit (EXIT_FAILURE); + } + bfd_set_format (abfd, bfd_object); + bfd_set_arch_mach (abfd, BFD_ARCH, machine); - S_SET_STORAGE_CLASS (symbolP, C_FILE); - S_SET_NUMBER_AUXILIARY (symbolP, 1); + string_byte_count = 4; - if (strlen (filename) > FILNMLEN) + /* Run through all the sub-segments and align them up. Also + close any open frags. We tack a .fill onto the end of the + frag chain so that any .align's size can be worked by looking + at the next frag. */ + for (frchain_ptr = frchain_root; + frchain_ptr != (struct frchain *) NULL; + frchain_ptr = frchain_ptr->frch_next) { - /* 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. */ - struct filename_list *f = ((struct filename_list *) - xmalloc (sizeof (struct filename_list))); + int alignment; - f->filename = filename; - f->next = 0; + subseg_set (frchain_ptr->frch_seg, frchain_ptr->frch_subseg); - SA_SET_FILE_FNAME_ZEROS (symbolP, 0); - SA_SET_FILE_FNAME_OFFSET (symbolP, 1); + alignment = SUB_SEGMENT_ALIGN (now_seg, frchain_ptr); - if (filename_list_tail) - filename_list_tail->next = f; - else - filename_list_head = f; - filename_list_tail = f; - } - else - { - SA_SET_FILE_FNAME (symbolP, filename); - } -#ifndef NO_LISTING - { - extern int listing; - if (listing) - listing_source_file (filename); - } +#ifdef md_do_align + md_do_align (alignment, NULL, 0, 0, alignment_done); #endif - SF_SET_DEBUG (symbolP); - S_SET_VALUE (symbolP, (valueT) previous_file_symbol); + if (subseg_text_p (now_seg)) + frag_align_code (alignment, 0); + else + frag_align (alignment, 0, 0); - previous_file_symbol = symbolP; +#ifdef md_do_align + alignment_done: +#endif - /* 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); + frag_wane (frag_now); + frag_now->fr_fix = 0; + know (frag_now->fr_next == NULL); } -} -/* Build a 'section static' symbol. */ + remove_subsegs (); -symbolS * -c_section_symbol (name, idx) - char *name; - int idx; -{ - symbolS *symbolP; + for (i = SEG_E0; i < SEG_UNKNOWN; i++) + relax_segment (segment_info[i].frchainP->frch_root, i); - symbolP = symbol_find_base (name, DO_NOT_STRIP); - if (symbolP == NULL) - symbolP = symbol_new (name, idx, 0, &zero_address_frag); - else - { - /* Mmmm. I just love violating interfaces. Makes me feel...dirty. */ - S_SET_SEGMENT (symbolP, idx); - symbolP->sy_frag = &zero_address_frag; - } - - S_SET_STORAGE_CLASS (symbolP, C_STAT); - S_SET_NUMBER_AUXILIARY (symbolP, 1); + /* Relaxation has completed. Freeze all syms. */ + finalize_syms = 1; - SF_SET_STATICS (symbolP); + H_SET_NUMBER_OF_SECTIONS (&headers, 0); -#ifdef TE_DELTA - /* manfred@s-direktnet.de: section symbols *must* have the LOCAL bit cleared, - which is set by the new definition of LOCAL_LABEL in tc-m68k.h. */ - SF_CLEAR_LOCAL (symbolP); -#endif -#ifdef TE_PE - /* If the .linkonce pseudo-op was used for this section, we must - store the information in the auxiliary entry for the section - symbol. */ - if (segment_info[idx].linkonce != LINKONCE_UNSET) + /* Find out how big the sections are, and set the addresses. */ + addr = 0; + for (i = SEG_E0; i < SEG_UNKNOWN; i++) { - int type; + long size; - switch (segment_info[idx].linkonce) + segment_info[i].scnhdr.s_paddr = addr; + segment_info[i].scnhdr.s_vaddr = addr; + + if (segment_info[i].scnhdr.s_name[0]) { - default: - abort (); - case LINKONCE_DISCARD: - type = IMAGE_COMDAT_SELECT_ANY; - break; - case LINKONCE_ONE_ONLY: - type = IMAGE_COMDAT_SELECT_NODUPLICATES; - break; - case LINKONCE_SAME_SIZE: - type = IMAGE_COMDAT_SELECT_SAME_SIZE; - break; - case LINKONCE_SAME_CONTENTS: - type = IMAGE_COMDAT_SELECT_EXACT_MATCH; - break; + H_SET_NUMBER_OF_SECTIONS (&headers, + H_GET_NUMBER_OF_SECTIONS (&headers) + 1); + +#ifdef COFF_LONG_SECTION_NAMES + /* Support long section names as found in PE. This code + must coordinate with that in coff_header_append and + w_strings. */ + { + unsigned int len; + + len = strlen (segment_info[i].name); + if (len > SCNNMLEN) + string_byte_count += len + 1; + } +#endif /* COFF_LONG_SECTION_NAMES */ } - SYM_AUXENT (symbolP)->x_scn.x_comdat = type; + size = size_section (abfd, (unsigned int) i); + addr += size; + + /* I think the section alignment is only used on the i960; the + i960 needs it, and it should do no harm on other targets. */ +#ifdef ALIGNMENT_IN_S_FLAGS + segment_info[i].scnhdr.s_flags |= (section_alignment[i] & 0xF) << 8; +#else + segment_info[i].scnhdr.s_align = 1 << section_alignment[i]; +#endif + + if (i == SEG_E0) + H_SET_TEXT_SIZE (&headers, size); + else if (i == SEG_E1) + H_SET_DATA_SIZE (&headers, size); + else if (i == SEG_E2) + H_SET_BSS_SIZE (&headers, size); } -#endif /* TE_PE */ - return symbolP; -} + /* Turn the gas native symbol table shape into a coff symbol table. */ + crawl_symbols (&headers, abfd); -static void -w_symbols (abfd, where, symbol_rootP) - bfd * abfd; - char *where; - symbolS * symbol_rootP; -{ - symbolS *symbolP; - unsigned int i; + if (string_byte_count == 4) + string_byte_count = 0; - /* First fill in those values we have only just worked out. */ - for (i = SEG_E0; i < SEG_LAST; i++) + H_SET_STRING_SIZE (&headers, string_byte_count); + +#ifdef tc_frob_file + tc_frob_file (); +#endif + + for (i = SEG_E0; i < SEG_UNKNOWN; i++) { - symbolP = segment_info[i].dot; - if (symbolP) - { - SA_SET_SCN_SCNLEN (symbolP, segment_info[i].scnhdr.s_size); - SA_SET_SCN_NRELOC (symbolP, segment_info[i].scnhdr.s_nreloc); - SA_SET_SCN_NLINNO (symbolP, segment_info[i].scnhdr.s_nlnno); - } + fixup_mdeps (segment_info[i].frchainP->frch_root, &headers, i); + fixup_segment (&segment_info[i], i); } - /* Emit all symbols left in the symbol chain. */ - for (symbolP = symbol_rootP; symbolP; symbolP = symbol_next (symbolP)) + /* Look for ".stab" segments and fill in their initial symbols + correctly. */ + for (i = SEG_E0; i < SEG_UNKNOWN; i++) { - /* Used to save the offset of the name. It is used to point - to the string in memory but must be a file offset. */ - char *temp; + name = segment_info[i].name; - /* 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; + if (name != NULL + && strneq (".stab", name, 5) + && ! strneq (".stabstr", name, 8)) + adjust_stab_section (abfd, i); + } - tc_coff_symbol_emit_hook (symbolP); + file_cursor = H_GET_TEXT_FILE_OFFSET (&headers); - temp = S_GET_NAME (symbolP); - if (SF_GET_STRING (symbolP)) - { - S_SET_OFFSET (symbolP, symbolP->sy_name_offset); - S_SET_ZEROES (symbolP, 0); - } - else - { - memset (symbolP->sy_symbol.ost_entry.n_name, 0, SYMNMLEN); - strncpy (symbolP->sy_symbol.ost_entry.n_name, temp, SYMNMLEN); - } - where = symbol_to_chars (abfd, where, symbolP); - S_SET_NAME (symbolP, temp); - } -} + bfd_seek (abfd, (file_ptr) file_cursor, 0); -static void -obj_coff_lcomm (ignore) - int ignore ATTRIBUTE_UNUSED; -{ - s_lcomm (0); - return; -} + /* Plant the data. */ + fill_section (abfd, &headers, &file_cursor); -static void -fixup_mdeps (frags, h, this_segment) - fragS *frags; - object_headers *h ATTRIBUTE_UNUSED; - segT this_segment; -{ - subseg_change (this_segment, 0); + do_relocs_for (abfd, &headers, &file_cursor); - while (frags) - { - switch (frags->fr_type) - { - case rs_align: - case rs_align_code: - case rs_align_test: - case rs_org: -#ifdef HANDLE_ALIGN - HANDLE_ALIGN (frags); + do_linenos_for (abfd, &headers, &file_cursor); + + H_SET_FILE_MAGIC_NUMBER (&headers, COFF_MAGIC); +#ifndef OBJ_COFF_OMIT_TIMESTAMP + H_SET_TIME_STAMP (&headers, (long) time (NULL)); +#else + H_SET_TIME_STAMP (&headers, 0); +#endif +#ifdef TC_COFF_SET_MACHINE + TC_COFF_SET_MACHINE (&headers); #endif - frags->fr_type = rs_fill; - frags->fr_offset = - ((frags->fr_next->fr_address - frags->fr_address - frags->fr_fix) - / frags->fr_var); - break; - case rs_machine_dependent: - md_convert_frag (h, this_segment, frags); - frag_wane (frags); - break; - default: - ; - } - frags = frags->fr_next; - } -} -#if 1 +#ifndef COFF_FLAGS +#define COFF_FLAGS 0 +#endif -#ifndef TC_FORCE_RELOCATION -#define TC_FORCE_RELOCATION(fix) 0 +#ifdef KEEP_RELOC_INFO + H_SET_FLAGS (&headers, ((H_GET_LINENO_SIZE (&headers) ? 0 : F_LNNO) | + COFF_FLAGS | coff_flags)); +#else + H_SET_FLAGS (&headers, ((H_GET_LINENO_SIZE (&headers) ? 0 : F_LNNO) | + (H_GET_RELOCATION_SIZE (&headers) ? 0 : F_RELFLG) | + COFF_FLAGS | coff_flags)); #endif -static void -fixup_segment (segP, this_segment_type) - segment_info_type * segP; - segT this_segment_type; -{ - fixS * fixP; - symbolS *add_symbolP; - symbolS *sub_symbolP; - long add_number; - int size; - char *place; - long where; - char pcrel; - fragS *fragP; - segT add_symbol_segment = absolute_section; + { + unsigned int symtable_size = H_GET_SYMBOL_TABLE_SIZE (&headers); + char *buffer1 = xmalloc (symtable_size + string_byte_count + 1); - for (fixP = segP->fix_root; fixP; fixP = fixP->fx_next) - { - fragP = fixP->fx_frag; - know (fragP); - where = fixP->fx_where; - place = fragP->fr_literal + where; - size = fixP->fx_size; - add_symbolP = fixP->fx_addsy; - sub_symbolP = fixP->fx_subsy; - add_number = fixP->fx_offset; - pcrel = fixP->fx_pcrel; + H_SET_SYMBOL_TABLE_POINTER (&headers, bfd_tell (abfd)); + w_symbols (abfd, buffer1, symbol_rootP); + if (string_byte_count > 0) + w_strings (buffer1 + symtable_size); + bfd_bwrite (buffer1, (bfd_size_type) symtable_size + string_byte_count, + abfd); + free (buffer1); + } - /* We want function-relative stabs to work on systems which - may use a relaxing linker; thus we must handle the sym1-sym2 - fixups function-relative stabs generates. + coff_header_append (abfd, &headers); - Of course, if you actually enable relaxing in the linker, the - line and block scoping information is going to be incorrect - in some cases. The only way to really fix this is to support - a reloc involving the difference of two symbols. */ - if (linkrelax - && (!sub_symbolP || pcrel)) - continue; + { + extern bfd *stdoutput; + stdoutput = abfd; + } +} -#ifdef TC_I960 - if (fixP->fx_tcbit && SF_GET_CALLNAME (add_symbolP)) - { - /* Relocation should be done via the associated 'bal' entry - point symbol. */ +/* Add a new segment. This is called from subseg_new via the + obj_new_segment macro. */ - if (!SF_GET_BALNAME (tc_get_bal_of_call (add_symbolP))) - { - as_bad_where (fixP->fx_file, fixP->fx_line, - _("No 'bal' entry point for leafproc %s"), - S_GET_NAME (add_symbolP)); - continue; - } - fixP->fx_addsy = add_symbolP = tc_get_bal_of_call (add_symbolP); - } -#endif - - /* Make sure the symbols have been resolved; this may not have - happened if these are expression symbols. */ - if (add_symbolP != NULL && ! add_symbolP->sy_resolved) - resolve_symbol_value (add_symbolP); - - if (add_symbolP != NULL) - { - /* If this fixup is against a symbol which has been equated - to another symbol, convert it to the other symbol. */ - if (add_symbolP->sy_value.X_op == O_symbol - && (! S_IS_DEFINED (add_symbolP) - || S_IS_COMMON (add_symbolP))) - { - while (add_symbolP->sy_value.X_op == O_symbol - && (! S_IS_DEFINED (add_symbolP) - || S_IS_COMMON (add_symbolP))) - { - symbolS *n; - - /* We must avoid looping, as that can occur with a - badly written program. */ - n = add_symbolP->sy_value.X_add_symbol; - if (n == add_symbolP) - break; - add_number += add_symbolP->sy_value.X_add_number; - add_symbolP = n; - } - fixP->fx_addsy = add_symbolP; - fixP->fx_offset = add_number; - } - } +segT +obj_coff_add_segment (const char *name) +{ + unsigned int i; - if (sub_symbolP != NULL && ! sub_symbolP->sy_resolved) - resolve_symbol_value (sub_symbolP); +#ifndef COFF_LONG_SECTION_NAMES + char buf[SCNNMLEN + 1]; - if (add_symbolP != NULL - && add_symbolP->sy_mri_common) - { - add_number += S_GET_VALUE (add_symbolP); - fixP->fx_offset = add_number; - add_symbolP = fixP->fx_addsy = add_symbolP->sy_value.X_add_symbol; - } + strncpy (buf, name, SCNNMLEN); + buf[SCNNMLEN] = '\0'; + name = buf; +#endif - if (add_symbolP) - add_symbol_segment = S_GET_SEGMENT (add_symbolP); + for (i = SEG_E0; i < SEG_LAST && segment_info[i].scnhdr.s_name[0]; i++) + if (streq (name, segment_info[i].name)) + return (segT) i; - if (sub_symbolP) - { - if (add_symbolP == NULL || add_symbol_segment == absolute_section) - { - if (add_symbolP != NULL) - { - add_number += S_GET_VALUE (add_symbolP); - add_symbolP = NULL; - fixP->fx_addsy = NULL; - } + if (i == SEG_LAST) + { + as_bad (_("Too many new sections; can't add \"%s\""), name); + return now_seg; + } - /* It's just -sym. */ - if (S_GET_SEGMENT (sub_symbolP) == absolute_section) - { - add_number -= S_GET_VALUE (sub_symbolP); - fixP->fx_subsy = 0; - fixP->fx_done = 1; - } - else - { -#ifndef TC_M68K - as_bad_where (fixP->fx_file, fixP->fx_line, - _("Negative of non-absolute symbol %s"), - S_GET_NAME (sub_symbolP)); -#endif - add_number -= S_GET_VALUE (sub_symbolP); - } /* not absolute */ + /* Add a new section. */ + strncpy (segment_info[i].scnhdr.s_name, name, + sizeof (segment_info[i].scnhdr.s_name)); + segment_info[i].scnhdr.s_flags = STYP_REG; + segment_info[i].name = xstrdup (name); - /* if sub_symbol is in the same segment that add_symbol - 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)) - { - /* Difference of 2 symbols from same segment. Can't - make difference of 2 undefineds: 'value' means - something different for N_UNDF. */ -#ifdef TC_I960 - /* 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")); -#endif /* TC_I960 */ - add_number += S_GET_VALUE (add_symbolP) - - S_GET_VALUE (sub_symbolP); - add_symbolP = NULL; + return (segT) i; +} - if (!TC_FORCE_RELOCATION (fixP)) - { - fixP->fx_addsy = NULL; - fixP->fx_subsy = NULL; - fixP->fx_done = 1; -#ifdef TC_M68K /* is this right? */ - pcrel = 0; - fixP->fx_pcrel = 0; -#endif - } - } - else - { - /* Different segments in subtraction. */ - know (!(S_IS_EXTERNAL (sub_symbolP) && (S_GET_SEGMENT (sub_symbolP) == absolute_section))); +/* 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. */ - if ((S_GET_SEGMENT (sub_symbolP) == absolute_section)) - add_number -= S_GET_VALUE (sub_symbolP); +void +obj_coff_section (int ignore ATTRIBUTE_UNUSED) +{ + /* Strip out the section name. */ + char *section_name, *name; + char c; + unsigned int exp; + long flags; -#ifdef DIFF_EXPR_OK - else if (S_GET_SEGMENT (sub_symbolP) == this_segment_type) - { - /* Make it pc-relative. */ - add_number += (md_pcrel_from (fixP) - - S_GET_VALUE (sub_symbolP)); - pcrel = 1; - fixP->fx_pcrel = 1; - sub_symbolP = 0; - fixP->fx_subsy = 0; - } -#endif - else - { - as_bad_where (fixP->fx_file, fixP->fx_line, - _("Can't emit reloc {- %s-seg symbol \"%s\"} @ file address %ld."), - segment_name (S_GET_SEGMENT (sub_symbolP)), - S_GET_NAME (sub_symbolP), - (long) (fragP->fr_address + where)); - } - } - } + if (flag_mri) + { + char type; - 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. */ -#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. */ - reloc_callj (fixP); -#endif /* TC_I960 */ + s_mri_sect (&type); + flags = 0; + if (type == 'C') + flags = STYP_TEXT; + else if (type == 'D') + flags = STYP_DATA; + segment_info[now_seg].scnhdr.s_flags |= flags; - add_number += S_GET_VALUE (add_symbolP); - add_number -= md_pcrel_from (fixP); + return; + } - /* We used to do - add_number -= segP->scnhdr.s_vaddr; - if defined (TC_I386) || defined (TE_LYNX). I now - think that was an error propagated from the case when - we are going to emit the relocation. If we are not - going to emit the relocation, then we just want to - set add_number to the difference between the symbols. - This is a case that would only arise when there is a - PC relative reference from a section other than .text - to a symbol defined in the same section, and the - reference is not relaxed. Since jump instructions on - the i386 are relaxed, this could only arise with a - call instruction. */ + section_name = input_line_pointer; + c = get_symbol_end (); - pcrel = 0; /* Lie. Don't want further pcrel processing. */ - if (!TC_FORCE_RELOCATION (fixP)) - { - fixP->fx_addsy = NULL; - fixP->fx_done = 1; - } - } - else - { - switch (add_symbol_segment) - { - case absolute_section: -#ifdef TC_I960 - /* See comment about reloc_callj() above. */ - reloc_callj (fixP); -#endif /* TC_I960 */ - add_number += S_GET_VALUE (add_symbolP); - add_symbolP = NULL; + name = xmalloc (input_line_pointer - section_name + 1); + strcpy (name, section_name); - if (!TC_FORCE_RELOCATION (fixP)) - { - fixP->fx_addsy = NULL; - fixP->fx_done = 1; - } - break; - default: + *input_line_pointer = c; -#if defined(TC_A29K) || (defined(TE_PE) && defined(TC_I386)) || defined(TC_M88K) || defined(TC_OR32) - /* This really should be handled in the linker, but - backward compatibility forbids. */ - add_number += S_GET_VALUE (add_symbolP); -#else - add_number += S_GET_VALUE (add_symbolP) + - segment_info[S_GET_SEGMENT (add_symbolP)].scnhdr.s_paddr; -#endif - break; + exp = 0; + flags = 0; - case SEG_UNKNOWN: -#ifdef TC_I960 - 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. */ - 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; - } -#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 - value of a common symbol is stored in the .text - segment (I've checked this on SVR3.2 and SCO - 3.2.2) Ian Taylor . */ - /* This is also true for 68k COFF on sysv machines - (Checked on Motorola sysv68 R3V6 and R3V7.1, and also on - UNIX System V/M68000, Release 1.0 from ATT/Bell Labs) - Philippe De Muyter . */ - if (S_IS_COMMON (add_symbolP)) - add_number += S_GET_VALUE (add_symbolP); -#endif - break; + SKIP_WHITESPACE (); + if (*input_line_pointer == ',') + { + ++input_line_pointer; + SKIP_WHITESPACE (); + if (*input_line_pointer != '"') + exp = get_absolute_expression (); + else + { + ++input_line_pointer; + while (*input_line_pointer != '"' + && ! is_end_of_line[(unsigned char) *input_line_pointer]) + { + switch (*input_line_pointer) + { + case 'b': flags |= STYP_BSS; break; + case 'i': flags |= STYP_INFO; break; + case 'l': flags |= STYP_LIB; break; + case 'n': flags |= STYP_NOLOAD; break; + case 'o': flags |= STYP_OVER; break; + case 'd': + case 'w': flags |= STYP_DATA; break; + case 'x': flags |= STYP_TEXT; break; + case 'r': flags |= STYP_LIT; break; + default: + as_warn (_("unknown section attribute '%c'"), + *input_line_pointer); + break; } + ++input_line_pointer; } + if (*input_line_pointer == '"') + ++input_line_pointer; } + } - if (pcrel) - { -#if !defined(TC_M88K) && !(defined(TE_PE) && defined(TC_I386)) && !defined(TC_A29K) && !defined(TC_OR32) - /* This adjustment is not correct on the m88k, for which the - linker does all the computation. */ - add_number -= md_pcrel_from (fixP); -#endif - if (add_symbolP == 0) - 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. + subseg_new (name, (subsegT) exp); - I changed the i960 to work this way as well. This is - compatible with the current GNU linker behaviour. I do - not know what other i960 COFF assemblers do. This is not - a common case: normally, only assembler code will contain - a PC relative reloc, and only branches which do not - originate in the .text section will have a non-zero - address. + segment_info[now_seg].scnhdr.s_flags |= flags; - I changed the m68k to work this way as well. This will - break existing PC relative relocs from sections which do - not start at address 0, but it will make ld -r work. - Ian Taylor, 4 Oct 96. */ + demand_empty_rest_of_line (); +} - add_number -= segP->scnhdr.s_vaddr; -#endif - } +static void +obj_coff_text (int ignore ATTRIBUTE_UNUSED) +{ + subseg_new (".text", get_absolute_expression ()); +} - md_apply_fix3 (fixP, (valueT *) & add_number, this_segment_type); +static void +obj_coff_data (int ignore ATTRIBUTE_UNUSED) +{ + if (flag_readonly_data_in_text) + subseg_new (".text", get_absolute_expression () + 1000); + else + subseg_new (".data", get_absolute_expression ()); +} - if (!fixP->fx_bit_fixP && ! fixP->fx_no_overflow) - { -#ifndef TC_M88K - /* The m88k uses the offset field of the reloc to get around - this problem. */ - if ((size == 1 - && ((add_number & ~0xFF) - || (fixP->fx_signed && (add_number & 0x80))) - && ((add_number & ~0xFF) != (-1 & ~0xFF) - || (add_number & 0x80) == 0)) - || (size == 2 - && ((add_number & ~0xFFFF) - || (fixP->fx_signed && (add_number & 0x8000))) - && ((add_number & ~0xFFFF) != (-1 & ~0xFFFF) - || (add_number & 0x8000) == 0))) - { - as_bad_where (fixP->fx_file, fixP->fx_line, - _("Value of %ld too large for field of %d bytes at 0x%lx"), - (long) add_number, size, - (unsigned long) (fragP->fr_address + where)); - } -#endif -#ifdef WARN_SIGNED_OVERFLOW_WORD - /* Warn if a .word value is too large when treated as a - signed number. We already know it is not too negative. - This is to catch over-large switches generated by gcc on - the 68k. */ - if (!flag_signed_overflow_ok - && size == 2 - && add_number > 0x7fff) - as_bad_where (fixP->fx_file, fixP->fx_line, - _("Signed .word overflow; switch may be too large; %ld at 0x%lx"), - (long) add_number, - (unsigned long) (fragP->fr_address + where)); +static void +obj_coff_ident (int ignore ATTRIBUTE_UNUSED) +{ + 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. */ +} + +void +c_dot_file_symbol (const char *filename, int appfile ATTRIBUTE_UNUSED) +{ + symbolS *symbolP; + + symbolP = symbol_new (".file", SEG_DEBUG, 0, & zero_address_frag); + + S_SET_STORAGE_CLASS (symbolP, C_FILE); + S_SET_NUMBER_AUXILIARY (symbolP, 1); + + if (strlen (filename) > FILNMLEN) + { + /* 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. */ + struct filename_list *f = xmalloc (sizeof (* f)); + + f->filename = filename; + f->next = 0; + + SA_SET_FILE_FNAME_ZEROS (symbolP, 0); + SA_SET_FILE_FNAME_OFFSET (symbolP, 1); + + if (filename_list_tail) + filename_list_tail->next = f; + else + filename_list_head = f; + filename_list_tail = f; + } + else + SA_SET_FILE_FNAME (symbolP, filename); + +#ifndef NO_LISTING + { + extern int listing; + if (listing) + 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. */ + if (symbol_rootP != symbolP) + { + symbol_remove (symbolP, &symbol_rootP, &symbol_lastP); + symbol_insert (symbolP, symbol_rootP, &symbol_rootP, &symbol_lastP); } } -#endif +static void +obj_coff_lcomm (int ignore ATTRIBUTE_UNUSED) +{ + s_lcomm (0); + return; +} /* The first entry in a .stab section is special. */ void -obj_coff_init_stab_section (seg) - segT seg; +obj_coff_init_stab_section (segT seg) { char *file; char *p; @@ -4579,7 +4415,7 @@ obj_coff_init_stab_section (seg) /* Zero it out. */ memset (p, 0, 12); as_where (&file, (unsigned int *) NULL); - stabstr_name = (char *) alloca (strlen (segment_info[seg].name) + 4); + stabstr_name = alloca (strlen (segment_info[seg].name) + 4); strcpy (stabstr_name, segment_info[seg].name); strcat (stabstr_name, "str"); stroff = get_stab_string_offset (file, stabstr_name); @@ -4587,117 +4423,61 @@ obj_coff_init_stab_section (seg) md_number_to_chars (p, stroff, 4); } -/* Fill in the counts in the first entry in a .stab section. */ - -static void -adjust_stab_section(abfd, seg) - bfd *abfd; - segT seg; -{ - segT stabstrseg = SEG_UNKNOWN; - const char *secname, *name2; - char *name; - char *p = NULL; - int i, strsz = 0, nsyms; - fragS *frag = segment_info[seg].frchainP->frch_root; - - /* Look for the associated string table section. */ - - secname = segment_info[seg].name; - name = (char *) alloca (strlen (secname) + 4); - strcpy (name, secname); - strcat (name, "str"); - - for (i = SEG_E0; i < SEG_UNKNOWN; i++) - { - name2 = segment_info[i].name; - if (name2 != NULL && strncmp(name2, name, 8) == 0) - { - stabstrseg = i; - break; - } - } - - /* If we found the section, get its size. */ - if (stabstrseg != SEG_UNKNOWN) - strsz = size_section (abfd, stabstrseg); - - nsyms = size_section (abfd, seg) / 12 - 1; - - /* Look for the first frag of sufficient size for the initial stab - symbol, and collect a pointer to it. */ - while (frag && frag->fr_fix < 12) - frag = frag->fr_next; - assert (frag != 0); - p = frag->fr_literal; - assert (p != 0); - - /* Write in the number of stab symbols and the size of the string - table. */ - bfd_h_put_16 (abfd, (bfd_vma) nsyms, (bfd_byte *) p + 6); - bfd_h_put_32 (abfd, (bfd_vma) strsz, (bfd_byte *) p + 8); -} - #endif /* not BFD_ASSEMBLER */ const pseudo_typeS coff_pseudo_table[] = { + {"ABORT", s_abort, 0}, + {"appline", obj_coff_ln, 1}, + /* We accept the .bss directive for backward compatibility with + earlier versions of gas. */ + {"bss", obj_coff_bss, 0}, {"def", obj_coff_def, 0}, {"dim", obj_coff_dim, 0}, {"endef", obj_coff_endef, 0}, + {"ident", obj_coff_ident, 0}, {"line", obj_coff_line, 0}, {"ln", obj_coff_ln, 0}, -#ifdef BFD_ASSEMBLER - {"loc", obj_coff_loc, 0}, -#endif - {"appline", obj_coff_ln, 1}, {"scl", obj_coff_scl, 0}, + {"sect", obj_coff_section, 0}, + {"sect.s", obj_coff_section, 0}, + {"section", obj_coff_section, 0}, + {"section.s", obj_coff_section, 0}, + /* FIXME: We ignore the MRI short attribute. */ {"size", obj_coff_size, 0}, {"tag", obj_coff_tag, 0}, {"type", obj_coff_type, 0}, {"val", obj_coff_val, 0}, - {"section", obj_coff_section, 0}, - {"sect", obj_coff_section, 0}, - /* FIXME: We ignore the MRI short attribute. */ - {"section.s", obj_coff_section, 0}, - {"sect.s", obj_coff_section, 0}, - /* We accept the .bss directive for backward compatibility with - earlier versions of gas. */ - {"bss", obj_coff_bss, 0}, - {"ident", obj_coff_ident, 0}, -#ifndef BFD_ASSEMBLER - {"use", obj_coff_section, 0}, - {"text", obj_coff_text, 0}, + {"version", s_ignore, 0}, +#ifdef BFD_ASSEMBLER + {"loc", obj_coff_loc, 0}, + {"optim", s_ignore, 0}, /* For sun386i cc (?) */ + {"weak", obj_coff_weak, 0}, +#else {"data", obj_coff_data, 0}, {"lcomm", obj_coff_lcomm, 0}, -#else - {"weak", obj_coff_weak, 0}, - {"optim", s_ignore, 0}, /* For sun386i cc (?) */ + {"text", obj_coff_text, 0}, + {"use", obj_coff_section, 0}, #endif - {"version", s_ignore, 0}, - {"ABORT", s_abort, 0}, -#if defined( TC_M88K ) || defined ( TC_TIC4X ) +#if defined TC_M88K || defined TC_TIC4X /* The m88k and tic4x uses sdef instead of def. */ {"sdef", obj_coff_def, 0}, #endif - {NULL, NULL, 0} /* end sentinel */ -}; /* coff_pseudo_table */ + {NULL, NULL, 0} +}; #ifdef BFD_ASSEMBLER /* Support for a COFF emulation. */ -static void coff_pop_insert PARAMS ((void)); -static int coff_separate_stab_sections PARAMS ((void)); - static void -coff_pop_insert () +coff_pop_insert (void) { pop_insert (coff_pseudo_table); } static int -coff_separate_stab_sections () +coff_separate_stab_sections (void) { return 1; } diff --git a/gas/config/obj-coff.h b/gas/config/obj-coff.h index 60f16fc..43335fe 100644 --- a/gas/config/obj-coff.h +++ b/gas/config/obj-coff.h @@ -1,6 +1,6 @@ /* coff object file format Copyright 1989, 1990, 1991, 1992, 1993, 1994, 1995, 1996, 1997, 1998, - 1999, 2000, 2001, 2002, 2003, 2004 + 1999, 2000, 2001, 2002, 2003, 2004, 2005 Free Software Foundation, Inc. This file is part of GAS. @@ -199,10 +199,7 @@ #define OBJ_COFF_MAX_AUXENTRIES 1 #endif -extern void coff_obj_symbol_new_hook PARAMS ((symbolS *)); #define obj_symbol_new_hook coff_obj_symbol_new_hook - -extern void coff_obj_read_begin_hook PARAMS ((void)); #define obj_read_begin_hook coff_obj_read_begin_hook /* This file really contains two implementations of the COFF back end. @@ -247,8 +244,6 @@ extern void coff_obj_read_begin_hook PARAMS ((void)); #define OUTPUT_FLAVOR bfd_target_coff_flavour -/* SYMBOL TABLE */ - /* Alter the field names, for now, until we've fixed up the other references to use the new name. */ #ifdef TC_I960 @@ -272,21 +267,14 @@ extern void coff_obj_read_begin_hook PARAMS ((void)); #define DO_NOT_STRIP 0 -extern void obj_coff_section PARAMS ((int)); - /* The number of auxiliary entries. */ #define S_GET_NUMBER_AUXILIARY(s) \ (coffsymbol (symbol_get_bfdsym (s))->native->u.syment.n_numaux) /* The number of auxiliary entries. */ -#define S_SET_NUMBER_AUXILIARY(s,v) (S_GET_NUMBER_AUXILIARY (s) = (v)) +#define S_SET_NUMBER_AUXILIARY(s, v) (S_GET_NUMBER_AUXILIARY (s) = (v)) /* True if a symbol name is in the string table, i.e. its length is > 8. */ -#define S_IS_STRING(s) (strlen(S_GET_NAME(s)) > 8 ? 1 : 0) - -extern int S_SET_DATA_TYPE PARAMS ((symbolS *, int)); -extern int S_SET_STORAGE_CLASS PARAMS ((symbolS *, int)); -extern int S_GET_STORAGE_CLASS PARAMS ((symbolS *)); -extern void SA_SET_SYM_ENDNDX PARAMS ((symbolS *, symbolS *)); +#define S_IS_STRING(s) (strlen (S_GET_NAME (s)) > 8 ? 1 : 0) /* Auxiliary entry macros. SA_ stands for symbol auxiliary. */ /* Omit the tv related fields. */ @@ -304,15 +292,15 @@ extern void SA_SET_SYM_ENDNDX PARAMS ((symbolS *, symbolS *)); #define SA_GET_SCN_NRELOC(s) (SYM_AUXENT (s)->x_scn.x_nreloc) #define SA_GET_SCN_NLINNO(s) (SYM_AUXENT (s)->x_scn.x_nlinno) -#define SA_SET_SYM_LNNO(s,v) (SYM_AUXENT (s)->x_sym.x_misc.x_lnsz.x_lnno=(v)) -#define SA_SET_SYM_SIZE(s,v) (SYM_AUXENT (s)->x_sym.x_misc.x_lnsz.x_size=(v)) -#define SA_SET_SYM_FSIZE(s,v) (SYM_AUXENT (s)->x_sym.x_misc.x_fsize=(v)) -#define SA_SET_SYM_LNNOPTR(s,v) (SYM_AUXENT (s)->x_sym.x_fcnary.x_fcn.x_lnnoptr=(v)) -#define SA_SET_SYM_DIMEN(s,i,v) (SYM_AUXENT (s)->x_sym.x_fcnary.x_ary.x_dimen[(i)]=(v)) -#define SA_SET_FILE_FNAME(s,v) strncpy(SYM_AUXENT (s)->x_file.x_fname,(v),FILNMLEN) -#define SA_SET_SCN_SCNLEN(s,v) (SYM_AUXENT (s)->x_scn.x_scnlen=(v)) -#define SA_SET_SCN_NRELOC(s,v) (SYM_AUXENT (s)->x_scn.x_nreloc=(v)) -#define SA_SET_SCN_NLINNO(s,v) (SYM_AUXENT (s)->x_scn.x_nlinno=(v)) +#define SA_SET_SYM_LNNO(s,v) (SYM_AUXENT (s)->x_sym.x_misc.x_lnsz.x_lnno = (v)) +#define SA_SET_SYM_SIZE(s,v) (SYM_AUXENT (s)->x_sym.x_misc.x_lnsz.x_size = (v)) +#define SA_SET_SYM_FSIZE(s,v) (SYM_AUXENT (s)->x_sym.x_misc.x_fsize = (v)) +#define SA_SET_SYM_LNNOPTR(s,v) (SYM_AUXENT (s)->x_sym.x_fcnary.x_fcn.x_lnnoptr = (v)) +#define SA_SET_SYM_DIMEN(s,i,v) (SYM_AUXENT (s)->x_sym.x_fcnary.x_ary.x_dimen[(i)] = (v)) +#define SA_SET_FILE_FNAME(s,v) strncpy (SYM_AUXENT (s)->x_file.x_fname, (v), FILNMLEN) +#define SA_SET_SCN_SCNLEN(s,v) (SYM_AUXENT (s)->x_scn.x_scnlen = (v)) +#define SA_SET_SCN_NRELOC(s,v) (SYM_AUXENT (s)->x_scn.x_nreloc = (v)) +#define SA_SET_SCN_NLINNO(s,v) (SYM_AUXENT (s)->x_scn.x_nlinno = (v)) /* Internal use only definitions. SF_ stands for symbol flags. @@ -322,31 +310,31 @@ extern void SA_SET_SYM_ENDNDX PARAMS ((symbolS *, symbolS *)); more on the balname/callname hack, see tc-i960.h. b.out is done differently. */ -#define SF_I960_MASK (0x000001ff) /* Bits 0-8 are used by the i960 port. */ -#define SF_SYSPROC (0x0000003f) /* bits 0-5 are used to store the sysproc number */ -#define SF_IS_SYSPROC (0x00000040) /* bit 6 marks symbols that are sysprocs */ -#define SF_BALNAME (0x00000080) /* bit 7 marks BALNAME symbols */ -#define SF_CALLNAME (0x00000100) /* bit 8 marks CALLNAME symbols */ - -#define SF_NORMAL_MASK (0x0000ffff) /* bits 12-15 are general purpose. */ - -#define SF_STATICS (0x00001000) /* Mark the .text & all symbols */ -#define SF_DEFINED (0x00002000) /* Symbol is defined in this file */ -#define SF_STRING (0x00004000) /* Symbol name length > 8 */ -#define SF_LOCAL (0x00008000) /* Symbol must not be emitted */ - -#define SF_DEBUG_MASK (0xffff0000) /* bits 16-31 are debug info */ - -#define SF_FUNCTION (0x00010000) /* The symbol is a function */ -#define SF_PROCESS (0x00020000) /* Process symbol before write */ -#define SF_TAGGED (0x00040000) /* Is associated with a tag */ -#define SF_TAG (0x00080000) /* Is a tag */ -#define SF_DEBUG (0x00100000) /* Is in debug or abs section */ -#define SF_GET_SEGMENT (0x00200000) /* Get the section of the forward symbol. */ +#define SF_I960_MASK 0x000001ff /* Bits 0-8 are used by the i960 port. */ +#define SF_SYSPROC 0x0000003f /* bits 0-5 are used to store the sysproc number. */ +#define SF_IS_SYSPROC 0x00000040 /* bit 6 marks symbols that are sysprocs. */ +#define SF_BALNAME 0x00000080 /* bit 7 marks BALNAME symbols. */ +#define SF_CALLNAME 0x00000100 /* bit 8 marks CALLNAME symbols. */ + +#define SF_NORMAL_MASK 0x0000ffff /* bits 12-15 are general purpose. */ + +#define SF_STATICS 0x00001000 /* Mark the .text & all symbols. */ +#define SF_DEFINED 0x00002000 /* Symbol is defined in this file. */ +#define SF_STRING 0x00004000 /* Symbol name length > 8. */ +#define SF_LOCAL 0x00008000 /* Symbol must not be emitted. */ + +#define SF_DEBUG_MASK 0xffff0000 /* bits 16-31 are debug info. */ + +#define SF_FUNCTION 0x00010000 /* The symbol is a function. */ +#define SF_PROCESS 0x00020000 /* Process symbol before write. */ +#define SF_TAGGED 0x00040000 /* Is associated with a tag. */ +#define SF_TAG 0x00080000 /* Is a tag. */ +#define SF_DEBUG 0x00100000 /* Is in debug or abs section. */ +#define SF_GET_SEGMENT 0x00200000 /* Get the section of the forward symbol. */ /* All other bits are unused. */ /* Accessors. */ -#define SF_GET(s) (*symbol_get_obj (s)) +#define SF_GET(s) (* symbol_get_obj (s)) #define SF_GET_DEBUG(s) (symbol_get_bfdsym (s)->flags & BSF_DEBUGGING) #define SF_SET_DEBUG(s) (symbol_get_bfdsym (s)->flags |= BSF_DEBUGGING) #define SF_GET_NORMAL_FIELD(s) (SF_GET (s) & SF_NORMAL_MASK) @@ -361,15 +349,15 @@ extern void SA_SET_SYM_ENDNDX PARAMS ((symbolS *, symbolS *)); #define SF_GET_TAGGED(s) (SF_GET (s) & SF_TAGGED) #define SF_GET_TAG(s) (SF_GET (s) & SF_TAG) #define SF_GET_GET_SEGMENT(s) (SF_GET (s) & SF_GET_SEGMENT) -#define SF_GET_I960(s) (SF_GET (s) & SF_I960_MASK) /* used by i960 */ -#define SF_GET_BALNAME(s) (SF_GET (s) & SF_BALNAME) /* used by i960 */ -#define SF_GET_CALLNAME(s) (SF_GET (s) & SF_CALLNAME) /* used by i960 */ -#define SF_GET_IS_SYSPROC(s) (SF_GET (s) & SF_IS_SYSPROC) /* used by i960 */ -#define SF_GET_SYSPROC(s) (SF_GET (s) & SF_SYSPROC) /* used by i960 */ +#define SF_GET_I960(s) (SF_GET (s) & SF_I960_MASK) /* Used by i960. */ +#define SF_GET_BALNAME(s) (SF_GET (s) & SF_BALNAME) /* Used by i960. */ +#define SF_GET_CALLNAME(s) (SF_GET (s) & SF_CALLNAME) /* Used by i960. */ +#define SF_GET_IS_SYSPROC(s) (SF_GET (s) & SF_IS_SYSPROC) /* Used by i960. */ +#define SF_GET_SYSPROC(s) (SF_GET (s) & SF_SYSPROC) /* Used by i960. */ /* Modifiers. */ #define SF_SET(s,v) (SF_GET (s) = (v)) -#define SF_SET_NORMAL_FIELD(s,v) (SF_GET (s) |= ((v) & SF_NORMAL_MASK)) +#define SF_SET_NORMAL_FIELD(s,v)(SF_GET (s) |= ((v) & SF_NORMAL_MASK)) #define SF_SET_DEBUG_FIELD(s,v) (SF_GET (s) |= ((v) & SF_DEBUG_MASK)) #define SF_SET_FILE(s) (SF_GET (s) |= SF_FILE) #define SF_SET_STATICS(s) (SF_GET (s) |= SF_STATICS) @@ -382,47 +370,38 @@ extern void SA_SET_SYM_ENDNDX PARAMS ((symbolS *, symbolS *)); #define SF_SET_TAGGED(s) (SF_GET (s) |= SF_TAGGED) #define SF_SET_TAG(s) (SF_GET (s) |= SF_TAG) #define SF_SET_GET_SEGMENT(s) (SF_GET (s) |= SF_GET_SEGMENT) -#define SF_SET_I960(s,v) (SF_GET (s) |= ((v) & SF_I960_MASK)) /* used by i960 */ -#define SF_SET_BALNAME(s) (SF_GET (s) |= SF_BALNAME) /* used by i960 */ -#define SF_SET_CALLNAME(s) (SF_GET (s) |= SF_CALLNAME) /* used by i960 */ -#define SF_SET_IS_SYSPROC(s) (SF_GET (s) |= SF_IS_SYSPROC) /* used by i960 */ -#define SF_SET_SYSPROC(s,v) (SF_GET (s) |= ((v) & SF_SYSPROC)) /* used by i960 */ +#define SF_SET_I960(s,v) (SF_GET (s) |= ((v) & SF_I960_MASK)) /* Used by i960. */ +#define SF_SET_BALNAME(s) (SF_GET (s) |= SF_BALNAME) /* Used by i960. */ +#define SF_SET_CALLNAME(s) (SF_GET (s) |= SF_CALLNAME) /* Used by i960. */ +#define SF_SET_IS_SYSPROC(s) (SF_GET (s) |= SF_IS_SYSPROC) /* Used by i960. */ +#define SF_SET_SYSPROC(s,v) (SF_GET (s) |= ((v) & SF_SYSPROC)) /* Used by i960. */ -/* -------------- Line number handling ------- */ + +/* Line number handling. */ extern int text_lineno_number; extern int coff_line_base; extern int coff_n_line_nos; +extern symbolS *coff_last_function; -#define obj_emit_lineno(WHERE,LINE,FILE_START) abort () -extern void coff_add_linesym PARAMS ((symbolS *)); - -void c_dot_file_symbol PARAMS ((const char *, int)); -#define obj_app_file(name, app) c_dot_file_symbol (name, app) - -extern void coff_frob_symbol PARAMS ((symbolS *, int *)); -extern void coff_adjust_symtab PARAMS ((void)); -extern void coff_frob_section PARAMS ((segT)); -extern void coff_adjust_section_syms PARAMS ((bfd *, asection *, PTR)); -extern void coff_frob_file_after_relocs PARAMS ((void)); -#define obj_frob_symbol(S,P) coff_frob_symbol(S,&P) +#define obj_emit_lineno(WHERE, LINE, FILE_START) abort () +#define obj_app_file(name, app) c_dot_file_symbol (name, app) +#define obj_frob_symbol(S,P) coff_frob_symbol (S, & P) +#define obj_frob_section(S) coff_frob_section (S) +#define obj_frob_file_after_relocs() coff_frob_file_after_relocs () #ifndef obj_adjust_symtab -#define obj_adjust_symtab() coff_adjust_symtab() +#define obj_adjust_symtab() coff_adjust_symtab () #endif -#define obj_frob_section(S) coff_frob_section (S) -#define obj_frob_file_after_relocs() coff_frob_file_after_relocs () - -extern symbolS *coff_last_function; /* Forward the segment of a forwarded symbol, handle assignments that just copy symbol values, etc. */ #ifndef OBJ_COPY_SYMBOL_ATTRIBUTES #ifndef TE_I386AIX -#define OBJ_COPY_SYMBOL_ATTRIBUTES(dest,src) \ +#define OBJ_COPY_SYMBOL_ATTRIBUTES(dest, src) \ (SF_GET_GET_SEGMENT (dest) \ ? (S_SET_SEGMENT (dest, S_GET_SEGMENT (src)), 0) \ : 0) #else -#define OBJ_COPY_SYMBOL_ATTRIBUTES(dest,src) \ +#define OBJ_COPY_SYMBOL_ATTRIBUTES(dest, src) \ (SF_GET_GET_SEGMENT (dest) && S_GET_SEGMENT (dest) == SEG_UNKNOWN \ ? (S_SET_SEGMENT (dest, S_GET_SEGMENT (src)), 0) \ : 0) @@ -466,7 +445,7 @@ extern const segT N_TYPE_seg[]; typedef struct { - /* Basic symbol */ + /* Basic symbol. */ struct internal_syment ost_entry; /* Auxiliary entry. */ union internal_auxent ost_auxent[OBJ_COFF_MAX_AUXENTRIES]; @@ -525,7 +504,7 @@ typedef struct || strchr (S_GET_NAME (s), '\001') != NULL \ || strchr (S_GET_NAME (s), '\002') != NULL \ || (flag_strip_local_absolute \ - && !S_IS_EXTERNAL(s) \ + && !S_IS_EXTERNAL (s) \ && (s)->sy_symbol.ost_entry.n_scnum == C_ABS_SECTION)) /* True if a symbol is not defined in this file. */ @@ -538,12 +517,12 @@ typedef struct && S_GET_VALUE (s) != 0) /* True if a symbol name is in the string table, i.e. its length is > 8. */ -#define S_IS_STRING(s) (strlen(S_GET_NAME(s)) > 8 ? 1 : 0) +#define S_IS_STRING(s) (strlen (S_GET_NAME (s)) > 8 ? 1 : 0) /* True if a symbol is defined as weak. */ #ifdef TE_PE #define S_IS_WEAK(s) \ - ((s)->sy_symbol.ost_entry.n_sclass == C_NT_WEAK \ + ( (s)->sy_symbol.ost_entry.n_sclass == C_NT_WEAK \ || (s)->sy_symbol.ost_entry.n_sclass == C_WEAKEXT) #else #define S_IS_WEAK(s) \ @@ -552,13 +531,13 @@ typedef struct /* Accessors. */ /* The name of the symbol. */ -#define S_GET_NAME(s) ((char*) (s)->sy_symbol.ost_entry.n_offset) +#define S_GET_NAME(s) ((char *) (s)->sy_symbol.ost_entry.n_offset) /* The pointer to the string table. */ #define S_GET_OFFSET(s) ((s)->sy_symbol.ost_entry.n_offset) /* The numeric value of the segment. */ -#define S_GET_SEGMENT(s) s_get_segment(s) +#define S_GET_SEGMENT(s) s_get_segment (s) /* The data type. */ #define S_GET_DATA_TYPE(s) ((s)->sy_symbol.ost_entry.n_type) @@ -571,38 +550,43 @@ typedef struct /* Modifiers. */ /* Set the name of the symbol. */ -#define S_SET_NAME(s,v) \ +#define S_SET_NAME(s, v) \ ((s)->sy_symbol.ost_entry.n_offset = (unsigned long) (v)) /* Set the offset of the symbol. */ -#define S_SET_OFFSET(s,v) \ +#define S_SET_OFFSET(s, v) \ ((s)->sy_symbol.ost_entry.n_offset = (v)) /* The numeric value of the segment. */ -#define S_SET_SEGMENT(s,v) \ - ((s)->sy_symbol.ost_entry.n_scnum = SEGMENT_TO_SYMBOL_TYPE(v)) +#define S_SET_SEGMENT(s, v) \ + ((s)->sy_symbol.ost_entry.n_scnum = SEGMENT_TO_SYMBOL_TYPE (v)) /* The data type. */ -#define S_SET_DATA_TYPE(s,v) \ +#define S_SET_DATA_TYPE(s, v) \ ((s)->sy_symbol.ost_entry.n_type = (v)) /* The storage class. */ -#define S_SET_STORAGE_CLASS(s,v) \ +#define S_SET_STORAGE_CLASS(s, v) \ ((s)->sy_symbol.ost_entry.n_sclass = (v)) /* The number of auxiliary entries. */ -#define S_SET_NUMBER_AUXILIARY(s,v) \ +#define S_SET_NUMBER_AUXILIARY(s, v) \ ((s)->sy_symbol.ost_entry.n_numaux = (v)) /* Additional modifiers. */ /* The symbol is external (does not mean undefined). */ #define S_SET_EXTERNAL(s) \ - { S_SET_STORAGE_CLASS(s, C_EXT) ; SF_CLEAR_LOCAL(s); } + do \ + { \ + S_SET_STORAGE_CLASS (s, C_EXT); \ + SF_CLEAR_LOCAL (s); \ + } \ + while (0) /* Auxiliary entry macros. SA_ stands for symbol auxiliary. */ /* Omit the tv related fields. */ /* Accessors. */ -#define SYM_AUXENT(S) (&(S)->sy_symbol.ost_auxent[0]) +#define SYM_AUXENT(S) (&(S)->sy_symbol.ost_auxent[0]) #define SA_GET_SYM_TAGNDX(s) (SYM_AUXENT (s)->x_sym.x_tagndx.l) #define SA_GET_SYM_LNNO(s) (SYM_AUXENT (s)->x_sym.x_misc.x_lnsz.x_lnno) @@ -619,19 +603,19 @@ typedef struct #define SA_GET_SCN_NLINNO(s) (SYM_AUXENT (s)->x_scn.x_nlinno) /* Modifiers. */ -#define SA_SET_SYM_TAGNDX(s,v) (SYM_AUXENT (s)->x_sym.x_tagndx.l=(v)) -#define SA_SET_SYM_LNNO(s,v) (SYM_AUXENT (s)->x_sym.x_misc.x_lnsz.x_lnno=(v)) -#define SA_SET_SYM_SIZE(s,v) (SYM_AUXENT (s)->x_sym.x_misc.x_lnsz.x_size=(v)) -#define SA_SET_SYM_FSIZE(s,v) (SYM_AUXENT (s)->x_sym.x_misc.x_fsize=(v)) -#define SA_SET_SYM_LNNOPTR(s,v) (SYM_AUXENT (s)->x_sym.x_fcnary.x_fcn.x_lnnoptr=(v)) -#define SA_SET_SYM_ENDNDX(s,v) (SYM_AUXENT (s)->x_sym.x_fcnary.x_fcn.x_endndx.l=(v)) -#define SA_SET_SYM_DIMEN(s,i,v) (SYM_AUXENT (s)->x_sym.x_fcnary.x_ary.x_dimen[(i)]=(v)) -#define SA_SET_FILE_FNAME(s,v) strncpy(SYM_AUXENT (s)->x_file.x_fname,(v),FILNMLEN) -#define SA_SET_FILE_FNAME_OFFSET(s,v) (SYM_AUXENT (s)->x_file.x_n.x_offset=(v)) -#define SA_SET_FILE_FNAME_ZEROS(s,v) (SYM_AUXENT (s)->x_file.x_n.x_zeroes=(v)) -#define SA_SET_SCN_SCNLEN(s,v) (SYM_AUXENT (s)->x_scn.x_scnlen=(v)) -#define SA_SET_SCN_NRELOC(s,v) (SYM_AUXENT (s)->x_scn.x_nreloc=(v)) -#define SA_SET_SCN_NLINNO(s,v) (SYM_AUXENT (s)->x_scn.x_nlinno=(v)) +#define SA_SET_SYM_TAGNDX(s,v) (SYM_AUXENT (s)->x_sym.x_tagndx.l = (v)) +#define SA_SET_SYM_LNNO(s,v) (SYM_AUXENT (s)->x_sym.x_misc.x_lnsz.x_lnno = (v)) +#define SA_SET_SYM_SIZE(s,v) (SYM_AUXENT (s)->x_sym.x_misc.x_lnsz.x_size = (v)) +#define SA_SET_SYM_FSIZE(s,v) (SYM_AUXENT (s)->x_sym.x_misc.x_fsize = (v)) +#define SA_SET_SYM_LNNOPTR(s,v) (SYM_AUXENT (s)->x_sym.x_fcnary.x_fcn.x_lnnoptr = (v)) +#define SA_SET_SYM_ENDNDX(s,v) (SYM_AUXENT (s)->x_sym.x_fcnary.x_fcn.x_endndx.l = (v)) +#define SA_SET_SYM_DIMEN(s,i,v) (SYM_AUXENT (s)->x_sym.x_fcnary.x_ary.x_dimen[(i)] = (v)) +#define SA_SET_FILE_FNAME(s,v) strncpy (SYM_AUXENT (s)->x_file.x_fname,(v),FILNMLEN) +#define SA_SET_FILE_FNAME_OFFSET(s,v) (SYM_AUXENT (s)->x_file.x_n.x_offset = (v)) +#define SA_SET_FILE_FNAME_ZEROS(s,v) (SYM_AUXENT (s)->x_file.x_n.x_zeroes = (v)) +#define SA_SET_SCN_SCNLEN(s,v) (SYM_AUXENT (s)->x_scn.x_scnlen = (v)) +#define SA_SET_SCN_NRELOC(s,v) (SYM_AUXENT (s)->x_scn.x_nreloc = (v)) +#define SA_SET_SCN_NLINNO(s,v) (SYM_AUXENT (s)->x_scn.x_nlinno = (v)) /* Internal use only definitions. SF_ stands for symbol flags. @@ -641,28 +625,28 @@ typedef struct more on the balname/callname hack, see tc-i960.h. b.out is done differently. */ -#define SF_I960_MASK (0x000001ff) /* Bits 0-8 are used by the i960 port. */ -#define SF_SYSPROC (0x0000003f) /* bits 0-5 are used to store the sysproc number */ -#define SF_IS_SYSPROC (0x00000040) /* bit 6 marks symbols that are sysprocs */ -#define SF_BALNAME (0x00000080) /* bit 7 marks BALNAME symbols */ -#define SF_CALLNAME (0x00000100) /* bit 8 marks CALLNAME symbols */ - -#define SF_NORMAL_MASK (0x0000ffff) /* bits 12-15 are general purpose. */ - -#define SF_STATICS (0x00001000) /* Mark the .text & all symbols */ -#define SF_DEFINED (0x00002000) /* Symbol is defined in this file */ -#define SF_STRING (0x00004000) /* Symbol name length > 8 */ -#define SF_LOCAL (0x00008000) /* Symbol must not be emitted */ - -#define SF_DEBUG_MASK (0xffff0000) /* bits 16-31 are debug info */ - -#define SF_FUNCTION (0x00010000) /* The symbol is a function */ -#define SF_PROCESS (0x00020000) /* Process symbol before write */ -#define SF_TAGGED (0x00040000) /* Is associated with a tag */ -#define SF_TAG (0x00080000) /* Is a tag */ -#define SF_DEBUG (0x00100000) /* Is in debug or abs section */ -#define SF_GET_SEGMENT (0x00200000) /* Get the section of the forward symbol. */ -#define SF_ADJ_LNNOPTR (0x00400000) /* Has a lnnoptr */ +#define SF_I960_MASK 0x000001ff /* Bits 0-8 are used by the i960 port. */ +#define SF_SYSPROC 0x0000003f /* bits 0-5 are used to store the sysproc number. */ +#define SF_IS_SYSPROC 0x00000040 /* bit 6 marks symbols that are sysprocs. */ +#define SF_BALNAME 0x00000080 /* bit 7 marks BALNAME symbols. */ +#define SF_CALLNAME 0x00000100 /* bit 8 marks CALLNAME symbols. */ + +#define SF_NORMAL_MASK 0x0000ffff /* bits 12-15 are general purpose. */ + +#define SF_STATICS 0x00001000 /* Mark the .text & all symbols. */ +#define SF_DEFINED 0x00002000 /* Symbol is defined in this file. */ +#define SF_STRING 0x00004000 /* Symbol name length > 8. */ +#define SF_LOCAL 0x00008000 /* Symbol must not be emitted. */ + +#define SF_DEBUG_MASK 0xffff0000 /* bits 16-31 are debug info. */ + +#define SF_FUNCTION 0x00010000 /* The symbol is a function. */ +#define SF_PROCESS 0x00020000 /* Process symbol before write. */ +#define SF_TAGGED 0x00040000 /* Is associated with a tag. */ +#define SF_TAG 0x00080000 /* Is a tag. */ +#define SF_DEBUG 0x00100000 /* Is in debug or abs section. */ +#define SF_GET_SEGMENT 0x00200000 /* Get the section of the forward symbol. */ +#define SF_ADJ_LNNOPTR 0x00400000 /* Has a lnnoptr. */ /* All other bits are unused. */ /* Accessors. */ @@ -681,15 +665,15 @@ typedef struct #define SF_GET_TAG(s) (SF_GET (s) & SF_TAG) #define SF_GET_GET_SEGMENT(s) (SF_GET (s) & SF_GET_SEGMENT) #define SF_GET_ADJ_LNNOPTR(s) (SF_GET (s) & SF_ADJ_LNNOPTR) -#define SF_GET_I960(s) (SF_GET (s) & SF_I960_MASK) /* used by i960 */ -#define SF_GET_BALNAME(s) (SF_GET (s) & SF_BALNAME) /* used by i960 */ -#define SF_GET_CALLNAME(s) (SF_GET (s) & SF_CALLNAME) /* used by i960 */ -#define SF_GET_IS_SYSPROC(s) (SF_GET (s) & SF_IS_SYSPROC) /* used by i960 */ -#define SF_GET_SYSPROC(s) (SF_GET (s) & SF_SYSPROC) /* used by i960 */ +#define SF_GET_I960(s) (SF_GET (s) & SF_I960_MASK) /* Used by i960. */ +#define SF_GET_BALNAME(s) (SF_GET (s) & SF_BALNAME) /* Used by i960. */ +#define SF_GET_CALLNAME(s) (SF_GET (s) & SF_CALLNAME) /* Used by i960. */ +#define SF_GET_IS_SYSPROC(s) (SF_GET (s) & SF_IS_SYSPROC) /* Used by i960. */ +#define SF_GET_SYSPROC(s) (SF_GET (s) & SF_SYSPROC) /* Used by i960. */ /* Modifiers. */ #define SF_SET(s,v) (SF_GET (s) = (v)) -#define SF_SET_NORMAL_FIELD(s,v) (SF_GET (s) |= ((v) & SF_NORMAL_MASK)) +#define SF_SET_NORMAL_FIELD(s,v)(SF_GET (s) |= ((v) & SF_NORMAL_MASK)) #define SF_SET_DEBUG_FIELD(s,v) (SF_GET (s) |= ((v) & SF_DEBUG_MASK)) #define SF_SET_FILE(s) (SF_GET (s) |= SF_FILE) #define SF_SET_STATICS(s) (SF_GET (s) |= SF_STATICS) @@ -704,11 +688,11 @@ typedef struct #define SF_SET_TAG(s) (SF_GET (s) |= SF_TAG) #define SF_SET_GET_SEGMENT(s) (SF_GET (s) |= SF_GET_SEGMENT) #define SF_SET_ADJ_LNNOPTR(s) (SF_GET (s) |= SF_ADJ_LNNOPTR) -#define SF_SET_I960(s,v) (SF_GET (s) |= ((v) & SF_I960_MASK)) /* used by i960 */ -#define SF_SET_BALNAME(s) (SF_GET (s) |= SF_BALNAME) /* used by i960 */ -#define SF_SET_CALLNAME(s) (SF_GET (s) |= SF_CALLNAME) /* used by i960 */ -#define SF_SET_IS_SYSPROC(s) (SF_GET (s) |= SF_IS_SYSPROC) /* used by i960 */ -#define SF_SET_SYSPROC(s,v) (SF_GET (s) |= ((v) & SF_SYSPROC)) /* used by i960 */ +#define SF_SET_I960(s,v) (SF_GET (s) |= ((v) & SF_I960_MASK)) /* Used by i960. */ +#define SF_SET_BALNAME(s) (SF_GET (s) |= SF_BALNAME) /* Used by i960. */ +#define SF_SET_CALLNAME(s) (SF_GET (s) |= SF_CALLNAME) /* Used by i960. */ +#define SF_SET_IS_SYSPROC(s) (SF_GET (s) |= SF_IS_SYSPROC) /* Used by i960. */ +#define SF_SET_SYSPROC(s,v) (SF_GET (s) |= ((v) & SF_SYSPROC)) /* Used by i960. */ /* File header macro and type definition. */ @@ -719,37 +703,35 @@ typedef struct #define OBJ_COFF_AOUTHDRSZ (0) #else #define OBJ_COFF_AOUTHDRSZ (AOUTHDRSZ) -#endif /* OBJ_COFF_OMIT_OPTIONAL_HEADER */ +#endif -#define H_GET_FILE_SIZE(h) \ - (long) (FILHSZ + OBJ_COFF_AOUTHDRSZ + \ - H_GET_NUMBER_OF_SECTIONS(h) * SCNHSZ + \ - H_GET_TEXT_SIZE(h) + H_GET_DATA_SIZE(h) + \ - H_GET_RELOCATION_SIZE(h) + H_GET_LINENO_SIZE(h) + \ - H_GET_SYMBOL_TABLE_SIZE(h) + \ - (h)->string_table_size) #define H_GET_TEXT_FILE_OFFSET(h) \ - (long) (FILHSZ + OBJ_COFF_AOUTHDRSZ + \ - H_GET_NUMBER_OF_SECTIONS(h) * SCNHSZ) + (long) (FILHSZ \ + + OBJ_COFF_AOUTHDRSZ \ + + H_GET_NUMBER_OF_SECTIONS (h) * SCNHSZ) + #define H_GET_DATA_FILE_OFFSET(h) \ - (long) (FILHSZ + OBJ_COFF_AOUTHDRSZ + \ - H_GET_NUMBER_OF_SECTIONS(h) * SCNHSZ + \ - H_GET_TEXT_SIZE(h)) + (long) (H_GET_TEXT_FILE_OFFSET (h) \ + + H_GET_TEXT_SIZE (h)) + #define H_GET_BSS_FILE_OFFSET(h) 0 + #define H_GET_RELOCATION_FILE_OFFSET(h) \ - (long) (FILHSZ + OBJ_COFF_AOUTHDRSZ + \ - H_GET_NUMBER_OF_SECTIONS(h) * SCNHSZ + \ - H_GET_TEXT_SIZE(h) + H_GET_DATA_SIZE(h)) + (long) (H_GET_DATA_FILE_OFFSET (h) \ + + H_GET_DATA_SIZE (h)) + #define H_GET_LINENO_FILE_OFFSET(h) \ - (long) (FILHSZ + OBJ_COFF_AOUTHDRSZ + \ - H_GET_NUMBER_OF_SECTIONS(h) * SCNHSZ + \ - H_GET_TEXT_SIZE(h) + H_GET_DATA_SIZE(h) + \ - H_GET_RELOCATION_SIZE(h)) + (long) (H_GET_RELOCATION_FILE_OFFSET (h) \ + + H_GET_RELOCATION_SIZE (h)) + #define H_GET_SYMBOL_TABLE_FILE_OFFSET(h) \ - (long) (FILHSZ + OBJ_COFF_AOUTHDRSZ + \ - H_GET_NUMBER_OF_SECTIONS(h) * SCNHSZ + \ - H_GET_TEXT_SIZE(h) + H_GET_DATA_SIZE(h) + \ - H_GET_RELOCATION_SIZE(h) + H_GET_LINENO_SIZE(h)) + (long) (H_GET_LINENO_FILE_OFFSET (h) \ + + H_GET_LINENO_SIZE (h)) + +#define H_GET_FILE_SIZE(h) \ + (long) (H_GET_SYMBOL_TABLE_FILE_OFFSET (h) \ + + H_GET_SYMBOL_TABLE_SIZE (h) \ + + (h)->string_table_size) /* Accessors. */ /* aouthdr. */ @@ -814,9 +796,9 @@ typedef struct typedef struct { - struct internal_aouthdr aouthdr; /* a.out header */ + struct internal_aouthdr aouthdr; /* a.out header. */ struct internal_filehdr filehdr; /* File header, not machine dep. */ - long string_table_size; /* names + '\0' + sizeof (int) */ + long string_table_size; /* names + '\0' + sizeof (int). */ long relocation_size; /* Cumulated size of relocation information for all sections in bytes. */ @@ -835,38 +817,13 @@ struct lineno_list #define obj_add_segment(s) obj_coff_add_segment (s) -extern segT obj_coff_add_segment PARAMS ((const char *)); - -extern void obj_coff_section PARAMS ((int)); - -extern void c_dot_file_symbol PARAMS ((const char *, int)); -#define obj_app_file(name, app) c_dot_file_symbol (name, app) -extern void obj_extra_stuff PARAMS ((object_headers * headers)); - -extern segT s_get_segment PARAMS ((symbolS *ptr)); - -extern void c_section_header PARAMS ((struct internal_scnhdr * header, - char *name, - long core_address, - long size, - long data_ptr, - long reloc_ptr, - long lineno_ptr, - long reloc_number, - long lineno_number, - long alignment)); - -#ifndef tc_coff_symbol_emit_hook -void tc_coff_symbol_emit_hook PARAMS ((symbolS *)); -#endif - /* Sanity check. */ - #ifdef TC_I960 #ifndef C_LEAFSTAT hey ! Where is the C_LEAFSTAT definition ? i960 - coff support is depending on it. #endif /* no C_LEAFSTAT */ #endif /* TC_I960 */ + extern struct internal_scnhdr data_section_header; extern struct internal_scnhdr text_section_header; @@ -878,7 +835,6 @@ extern struct internal_scnhdr text_section_header; #ifdef TE_PE #define obj_handle_link_once(t) obj_coff_pe_handle_link_once (t) -extern void obj_coff_pe_handle_link_once (); #endif #endif /* not BFD_ASSEMBLER */ @@ -906,11 +862,40 @@ extern const pseudo_typeS coff_pseudo_table[]; /* We need 12 bytes at the start of the section to hold some initial information. */ -extern void obj_coff_init_stab_section PARAMS ((segT)); #define INIT_STAB_SECTION(seg) obj_coff_init_stab_section (seg) /* Store the number of relocations in the section aux entry. */ #define SET_SECTION_RELOCS(sec, relocs, n) \ SA_SET_SCN_NRELOC (section_symbol (sec), n) +#define obj_app_file(name, app) c_dot_file_symbol (name, app) + +#ifdef BFD_ASSEMBLER +extern int S_SET_DATA_TYPE (symbolS *, int); +extern int S_SET_STORAGE_CLASS (symbolS *, int); +extern int S_GET_STORAGE_CLASS (symbolS *); +extern void SA_SET_SYM_ENDNDX (symbolS *, symbolS *); +extern void coff_add_linesym (symbolS *); +extern void c_dot_file_symbol (const char *, int); +extern void coff_frob_symbol (symbolS *, int *); +extern void coff_adjust_symtab (void); +extern void coff_frob_section (segT); +extern void coff_adjust_section_syms (bfd *, asection *, void *); +extern void coff_frob_file_after_relocs (void); +#else +extern void obj_extra_stuff (object_headers *); +#endif +extern void coff_obj_symbol_new_hook (symbolS *); +extern void coff_obj_read_begin_hook (void); +extern void obj_coff_section (int); +extern segT obj_coff_add_segment (const char *); +extern void obj_coff_section (int); +extern void c_dot_file_symbol (const char *, int); +extern segT s_get_segment (symbolS *); +extern void tc_coff_symbol_emit_hook (symbolS *); +extern void obj_coff_pe_handle_link_once (void); +extern void obj_coff_init_stab_section (segT); +extern void c_section_header (struct internal_scnhdr *, + char *, long, long, long, long, + long, long, long, long); #endif /* OBJ_FORMAT_H */ -- 2.7.4