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