bfd/
* cpu-m68k.c (bfd_m68k_compatible): Treat ISA A+ and ISA B code as incompatible. Likewise MAC and EMAC code. * elf32-m68k.c (elf32_m68k_merge_private_bfd_data): Use bfd_get_compatible to set the new bfd architecture. Rely on it to detect incompatibilities. gas/ * config/tc-m68k.c (m68k_cpus): Change cpu_cf5208 entries to use mcfemac instead of mcfmac. ld/testsuite/ * ld-m68k/merge-error-1a.s, ld-m68k/merge-error-1b.s, * ld-m68k/merge-error-1a.d, ld-m68k/merge-error-1b.d, * ld-m68k/merge-error-1c.d, ld-m68k/merge-error-1d.d, * ld-m68k/merge-error-1e.d, ld-m68k/merge-ok-1a.d, * ld-m68k/merge-ok-1b.d: New tests. * ld-m68k/m68k.exp: Run them.
This commit is contained in:
parent
9332ab0250
commit
a9d3488055
|
@ -1,3 +1,11 @@
|
|||
2006-03-25 Richard Sandiford <richard@codesourcery.com>
|
||||
|
||||
* cpu-m68k.c (bfd_m68k_compatible): Treat ISA A+ and ISA B code as
|
||||
incompatible. Likewise MAC and EMAC code.
|
||||
* elf32-m68k.c (elf32_m68k_merge_private_bfd_data): Use
|
||||
bfd_get_compatible to set the new bfd architecture. Rely on it
|
||||
to detect incompatibilities.
|
||||
|
||||
2006-03-22 Bob Wilson <bob.wilson@acm.org>
|
||||
|
||||
* elf32-xtensa.c (xtensa_read_table_entries): Remove assertion that
|
||||
|
|
|
@ -208,9 +208,16 @@ bfd_m68k_compatible (const bfd_arch_info_type *a,
|
|||
/* Merge cf machine. */
|
||||
unsigned features = (bfd_m68k_mach_to_features (a->mach)
|
||||
| bfd_m68k_mach_to_features (b->mach));
|
||||
unsigned machine = bfd_m68k_features_to_mach (features);
|
||||
|
||||
return bfd_lookup_arch (a->arch, machine);
|
||||
/* ISA A+ and ISA B are incompatible. */
|
||||
if ((~features & (mcfisa_aa | mcfisa_b)) == 0)
|
||||
return NULL;
|
||||
|
||||
/* MAC and EMAC code cannot be merged. */
|
||||
if ((~features & (mcfmac | mcfemac)) == 0)
|
||||
return NULL;
|
||||
|
||||
return bfd_lookup_arch (a->arch, bfd_m68k_features_to_mach (features));
|
||||
}
|
||||
else
|
||||
/* They are incompatible. */
|
||||
|
|
|
@ -446,40 +446,24 @@ elf32_m68k_merge_private_bfd_data (ibfd, obfd)
|
|||
{
|
||||
flagword out_flags;
|
||||
flagword in_flags;
|
||||
unsigned in_mach, out_mach;
|
||||
flagword out_isa;
|
||||
flagword in_isa;
|
||||
const bfd_arch_info_type *arch_info;
|
||||
|
||||
if ( bfd_get_flavour (ibfd) != bfd_target_elf_flavour
|
||||
|| bfd_get_flavour (obfd) != bfd_target_elf_flavour)
|
||||
return FALSE;
|
||||
|
||||
in_mach = bfd_get_mach (ibfd);
|
||||
out_mach = bfd_get_mach (obfd);
|
||||
if (!out_mach || !in_mach)
|
||||
/* One is unknown, copy the input machine. */
|
||||
out_mach = in_mach;
|
||||
else if (in_mach != out_mach)
|
||||
{
|
||||
if (in_mach <= bfd_mach_m68060 && out_mach <= bfd_mach_m68060)
|
||||
{
|
||||
/* Merge m68k machine. */
|
||||
if (in_mach > out_mach)
|
||||
out_mach = in_mach;
|
||||
}
|
||||
else if (in_mach >= bfd_mach_mcf_isa_a_nodiv
|
||||
&& out_mach >= bfd_mach_mcf_isa_a_nodiv)
|
||||
/* Merge cf machine. */
|
||||
out_mach = bfd_m68k_features_to_mach
|
||||
(bfd_m68k_mach_to_features (in_mach)
|
||||
| bfd_m68k_mach_to_features (out_mach));
|
||||
else
|
||||
/* They are incompatible. */
|
||||
return FALSE;
|
||||
}
|
||||
bfd_set_arch_mach (obfd, bfd_arch_m68k, out_mach);
|
||||
|
||||
in_flags = elf_elfheader (ibfd)->e_flags;
|
||||
out_flags = elf_elfheader (obfd)->e_flags;
|
||||
/* Get the merged machine. This checks for incompatibility between
|
||||
Coldfire & non-Coldfire flags, incompability between different
|
||||
Coldfire ISAs, and incompability between different MAC types. */
|
||||
arch_info = bfd_arch_get_compatible (ibfd, obfd, FALSE);
|
||||
if (!arch_info)
|
||||
return FALSE;
|
||||
|
||||
bfd_set_arch_mach (obfd, bfd_arch_m68k, arch_info->mach);
|
||||
|
||||
in_flags = elf_elfheader (ibfd)->e_flags;
|
||||
if (!elf_flags_init (obfd))
|
||||
{
|
||||
elf_flags_init (obfd) = TRUE;
|
||||
|
@ -487,54 +471,12 @@ elf32_m68k_merge_private_bfd_data (ibfd, obfd)
|
|||
}
|
||||
else
|
||||
{
|
||||
flagword isa_in = in_flags & EF_M68K_ISA_MASK;
|
||||
flagword isa_out = out_flags & EF_M68K_ISA_MASK;
|
||||
|
||||
|
||||
/* Copy legacy flags. */
|
||||
out_flags |= in_flags & (EF_M68K_CPU32 | EF_M68K_M68000 | EF_M68K_CFV4E);
|
||||
|
||||
if ((isa_in | isa_out)
|
||||
&& ((in_flags | out_flags) & (EF_M68K_CPU32 | EF_M68K_M68000)))
|
||||
/* Mixing m68k and cf is not allowed */
|
||||
return FALSE;
|
||||
|
||||
if (isa_in)
|
||||
{
|
||||
if (isa_out)
|
||||
{
|
||||
if (isa_out == EF_M68K_ISA_A_PLUS
|
||||
&& (isa_in == EF_M68K_ISA_B_NOUSP
|
||||
|| isa_in == EF_M68K_ISA_B))
|
||||
/* Cannot mix A+ and B */
|
||||
return FALSE;
|
||||
if (isa_in == EF_M68K_ISA_A_PLUS
|
||||
&& (isa_out == EF_M68K_ISA_B_NOUSP
|
||||
|| isa_out == EF_M68K_ISA_B))
|
||||
/* Cannot mix B and A+ */
|
||||
return FALSE;
|
||||
|
||||
if (isa_in > isa_out)
|
||||
out_flags ^= isa_in ^ isa_out;
|
||||
|
||||
out_flags |= in_flags & EF_M68K_FLOAT;
|
||||
if (in_flags & EF_M68K_MAC_MASK)
|
||||
{
|
||||
if (!(out_flags & EF_M68K_MAC_MASK))
|
||||
out_flags |= in_flags & EF_M68K_MAC_MASK;
|
||||
else if ((out_flags & EF_M68K_MAC_MASK)
|
||||
!= (in_flags & EF_M68K_MAC_MASK))
|
||||
/* Cannot mix MACs */
|
||||
return FALSE;
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
/* Copy the coldfire bits. */
|
||||
out_flags &= ~EF_M68K_CF_MASK;
|
||||
out_flags |= in_flags & EF_M68K_CF_MASK;
|
||||
}
|
||||
}
|
||||
out_flags = elf_elfheader (obfd)->e_flags;
|
||||
in_isa = (in_flags & EF_M68K_ISA_MASK);
|
||||
out_isa = (out_flags & EF_M68K_ISA_MASK);
|
||||
if (in_isa > out_isa)
|
||||
out_flags ^= in_isa ^ out_isa;
|
||||
out_flags |= in_flags ^ in_isa;
|
||||
}
|
||||
elf_elfheader (obfd)->e_flags = out_flags;
|
||||
|
||||
|
|
|
@ -1,3 +1,8 @@
|
|||
2006-03-25 Richard Sandiford <richard@codesourcery.com>
|
||||
|
||||
* config/tc-m68k.c (m68k_cpus): Change cpu_cf5208 entries to use
|
||||
mcfemac instead of mcfmac.
|
||||
|
||||
2006-03-22 Richard Sandiford <richard@codesourcery.com>
|
||||
Daniel Jacobowitz <dan@codesourcery.com>
|
||||
Phil Edwards <phil@codesourcery.com>
|
||||
|
|
|
@ -432,7 +432,7 @@ static const struct m68k_cpu m68k_cpus[] =
|
|||
{ cpu32|m68881, cpu_cpu32, "cpu32", 0},
|
||||
{ mcfisa_a, cpu_cf5200, "5200", 0},
|
||||
{ mcfisa_a|mcfhwdiv|mcfmac, cpu_cf5206e, "5206e", 0},
|
||||
{ mcfisa_a|mcfisa_aa|mcfhwdiv|mcfmac|mcfusp, cpu_cf5208, "5208", 0},
|
||||
{ mcfisa_a|mcfisa_aa|mcfhwdiv|mcfemac|mcfusp, cpu_cf5208, "5208", 0},
|
||||
{ mcfisa_a|mcfisa_aa|mcfhwdiv|mcfmac|mcfusp, cpu_cf5213, "5213", 0},
|
||||
{ mcfisa_a|mcfisa_aa|mcfhwdiv|mcfemac|mcfusp,cpu_cf521x, "521x", 0},
|
||||
{ mcfisa_a|mcfhwdiv|mcfemac, cpu_cf5249, "5249", 0},
|
||||
|
@ -473,7 +473,7 @@ static const struct m68k_cpu m68k_cpus[] =
|
|||
{ mcfisa_a, cpu_cf5200, "5202", 1},
|
||||
{ mcfisa_a, cpu_cf5200, "5204", 1},
|
||||
{ mcfisa_a, cpu_cf5200, "5206", 1},
|
||||
{ mcfisa_a|mcfisa_aa|mcfhwdiv|mcfmac|mcfusp, cpu_cf5208, "5207", 1},
|
||||
{ mcfisa_a|mcfisa_aa|mcfhwdiv|mcfemac|mcfusp, cpu_cf5208, "5207", 1},
|
||||
{ mcfisa_a|mcfisa_aa|mcfhwdiv|mcfmac|mcfusp, cpu_cf5213, "5211", 1},
|
||||
{ mcfisa_a|mcfisa_aa|mcfhwdiv|mcfmac|mcfusp, cpu_cf5213, "5212", 1},
|
||||
{ mcfisa_a|mcfisa_aa|mcfhwdiv|mcfemac|mcfusp, cpu_cf521x, "5214", 1},
|
||||
|
|
|
@ -1,3 +1,12 @@
|
|||
2006-03-25 Richard Sandiford <richard@codesourcery.com>
|
||||
|
||||
* ld-m68k/merge-error-1a.s, ld-m68k/merge-error-1b.s,
|
||||
* ld-m68k/merge-error-1a.d, ld-m68k/merge-error-1b.d,
|
||||
* ld-m68k/merge-error-1c.d, ld-m68k/merge-error-1d.d,
|
||||
* ld-m68k/merge-error-1e.d, ld-m68k/merge-ok-1a.d,
|
||||
* ld-m68k/merge-ok-1b.d: New tests.
|
||||
* ld-m68k/m68k.exp: Run them.
|
||||
|
||||
2006-03-22 Richard Sandiford <richard@codesourcery.com>
|
||||
|
||||
* ld-mips/vxworks1.dd, ld-mips/vxworks1.ld, ld-mips/vxworks1-lib.dd,
|
||||
|
|
|
@ -45,3 +45,11 @@ set m68k_mergeok_tests {
|
|||
{isab.s isab-float.s} {{objdump -p isab-float.d}} "isab-float"}}
|
||||
|
||||
run_ld_link_tests $m68k_mergeok_tests
|
||||
|
||||
run_dump_test "merge-error-1a"
|
||||
run_dump_test "merge-error-1b"
|
||||
run_dump_test "merge-error-1c"
|
||||
run_dump_test "merge-error-1d"
|
||||
run_dump_test "merge-error-1e"
|
||||
run_dump_test "merge-ok-1a"
|
||||
run_dump_test "merge-ok-1b"
|
||||
|
|
|
@ -0,0 +1,4 @@
|
|||
#source: merge-error-1a.s -mcpu=cpu32
|
||||
#source: merge-error-1b.s -mcpu=68000
|
||||
#ld: -r
|
||||
#warning: .*
|
|
@ -0,0 +1 @@
|
|||
rts
|
|
@ -0,0 +1,4 @@
|
|||
#source: merge-error-1a.s -mcpu=cpu32
|
||||
#source: merge-error-1b.s -mcpu=5207
|
||||
#ld: -r
|
||||
#warning: .*
|
|
@ -0,0 +1 @@
|
|||
rts
|
|
@ -0,0 +1,4 @@
|
|||
#source: merge-error-1a.s -march=isaaplus
|
||||
#source: merge-error-1b.s -march=isab
|
||||
#ld: -r
|
||||
#warning: .*
|
|
@ -0,0 +1,4 @@
|
|||
#source: merge-error-1a.s -march=isaa -mmac
|
||||
#source: merge-error-1b.s -march=isaa -memac
|
||||
#ld: -r
|
||||
#warning: .*
|
|
@ -0,0 +1,4 @@
|
|||
#source: merge-error-1a.s -march=isaa -mno-div -mmac
|
||||
#source: merge-error-1b.s -march=isaa -mno-div -memac
|
||||
#ld: -r
|
||||
#warning: .*
|
|
@ -0,0 +1,6 @@
|
|||
#source: merge-error-1a.s -mcpu=5207
|
||||
#source: merge-error-1b.s -mcpu=528x
|
||||
#ld: -r
|
||||
#objdump: -p
|
||||
#...
|
||||
private flags = 23: \[isa A\+\] \[emac\]
|
|
@ -0,0 +1,6 @@
|
|||
#source: merge-error-1a.s -march=isaa -mno-div -mmac
|
||||
#source: merge-error-1b.s -march=isaa -mno-div -mfloat
|
||||
#ld: -r
|
||||
#objdump: -p
|
||||
#...
|
||||
private flags = 8051: \[cfv4e\] \[isa A\] \[nodiv\] \[float\] \[mac\]
|
Loading…
Reference in New Issue