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