1/* BFD library support routines for architectures.
2   Copyright (C) 1990-2017 Free Software Foundation, Inc.
3   Hacked by Steve Chamberlain of Cygnus Support.
4
5   This file is part of BFD, the Binary File Descriptor library.
6
7   This program is free software; you can redistribute it and/or modify
8   it under the terms of the GNU General Public License as published by
9   the Free Software Foundation; either version 3 of the License, or
10   (at your option) any later version.
11
12   This program is distributed in the hope that it will be useful,
13   but WITHOUT ANY WARRANTY; without even the implied warranty of
14   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
15   GNU General Public License for more details.
16
17   You should have received a copy of the GNU General Public License
18   along with this program; if not, write to the Free Software
19   Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston,
20   MA 02110-1301, USA.  */
21
22#include "sysdep.h"
23#include "bfd.h"
24#include "libbfd.h"
25#include "opcode/m68k.h"
26
27static const bfd_arch_info_type *
28bfd_m68k_compatible (const bfd_arch_info_type *a,
29		     const bfd_arch_info_type *b);
30
31#define N(name, print,d,next)  \
32{  32, 32, 8, bfd_arch_m68k, name, "m68k",print,2,d,bfd_m68k_compatible, \
33   bfd_default_scan, bfd_arch_default_fill, next, }
34
35static const bfd_arch_info_type arch_info_struct[] =
36  {
37    N(bfd_mach_m68000,  "m68k:68000", FALSE, &arch_info_struct[1]),
38    N(bfd_mach_m68008,  "m68k:68008", FALSE, &arch_info_struct[2]),
39    N(bfd_mach_m68010,  "m68k:68010", FALSE, &arch_info_struct[3]),
40    N(bfd_mach_m68020,  "m68k:68020", FALSE, &arch_info_struct[4]),
41    N(bfd_mach_m68030,  "m68k:68030", FALSE, &arch_info_struct[5]),
42    N(bfd_mach_m68040,  "m68k:68040", FALSE, &arch_info_struct[6]),
43    N(bfd_mach_m68060,  "m68k:68060", FALSE, &arch_info_struct[7]),
44    N(bfd_mach_cpu32,   "m68k:cpu32", FALSE, &arch_info_struct[8]),
45    N(bfd_mach_fido,    "m68k:fido",  FALSE, &arch_info_struct[9]),
46
47    /* Various combinations of CF architecture features */
48    N(bfd_mach_mcf_isa_a_nodiv, "m68k:isa-a:nodiv",
49      FALSE, &arch_info_struct[10]),
50    N(bfd_mach_mcf_isa_a, "m68k:isa-a",
51      FALSE, &arch_info_struct[11]),
52    N(bfd_mach_mcf_isa_a_mac, "m68k:isa-a:mac",
53      FALSE, &arch_info_struct[12]),
54    N(bfd_mach_mcf_isa_a_emac, "m68k:isa-a:emac",
55      FALSE, &arch_info_struct[13]),
56    N(bfd_mach_mcf_isa_aplus, "m68k:isa-aplus",
57      FALSE, &arch_info_struct[14]),
58    N(bfd_mach_mcf_isa_aplus_mac, "m68k:isa-aplus:mac",
59      FALSE, &arch_info_struct[15]),
60    N(bfd_mach_mcf_isa_aplus_emac, "m68k:isa-aplus:emac",
61      FALSE, &arch_info_struct[16]),
62    N(bfd_mach_mcf_isa_b_nousp, "m68k:isa-b:nousp",
63      FALSE, &arch_info_struct[17]),
64    N(bfd_mach_mcf_isa_b_nousp_mac, "m68k:isa-b:nousp:mac",
65      FALSE, &arch_info_struct[18]),
66    N(bfd_mach_mcf_isa_b_nousp_emac, "m68k:isa-b:nousp:emac",
67      FALSE, &arch_info_struct[19]),
68    N(bfd_mach_mcf_isa_b, "m68k:isa-b",
69      FALSE, &arch_info_struct[20]),
70    N(bfd_mach_mcf_isa_b_mac, "m68k:isa-b:mac",
71      FALSE, &arch_info_struct[21]),
72    N(bfd_mach_mcf_isa_b_emac, "m68k:isa-b:emac",
73      FALSE, &arch_info_struct[22]),
74    N(bfd_mach_mcf_isa_b_float, "m68k:isa-b:float",
75      FALSE, &arch_info_struct[23]),
76    N(bfd_mach_mcf_isa_b_float_mac, "m68k:isa-b:float:mac",
77      FALSE, &arch_info_struct[24]),
78    N(bfd_mach_mcf_isa_b_float_emac, "m68k:isa-b:float:emac",
79      FALSE, &arch_info_struct[25]),
80    N(bfd_mach_mcf_isa_c, "m68k:isa-c",
81      FALSE, &arch_info_struct[26]),
82    N(bfd_mach_mcf_isa_c_mac, "m68k:isa-c:mac",
83      FALSE, &arch_info_struct[27]),
84    N(bfd_mach_mcf_isa_c_emac, "m68k:isa-c:emac",
85      FALSE, &arch_info_struct[28]),
86    N(bfd_mach_mcf_isa_c_nodiv, "m68k:isa-c:nodiv",
87      FALSE, &arch_info_struct[29]),
88    N(bfd_mach_mcf_isa_c_nodiv_mac, "m68k:isa-c:nodiv:mac",
89      FALSE, &arch_info_struct[30]),
90    N(bfd_mach_mcf_isa_c_nodiv_emac, "m68k:isa-c:nodiv:emac",
91      FALSE, &arch_info_struct[31]),
92
93    /* Legacy names for CF architectures */
94    N(bfd_mach_mcf_isa_a_nodiv, "m68k:5200", FALSE, &arch_info_struct[32]),
95    N(bfd_mach_mcf_isa_a_mac,"m68k:5206e", FALSE, &arch_info_struct[33]),
96    N(bfd_mach_mcf_isa_a_mac, "m68k:5307", FALSE, &arch_info_struct[34]),
97    N(bfd_mach_mcf_isa_b_nousp_mac, "m68k:5407", FALSE, &arch_info_struct[35]),
98    N(bfd_mach_mcf_isa_aplus_emac, "m68k:528x", FALSE, &arch_info_struct[36]),
99    N(bfd_mach_mcf_isa_aplus_emac, "m68k:521x", FALSE, &arch_info_struct[37]),
100    N(bfd_mach_mcf_isa_a_emac, "m68k:5249", FALSE, &arch_info_struct[38]),
101    N(bfd_mach_mcf_isa_b_float_emac, "m68k:547x",
102      FALSE, &arch_info_struct[39]),
103    N(bfd_mach_mcf_isa_b_float_emac, "m68k:548x",
104      FALSE, &arch_info_struct[40]),
105    N(bfd_mach_mcf_isa_b_float_emac, "m68k:cfv4e", FALSE, 0),
106  };
107
108const bfd_arch_info_type bfd_m68k_arch =
109  N(0, "m68k", TRUE, &arch_info_struct[0]);
110
111/* Table indexed by bfd_mach_arch number indicating which
112   architectural features are supported.  */
113static const unsigned m68k_arch_features[] =
114{
115  0,
116  m68000|m68881|m68851,
117  m68000|m68881|m68851,
118  m68010|m68881|m68851,
119  m68020|m68881|m68851,
120  m68030|m68881|m68851,
121  m68040|m68881|m68851,
122  m68060|m68881|m68851,
123  cpu32|m68881,
124  fido_a|m68881,
125  mcfisa_a,
126  mcfisa_a|mcfhwdiv,
127  mcfisa_a|mcfhwdiv|mcfmac,
128  mcfisa_a|mcfhwdiv|mcfemac,
129  mcfisa_a|mcfisa_aa|mcfhwdiv|mcfusp,
130  mcfisa_a|mcfisa_aa|mcfhwdiv|mcfusp|mcfmac,
131  mcfisa_a|mcfisa_aa|mcfhwdiv|mcfusp|mcfemac,
132  mcfisa_a|mcfhwdiv|mcfisa_b,
133  mcfisa_a|mcfhwdiv|mcfisa_b|mcfmac,
134  mcfisa_a|mcfhwdiv|mcfisa_b|mcfemac,
135  mcfisa_a|mcfhwdiv|mcfisa_b|mcfusp,
136  mcfisa_a|mcfhwdiv|mcfisa_b|mcfusp|mcfmac,
137  mcfisa_a|mcfhwdiv|mcfisa_b|mcfusp|mcfemac,
138  mcfisa_a|mcfhwdiv|mcfisa_b|mcfusp|cfloat,
139  mcfisa_a|mcfhwdiv|mcfisa_b|mcfusp|cfloat|mcfmac,
140  mcfisa_a|mcfhwdiv|mcfisa_b|mcfusp|cfloat|mcfemac,
141  mcfisa_a|mcfhwdiv|mcfisa_c|mcfusp,
142  mcfisa_a|mcfhwdiv|mcfisa_c|mcfusp|mcfmac,
143  mcfisa_a|mcfhwdiv|mcfisa_c|mcfusp|mcfemac,
144  mcfisa_a|mcfisa_c|mcfusp,
145  mcfisa_a|mcfisa_c|mcfusp|mcfmac,
146  mcfisa_a|mcfisa_c|mcfusp|mcfemac,
147};
148
149/* Return the count of bits set in MASK  */
150static unsigned
151bit_count (unsigned mask)
152{
153  unsigned ix;
154
155  for (ix = 0; mask; ix++)
156    /* Clear the LSB set */
157    mask ^= mask & -mask;
158  return ix;
159}
160
161/* Return the architectural features supported by MACH */
162
163unsigned
164bfd_m68k_mach_to_features (int mach)
165{
166  if ((unsigned)mach
167      >= sizeof (m68k_arch_features) / sizeof (m68k_arch_features[0]))
168    mach = 0;
169  return m68k_arch_features[mach];
170}
171
172/* Return the bfd machine that most closely represents the
173   architectural features.  We find the machine with the smallest
174   number of additional features.  If there is no such machine, we
175   find the one with the smallest number of missing features.  */
176
177int bfd_m68k_features_to_mach (unsigned features)
178{
179  int superset = 0, subset = 0;
180  unsigned extra = 99, missing = 99;
181  unsigned ix;
182
183  for (ix = 0;
184       ix != sizeof (m68k_arch_features) / sizeof (m68k_arch_features[0]);
185       ix++)
186    {
187      unsigned this_extra, this_missing;
188
189      if (m68k_arch_features[ix] == features)
190	return ix;
191      this_extra = bit_count (m68k_arch_features[ix] & ~features);
192      if (this_extra < extra)
193	{
194	  extra = this_extra;
195	  superset = ix;
196	}
197
198      this_missing = bit_count (features & ~m68k_arch_features[ix]);
199      if (this_missing < missing)
200	{
201	  missing = this_missing;
202	  superset = ix;
203	}
204    }
205  return superset ? superset : subset;
206}
207
208static const bfd_arch_info_type *
209bfd_m68k_compatible (const bfd_arch_info_type *a,
210		     const bfd_arch_info_type *b)
211{
212  if (a->arch != b->arch)
213    return NULL;
214
215  if (a->bits_per_word != b->bits_per_word)
216    return NULL;
217
218  if (!a->mach)
219    return b;
220  if (!b->mach)
221    return a;
222
223  if (a->mach <= bfd_mach_m68060 && b->mach <= bfd_mach_m68060)
224    /* Merge m68k machine. */
225    return a->mach > b->mach ? a : b;
226  else if (a->mach >= bfd_mach_cpu32 && b->mach >= bfd_mach_cpu32)
227    {
228      /* Merge the machine features.  */
229      unsigned features = (bfd_m68k_mach_to_features (a->mach)
230			   | bfd_m68k_mach_to_features (b->mach));
231
232      /* CPU32 and Coldfire are incompatible.  */
233      if ((~features & (cpu32 | mcfisa_a)) == 0)
234	return NULL;
235
236      /* Fido and Coldfire are incompatible.  */
237      if ((~features & (fido_a | mcfisa_a)) == 0)
238	return NULL;
239
240      /* ISA A+ and ISA B are incompatible.  */
241      if ((~features & (mcfisa_aa | mcfisa_b)) == 0)
242	return NULL;
243
244      /* ISA B and ISA C are incompatible.  */
245      if ((~features & (mcfisa_b | mcfisa_c)) == 0)
246	return NULL;
247
248      /* MAC and EMAC code cannot be merged.  */
249      if ((~features & (mcfmac | mcfemac)) == 0)
250	return NULL;
251
252      /* CPU32 is compatible with Fido except that Fido does not
253	 support tbl instructions.  Warn when the user wants to mix
254	 the two.  */
255      if ((a->mach == bfd_mach_cpu32 && b->mach == bfd_mach_fido)
256	  || (a->mach == bfd_mach_fido && b->mach == bfd_mach_cpu32))
257	{
258	  static int cpu32_fido_mix_warning;
259	  if (!cpu32_fido_mix_warning)
260	    {
261	      cpu32_fido_mix_warning = 1;
262	      _bfd_error_handler ("warning: linking CPU32 objects with fido objects");
263	    }
264	  return bfd_lookup_arch (a->arch,
265				  bfd_m68k_features_to_mach (fido_a | m68881));
266	}
267
268      return bfd_lookup_arch (a->arch, bfd_m68k_features_to_mach (features));
269    }
270  else
271    /* They are incompatible.  */
272    return NULL;
273}
274