Fix formatting.
This commit is contained in:
parent
03d5f569de
commit
efaf0ba464
|
@ -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>
|
||||
|
||||
|
|
378
gas/write.c
378
gas/write.c
|
@ -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;
|
||||
|
@ -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);
|
||||
}
|
||||
|
||||
|
@ -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;
|
||||
|
@ -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
|
||||
|
||||
|
@ -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;
|
||||
|
@ -1176,8 +1174,8 @@ write_contents (abfd, sec, xxx)
|
|||
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),
|
||||
|
@ -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 */
|
||||
/* 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 */
|
||||
|
|
Loading…
Reference in New Issue