* config/tc-mips.c (mips_ip): Mark sections created to hold

floating point information as read only.
This commit is contained in:
Ian Lance Taylor 1996-05-25 01:25:27 +00:00
parent e30c00760c
commit 9b61d62b9f
2 changed files with 53 additions and 31 deletions

View File

@ -1,3 +1,8 @@
Fri May 24 18:24:11 1996 Ian Lance Taylor <ian@cygnus.com>
* config/tc-mips.c (mips_ip): Mark sections created to hold
floating point information as read only.
Fri May 24 12:07:54 1996 David Edelsohn <edelsohn@mhpcc.edu>
* config/tc-ppc.c (ppc_set_cpu): Change defaults to match AIX.

View File

@ -5496,6 +5496,12 @@ mips_ip (str, ip)
break;
}
new_seg = subseg_new (newname, (subsegT) 0);
if (OUTPUT_FLAVOR == bfd_target_elf_flavour)
bfd_set_section_flags (stdoutput, new_seg,
(SEC_ALLOC
| SEC_LOAD
| SEC_READONLY
| SEC_DATA));
frag_align (*args == 'l' ? 2 : 3, 0);
if (OUTPUT_FLAVOR == bfd_target_elf_flavour)
record_alignment (new_seg, 4);
@ -6315,7 +6321,7 @@ mips_frob_file ()
for (l = mips_hi_fixup_list; l != NULL; l = l->next)
{
segment_info_type *seginfo;
fixS *f, *prev;
int pass;
assert (l->fixp->fx_r_type == BFD_RELOC_HI16_S);
@ -6328,46 +6334,57 @@ mips_frob_file ()
continue;
/* Look through the fixups for this segment for a matching %lo.
When we find one, move the %hi just in front of it. */
When we find one, move the %hi just in front of it. We do
this in two passes. In the first pass, we try to find a
unique %lo. In the second pass, we permit multiple %hi
relocs for a single %lo (this is a GNU extension). */
seginfo = seg_info (l->seg);
prev = NULL;
for (f = seginfo->fix_root; f != NULL; f = f->fx_next)
for (pass = 0; pass < 2; pass++)
{
/* Check whether this is a %lo fixup which matches l->fixp;
we can't use it if the %lo is already matching a %hi. */
if (f->fx_r_type == BFD_RELOC_LO16
&& f->fx_addsy == l->fixp->fx_addsy
&& f->fx_offset == l->fixp->fx_offset
&& (prev == NULL
|| prev->fx_r_type != BFD_RELOC_HI16_S
|| prev->fx_addsy != f->fx_addsy
|| prev->fx_offset != f->fx_offset))
fixS *f, *prev;
prev = NULL;
for (f = seginfo->fix_root; f != NULL; f = f->fx_next)
{
fixS **pf;
/* Check whether this is a %lo fixup which matches l->fixp. */
if (f->fx_r_type == BFD_RELOC_LO16
&& f->fx_addsy == l->fixp->fx_addsy
&& f->fx_offset == l->fixp->fx_offset
&& (pass == 1
|| prev == NULL
|| prev->fx_r_type != BFD_RELOC_HI16_S
|| prev->fx_addsy != f->fx_addsy
|| prev->fx_offset != f->fx_offset))
{
fixS **pf;
/* Move l->fixp before f. */
for (pf = &seginfo->fix_root;
*pf != l->fixp;
pf = &(*pf)->fx_next)
assert (*pf != NULL);
/* Move l->fixp before f. */
for (pf = &seginfo->fix_root;
*pf != l->fixp;
pf = &(*pf)->fx_next)
assert (*pf != NULL);
*pf = l->fixp->fx_next;
*pf = l->fixp->fx_next;
l->fixp->fx_next = f;
if (prev == NULL)
seginfo->fix_root = l->fixp;
else
prev->fx_next = l->fixp;
l->fixp->fx_next = f;
if (prev == NULL)
seginfo->fix_root = l->fixp;
else
prev->fx_next = l->fixp;
break;
break;
}
prev = f;
}
prev = f;
}
if (f != NULL)
break;
if (f == NULL)
as_warn_where (l->fixp->fx_file, l->fixp->fx_line,
"Unmatched %%hi reloc");
if (pass == 1)
as_warn_where (l->fixp->fx_file, l->fixp->fx_line,
"Unmatched %%hi reloc");
}
}
}