1/* BFD library support routines for the Renesas / SuperH SH architecture. 2 Copyright 1993, 1994, 1997, 1998, 2000, 2001, 2002, 2003, 2004, 2005, 3 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 "../opcodes/sh-opc.h" 27 28#define SH_NEXT arch_info_struct + 0 29#define SH2_NEXT arch_info_struct + 1 30#define SH2E_NEXT arch_info_struct + 2 31#define SH_DSP_NEXT arch_info_struct + 3 32#define SH3_NEXT arch_info_struct + 4 33#define SH3_NOMMU_NEXT arch_info_struct + 5 34#define SH3_DSP_NEXT arch_info_struct + 6 35#define SH3E_NEXT arch_info_struct + 7 36#define SH4_NEXT arch_info_struct + 8 37#define SH4A_NEXT arch_info_struct + 9 38#define SH4AL_DSP_NEXT arch_info_struct + 10 39#define SH4_NOFPU_NEXT arch_info_struct + 11 40#define SH4_NOMMU_NOFPU_NEXT arch_info_struct + 12 41#define SH4A_NOFPU_NEXT arch_info_struct + 13 42#define SH2A_NEXT arch_info_struct + 14 43#define SH2A_NOFPU_NEXT arch_info_struct + 15 44#define SH2A_NOFPU_OR_SH4_NOMMU_NOFPU_NEXT arch_info_struct + 16 45#define SH2A_NOFPU_OR_SH3_NOMMU_NEXT arch_info_struct + 17 46#define SH2A_OR_SH4_NEXT arch_info_struct + 18 47#define SH2A_OR_SH3E_NEXT arch_info_struct + 19 48#define SH64_NEXT NULL 49 50static const bfd_arch_info_type arch_info_struct[] = 51{ 52 { 53 32, /* 32 bits in a word. */ 54 32, /* 32 bits in an address. */ 55 8, /* 8 bits in a byte. */ 56 bfd_arch_sh, 57 bfd_mach_sh2, 58 "sh", /* Architecture name. */ 59 "sh2", /* Machine name. */ 60 1, 61 FALSE, /* Not the default. */ 62 bfd_default_compatible, 63 bfd_default_scan, 64 SH2_NEXT 65 }, 66 { 67 32, /* 32 bits in a word. */ 68 32, /* 32 bits in an address. */ 69 8, /* 8 bits in a byte. */ 70 bfd_arch_sh, 71 bfd_mach_sh2e, 72 "sh", /* Architecture name. */ 73 "sh2e", /* Machine name. */ 74 1, 75 FALSE, /* Not the default. */ 76 bfd_default_compatible, 77 bfd_default_scan, 78 SH2E_NEXT 79 }, 80 { 81 32, /* 32 bits in a word. */ 82 32, /* 32 bits in an address. */ 83 8, /* 8 bits in a byte. */ 84 bfd_arch_sh, 85 bfd_mach_sh_dsp, 86 "sh", /* Architecture name. */ 87 "sh-dsp", /* Machine name. */ 88 1, 89 FALSE, /* Not the default. */ 90 bfd_default_compatible, 91 bfd_default_scan, 92 SH_DSP_NEXT 93 }, 94 { 95 32, /* 32 bits in a word. */ 96 32, /* 32 bits in an address. */ 97 8, /* 8 bits in a byte. */ 98 bfd_arch_sh, 99 bfd_mach_sh3, 100 "sh", /* Architecture name. */ 101 "sh3", /* Machine name. */ 102 1, 103 FALSE, /* Not the default. */ 104 bfd_default_compatible, 105 bfd_default_scan, 106 SH3_NEXT 107 }, 108 { 109 32, /* 32 bits in a word. */ 110 32, /* 32 bits in an address. */ 111 8, /* 8 bits in a byte. */ 112 bfd_arch_sh, 113 bfd_mach_sh3_nommu, 114 "sh", /* Architecture name. */ 115 "sh3-nommu", /* Machine name. */ 116 1, 117 FALSE, /* Not the default. */ 118 bfd_default_compatible, 119 bfd_default_scan, 120 SH3_NOMMU_NEXT 121 }, 122 { 123 32, /* 32 bits in a word. */ 124 32, /* 32 bits in an address. */ 125 8, /* 8 bits in a byte. */ 126 bfd_arch_sh, 127 bfd_mach_sh3_dsp, 128 "sh", /* Architecture name. */ 129 "sh3-dsp", /* Machine name. */ 130 1, 131 FALSE, /* Not the default. */ 132 bfd_default_compatible, 133 bfd_default_scan, 134 SH3_DSP_NEXT 135 }, 136 { 137 32, /* 32 bits in a word. */ 138 32, /* 32 bits in an address. */ 139 8, /* 8 bits in a byte. */ 140 bfd_arch_sh, 141 bfd_mach_sh3e, 142 "sh", /* Architecture name. */ 143 "sh3e", /* Machine name. */ 144 1, 145 FALSE, /* Not the default. */ 146 bfd_default_compatible, 147 bfd_default_scan, 148 SH3E_NEXT 149 }, 150 { 151 32, /* 32 bits in a word. */ 152 32, /* 32 bits in an address. */ 153 8, /* 8 bits in a byte. */ 154 bfd_arch_sh, 155 bfd_mach_sh4, 156 "sh", /* Architecture name. */ 157 "sh4", /* Machine name. */ 158 1, 159 FALSE, /* Not the default. */ 160 bfd_default_compatible, 161 bfd_default_scan, 162 SH4_NEXT 163 }, 164 { 165 32, /* 32 bits in a word. */ 166 32, /* 32 bits in an address. */ 167 8, /* 8 bits in a byte. */ 168 bfd_arch_sh, 169 bfd_mach_sh4a, 170 "sh", /* Architecture name. */ 171 "sh4a", /* Machine name. */ 172 1, 173 FALSE, /* Not the default. */ 174 bfd_default_compatible, 175 bfd_default_scan, 176 SH4A_NEXT 177 }, 178 { 179 32, /* 32 bits in a word. */ 180 32, /* 32 bits in an address. */ 181 8, /* 8 bits in a byte. */ 182 bfd_arch_sh, 183 bfd_mach_sh4al_dsp, 184 "sh", /* Architecture name. */ 185 "sh4al-dsp", /* Machine name. */ 186 1, 187 FALSE, /* Not the default. */ 188 bfd_default_compatible, 189 bfd_default_scan, 190 SH4AL_DSP_NEXT 191 }, 192 { 193 32, /* 32 bits in a word. */ 194 32, /* 32 bits in an address. */ 195 8, /* 8 bits in a byte. */ 196 bfd_arch_sh, 197 bfd_mach_sh4_nofpu, 198 "sh", /* Architecture name. */ 199 "sh4-nofpu", /* Machine name. */ 200 1, 201 FALSE, /* Not the default. */ 202 bfd_default_compatible, 203 bfd_default_scan, 204 SH4_NOFPU_NEXT 205 }, 206 { 207 32, /* 32 bits in a word. */ 208 32, /* 32 bits in an address. */ 209 8, /* 8 bits in a byte. */ 210 bfd_arch_sh, 211 bfd_mach_sh4_nommu_nofpu, 212 "sh", /* Architecture name. */ 213 "sh4-nommu-nofpu", /* Machine name. */ 214 1, 215 FALSE, /* Not the default. */ 216 bfd_default_compatible, 217 bfd_default_scan, 218 SH4_NOMMU_NOFPU_NEXT 219 }, 220 { 221 32, /* 32 bits in a word. */ 222 32, /* 32 bits in an address. */ 223 8, /* 8 bits in a byte. */ 224 bfd_arch_sh, 225 bfd_mach_sh4a_nofpu, 226 "sh", /* Architecture name. */ 227 "sh4a-nofpu", /* Machine name. */ 228 1, 229 FALSE, /* Not the default. */ 230 bfd_default_compatible, 231 bfd_default_scan, 232 SH4A_NOFPU_NEXT 233 }, 234 { 235 32, /* 32 bits in a word. */ 236 32, /* 32 bits in an address. */ 237 8, /* 8 bits in a byte. */ 238 bfd_arch_sh, 239 bfd_mach_sh2a, 240 "sh", /* Architecture name. */ 241 "sh2a", /* Machine name. */ 242 1, 243 FALSE, /* Not the default. */ 244 bfd_default_compatible, 245 bfd_default_scan, 246 SH2A_NEXT 247 }, 248 { 249 32, /* 32 bits in a word. */ 250 32, /* 32 bits in an address. */ 251 8, /* 8 bits in a byte. */ 252 bfd_arch_sh, 253 bfd_mach_sh2a_nofpu, 254 "sh", /* Architecture name. */ 255 "sh2a-nofpu", /* Machine name. */ 256 1, 257 FALSE, /* Not the default. */ 258 bfd_default_compatible, 259 bfd_default_scan, 260 SH2A_NOFPU_NEXT 261 }, 262 { 263 32, /* 32 bits in a word. */ 264 32, /* 32 bits in an address. */ 265 8, /* 8 bits in a byte. */ 266 bfd_arch_sh, 267 bfd_mach_sh2a_nofpu_or_sh4_nommu_nofpu, 268 "sh", /* Architecture name. */ 269 "sh2a-nofpu-or-sh4-nommu-nofpu", /* Machine name. */ 270 1, 271 FALSE, /* Not the default. */ 272 bfd_default_compatible, 273 bfd_default_scan, 274 SH2A_NOFPU_OR_SH4_NOMMU_NOFPU_NEXT 275 }, 276 { 277 32, /* 32 bits in a word. */ 278 32, /* 32 bits in an address. */ 279 8, /* 8 bits in a byte. */ 280 bfd_arch_sh, 281 bfd_mach_sh2a_nofpu_or_sh3_nommu, 282 "sh", /* Architecture name. . */ 283 "sh2a-nofpu-or-sh3-nommu", /* Machine name. */ 284 1, 285 FALSE, /* Not the default. */ 286 bfd_default_compatible, 287 bfd_default_scan, 288 SH2A_NOFPU_OR_SH3_NOMMU_NEXT 289 }, 290 { 291 32, /* 32 bits in a word. */ 292 32, /* 32 bits in an address. */ 293 8, /* 8 bits in a byte. */ 294 bfd_arch_sh, 295 bfd_mach_sh2a_or_sh4, 296 "sh", /* Architecture name. */ 297 "sh2a-or-sh4", /* Machine name. */ 298 1, 299 FALSE, /* Not the default. */ 300 bfd_default_compatible, 301 bfd_default_scan, 302 SH2A_OR_SH4_NEXT 303 }, 304 { 305 32, /* 32 bits in a word. */ 306 32, /* 32 bits in an address. */ 307 8, /* 8 bits in a byte. */ 308 bfd_arch_sh, 309 bfd_mach_sh2a_or_sh3e, 310 "sh", /* Architecture name. */ 311 "sh2a-or-sh3e", /* Machine name. */ 312 1, 313 FALSE, /* Not the default. */ 314 bfd_default_compatible, 315 bfd_default_scan, 316 SH2A_OR_SH3E_NEXT 317 }, 318 { 319 64, /* 64 bits in a word. */ 320 64, /* 64 bits in an address. */ 321 8, /* 8 bits in a byte. */ 322 bfd_arch_sh, 323 bfd_mach_sh5, 324 "sh", /* Architecture name. */ 325 "sh5", /* Machine name. */ 326 1, 327 FALSE, /* Not the default. */ 328 bfd_default_compatible, 329 bfd_default_scan, 330 SH64_NEXT 331 }, 332}; 333 334const bfd_arch_info_type bfd_sh_arch = 335{ 336 32, /* 32 bits in a word. */ 337 32, /* 32 bits in an address. */ 338 8, /* 8 bits in a byte. */ 339 bfd_arch_sh, 340 bfd_mach_sh, 341 "sh", /* Architecture name. */ 342 "sh", /* Machine name. */ 343 1, 344 TRUE, /* The default machine. */ 345 bfd_default_compatible, 346 bfd_default_scan, 347 SH_NEXT 348}; 349 350 351/* This table defines the mappings from the BFD internal numbering 352 system to the opcodes internal flags system. 353 It is used by the functions defined below. 354 The prototypes for these SH specific functions are found in 355 sh-opc.h . */ 356 357static struct { unsigned long bfd_mach, arch, arch_up; } bfd_to_arch_table[] = 358{ 359 { bfd_mach_sh, arch_sh1, arch_sh_up }, 360 { bfd_mach_sh2, arch_sh2, arch_sh2_up }, 361 { bfd_mach_sh2e, arch_sh2e, arch_sh2e_up }, 362 { bfd_mach_sh_dsp, arch_sh_dsp, arch_sh_dsp_up }, 363 { bfd_mach_sh2a, arch_sh2a, arch_sh2a_up }, 364 { bfd_mach_sh2a_nofpu, arch_sh2a_nofpu, arch_sh2a_nofpu_up }, 365 366 { bfd_mach_sh2a_nofpu_or_sh4_nommu_nofpu, arch_sh2a_nofpu_or_sh4_nommu_nofpu, arch_sh2a_nofpu_or_sh4_nommu_nofpu_up }, 367 { bfd_mach_sh2a_nofpu_or_sh3_nommu, arch_sh2a_nofpu_or_sh3_nommu, arch_sh2a_nofpu_or_sh3_nommu_up }, 368 { bfd_mach_sh2a_or_sh4, arch_sh2a_or_sh4, arch_sh2a_or_sh4_up }, 369 { bfd_mach_sh2a_or_sh3e, arch_sh2a_or_sh3e, arch_sh2a_or_sh3e_up }, 370 371 { bfd_mach_sh3, arch_sh3, arch_sh3_up }, 372 { bfd_mach_sh3_nommu, arch_sh3_nommu, arch_sh3_nommu_up }, 373 { bfd_mach_sh3_dsp, arch_sh3_dsp, arch_sh3_dsp_up }, 374 { bfd_mach_sh3e, arch_sh3e, arch_sh3e_up }, 375 { bfd_mach_sh4, arch_sh4, arch_sh4_up }, 376 { bfd_mach_sh4a, arch_sh4a, arch_sh4a_up }, 377 { bfd_mach_sh4al_dsp, arch_sh4al_dsp, arch_sh4al_dsp_up }, 378 { bfd_mach_sh4_nofpu, arch_sh4_nofpu, arch_sh4_nofpu_up }, 379 { bfd_mach_sh4_nommu_nofpu, arch_sh4_nommu_nofpu, arch_sh4_nommu_nofpu_up }, 380 { bfd_mach_sh4a_nofpu, arch_sh4a_nofpu, arch_sh4a_nofpu_up }, 381 { 0, 0, 0 } /* Terminator. */ 382}; 383 384 385/* Convert a BFD mach number into the right opcodes arch flags 386 using the table above. */ 387 388unsigned int 389sh_get_arch_from_bfd_mach (unsigned long mach) 390{ 391 int i = 0; 392 393 while (bfd_to_arch_table[i].bfd_mach != 0) 394 if (bfd_to_arch_table[i].bfd_mach == mach) 395 return bfd_to_arch_table[i].arch; 396 else 397 i++; 398 399 /* Machine not found. */ 400 BFD_FAIL(); 401 402 return SH_ARCH_UNKNOWN_ARCH; 403} 404 405 406/* Convert a BFD mach number into a set of opcodes arch flags 407 describing all the compatible architectures (i.e. arch_up) 408 using the table above. */ 409 410unsigned int 411sh_get_arch_up_from_bfd_mach (unsigned long mach) 412{ 413 int i = 0; 414 415 while (bfd_to_arch_table[i].bfd_mach != 0) 416 if (bfd_to_arch_table[i].bfd_mach == mach) 417 return bfd_to_arch_table[i].arch_up; 418 else 419 i++; 420 421 /* Machine not found. */ 422 BFD_FAIL(); 423 424 return SH_ARCH_UNKNOWN_ARCH; 425} 426 427 428/* Convert an arbitary arch_set - not necessarily corresponding 429 directly to anything in the table above - to the most generic 430 architecture which supports all the required features, and 431 return the corresponding BFD mach. */ 432 433unsigned long 434sh_get_bfd_mach_from_arch_set (unsigned int arch_set) 435{ 436 unsigned long result = 0; 437 unsigned int best = ~arch_set; 438 unsigned int co_mask = ~0; 439 int i = 0; 440 441 /* If arch_set permits variants with no coprocessor then do not allow 442 the other irrelevant co-processor bits to influence the choice: 443 e.g. if dsp is disallowed by arch_set, then the algorithm would 444 prefer fpu variants over nofpu variants because they also disallow 445 dsp - even though the nofpu would be the most correct choice. 446 This assumes that EVERY fpu/dsp variant has a no-coprocessor 447 counter-part, or their non-fpu/dsp instructions do not have the 448 no co-processor bit set. */ 449 if (arch_set & arch_sh_no_co) 450 co_mask = ~(arch_sh_sp_fpu | arch_sh_dp_fpu | arch_sh_has_dsp); 451 452 while (bfd_to_arch_table[i].bfd_mach != 0) 453 { 454 unsigned int try = bfd_to_arch_table[i].arch_up & co_mask; 455 456 /* Conceptually: Find the architecture with the least number 457 of extra features or, if they have the same number, then 458 the greatest number of required features. Disregard 459 architectures where the required features alone do 460 not describe a valid architecture. */ 461 if (((try & ~arch_set) < (best & ~arch_set) 462 || ((try & ~arch_set) == (best & ~arch_set) 463 && (~try & arch_set) < (~best & arch_set))) 464 && SH_MERGE_ARCH_SET_VALID (try, arch_set)) 465 { 466 result = bfd_to_arch_table[i].bfd_mach; 467 best = try; 468 } 469 470 i++; 471 } 472 473 /* This might happen if a new variant is added to sh-opc.h 474 but no corresponding entry is added to the table above. */ 475 BFD_ASSERT (result != 0); 476 477 return result; 478} 479 480 481/* Merge the architecture type of two BFD files, such that the 482 resultant architecture supports all the features required 483 by the two input BFDs. 484 If the input BFDs are multually incompatible - i.e. one uses 485 DSP while the other uses FPU - or there is no known architecture 486 that fits the requirements then an error is emitted. */ 487 488bfd_boolean 489sh_merge_bfd_arch (bfd *ibfd, bfd *obfd) 490{ 491 unsigned int old_arch, new_arch, merged_arch; 492 493 if (! _bfd_generic_verify_endian_match (ibfd, obfd)) 494 return FALSE; 495 496 old_arch = sh_get_arch_up_from_bfd_mach (bfd_get_mach (obfd)); 497 new_arch = sh_get_arch_up_from_bfd_mach (bfd_get_mach (ibfd)); 498 499 merged_arch = SH_MERGE_ARCH_SET (old_arch, new_arch); 500 501 if (!SH_VALID_CO_ARCH_SET (merged_arch)) 502 { 503 (*_bfd_error_handler) 504 ("%B: uses %s instructions while previous modules use %s instructions", 505 ibfd, 506 SH_ARCH_SET_HAS_DSP (new_arch) ? "dsp" : "floating point", 507 SH_ARCH_SET_HAS_DSP (new_arch) ? "floating point" : "dsp"); 508 bfd_set_error (bfd_error_bad_value); 509 return FALSE; 510 } 511 else if (!SH_VALID_ARCH_SET (merged_arch)) 512 { 513 (*_bfd_error_handler) 514 ("internal error: merge of architecture '%s' with architecture '%s' produced unknown architecture\n", 515 bfd_printable_name (obfd), 516 bfd_printable_name (ibfd)); 517 bfd_set_error (bfd_error_bad_value); 518 return FALSE; 519 } 520 521 bfd_default_set_arch_mach (obfd, bfd_arch_sh, 522 sh_get_bfd_mach_from_arch_set (merged_arch)); 523 524 return TRUE; 525} 526