* config/obj-coff.c (size_section): Do an fprintf to stderr rather

than a printf.
	(fixup_segment): Use as_bad_where rather than as_bad.
This commit is contained in:
Ian Lance Taylor 1994-09-08 23:46:00 +00:00
parent fa3539fe77
commit eb4fd16f4d
2 changed files with 116 additions and 261 deletions

View File

@ -1,7 +1,13 @@
Thu Sep 8 19:43:49 1994 Ian Lance Taylor (ian@sanguine.cygnus.com)
* config/obj-coff.c (size_section): Do an fprintf to stderr rather
than a printf.
(fixup_segment): Use as_bad_where rather than as_bad.
Wed Sep 7 17:21:12 1994 Steve Chamberlain (sac@jonny.cygnus.com)
* config/tc-{h8300,sh}.[ch] (tc_coff_symbol_emit): Function doing nothing
becomes macro doing nothing.
* config/tc-{h8300,sh}.[ch] (tc_coff_symbol_emit): Function doing
nothing becomes macro doing nothing.
Wed Sep 7 19:10:09 1994 Ken Raeburn (raeburn@cujo.cygnus.com)

View File

@ -22,51 +22,9 @@
#include "obstack.h"
#include "subsegs.h"
#ifdef BFD_ASSEMBLER
static symbolS *tag_find_or_make PARAMS ((char *name));
static symbolS *tag_find PARAMS ((char *name));
static void tag_init PARAMS ((void));
static void tag_insert PARAMS ((const char *name, symbolS * symbolP));
const char *s_get_name PARAMS ((symbolS * s));
static void obj_coff_def PARAMS ((int));
static void obj_coff_dim PARAMS ((int));
static void obj_coff_endef PARAMS ((int));
static void obj_coff_line PARAMS ((int));
static void obj_coff_ln PARAMS ((int));
static void obj_coff_scl PARAMS ((int));
static void obj_coff_size PARAMS ((int));
static void obj_coff_tag PARAMS ((int));
static void obj_coff_type PARAMS ((int));
static void obj_coff_val PARAMS ((int));
static void SA_SET_SYM_TAGNDX PARAMS ((symbolS *, symbolS *));
static struct hash_control *tag_hash;
static symbolS *def_symbol_in_progress;
const pseudo_typeS obj_pseudo_table[] =
{
{"def", obj_coff_def, 0},
{"dim", obj_coff_dim, 0},
{"endef", obj_coff_endef, 0},
{"line", obj_coff_line, 0},
{"ln", obj_coff_ln, 0},
{"appline", obj_coff_ln, 1},
{"scl", obj_coff_scl, 0},
{"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 },
{"ident", s_ignore, 0}, /* we don't yet handle this. */
{"optim", s_ignore, 0}, /* For sun386i cc (?) */
/* other stuff */
{"ABORT", s_abort, 0},
{NULL} /* end sentinel */
}; /* obj_pseudo_table */
/* stack stuff */
typedef struct
@ -102,6 +60,8 @@ stack_init (chunk_size, element_size)
return st;
}
#if 0
/* Not currently used. */
static void
stack_delete (st)
stack *st;
@ -109,6 +69,7 @@ stack_delete (st)
free (st->data);
free (st);
}
#endif
static char *
stack_push (st, element)
@ -143,6 +104,8 @@ stack_pop (st)
* Maintain a list of the tagnames of the structres.
*/
static struct hash_control *tag_hash;
static void
tag_init ()
{
@ -163,6 +126,17 @@ tag_insert (name, symbolP)
}
}
static symbolS *
tag_find (name)
char *name;
{
#ifdef STRIP_UNDERSCORE
if (*name == '_')
name++;
#endif /* STRIP_UNDERSCORE */
return (symbolS *) hash_find (tag_hash, name);
}
static symbolS *
tag_find_or_make (name)
char *name;
@ -175,23 +149,20 @@ tag_find_or_make (name)
0, &zero_address_frag);
tag_insert (S_GET_NAME (symbolP), symbolP);
#ifdef BFD_ASSEMBLER
symbol_table_insert (symbolP);
#endif
} /* not found */
return symbolP;
}
static symbolS *
tag_find (name)
char *name;
{
#ifdef STRIP_UNDERSCORE
if (*name == '_')
name++;
#endif /* STRIP_UNDERSCORE */
return (symbolS *) hash_find (tag_hash, name);
}
#ifdef BFD_ASSEMBLER
static void SA_SET_SYM_TAGNDX PARAMS ((symbolS *, symbolS *));
struct line_no {
struct line_no *next;
fragS *frag;
@ -970,7 +941,8 @@ coff_frob_symbol (symp, punt)
}
else if (S_GET_STORAGE_CLASS (symp) == C_NULL)
{
if (S_GET_SEGMENT (symp) == text_section)
if (S_GET_SEGMENT (symp) == text_section
&& symp != seg_info (text_section)->sym)
S_SET_STORAGE_CLASS (symp, C_LABEL);
else
S_SET_STORAGE_CLASS (symp, C_STAT);
@ -1273,6 +1245,9 @@ symbol_dump ()
#define NOP_OPCODE 0x00
#endif
/* The zeroes if symbol name is longer than 8 chars */
#define S_SET_ZEROES(s,v) ((s)->sy_symbol.ost_entry.n_zeroes = (v))
#define MIN(a,b) ((a) < (b)? (a) : (b))
/* This vector is used to turn an internal segment into a section #
suitable for insertion into a coff symbol table
@ -1309,7 +1284,7 @@ static symbolS *last_line_symbol;
negatives. This vector is used by S_GET_SEGMENT to turn a coff
section number into a segment number
*/
static symbolS *previous_file_symbol = NULL;
static symbolS *previous_file_symbol;
void c_symbol_merge ();
static int line_base;
@ -1330,14 +1305,8 @@ static void fill_section PARAMS ((bfd * abfd,
unsigned long *));
static symbolS *tag_find_or_make PARAMS ((char *name));
static symbolS *tag_find PARAMS ((char *name));
static void tag_init PARAMS ((void));
static void tag_insert PARAMS ((char *name, symbolS * symbolP));
char *s_get_name PARAMS ((symbolS * s));
static int c_line_new PARAMS ((symbolS * symbol, long paddr,
unsigned short line_number,
int line_number,
fragS * frag));
@ -1346,20 +1315,6 @@ static void w_symbols PARAMS ((bfd * abfd, char *where,
static void adjust_stab_section PARAMS ((bfd *abfd, segT seg));
static struct hash_control *tag_hash;
static symbolS *def_symbol_in_progress = NULL;
static void obj_coff_def PARAMS ((int));
static void obj_coff_dim PARAMS ((int));
static void obj_coff_endef PARAMS ((int));
static void obj_coff_line PARAMS ((int));
static void obj_coff_ln PARAMS ((int));
static void obj_coff_scl PARAMS ((int));
static void obj_coff_size PARAMS ((int));
static void obj_coff_tag PARAMS ((int));
static void obj_coff_type PARAMS ((int));
static void obj_coff_val PARAMS ((int));
static void obj_coff_lcomm PARAMS ((int));
static void obj_coff_text PARAMS ((int));
static void obj_coff_data PARAMS ((int));
@ -1367,158 +1322,6 @@ static void obj_coff_bss PARAMS ((int));
static void obj_coff_ident PARAMS ((int));
void obj_coff_section PARAMS ((int));
const pseudo_typeS obj_pseudo_table[] =
{
{"def", obj_coff_def, 0},
{"dim", obj_coff_dim, 0},
{"endef", obj_coff_endef, 0},
{"line", obj_coff_line, 0},
{"ln", obj_coff_ln, 0},
{"appline", obj_coff_ln, 1},
{"scl", obj_coff_scl, 0},
{"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},
{"use", obj_coff_section, 0},
{"sect", obj_coff_section, 0},
{"text", obj_coff_text, 0},
{"data", obj_coff_data, 0},
{"bss", obj_coff_bss, 0},
{"ident", obj_coff_ident, 0},
{"ABORT", s_abort, 0},
{"lcomm", obj_coff_lcomm, 0},
#ifdef TC_M88K
/* The m88k uses sdef instead of def. */
{"sdef", obj_coff_def, 0},
#endif
{NULL} /* end sentinel */
}; /* obj_pseudo_table */
/* stack stuff */
typedef struct
{
unsigned long chunk_size;
unsigned long element_size;
unsigned long size;
char *data;
unsigned long pointer;
}
stack;
static stack *
stack_init (chunk_size, element_size)
unsigned long chunk_size;
unsigned long element_size;
{
stack *st;
st = (stack *) malloc (sizeof (stack));
if (!st)
return 0;
st->data = malloc (chunk_size);
if (!st->data)
{
free (st);
return 0;
}
st->pointer = 0;
st->size = chunk_size;
st->chunk_size = chunk_size;
st->element_size = element_size;
return st;
}
static void
stack_delete (st)
stack *st;
{
free (st->data);
free (st);
}
static char *
stack_push (st, element)
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;
}
memcpy (st->data + st->pointer, element, st->element_size);
st->pointer += st->element_size;
return st->data + st->pointer;
}
static char *
stack_pop (st)
stack *st;
{
if (st->pointer < st->element_size)
{
st->pointer = 0;
return (char *) 0;
}
st->pointer -= st->element_size;
return st->data + st->pointer;
}
/*
* Maintain a list of the tagnames of the structres.
*/
static void
tag_init ()
{
tag_hash = hash_new ();
}
static void
tag_insert (name, symbolP)
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);
}
}
static symbolS *
tag_find_or_make (name)
char *name;
{
symbolS *symbolP;
if ((symbolP = tag_find (name)) == NULL)
{
symbolP = symbol_new (name, undefined_section,
0, &zero_address_frag);
tag_insert (S_GET_NAME (symbolP), symbolP);
} /* not found */
return symbolP;
}
static symbolS *
tag_find (name)
char *name;
{
#ifdef STRIP_UNDERSCORE
if (*name == '_')
name++;
#endif /* STRIP_UNDERSCORE */
return (symbolS *) hash_find (tag_hash, name);
}
/* Section stuff
We allow more than just the standard 3 sections, infact, we allow
@ -1535,7 +1338,7 @@ typedef struct
int i;
} seg_info_type;
seg_info_type seg_info_off_by_4[N_SEG] =
static const seg_info_type seg_info_off_by_4[N_SEG] =
{
{SEG_PTV, },
{SEG_NTV, },
@ -1567,8 +1370,6 @@ seg_info_type seg_info_off_by_4[N_SEG] =
#define SEG_INFO_FROM_SECTION_NUMBER(x) (seg_info_off_by_4[(x)+4])
#define SEG_INFO_FROM_SEG_NUMBER(x) (seg_info_off_by_4[(x)])
static relax_addressT
relax_align (address, alignment)
@ -1581,7 +1382,7 @@ relax_align (address, alignment)
mask = ~((~0) << alignment);
new_address = (address + mask) & (~mask);
return (new_address - address);
} /* relax_align() */
}
segT
@ -1608,7 +1409,7 @@ size_section (abfd, idx)
size = frag->fr_address;
if (frag->fr_address != size)
{
printf ("Out of step\n");
fprintf (stderr, "Out of step\n");
size = frag->fr_address;
}
@ -2541,11 +2342,11 @@ obj_read_begin_hook ()
externals onto another chain */
/* The chain of externals */
symbolS *symbol_externP = NULL;
symbolS *symbol_extern_lastP = NULL;
symbolS *symbol_externP;
symbolS *symbol_extern_lastP;
stack *block_stack;
symbolS *last_functionP = NULL;
symbolS *last_functionP;
symbolS *last_tagP;
static unsigned int
@ -2999,10 +2800,10 @@ write_object_file ()
frchain_ptr != (struct frchain *) NULL;
frchain_ptr = frchain_ptr->frch_next)
{
/* 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 */
/* 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. */
subseg_set (frchain_ptr->frch_seg, frchain_ptr->frch_subseg);
#ifndef SUB_SEGMENT_ALIGN
@ -3043,6 +2844,10 @@ write_object_file ()
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. */
segment_info[i].scnhdr.s_align = section_alignment[i];
if (i == SEG_E0)
H_SET_TEXT_SIZE (&headers, size);
else if (i == SEG_E1)
@ -3097,6 +2902,9 @@ write_object_file ()
#else
H_SET_TIME_STAMP (&headers, 0);
#endif
#ifdef TC_COFF_SET_MACHINE
TC_COFF_SET_MACHINE (&headers);
#endif
#ifdef KEEP_RELOC_INFO
H_SET_FLAGS (&headers, ((H_GET_LINENO_SIZE(&headers) ? 0 : F_LNNO) |
@ -3327,7 +3135,7 @@ static int
c_line_new (symbol, paddr, line_number, frag)
symbolS * symbol;
long paddr;
unsigned short line_number;
int line_number;
fragS * frag;
{
struct lineno_list *new_line =
@ -3604,15 +3412,16 @@ fixup_segment (segP, this_segment_type)
size = fixP->fx_size;
add_symbolP = fixP->fx_addsy;
#ifdef TC_I960
if (fixP->fx_tcbit && TC_S_IS_CALLNAME (add_symbolP))
if (fixP->fx_tcbit && SF_GET_CALLNAME (add_symbolP))
{
/* Relocation should be done via the associated 'bal' entry
point symbol. */
if (!TC_S_IS_BALNAME (tc_get_bal_of_call (add_symbolP)))
if (!SF_GET_BALNAME (tc_get_bal_of_call (add_symbolP)))
{
as_bad ("No 'bal' entry point for leafproc %s",
S_GET_NAME (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);
@ -3634,7 +3443,9 @@ fixup_segment (segP, this_segment_type)
/* Its just -sym */
if (S_GET_SEGMENT (sub_symbolP) != absolute_section)
{
as_bad ("Negative of non-absolute symbol %s", S_GET_NAME (sub_symbolP));
as_bad_where (fixP->fx_file, fixP->fx_line,
"Negative of non-absolute symbol %s",
S_GET_NAME (sub_symbolP));
} /* not absolute */
add_number -= S_GET_VALUE (sub_symbolP);
@ -3655,7 +3466,8 @@ fixup_segment (segP, this_segment_type)
as the target of a call instruction. */
if (fixP->fx_tcbit)
{
as_bad ("callj to difference of 2 symbols");
as_bad_where (fixP->fx_file, fixP->fx_line,
"callj to difference of 2 symbols");
}
#endif /* TC_I960 */
add_number += S_GET_VALUE (add_symbolP) -
@ -3692,10 +3504,11 @@ fixup_segment (segP, this_segment_type)
#endif
else
{
as_bad ("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));
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 absolute */
}
} /* if sub_symbolP */
@ -3763,7 +3576,8 @@ fixup_segment (segP, this_segment_type)
* for local branches: flag as error, don't generate
* relocation.
*/
as_bad ("can't use COBR format with external label");
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;
@ -3813,9 +3627,10 @@ fixup_segment (segP, this_segment_type)
(size == 2 &&
(add_number & ~0xFFFF) && ((add_number & ~0xFFFF) != (-1 & ~0xFFFF))))
{
as_bad ("Value of %ld too large for field of %d bytes at 0x%lx",
(long) add_number, size,
(unsigned long) (fragP->fr_address + where));
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));
} /* generic error checking */
#endif
#ifdef WARN_SIGNED_OVERFLOW_WORD
@ -3826,9 +3641,10 @@ fixup_segment (segP, this_segment_type)
if (!flag_signed_overflow_ok
&& size == 2
&& add_number > 0x7fff)
as_bad ("Signed .word overflow; switch may be too large; %ld at 0x%lx",
(long) add_number,
(unsigned long) (fragP->fr_address + where));
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
} /* not a bit fix */
/* once this fix has been applied, we don't have to output anything
@ -3913,5 +3729,38 @@ adjust_stab_section(abfd, seg)
bfd_h_put_32 (abfd, (bfd_vma) strsz, (bfd_byte *) p + 8);
}
#endif /* not BFD_ASSEMBLER */
const pseudo_typeS obj_pseudo_table[] =
{
{"def", obj_coff_def, 0},
{"dim", obj_coff_dim, 0},
{"endef", obj_coff_endef, 0},
{"line", obj_coff_line, 0},
{"ln", obj_coff_ln, 0},
{"appline", obj_coff_ln, 1},
{"scl", obj_coff_scl, 0},
{"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},
#ifndef BFD_ASSEMBLER
{"use", obj_coff_section, 0},
{"sect", obj_coff_section, 0},
{"text", obj_coff_text, 0},
{"data", obj_coff_data, 0},
{"bss", obj_coff_bss, 0},
{"lcomm", obj_coff_lcomm, 0},
{"ident", obj_coff_ident, 0},
#else
{"optim", s_ignore, 0}, /* For sun386i cc (?) */
{"ident", s_ignore, 0}, /* we don't yet handle this. */
#endif
{"ABORT", s_abort, 0},
#ifdef TC_M88K
/* The m88k uses sdef instead of def. */
{"sdef", obj_coff_def, 0},
#endif
{NULL} /* end sentinel */
}; /* obj_pseudo_table */