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