* 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> Fri May 24 12:07:54 1996 David Edelsohn <edelsohn@mhpcc.edu>
* config/tc-ppc.c (ppc_set_cpu): Change defaults to match AIX. * config/tc-ppc.c (ppc_set_cpu): Change defaults to match AIX.

View File

@ -5496,6 +5496,12 @@ mips_ip (str, ip)
break; break;
} }
new_seg = subseg_new (newname, (subsegT) 0); 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); frag_align (*args == 'l' ? 2 : 3, 0);
if (OUTPUT_FLAVOR == bfd_target_elf_flavour) if (OUTPUT_FLAVOR == bfd_target_elf_flavour)
record_alignment (new_seg, 4); record_alignment (new_seg, 4);
@ -6315,7 +6321,7 @@ mips_frob_file ()
for (l = mips_hi_fixup_list; l != NULL; l = l->next) for (l = mips_hi_fixup_list; l != NULL; l = l->next)
{ {
segment_info_type *seginfo; segment_info_type *seginfo;
fixS *f, *prev; int pass;
assert (l->fixp->fx_r_type == BFD_RELOC_HI16_S); assert (l->fixp->fx_r_type == BFD_RELOC_HI16_S);
@ -6328,17 +6334,24 @@ mips_frob_file ()
continue; continue;
/* Look through the fixups for this segment for a matching %lo. /* 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); seginfo = seg_info (l->seg);
for (pass = 0; pass < 2; pass++)
{
fixS *f, *prev;
prev = NULL; prev = NULL;
for (f = seginfo->fix_root; f != NULL; f = f->fx_next) for (f = seginfo->fix_root; f != NULL; f = f->fx_next)
{ {
/* Check whether this is a %lo fixup which matches l->fixp; /* 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 if (f->fx_r_type == BFD_RELOC_LO16
&& f->fx_addsy == l->fixp->fx_addsy && f->fx_addsy == l->fixp->fx_addsy
&& f->fx_offset == l->fixp->fx_offset && f->fx_offset == l->fixp->fx_offset
&& (prev == NULL && (pass == 1
|| prev == NULL
|| prev->fx_r_type != BFD_RELOC_HI16_S || prev->fx_r_type != BFD_RELOC_HI16_S
|| prev->fx_addsy != f->fx_addsy || prev->fx_addsy != f->fx_addsy
|| prev->fx_offset != f->fx_offset)) || prev->fx_offset != f->fx_offset))
@ -6365,10 +6378,14 @@ mips_frob_file ()
prev = f; prev = f;
} }
if (f == NULL) if (f != NULL)
break;
if (pass == 1)
as_warn_where (l->fixp->fx_file, l->fixp->fx_line, as_warn_where (l->fixp->fx_file, l->fixp->fx_line,
"Unmatched %%hi reloc"); "Unmatched %%hi reloc");
} }
}
} }
/* When generating embedded PIC code we need to use a special /* When generating embedded PIC code we need to use a special