Fix formatting.

This commit is contained in:
Nick Clifton 2000-07-20 20:07:09 +00:00
parent 03d5f569de
commit efaf0ba464
2 changed files with 304 additions and 307 deletions

View File

@ -21,6 +21,7 @@
2000-07-20 Kazu Hirata <kazu@hxi.com>
* read.c: Fix formatting.
* write.c: Fix formatting.
2000-07-19 H.J. Lu <hjl@gnu.org>

View File

@ -1,5 +1,5 @@
/* write.c - emit .o file
Copyright (C) 1986, 87, 90, 91, 92, 93, 94, 95, 96, 97, 98, 1999
Copyright (C) 1986, 87, 90, 91, 92, 93, 94, 95, 96, 97, 98, 99, 2000
Free Software Foundation, Inc.
This file is part of GAS, the GNU Assembler.
@ -136,11 +136,8 @@ static void relax_and_size_all_segments PARAMS ((void));
static void set_segment_vma PARAMS ((bfd *, asection *, PTR));
#endif
/*
* fix_new()
*
* Create a fixS in obstack 'notes'.
*/
/* Create a fixS in obstack 'notes'. */
static fixS *
fix_new_internal (frag, where, size, add_symbol, sub_symbol, offset, pcrel,
r_type)
@ -152,9 +149,9 @@ fix_new_internal (frag, where, size, add_symbol, sub_symbol, offset, pcrel,
offsetT offset; /* X_add_number. */
int pcrel; /* TRUE if PC-relative relocation. */
#ifdef BFD_ASSEMBLER
bfd_reloc_code_real_type r_type; /* Relocation type */
bfd_reloc_code_real_type r_type; /* Relocation type. */
#else
int r_type; /* Relocation type */
int r_type; /* Relocation type. */
#endif
{
fixS *fixP;
@ -195,7 +192,7 @@ fix_new_internal (frag, where, size, add_symbol, sub_symbol, offset, pcrel,
#endif
#ifdef TC_FIX_TYPE
TC_INIT_FIX_DATA(fixP);
TC_INIT_FIX_DATA (fixP);
#endif
as_where (&fixP->fx_file, &fixP->fx_line);
@ -204,7 +201,6 @@ fix_new_internal (frag, where, size, add_symbol, sub_symbol, offset, pcrel,
comparing to older versions of gas that have relocs
reverse sorted, it is convenient to have this compile
time option. xoxorich. */
{
#ifdef BFD_ASSEMBLER
@ -232,7 +228,6 @@ fix_new_internal (frag, where, size, add_symbol, sub_symbol, offset, pcrel,
*seg_fix_tailP = fixP;
#endif /* REVERSE_SORT_RELOCS */
}
return fixP;
@ -249,9 +244,9 @@ fix_new (frag, where, size, add_symbol, offset, pcrel, r_type)
offsetT offset; /* X_add_number. */
int pcrel; /* TRUE if PC-relative relocation. */
#ifdef BFD_ASSEMBLER
bfd_reloc_code_real_type r_type; /* Relocation type */
bfd_reloc_code_real_type r_type; /* Relocation type. */
#else
int r_type; /* Relocation type */
int r_type; /* Relocation type. */
#endif
{
return fix_new_internal (frag, where, size, add_symbol,
@ -270,9 +265,9 @@ fix_new_exp (frag, where, size, exp, pcrel, r_type)
expressionS *exp; /* Expression. */
int pcrel; /* TRUE if PC-relative relocation. */
#ifdef BFD_ASSEMBLER
bfd_reloc_code_real_type r_type; /* Relocation type */
bfd_reloc_code_real_type r_type; /* Relocation type. */
#else
int r_type; /* Relocation type */
int r_type; /* Relocation type. */
#endif
{
symbolS *add = NULL;
@ -289,10 +284,12 @@ fix_new_exp (frag, where, size, exp, pcrel, r_type)
the difference expression cannot immediately be reduced. */
{
symbolS *stmp = make_expr_symbol (exp);
exp->X_op = O_symbol;
exp->X_op_symbol = 0;
exp->X_add_symbol = stmp;
exp->X_add_number = 0;
return fix_new_exp (frag, where, size, exp, pcrel, r_type);
}
@ -306,7 +303,7 @@ fix_new_exp (frag, where, size, exp, pcrel, r_type)
#if defined(TC_RVA_RELOC)
r_type = TC_RVA_RELOC;
#else
as_fatal(_("rva not supported"));
as_fatal (_("rva not supported"));
#endif
#endif
break;
@ -331,8 +328,7 @@ fix_new_exp (frag, where, size, exp, pcrel, r_type)
break;
}
return fix_new_internal (frag, where, size, add, sub, off,
pcrel, r_type);
return fix_new_internal (frag, where, size, add, sub, off, pcrel, r_type);
}
/* Append a string onto another string, bumping the pointer along. */
@ -354,15 +350,14 @@ append (charPP, fromP, length)
int section_alignment[SEG_MAXIMUM_ORDINAL];
#endif
/*
* This routine records the largest alignment seen for each segment.
* If the beginning of the segment is aligned on the worst-case
* boundary, all of the other alignments within it will work. At
* least one object format really uses this info.
*/
/* This routine records the largest alignment seen for each segment.
If the beginning of the segment is aligned on the worst-case
boundary, all of the other alignments within it will work. At
least one object format really uses this info. */
void
record_alignment (seg, align)
/* Segment to which alignment pertains */
/* Segment to which alignment pertains. */
segT seg;
/* Alignment, as a power of 2 (e.g., 1 => 2-byte boundary, 2 => 4-byte
boundary, etc.) */
@ -476,7 +471,7 @@ remove_subsegs (head, seg, root, last)
#ifdef BFD_ASSEMBLER
static void
cvt_frag_to_fill (sec, fragP)
segT sec;
segT sec ATTRIBUTE_UNUSED;
fragS *fragP;
#else
static void
@ -542,11 +537,9 @@ cvt_frag_to_fill (headersP, sec, fragP)
|| ((offsetT) (fragP->fr_next->fr_address - fragP->fr_address)
== fragP->fr_fix));
/*
* After md_convert_frag, we make the frag into a ".space 0".
* Md_convert_frag() should set up any fixSs and constants
* required.
*/
/* After md_convert_frag, we make the frag into a ".space 0".
md_convert_frag() should set up any fixSs and constants
required. */
frag_wane (fragP);
break;
@ -603,7 +596,8 @@ relax_and_size_seg (abfd, sec, xxx)
for (fragp = seginfo->frchainP->frch_root;
fragp->fr_next;
fragp = fragp->fr_next)
/* walk to last elt */;
/* Walk to last elt. */
;
size = fragp->fr_address + fragp->fr_fix;
}
else
@ -700,7 +694,8 @@ adjust_reloc_syms (abfd, sec, xxx)
for (fixp = seginfo->fix_root; fixp; fixp = fixp->fx_next)
if (fixp->fx_done)
/* ignore it */;
/* Ignore it. */
;
else if (fixp->fx_addsy)
{
symbolS *sym;
@ -871,7 +866,7 @@ adjust_reloc_syms (abfd, sec, xxx)
done:
;
}
#if 1/*def RELOC_REQUIRES_SYMBOL*/
#if 1 /* def RELOC_REQUIRES_SYMBOL */
else
{
/* There was no symbol required by this relocation. However,
@ -880,7 +875,9 @@ adjust_reloc_syms (abfd, sec, xxx)
a local symbol in the absolute section. */
fixp->fx_addsy = section_symbol (absolute_section);
/* fixp->fx_addsy->sy_used_in_reloc = 1; */
#if 0
fixp->fx_addsy->sy_used_in_reloc = 1;
#endif
}
#endif
@ -914,7 +911,7 @@ write_relocs (abfd, sec, xxx)
#ifndef RELOC_EXPANSION_POSSIBLE
/* Set up reloc information as well. */
relocs = (arelent **) xmalloc (n * sizeof (arelent *));
memset ((char*)relocs, 0, n * sizeof (arelent*));
memset ((char *) relocs, 0, n * sizeof (arelent *));
i = 0;
for (fixp = seginfo->fix_root; fixp != (fixS *) NULL; fixp = fixp->fx_next)
@ -1016,7 +1013,7 @@ write_relocs (abfd, sec, xxx)
for (j = 0; reloc[j]; j++)
{
relocs[i++] = reloc[j];
assert(i <= n);
assert (i <= n);
}
data = fixp->fx_frag->fr_literal + fixp->fx_where;
if (fixp->fx_where + fixp->fx_size
@ -1104,7 +1101,7 @@ write_contents (abfd, sec, xxx)
/* Write out the frags. */
if (seginfo == NULL
|| ! (bfd_get_section_flags (abfd, sec) & SEC_HAS_CONTENTS))
|| !(bfd_get_section_flags (abfd, sec) & SEC_HAS_CONTENTS))
return;
for (f = seginfo->frchainP->frch_root;
@ -1137,7 +1134,7 @@ write_contents (abfd, sec, xxx)
if (fill_size && count)
{
char buf[256];
if (fill_size > sizeof(buf))
if (fill_size > sizeof (buf))
{
/* Do it the old way. Can this ever happen? */
while (count--)
@ -1149,7 +1146,8 @@ write_contents (abfd, sec, xxx)
if (x == false)
{
bfd_perror (stdoutput->filename);
as_perror (_("FATAL: Can't write %s"), stdoutput->filename);
as_perror (_("FATAL: Can't write %s"),
stdoutput->filename);
exit (EXIT_FAILURE);
}
offset += fill_size;
@ -1169,15 +1167,15 @@ write_contents (abfd, sec, xxx)
else
{
char *bufp;
n_per_buf = sizeof(buf)/fill_size;
n_per_buf = sizeof (buf) / fill_size;
for (i = n_per_buf, bufp = buf; i; i--, bufp += fill_size)
memcpy(bufp, fill_literal, fill_size);
memcpy (bufp, fill_literal, fill_size);
}
for (; count > 0; count -= n_per_buf)
{
n_per_buf = n_per_buf > count ? count : n_per_buf;
x = bfd_set_section_contents (stdoutput, sec,
buf, (file_ptr) offset,
x = bfd_set_section_contents
(stdoutput, sec, buf, (file_ptr) offset,
(bfd_size_type) n_per_buf * fill_size);
if (x != true)
as_fatal (_("Cannot write to output file."));
@ -1228,26 +1226,23 @@ relax_and_size_all_segments ()
relax_segment (text_frag_root, SEG_TEXT);
relax_segment (data_frag_root, SEG_DATA);
relax_segment (bss_frag_root, SEG_BSS);
/*
* Now the addresses of frags are correct within the segment.
*/
/* Now the addresses of frags are correct within the segment. */
know (text_last_frag->fr_type == rs_fill && text_last_frag->fr_offset == 0);
H_SET_TEXT_SIZE (&headers, text_last_frag->fr_address);
text_last_frag->fr_address = H_GET_TEXT_SIZE (&headers);
/*
* Join the 2 segments into 1 huge segment.
* To do this, re-compute every rn_address in the SEG_DATA frags.
* Then join the data frags after the text frags.
*
* Determine a_data [length of data segment].
*/
/* Join the 2 segments into 1 huge segment.
To do this, re-compute every rn_address in the SEG_DATA frags.
Then join the data frags after the text frags.
Determine a_data [length of data segment]. */
if (data_frag_root)
{
register relax_addressT slide;
know ((text_last_frag->fr_type == rs_fill) && (text_last_frag->fr_offset == 0));
know ((text_last_frag->fr_type == rs_fill)
&& (text_last_frag->fr_offset == 0));
H_SET_DATA_SIZE (&headers, data_last_frag->fr_address);
data_last_frag->fr_address = H_GET_DATA_SIZE (&headers);
@ -1263,9 +1258,7 @@ relax_and_size_all_segments ()
#endif
for (fragP = data_frag_root; fragP; fragP = fragP->fr_next)
{
fragP->fr_address += slide;
} /* for each data frag */
know (text_last_frag != 0);
text_last_frag->fr_next = data_frag_root;
@ -1292,15 +1285,13 @@ relax_and_size_all_segments ()
#endif /* ! OBJ_BOUT */
/* Slide all the frags */
/* Slide all the frags. */
if (bss_frag_root)
{
relax_addressT slide = bss_address_frag.fr_address;
for (fragP = bss_frag_root; fragP; fragP = fragP->fr_next)
{
fragP->fr_address += slide;
} /* for each bss frag */
}
if (bss_last_frag)
@ -1400,7 +1391,6 @@ subsegs_finish ()
For this segment ...
Create a last frag. Do not leave a "being filled in frag". */
frag_wane (frag_now);
frag_now->fr_fix = 0;
know (frag_now->fr_next == NULL);
@ -1506,27 +1496,23 @@ write_object_file ()
#endif
#ifndef BFD_ASSEMBLER
/*
*
* Crawl the symbol chain.
*
* For each symbol whose value depends on a frag, take the address of
* that frag and subsume it into the value of the symbol.
* After this, there is just one way to lookup a symbol value.
* Values are left in their final state for object file emission.
* We adjust the values of 'L' local symbols, even if we do
* not intend to emit them to the object file, because their values
* are needed for fix-ups.
*
* Unless we saw a -L flag, remove all symbols that begin with 'L'
* from the symbol chain. (They are still pointed to by the fixes.)
*
* Count the remaining symbols.
* Assign a symbol number to each symbol.
* Count the number of string-table chars we will emit.
* Put this info into the headers as appropriate.
*
*/
/* Crawl the symbol chain.
For each symbol whose value depends on a frag, take the address of
that frag and subsume it into the value of the symbol.
After this, there is just one way to lookup a symbol value.
Values are left in their final state for object file emission.
We adjust the values of 'L' local symbols, even if we do
not intend to emit them to the object file, because their values
are needed for fix-ups.
Unless we saw a -L flag, remove all symbols that begin with 'L'
from the symbol chain. (They are still pointed to by the fixes.)
Count the remaining symbols.
Assign a symbol number to each symbol.
Count the number of string-table chars we will emit.
Put this info into the headers as appropriate. */
know (zero_address_frag.fr_address == 0);
string_byte_count = sizeof (string_byte_count);
@ -1537,12 +1523,10 @@ write_object_file ()
H_SET_STRING_SIZE (&headers, string_byte_count);
/*
* Addresses of frags now reflect addresses we use in the object file.
* Symbol values are correct.
* Scan the frags, converting any ".org"s and ".align"s to ".fill"s.
* Also converting any machine-dependent frags using md_convert_frag();
*/
/* Addresses of frags now reflect addresses we use in the object file.
Symbol values are correct.
Scan the frags, converting any ".org"s and ".align"s to ".fill"s.
Also converting any machine-dependent frags using md_convert_frag(); */
subseg_change (SEG_TEXT, 0);
for (fragP = text_frag_root; fragP; fragP = fragP->fr_next)
@ -1630,26 +1614,32 @@ write_object_file ()
/* Find out how many broken_words go here. */
n = 0;
for (untruth = lie; untruth && untruth->dispfrag == fragP; untruth = untruth->next_broken_word)
for (untruth = lie;
untruth && untruth->dispfrag == fragP;
untruth = untruth->next_broken_word)
if (untruth->added == 1)
n++;
table_ptr = lie->dispfrag->fr_opcode;
table_addr = lie->dispfrag->fr_address + (table_ptr - lie->dispfrag->fr_literal);
table_addr = (lie->dispfrag->fr_address
+ (table_ptr - lie->dispfrag->fr_literal));
/* Create the jump around the long jumps. This is a short
jump from table_ptr+0 to table_ptr+n*long_jump_size. */
from_addr = table_addr;
to_addr = table_addr + md_short_jump_size + n * md_long_jump_size;
md_create_short_jump (table_ptr, from_addr, to_addr, lie->dispfrag, lie->add);
md_create_short_jump (table_ptr, from_addr, to_addr, lie->dispfrag,
lie->add);
table_ptr += md_short_jump_size;
table_addr += md_short_jump_size;
for (m = 0; lie && lie->dispfrag == fragP; m++, lie = lie->next_broken_word)
for (m = 0;
lie && lie->dispfrag == fragP;
m++, lie = lie->next_broken_word)
{
if (lie->added == 2)
continue;
/* Patch the jump table */
/* This is the offset from ??? to table_ptr+0 */
/* Patch the jump table. */
/* This is the offset from ??? to table_ptr+0. */
to_addr = table_addr - S_GET_VALUE (lie->sub);
#ifdef BFD_ASSEMBLER
to_addr -= symbol_get_frag (lie->sub)->fr_address;
@ -1658,20 +1648,23 @@ write_object_file ()
TC_CHECK_ADJUSTED_BROKEN_DOT_WORD (to_addr, lie);
#endif
md_number_to_chars (lie->word_goes_here, to_addr, 2);
for (untruth = lie->next_broken_word; untruth && untruth->dispfrag == fragP; untruth = untruth->next_broken_word)
for (untruth = lie->next_broken_word;
untruth && untruth->dispfrag == fragP;
untruth = untruth->next_broken_word)
{
if (untruth->use_jump == lie)
md_number_to_chars (untruth->word_goes_here, to_addr, 2);
}
/* Install the long jump */
/* this is a long jump from table_ptr+0 to the final target */
/* Install the long jump. */
/* This is a long jump from table_ptr+0 to the final target. */
from_addr = table_addr;
to_addr = S_GET_VALUE (lie->add) + lie->addnum;
#ifdef BFD_ASSEMBLER
to_addr += symbol_get_frag (lie->add)->fr_address;
#endif
md_create_long_jump (table_ptr, from_addr, to_addr, lie->dispfrag, lie->add);
md_create_long_jump (table_ptr, from_addr, to_addr, lie->dispfrag,
lie->add);
table_ptr += md_long_jump_size;
table_addr += md_long_jump_size;
}
@ -1684,10 +1677,8 @@ write_object_file ()
{ /* not vms */
char *the_object_file;
long object_file_size;
/*
* Scan every FixS performing fixups. We had to wait until now to do
* this because md_convert_frag() may have made some fixSs.
*/
/* Scan every FixS performing fixups. We had to wait until now to
do this because md_convert_frag() may have made some fixSs. */
int trsize, drsize;
subseg_change (SEG_TEXT, 0);
@ -1696,11 +1687,11 @@ write_object_file ()
drsize = md_reloc_size * fixup_segment (data_fix_root, SEG_DATA);
H_SET_RELOCATION_SIZE (&headers, trsize, drsize);
/* FIXME move this stuff into the pre-write-hook */
/* FIXME: Move this stuff into the pre-write-hook. */
H_SET_MAGIC_NUMBER (&headers, magic_number_for_object_file);
H_SET_ENTRY_POINT (&headers, 0);
obj_pre_write_hook (&headers); /* extra coff stuff */
obj_pre_write_hook (&headers); /* Extra coff stuff. */
object_file_size = H_GET_FILE_SIZE (&headers);
next_object_file_charP = the_object_file = xmalloc (object_file_size);
@ -1709,11 +1700,10 @@ write_object_file ()
obj_header_append (&next_object_file_charP, &headers);
know ((next_object_file_charP - the_object_file) == H_GET_HEADER_SIZE (&headers));
know ((next_object_file_charP - the_object_file)
== H_GET_HEADER_SIZE (&headers));
/*
* Emit code.
*/
/* Emit code. */
for (fragP = text_frag_root; fragP; fragP = fragP->fr_next)
{
register long count;
@ -1722,72 +1712,85 @@ write_object_file ()
PROGRESS (1);
know (fragP->fr_type == rs_fill);
append (&next_object_file_charP, fragP->fr_literal, (unsigned long) fragP->fr_fix);
append (&next_object_file_charP, fragP->fr_literal,
(unsigned long) fragP->fr_fix);
fill_literal = fragP->fr_literal + fragP->fr_fix;
fill_size = fragP->fr_var;
know (fragP->fr_offset >= 0);
for (count = fragP->fr_offset; count; count--)
{
append (&next_object_file_charP, fill_literal, (unsigned long) fill_size);
} /* for each */
append (&next_object_file_charP, fill_literal,
(unsigned long) fill_size);
}
} /* for each code frag. */
know ((next_object_file_charP - the_object_file)
== (H_GET_HEADER_SIZE (&headers)
+ H_GET_TEXT_SIZE (&headers)
+ H_GET_DATA_SIZE (&headers)));
know ((next_object_file_charP - the_object_file) == (H_GET_HEADER_SIZE (&headers) + H_GET_TEXT_SIZE (&headers) + H_GET_DATA_SIZE (&headers)));
/*
* Emit relocations.
*/
obj_emit_relocations (&next_object_file_charP, text_fix_root, (relax_addressT) 0);
know ((next_object_file_charP - the_object_file) == (H_GET_HEADER_SIZE (&headers) + H_GET_TEXT_SIZE (&headers) + H_GET_DATA_SIZE (&headers) + H_GET_TEXT_RELOCATION_SIZE (&headers)));
/* Emit relocations. */
obj_emit_relocations (&next_object_file_charP, text_fix_root,
(relax_addressT) 0);
know ((next_object_file_charP - the_object_file)
== (H_GET_HEADER_SIZE (&headers)
+ H_GET_TEXT_SIZE (&headers)
+ H_GET_DATA_SIZE (&headers)
+ H_GET_TEXT_RELOCATION_SIZE (&headers)));
#ifdef TC_I960
/* Make addresses in data relocation directives relative to beginning of
* first data fragment, not end of last text fragment: alignment of the
* start of the data segment may place a gap between the segments.
*/
obj_emit_relocations (&next_object_file_charP, data_fix_root, data0_frchainP->frch_root->fr_address);
first data fragment, not end of last text fragment: alignment of the
start of the data segment may place a gap between the segments. */
obj_emit_relocations (&next_object_file_charP, data_fix_root,
data0_frchainP->frch_root->fr_address);
#else /* TC_I960 */
obj_emit_relocations (&next_object_file_charP, data_fix_root, text_last_frag->fr_address);
obj_emit_relocations (&next_object_file_charP, data_fix_root,
text_last_frag->fr_address);
#endif /* TC_I960 */
know ((next_object_file_charP - the_object_file) == (H_GET_HEADER_SIZE (&headers) + H_GET_TEXT_SIZE (&headers) + H_GET_DATA_SIZE (&headers) + H_GET_TEXT_RELOCATION_SIZE (&headers) + H_GET_DATA_RELOCATION_SIZE (&headers)));
know ((next_object_file_charP - the_object_file)
== (H_GET_HEADER_SIZE (&headers)
+ H_GET_TEXT_SIZE (&headers)
+ H_GET_DATA_SIZE (&headers)
+ H_GET_TEXT_RELOCATION_SIZE (&headers)
+ H_GET_DATA_RELOCATION_SIZE (&headers)));
/*
* Emit line number entries.
*/
/* Emit line number entries. */
OBJ_EMIT_LINENO (&next_object_file_charP, lineno_rootP, the_object_file);
know ((next_object_file_charP - the_object_file) == (H_GET_HEADER_SIZE (&headers) + H_GET_TEXT_SIZE (&headers) + H_GET_DATA_SIZE (&headers) + H_GET_TEXT_RELOCATION_SIZE (&headers) + H_GET_DATA_RELOCATION_SIZE (&headers) + H_GET_LINENO_SIZE (&headers)));
know ((next_object_file_charP - the_object_file)
== (H_GET_HEADER_SIZE (&headers)
+ H_GET_TEXT_SIZE (&headers)
+ H_GET_DATA_SIZE (&headers)
+ H_GET_TEXT_RELOCATION_SIZE (&headers)
+ H_GET_DATA_RELOCATION_SIZE (&headers)
+ H_GET_LINENO_SIZE (&headers)));
/*
* Emit symbols.
*/
/* Emit symbols. */
obj_emit_symbols (&next_object_file_charP, symbol_rootP);
know ((next_object_file_charP - the_object_file) == (H_GET_HEADER_SIZE (&headers) + H_GET_TEXT_SIZE (&headers) + H_GET_DATA_SIZE (&headers) + H_GET_TEXT_RELOCATION_SIZE (&headers) + H_GET_DATA_RELOCATION_SIZE (&headers) + H_GET_LINENO_SIZE (&headers) + H_GET_SYMBOL_TABLE_SIZE (&headers)));
/*
* Emit strings.
*/
know ((next_object_file_charP - the_object_file)
== (H_GET_HEADER_SIZE (&headers)
+ H_GET_TEXT_SIZE (&headers)
+ H_GET_DATA_SIZE (&headers)
+ H_GET_TEXT_RELOCATION_SIZE (&headers)
+ H_GET_DATA_RELOCATION_SIZE (&headers)
+ H_GET_LINENO_SIZE (&headers)
+ H_GET_SYMBOL_TABLE_SIZE (&headers)));
/* Emit strings. */
if (string_byte_count > 0)
{
obj_emit_strings (&next_object_file_charP);
} /* only if we have a string table */
#ifdef BFD_HEADERS
bfd_seek (stdoutput, 0, 0);
bfd_write (the_object_file, 1, object_file_size, stdoutput);
#else
/* Write the data to the file */
/* Write the data to the file. */
output_file_append (the_object_file, object_file_size, out_file_name);
free (the_object_file);
#endif
} /* non vms output */
}
#else /* OBJ_VMS */
/*
* Now do the VMS-dependent part of writing the object file
*/
/* Now do the VMS-dependent part of writing the object file. */
vms_write_object_file (H_GET_TEXT_SIZE (&headers),
H_GET_DATA_SIZE (&headers),
H_GET_BSS_SIZE (&headers),
@ -1815,7 +1818,7 @@ write_object_file ()
obj_frob_file_before_adjust ();
#endif
bfd_map_over_sections (stdoutput, adjust_reloc_syms, (char *)0);
bfd_map_over_sections (stdoutput, adjust_reloc_syms, (char *) 0);
/* Set up symbol table, and write it out. */
if (symbol_rootP)
@ -1839,7 +1842,8 @@ write_object_file ()
name = S_GET_NAME (symp);
if (name)
{
const char *name2 = decode_local_label_name ((char *)S_GET_NAME (symp));
const char *name2 =
decode_local_label_name ((char *) S_GET_NAME (symp));
/* They only differ if `name' is a fb or dollar local
label name. */
if (name2 != name && ! S_IS_DEFINED (symp))
@ -1896,10 +1900,10 @@ write_object_file ()
&& ! symbol_used_in_reloc_p (symp)))
{
symbol_remove (symp, &symbol_rootP, &symbol_lastP);
/* After symbol_remove, symbol_next(symp) still returns
the one that came after it in the chain. So we don't
need to do any extra cleanup work here. */
continue;
}
@ -1957,19 +1961,6 @@ write_object_file ()
}
#endif /* ! BFD */
/*
* relax_segment()
*
* Now we have a segment, not a crowd of sub-segments, we can make fr_address
* values.
*
* Relax the frags.
*
* After this, all frags in this segment have addresses that are correct
* within the segment. Since segments live in different file addresses,
* these frag addresses may not be the same as final object-file addresses.
*/
#ifdef TC_GENERIC_RELAX_TABLE
static int is_dnrange PARAMS ((fragS *, fragS *));
@ -2042,12 +2033,14 @@ relax_frag (fragP, stretch)
aim = target - address - fragP->fr_fix;
#ifdef TC_PCREL_ADJUST
/* Currently only the ns32k family needs this */
aim += TC_PCREL_ADJUST(fragP);
/*#else*/
/* Currently only the ns32k family needs this. */
aim += TC_PCREL_ADJUST (fragP);
/* #else */
/* This machine doesn't want to use pcrel_adjust.
In that case, pcrel_adjust should be zero. */
/* assert (fragP->fr_targ.ns32k.pcrel_adjust == 0);*/
#if 0
assert (fragP->fr_targ.ns32k.pcrel_adjust == 0);
#endif
#endif
#ifdef md_prepare_relax_scan /* formerly called M68K_AIM_KLUDGE */
md_prepare_relax_scan (fragP, address, aim, this_state, this_type);
@ -2111,6 +2104,16 @@ relax_align (address, alignment)
return (new_address - address);
}
/* Now we have a segment, not a crowd of sub-segments, we can make
fr_address values.
Relax the frags.
After this, all frags in this segment have addresses that are correct
within the segment. Since segments live in different file addresses,
these frag addresses may not be the same as final object-file
addresses. */
void
relax_segment (segment_frag_root, segment)
struct frag *segment_frag_root;
@ -2167,7 +2170,7 @@ relax_segment (segment_frag_root, segment)
break;
#ifndef WORKING_DOT_WORD
/* Broken words don't concern us yet */
/* Broken words don't concern us yet. */
case rs_broken_word:
break;
#endif
@ -2185,15 +2188,14 @@ relax_segment (segment_frag_root, segment)
default:
BAD_CASE (fragP->fr_type);
break;
} /* switch(fr_type) */
} /* for each frag in the segment */
}
}
/* Do relax(). */
{
long stretch; /* May be any size, 0 or negative. */
/* Cumulative number of addresses we have */
/* relaxed this pass. */
/* We may have relaxed more than one address. */
/* Cumulative number of addresses we have relaxed this pass.
We may have relaxed more than one address. */
long stretched; /* Have we stretched on this pass? */
/* This is 'cuz stretch may be zero, when, in fact some piece of code
grew, and another shrank. If a branch instruction doesn't fit anymore,
@ -2202,6 +2204,7 @@ relax_segment (segment_frag_root, segment)
do
{
stretch = stretched = 0;
for (fragP = segment_frag_root; fragP; fragP = fragP->fr_next)
{
long growth = 0;
@ -2345,7 +2348,8 @@ relax_segment (segment_frag_root, segment)
growth = stretch;
}
growth -= stretch; /* This is an absolute growth factor */
/* This is an absolute growth factor */
growth -= stretch;
break;
}
@ -2411,15 +2415,11 @@ relax_segment (segment_frag_root, segment)
while (stretched); /* Until nothing further to relax. */
} /* do_relax */
/*
* We now have valid fr_address'es for each frag.
*/
/* We now have valid fr_address'es for each frag. */
/*
* All fr_address's are correct, relative to their own segment.
* We have made all the fixS we will ever make.
*/
} /* relax_segment() */
/* All fr_address's are correct, relative to their own segment.
We have made all the fixS we will ever make. */
}
#if defined (BFD_ASSEMBLER) || (!defined (BFD) && !defined (OBJ_VMS))
@ -2471,13 +2471,11 @@ fixup_segment (fixP, this_segment_type)
for (; fixP; fixP = fixP->fx_next)
{
#ifdef DEBUG5
fprintf (stderr, "\nprocessing fixup:\n");
print_fixup (fixP);
#endif
fragP = fixP->fx_frag;
know (fragP);
where = fixP->fx_where;
@ -2517,7 +2515,7 @@ fixup_segment (fixP, this_segment_type)
fixP->fx_addsy = NULL;
}
/* It's just -sym */
/* It's just -sym. */
if (S_GET_SEGMENT (sub_symbolP) == absolute_section)
{
add_number -= S_GET_VALUE (sub_symbolP);
@ -2575,9 +2573,11 @@ fixup_segment (fixP, this_segment_type)
#ifdef DIFF_EXPR_OK
else if (S_GET_SEGMENT (sub_symbolP) == this_segment_type
#if 0 /* Do this even if it's already described as pc-relative. For example,
on the m68k, an operand of "pc@(foo-.-2)" should address "foo" in a
pc-relative mode. */
#if 0
/* Do this even if it's already described as
pc-relative. For example, on the m68k, an
operand of "pc@(foo-.-2)" should address
"foo" in a pc-relative mode. */
&& pcrel
#endif
)
@ -2627,11 +2627,9 @@ fixup_segment (fixP, this_segment_type)
if (add_symbol_segment == this_segment_type && pcrel && !plt
&& TC_RELOC_RTSYM_LOC_FIXUP (fixP))
{
/*
* This fixup was made when the symbol's segment was
* SEG_UNKNOWN, but it is now in the local segment.
* So we know how to do the address without relocation.
*/
/* This fixup was made when the symbol's segment was
SEG_UNKNOWN, but it is now in the local segment.
So we know how to do the address without relocation. */
#ifdef TC_I960
/* reloc_callj() may replace a 'call' with a 'calls' or a
'bal', in which cases it modifies *fixP as appropriate.
@ -2643,7 +2641,8 @@ fixup_segment (fixP, this_segment_type)
add_number += S_GET_VALUE (add_symbolP);
add_number -= MD_PCREL_FROM_SECTION (fixP, this_segment_type);
pcrel = 0; /* Lie. Don't want further pcrel processing. */
/* Lie. Don't want further pcrel processing. */
pcrel = 0;
/* Let the target machine make the final determination
as to whether or not a relocation will be needed to
@ -2685,16 +2684,15 @@ fixup_segment (fixP, this_segment_type)
if ((int) fixP->fx_bit_fixP == 13)
{
/* This is a COBR instruction. They have only a
* 13-bit displacement and are only to be used
* for local branches: flag as error, don't generate
* relocation.
*/
13-bit displacement and are only to be used
for local branches: flag as error, don't generate
relocation. */
as_bad_where (fixP->fx_file, fixP->fx_line,
_("can't use COBR format with external label"));
fixP->fx_addsy = NULL;
fixP->fx_done = 1;
continue;
} /* COBR */
} /* COBR. */
#endif /* TC_I960 */
#ifdef OBJ_COFF
@ -2766,7 +2764,7 @@ fixup_segment (fixP, this_segment_type)
valueT mask;
mask = 0;
mask--; /* set all bits to one */
mask--; /* Set all bits to one. */
mask <<= size * 8 - (fixP->fx_signed ? 1 : 0);
if ((add_number & mask) != 0 && (add_number & mask) != mask)
{
@ -2779,7 +2777,7 @@ fixup_segment (fixP, this_segment_type)
as_bad_where (fixP->fx_file, fixP->fx_line,
_("Value of %s too large for field of %d bytes at %s"),
buf2, size, buf);
} /* generic error checking */
} /* Generic error checking. */
}
#ifdef WARN_SIGNED_OVERFLOW_WORD
/* Warn if a .word value is too large when treated as a signed
@ -2793,7 +2791,7 @@ fixup_segment (fixP, this_segment_type)
(long) add_number,
(unsigned long) (fragP->fr_address + where));
#endif
} /* not a bit fix */
} /* Not a bit fix. */
#ifdef TC_VALIDATE_FIX
skip: ATTRIBUTE_UNUSED_LABEL
@ -2848,7 +2846,7 @@ write_print_statistics (file)
fprintf (file, "fixups: %d\n", n_fixups);
}
/* for debugging */
/* For debugging. */
extern int indent_level;
void
@ -2901,5 +2899,3 @@ print_fixup (fixp)
TC_FIX_DATA_PRINT (stderr, fixp);
#endif
}
/* end of write.c */