archures.c revision 208737
133965Sjdp/* BFD library support routines for architectures. 278828Sobrien Copyright 1990, 1991, 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999, 3208737Sjmallett 2000, 2001, 2002, 2003, 2004, 2005, 2006 460484Sobrien Free Software Foundation, Inc. 533965Sjdp Hacked by John Gilmore and Steve Chamberlain of Cygnus Support. 633965Sjdp 7130561Sobrien This file is part of BFD, the Binary File Descriptor library. 833965Sjdp 9130561Sobrien This program is free software; you can redistribute it and/or modify 10130561Sobrien it under the terms of the GNU General Public License as published by 11130561Sobrien the Free Software Foundation; either version 2 of the License, or 12130561Sobrien (at your option) any later version. 1333965Sjdp 14130561Sobrien This program is distributed in the hope that it will be useful, 15130561Sobrien but WITHOUT ANY WARRANTY; without even the implied warranty of 16130561Sobrien MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 17130561Sobrien GNU General Public License for more details. 1833965Sjdp 19130561Sobrien You should have received a copy of the GNU General Public License 20130561Sobrien along with this program; if not, write to the Free Software 21208737Sjmallett Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston, MA 02110-1301, USA. */ 2233965Sjdp 2333965Sjdp#include "bfd.h" 2433965Sjdp#include "sysdep.h" 2533965Sjdp#include "libbfd.h" 2689857Sobrien#include "safe-ctype.h" 2733965Sjdp 2833965Sjdp/* 2933965Sjdp 3033965SjdpSECTION 3133965Sjdp Architectures 3233965Sjdp 3333965Sjdp BFD keeps one atom in a BFD describing the 3433965Sjdp architecture of the data attached to the BFD: a pointer to a 3577298Sobrien <<bfd_arch_info_type>>. 3633965Sjdp 3733965Sjdp Pointers to structures can be requested independently of a BFD 3833965Sjdp so that an architecture's information can be interrogated 3933965Sjdp without access to an open BFD. 4033965Sjdp 4133965Sjdp The architecture information is provided by each architecture package. 4233965Sjdp The set of default architectures is selected by the macro 4333965Sjdp <<SELECT_ARCHITECTURES>>. This is normally set up in the 4433965Sjdp @file{config/@var{target}.mt} file of your choice. If the name is not 4577298Sobrien defined, then all the architectures supported are included. 4633965Sjdp 4733965Sjdp When BFD starts up, all the architectures are called with an 4833965Sjdp initialize method. It is up to the architecture back end to 4933965Sjdp insert as many items into the list of architectures as it wants to; 5033965Sjdp generally this would be one for each machine and one for the 5177298Sobrien default case (an item with a machine field of 0). 5233965Sjdp 5333965Sjdp BFD's idea of an architecture is implemented in @file{archures.c}. 5433965Sjdp*/ 5533965Sjdp 5633965Sjdp/* 5733965Sjdp 5833965SjdpSUBSECTION 5933965Sjdp bfd_architecture 6033965Sjdp 6133965SjdpDESCRIPTION 6233965Sjdp This enum gives the object file's CPU architecture, in a 6333965Sjdp global sense---i.e., what processor family does it belong to? 6433965Sjdp Another field indicates which processor within 6533965Sjdp the family is in use. The machine gives a number which 6633965Sjdp distinguishes different versions of the architecture, 6733965Sjdp containing, for example, 2 and 3 for Intel i960 KA and i960 KB, 6877298Sobrien and 68020 and 68030 for Motorola 68020 and 68030. 6933965Sjdp 7077298Sobrien.enum bfd_architecture 7133965Sjdp.{ 7291041Sobrien. bfd_arch_unknown, {* File arch not known. *} 7391041Sobrien. bfd_arch_obscure, {* Arch known, not one of these. *} 7433965Sjdp. bfd_arch_m68k, {* Motorola 68xxx *} 7538889Sjdp.#define bfd_mach_m68000 1 7638889Sjdp.#define bfd_mach_m68008 2 7738889Sjdp.#define bfd_mach_m68010 3 7838889Sjdp.#define bfd_mach_m68020 4 7938889Sjdp.#define bfd_mach_m68030 5 8038889Sjdp.#define bfd_mach_m68040 6 8138889Sjdp.#define bfd_mach_m68060 7 8260484Sobrien.#define bfd_mach_cpu32 8 8378828Sobrien.#define bfd_mach_mcf5200 9 8478828Sobrien.#define bfd_mach_mcf5206e 10 8578828Sobrien.#define bfd_mach_mcf5307 11 8678828Sobrien.#define bfd_mach_mcf5407 12 87130561Sobrien.#define bfd_mach_mcf528x 13 8877298Sobrien. bfd_arch_vax, {* DEC Vax *} 8933965Sjdp. bfd_arch_i960, {* Intel 960 *} 9033965Sjdp. {* The order of the following is important. 9177298Sobrien. lower number indicates a machine type that 9233965Sjdp. only accepts a subset of the instructions 9333965Sjdp. available to machines with higher numbers. 9433965Sjdp. The exception is the "ca", which is 9577298Sobrien. incompatible with all other machines except 9691041Sobrien. "core". *} 9733965Sjdp. 9833965Sjdp.#define bfd_mach_i960_core 1 9933965Sjdp.#define bfd_mach_i960_ka_sa 2 10033965Sjdp.#define bfd_mach_i960_kb_sb 3 10133965Sjdp.#define bfd_mach_i960_mc 4 10233965Sjdp.#define bfd_mach_i960_xa 5 10333965Sjdp.#define bfd_mach_i960_ca 6 10433965Sjdp.#define bfd_mach_i960_jx 7 10533965Sjdp.#define bfd_mach_i960_hx 8 10633965Sjdp. 10791041Sobrien. bfd_arch_or32, {* OpenRISC 32 *} 10891041Sobrien. 10933965Sjdp. bfd_arch_a29k, {* AMD 29000 *} 11033965Sjdp. bfd_arch_sparc, {* SPARC *} 11133965Sjdp.#define bfd_mach_sparc 1 11233965Sjdp.{* The difference between v8plus and v9 is that v9 is a true 64 bit env. *} 11333965Sjdp.#define bfd_mach_sparc_sparclet 2 11433965Sjdp.#define bfd_mach_sparc_sparclite 3 11533965Sjdp.#define bfd_mach_sparc_v8plus 4 11691041Sobrien.#define bfd_mach_sparc_v8plusa 5 {* with ultrasparc add'ns. *} 11760484Sobrien.#define bfd_mach_sparc_sparclite_le 6 11860484Sobrien.#define bfd_mach_sparc_v9 7 11991041Sobrien.#define bfd_mach_sparc_v9a 8 {* with ultrasparc add'ns. *} 12091041Sobrien.#define bfd_mach_sparc_v8plusb 9 {* with cheetah add'ns. *} 12191041Sobrien.#define bfd_mach_sparc_v9b 10 {* with cheetah add'ns. *} 12233965Sjdp.{* Nonzero if MACH has the v9 instruction set. *} 12333965Sjdp.#define bfd_mach_sparc_v9_p(mach) \ 12477298Sobrien. ((mach) >= bfd_mach_sparc_v8plus && (mach) <= bfd_mach_sparc_v9b \ 12577298Sobrien. && (mach) != bfd_mach_sparc_sparclite_le) 12633965Sjdp. bfd_arch_mips, {* MIPS Rxxxx *} 12738889Sjdp.#define bfd_mach_mips3000 3000 12838889Sjdp.#define bfd_mach_mips3900 3900 12938889Sjdp.#define bfd_mach_mips4000 4000 13038889Sjdp.#define bfd_mach_mips4010 4010 13138889Sjdp.#define bfd_mach_mips4100 4100 13260484Sobrien.#define bfd_mach_mips4111 4111 133130561Sobrien.#define bfd_mach_mips4120 4120 13438889Sjdp.#define bfd_mach_mips4300 4300 13538889Sjdp.#define bfd_mach_mips4400 4400 13638889Sjdp.#define bfd_mach_mips4600 4600 13738889Sjdp.#define bfd_mach_mips4650 4650 13838889Sjdp.#define bfd_mach_mips5000 5000 139130561Sobrien.#define bfd_mach_mips5400 5400 140130561Sobrien.#define bfd_mach_mips5500 5500 14138889Sjdp.#define bfd_mach_mips6000 6000 142130561Sobrien.#define bfd_mach_mips7000 7000 14338889Sjdp.#define bfd_mach_mips8000 8000 144208737Sjmallett.#define bfd_mach_mips9000 9000 14538889Sjdp.#define bfd_mach_mips10000 10000 14678828Sobrien.#define bfd_mach_mips12000 12000 14738889Sjdp.#define bfd_mach_mips16 16 14877298Sobrien.#define bfd_mach_mips5 5 149208737Sjmallett.#define bfd_mach_mips_octeon 6502 15077298Sobrien.#define bfd_mach_mips_sb1 12310201 {* octal 'SB', 01 *} 15189857Sobrien.#define bfd_mach_mipsisa32 32 152130561Sobrien.#define bfd_mach_mipsisa32r2 33 15389857Sobrien.#define bfd_mach_mipsisa64 64 154130561Sobrien.#define bfd_mach_mipsisa64r2 65 15533965Sjdp. bfd_arch_i386, {* Intel 386 *} 156130561Sobrien.#define bfd_mach_i386_i386 1 157130561Sobrien.#define bfd_mach_i386_i8086 2 158130561Sobrien.#define bfd_mach_i386_i386_intel_syntax 3 159130561Sobrien.#define bfd_mach_x86_64 64 160130561Sobrien.#define bfd_mach_x86_64_intel_syntax 65 16133965Sjdp. bfd_arch_we32k, {* AT&T WE32xxx *} 16233965Sjdp. bfd_arch_tahoe, {* CCI/Harris Tahoe *} 16333965Sjdp. bfd_arch_i860, {* Intel 860 *} 16460484Sobrien. bfd_arch_i370, {* IBM 360/370 Mainframes *} 16533965Sjdp. bfd_arch_romp, {* IBM ROMP PC/RT *} 16633965Sjdp. bfd_arch_alliant, {* Alliant *} 16733965Sjdp. bfd_arch_convex, {* Convex *} 16833965Sjdp. bfd_arch_m88k, {* Motorola 88xxx *} 169130561Sobrien. bfd_arch_m98k, {* Motorola 98xxx *} 17033965Sjdp. bfd_arch_pyramid, {* Pyramid Technology *} 171130561Sobrien. bfd_arch_h8300, {* Renesas H8/300 (formerly Hitachi H8/300) *} 172130561Sobrien.#define bfd_mach_h8300 1 173130561Sobrien.#define bfd_mach_h8300h 2 174130561Sobrien.#define bfd_mach_h8300s 3 175130561Sobrien.#define bfd_mach_h8300hn 4 176130561Sobrien.#define bfd_mach_h8300sn 5 177130561Sobrien.#define bfd_mach_h8300sx 6 178130561Sobrien.#define bfd_mach_h8300sxn 7 17989857Sobrien. bfd_arch_pdp11, {* DEC PDP-11 *} 18033965Sjdp. bfd_arch_powerpc, {* PowerPC *} 181130561Sobrien.#define bfd_mach_ppc 32 182130561Sobrien.#define bfd_mach_ppc64 64 18377298Sobrien.#define bfd_mach_ppc_403 403 18477298Sobrien.#define bfd_mach_ppc_403gc 4030 18577298Sobrien.#define bfd_mach_ppc_505 505 18677298Sobrien.#define bfd_mach_ppc_601 601 18777298Sobrien.#define bfd_mach_ppc_602 602 18877298Sobrien.#define bfd_mach_ppc_603 603 18977298Sobrien.#define bfd_mach_ppc_ec603e 6031 19077298Sobrien.#define bfd_mach_ppc_604 604 19177298Sobrien.#define bfd_mach_ppc_620 620 19277298Sobrien.#define bfd_mach_ppc_630 630 19377298Sobrien.#define bfd_mach_ppc_750 750 19477298Sobrien.#define bfd_mach_ppc_860 860 19577298Sobrien.#define bfd_mach_ppc_a35 35 19677298Sobrien.#define bfd_mach_ppc_rs64ii 642 19777298Sobrien.#define bfd_mach_ppc_rs64iii 643 19877298Sobrien.#define bfd_mach_ppc_7400 7400 199130561Sobrien.#define bfd_mach_ppc_e500 500 20033965Sjdp. bfd_arch_rs6000, {* IBM RS/6000 *} 201130561Sobrien.#define bfd_mach_rs6k 6000 20277298Sobrien.#define bfd_mach_rs6k_rs1 6001 20377298Sobrien.#define bfd_mach_rs6k_rsc 6003 20477298Sobrien.#define bfd_mach_rs6k_rs2 6002 20533965Sjdp. bfd_arch_hppa, {* HP PA RISC *} 206130561Sobrien.#define bfd_mach_hppa10 10 207130561Sobrien.#define bfd_mach_hppa11 11 208130561Sobrien.#define bfd_mach_hppa20 20 209130561Sobrien.#define bfd_mach_hppa20w 25 21033965Sjdp. bfd_arch_d10v, {* Mitsubishi D10V *} 211130561Sobrien.#define bfd_mach_d10v 1 21260484Sobrien.#define bfd_mach_d10v_ts2 2 21360484Sobrien.#define bfd_mach_d10v_ts3 3 21460484Sobrien. bfd_arch_d30v, {* Mitsubishi D30V *} 215104834Sobrien. bfd_arch_dlx, {* DLX *} 21677298Sobrien. bfd_arch_m68hc11, {* Motorola 68HC11 *} 21777298Sobrien. bfd_arch_m68hc12, {* Motorola 68HC12 *} 218130561Sobrien.#define bfd_mach_m6812_default 0 219130561Sobrien.#define bfd_mach_m6812 1 220130561Sobrien.#define bfd_mach_m6812s 2 22133965Sjdp. bfd_arch_z8k, {* Zilog Z8000 *} 22233965Sjdp.#define bfd_mach_z8001 1 22333965Sjdp.#define bfd_mach_z8002 2 224130561Sobrien. bfd_arch_h8500, {* Renesas H8/500 (formerly Hitachi H8/500) *} 225130561Sobrien. bfd_arch_sh, {* Renesas / SuperH SH (formerly Hitachi SH) *} 226130561Sobrien.#define bfd_mach_sh 1 22760484Sobrien.#define bfd_mach_sh2 0x20 22860484Sobrien.#define bfd_mach_sh_dsp 0x2d 229130561Sobrien.#define bfd_mach_sh2e 0x2e 23038889Sjdp.#define bfd_mach_sh3 0x30 23160484Sobrien.#define bfd_mach_sh3_dsp 0x3d 23238889Sjdp.#define bfd_mach_sh3e 0x3e 23338889Sjdp.#define bfd_mach_sh4 0x40 234130561Sobrien.#define bfd_mach_sh4_nofpu 0x41 235130561Sobrien.#define bfd_mach_sh4a 0x4a 236130561Sobrien.#define bfd_mach_sh4a_nofpu 0x4b 237130561Sobrien.#define bfd_mach_sh4al_dsp 0x4d 23891041Sobrien.#define bfd_mach_sh5 0x50 23933965Sjdp. bfd_arch_alpha, {* Dec Alpha *} 24060484Sobrien.#define bfd_mach_alpha_ev4 0x10 24160484Sobrien.#define bfd_mach_alpha_ev5 0x20 24260484Sobrien.#define bfd_mach_alpha_ev6 0x30 24391041Sobrien. bfd_arch_arm, {* Advanced Risc Machines ARM. *} 244130561Sobrien.#define bfd_mach_arm_unknown 0 24538889Sjdp.#define bfd_mach_arm_2 1 24660484Sobrien.#define bfd_mach_arm_2a 2 24738889Sjdp.#define bfd_mach_arm_3 3 24838889Sjdp.#define bfd_mach_arm_3M 4 24960484Sobrien.#define bfd_mach_arm_4 5 25038889Sjdp.#define bfd_mach_arm_4T 6 25160484Sobrien.#define bfd_mach_arm_5 7 25260484Sobrien.#define bfd_mach_arm_5T 8 25377298Sobrien.#define bfd_mach_arm_5TE 9 25477298Sobrien.#define bfd_mach_arm_XScale 10 255130561Sobrien.#define bfd_mach_arm_ep9312 11 256130561Sobrien.#define bfd_mach_arm_iWMMXt 12 25733965Sjdp. bfd_arch_ns32k, {* National Semiconductors ns32000 *} 25833965Sjdp. bfd_arch_w65, {* WDC 65816 *} 25938889Sjdp. bfd_arch_tic30, {* Texas Instruments TMS320C30 *} 260130561Sobrien. bfd_arch_tic4x, {* Texas Instruments TMS320C3X/4X *} 261130561Sobrien.#define bfd_mach_tic3x 30 262130561Sobrien.#define bfd_mach_tic4x 40 26377298Sobrien. bfd_arch_tic54x, {* Texas Instruments TMS320C54X *} 26460484Sobrien. bfd_arch_tic80, {* TI TMS320c80 (MVP) *} 26538889Sjdp. bfd_arch_v850, {* NEC V850 *} 266130561Sobrien.#define bfd_mach_v850 1 26760484Sobrien.#define bfd_mach_v850e 'E' 268130561Sobrien.#define bfd_mach_v850e1 '1' 26977298Sobrien. bfd_arch_arc, {* ARC Cores *} 270130561Sobrien.#define bfd_mach_arc_5 5 271130561Sobrien.#define bfd_mach_arc_6 6 272130561Sobrien.#define bfd_mach_arc_7 7 273130561Sobrien.#define bfd_mach_arc_8 8 274130561Sobrien. bfd_arch_m32r, {* Renesas M32R (formerly Mitsubishi M32R/D) *} 275130561Sobrien.#define bfd_mach_m32r 1 {* For backwards compatibility. *} 27660484Sobrien.#define bfd_mach_m32rx 'x' 277130561Sobrien.#define bfd_mach_m32r2 '2' 27833965Sjdp. bfd_arch_mn10200, {* Matsushita MN10200 *} 27933965Sjdp. bfd_arch_mn10300, {* Matsushita MN10300 *} 28060484Sobrien.#define bfd_mach_mn10300 300 28160484Sobrien.#define bfd_mach_am33 330 282130561Sobrien.#define bfd_mach_am33_2 332 28360484Sobrien. bfd_arch_fr30, 28460484Sobrien.#define bfd_mach_fr30 0x46523330 285104834Sobrien. bfd_arch_frv, 286130561Sobrien.#define bfd_mach_frv 1 287130561Sobrien.#define bfd_mach_frvsimple 2 288104834Sobrien.#define bfd_mach_fr300 300 289104834Sobrien.#define bfd_mach_fr400 400 290104834Sobrien.#define bfd_mach_frvtomcat 499 {* fr500 prototype *} 291104834Sobrien.#define bfd_mach_fr500 500 292130561Sobrien.#define bfd_mach_fr550 550 29360484Sobrien. bfd_arch_mcore, 29477298Sobrien. bfd_arch_ia64, {* HP/Intel ia64 *} 295130561Sobrien.#define bfd_mach_ia64_elf64 64 296130561Sobrien.#define bfd_mach_ia64_elf32 32 297130561Sobrien. bfd_arch_ip2k, {* Ubicom IP2K microcontrollers. *} 298130561Sobrien.#define bfd_mach_ip2022 1 299130561Sobrien.#define bfd_mach_ip2022ext 2 300130561Sobrien. bfd_arch_iq2000, {* Vitesse IQ2000. *} 301130561Sobrien.#define bfd_mach_iq2000 1 302130561Sobrien.#define bfd_mach_iq10 2 30360484Sobrien. bfd_arch_pj, 30491041Sobrien. bfd_arch_avr, {* Atmel AVR microcontrollers. *} 30560484Sobrien.#define bfd_mach_avr1 1 30660484Sobrien.#define bfd_mach_avr2 2 30760484Sobrien.#define bfd_mach_avr3 3 30860484Sobrien.#define bfd_mach_avr4 4 30977298Sobrien.#define bfd_mach_avr5 5 31077298Sobrien. bfd_arch_cris, {* Axis CRIS *} 31189857Sobrien. bfd_arch_s390, {* IBM s390 *} 312130561Sobrien.#define bfd_mach_s390_31 31 313130561Sobrien.#define bfd_mach_s390_64 64 31489857Sobrien. bfd_arch_openrisc, {* OpenRISC *} 31591041Sobrien. bfd_arch_mmix, {* Donald Knuth's educational processor. *} 31689857Sobrien. bfd_arch_xstormy16, 317130561Sobrien.#define bfd_mach_xstormy16 1 318130561Sobrien. bfd_arch_msp430, {* Texas Instruments MSP430 architecture. *} 319130561Sobrien.#define bfd_mach_msp11 11 320130561Sobrien.#define bfd_mach_msp110 110 321130561Sobrien.#define bfd_mach_msp12 12 322130561Sobrien.#define bfd_mach_msp13 13 323130561Sobrien.#define bfd_mach_msp14 14 324130561Sobrien.#define bfd_mach_msp15 15 325130561Sobrien.#define bfd_mach_msp16 16 326130561Sobrien.#define bfd_mach_msp31 31 327130561Sobrien.#define bfd_mach_msp32 32 328130561Sobrien.#define bfd_mach_msp33 33 329130561Sobrien.#define bfd_mach_msp41 41 330130561Sobrien.#define bfd_mach_msp42 42 331130561Sobrien.#define bfd_mach_msp43 43 332130561Sobrien.#define bfd_mach_msp44 44 333130561Sobrien. bfd_arch_xtensa, {* Tensilica's Xtensa cores. *} 334130561Sobrien.#define bfd_mach_xtensa 1 33533965Sjdp. bfd_arch_last 33633965Sjdp. }; 33733965Sjdp*/ 33833965Sjdp 33933965Sjdp/* 34033965SjdpSUBSECTION 34133965Sjdp bfd_arch_info 34233965Sjdp 34333965SjdpDESCRIPTION 34433965Sjdp This structure contains information on architectures for use 34533965Sjdp within BFD. 34633965Sjdp 34733965Sjdp. 34877298Sobrien.typedef struct bfd_arch_info 34933965Sjdp.{ 35033965Sjdp. int bits_per_word; 35133965Sjdp. int bits_per_address; 35233965Sjdp. int bits_per_byte; 35333965Sjdp. enum bfd_architecture arch; 35433965Sjdp. unsigned long mach; 35533965Sjdp. const char *arch_name; 35633965Sjdp. const char *printable_name; 35733965Sjdp. unsigned int section_align_power; 358130561Sobrien. {* TRUE if this is the default machine for the architecture. 35999461Sobrien. The default arch should be the first entry for an arch so that 36099461Sobrien. all the entries for that arch can be accessed via <<next>>. *} 361130561Sobrien. bfd_boolean the_default; 36233965Sjdp. const struct bfd_arch_info * (*compatible) 363130561Sobrien. (const struct bfd_arch_info *a, const struct bfd_arch_info *b); 36433965Sjdp. 365130561Sobrien. bfd_boolean (*scan) (const struct bfd_arch_info *, const char *); 36633965Sjdp. 36733965Sjdp. const struct bfd_arch_info *next; 36891041Sobrien.} 36991041Sobrien.bfd_arch_info_type; 37091041Sobrien. 37133965Sjdp*/ 37233965Sjdp 37333965Sjdpextern const bfd_arch_info_type bfd_a29k_arch; 37433965Sjdpextern const bfd_arch_info_type bfd_alpha_arch; 37538889Sjdpextern const bfd_arch_info_type bfd_arc_arch; 37633965Sjdpextern const bfd_arch_info_type bfd_arm_arch; 37791041Sobrienextern const bfd_arch_info_type bfd_avr_arch; 37877298Sobrienextern const bfd_arch_info_type bfd_cris_arch; 37933965Sjdpextern const bfd_arch_info_type bfd_d10v_arch; 38060484Sobrienextern const bfd_arch_info_type bfd_d30v_arch; 381104834Sobrienextern const bfd_arch_info_type bfd_dlx_arch; 38291041Sobrienextern const bfd_arch_info_type bfd_fr30_arch; 383104834Sobrienextern const bfd_arch_info_type bfd_frv_arch; 38433965Sjdpextern const bfd_arch_info_type bfd_h8300_arch; 38533965Sjdpextern const bfd_arch_info_type bfd_h8500_arch; 38633965Sjdpextern const bfd_arch_info_type bfd_hppa_arch; 38760484Sobrienextern const bfd_arch_info_type bfd_i370_arch; 38833965Sjdpextern const bfd_arch_info_type bfd_i386_arch; 38933965Sjdpextern const bfd_arch_info_type bfd_i860_arch; 39033965Sjdpextern const bfd_arch_info_type bfd_i960_arch; 39191041Sobrienextern const bfd_arch_info_type bfd_ia64_arch; 392130561Sobrienextern const bfd_arch_info_type bfd_ip2k_arch; 393130561Sobrienextern const bfd_arch_info_type bfd_iq2000_arch; 39433965Sjdpextern const bfd_arch_info_type bfd_m32r_arch; 39577298Sobrienextern const bfd_arch_info_type bfd_m68hc11_arch; 39677298Sobrienextern const bfd_arch_info_type bfd_m68hc12_arch; 39733965Sjdpextern const bfd_arch_info_type bfd_m68k_arch; 39833965Sjdpextern const bfd_arch_info_type bfd_m88k_arch; 39991041Sobrienextern const bfd_arch_info_type bfd_mcore_arch; 40033965Sjdpextern const bfd_arch_info_type bfd_mips_arch; 40191041Sobrienextern const bfd_arch_info_type bfd_mmix_arch; 40233965Sjdpextern const bfd_arch_info_type bfd_mn10200_arch; 40333965Sjdpextern const bfd_arch_info_type bfd_mn10300_arch; 404130561Sobrienextern const bfd_arch_info_type bfd_msp430_arch; 40591041Sobrienextern const bfd_arch_info_type bfd_ns32k_arch; 40691041Sobrienextern const bfd_arch_info_type bfd_openrisc_arch; 40791041Sobrienextern const bfd_arch_info_type bfd_or32_arch; 40889857Sobrienextern const bfd_arch_info_type bfd_pdp11_arch; 40991041Sobrienextern const bfd_arch_info_type bfd_pj_arch; 41091041Sobrienextern const bfd_arch_info_type bfd_powerpc_archs[]; 41191041Sobrien#define bfd_powerpc_arch bfd_powerpc_archs[0] 41233965Sjdpextern const bfd_arch_info_type bfd_rs6000_arch; 41391041Sobrienextern const bfd_arch_info_type bfd_s390_arch; 41433965Sjdpextern const bfd_arch_info_type bfd_sh_arch; 41533965Sjdpextern const bfd_arch_info_type bfd_sparc_arch; 41638889Sjdpextern const bfd_arch_info_type bfd_tic30_arch; 417130561Sobrienextern const bfd_arch_info_type bfd_tic4x_arch; 41877298Sobrienextern const bfd_arch_info_type bfd_tic54x_arch; 41960484Sobrienextern const bfd_arch_info_type bfd_tic80_arch; 42091041Sobrienextern const bfd_arch_info_type bfd_v850_arch; 42133965Sjdpextern const bfd_arch_info_type bfd_vax_arch; 42233965Sjdpextern const bfd_arch_info_type bfd_we32k_arch; 42333965Sjdpextern const bfd_arch_info_type bfd_w65_arch; 42489857Sobrienextern const bfd_arch_info_type bfd_xstormy16_arch; 425130561Sobrienextern const bfd_arch_info_type bfd_xtensa_arch; 42691041Sobrienextern const bfd_arch_info_type bfd_z8k_arch; 42733965Sjdp 42891041Sobrienstatic const bfd_arch_info_type * const bfd_archures_list[] = 42991041Sobrien { 43033965Sjdp#ifdef SELECT_ARCHITECTURES 43191041Sobrien SELECT_ARCHITECTURES, 43233965Sjdp#else 43391041Sobrien &bfd_a29k_arch, 43491041Sobrien &bfd_alpha_arch, 43591041Sobrien &bfd_arc_arch, 43691041Sobrien &bfd_arm_arch, 43791041Sobrien &bfd_avr_arch, 43891041Sobrien &bfd_cris_arch, 43991041Sobrien &bfd_d10v_arch, 44091041Sobrien &bfd_d30v_arch, 441104834Sobrien &bfd_dlx_arch, 44291041Sobrien &bfd_fr30_arch, 443104834Sobrien &bfd_frv_arch, 44491041Sobrien &bfd_h8300_arch, 44591041Sobrien &bfd_h8500_arch, 44691041Sobrien &bfd_hppa_arch, 44791041Sobrien &bfd_i370_arch, 44891041Sobrien &bfd_i386_arch, 44991041Sobrien &bfd_i860_arch, 45091041Sobrien &bfd_i960_arch, 45191041Sobrien &bfd_ia64_arch, 452130561Sobrien &bfd_ip2k_arch, 453130561Sobrien &bfd_iq2000_arch, 45491041Sobrien &bfd_m32r_arch, 45591041Sobrien &bfd_m68hc11_arch, 45691041Sobrien &bfd_m68hc12_arch, 45791041Sobrien &bfd_m68k_arch, 45891041Sobrien &bfd_m88k_arch, 45991041Sobrien &bfd_mcore_arch, 46091041Sobrien &bfd_mips_arch, 46191041Sobrien &bfd_mmix_arch, 46291041Sobrien &bfd_mn10200_arch, 46391041Sobrien &bfd_mn10300_arch, 464130561Sobrien &bfd_msp430_arch, 46591041Sobrien &bfd_ns32k_arch, 46691041Sobrien &bfd_openrisc_arch, 46791041Sobrien &bfd_or32_arch, 46891041Sobrien &bfd_pdp11_arch, 46991041Sobrien &bfd_powerpc_arch, 47091041Sobrien &bfd_rs6000_arch, 47191041Sobrien &bfd_s390_arch, 47291041Sobrien &bfd_sh_arch, 47391041Sobrien &bfd_sparc_arch, 47491041Sobrien &bfd_tic30_arch, 475130561Sobrien &bfd_tic4x_arch, 47691041Sobrien &bfd_tic54x_arch, 47791041Sobrien &bfd_tic80_arch, 47891041Sobrien &bfd_v850_arch, 47991041Sobrien &bfd_vax_arch, 48091041Sobrien &bfd_w65_arch, 48191041Sobrien &bfd_we32k_arch, 48291041Sobrien &bfd_xstormy16_arch, 483130561Sobrien &bfd_xtensa_arch, 48491041Sobrien &bfd_z8k_arch, 48533965Sjdp#endif 48633965Sjdp 0 48733965Sjdp}; 48833965Sjdp 48933965Sjdp/* 49033965SjdpFUNCTION 49133965Sjdp bfd_printable_name 49233965Sjdp 49333965SjdpSYNOPSIS 494130561Sobrien const char *bfd_printable_name (bfd *abfd); 49533965Sjdp 49633965SjdpDESCRIPTION 49733965Sjdp Return a printable string representing the architecture and machine 49833965Sjdp from the pointer to the architecture info structure. 49933965Sjdp 50033965Sjdp*/ 50133965Sjdp 50233965Sjdpconst char * 503130561Sobrienbfd_printable_name (bfd *abfd) 50433965Sjdp{ 50533965Sjdp return abfd->arch_info->printable_name; 50633965Sjdp} 50733965Sjdp 50833965Sjdp/* 50933965SjdpFUNCTION 51033965Sjdp bfd_scan_arch 51133965Sjdp 51233965SjdpSYNOPSIS 513130561Sobrien const bfd_arch_info_type *bfd_scan_arch (const char *string); 51433965Sjdp 51533965SjdpDESCRIPTION 51633965Sjdp Figure out if BFD supports any cpu which could be described with 51733965Sjdp the name @var{string}. Return a pointer to an <<arch_info>> 51833965Sjdp structure if a machine is found, otherwise NULL. 51933965Sjdp*/ 52033965Sjdp 52133965Sjdpconst bfd_arch_info_type * 522130561Sobrienbfd_scan_arch (const char *string) 52333965Sjdp{ 52433965Sjdp const bfd_arch_info_type * const *app, *ap; 52533965Sjdp 52677298Sobrien /* Look through all the installed architectures. */ 52733965Sjdp for (app = bfd_archures_list; *app != NULL; app++) 52833965Sjdp { 52933965Sjdp for (ap = *app; ap != NULL; ap = ap->next) 53033965Sjdp { 53133965Sjdp if (ap->scan (ap, string)) 53233965Sjdp return ap; 53333965Sjdp } 53433965Sjdp } 53533965Sjdp 53633965Sjdp return NULL; 53733965Sjdp} 53833965Sjdp 53933965Sjdp/* 54033965SjdpFUNCTION 54138889Sjdp bfd_arch_list 54238889Sjdp 54338889SjdpSYNOPSIS 544130561Sobrien const char **bfd_arch_list (void); 54538889Sjdp 54638889SjdpDESCRIPTION 54738889Sjdp Return a freshly malloced NULL-terminated vector of the names 54838889Sjdp of all the valid BFD architectures. Do not modify the names. 54938889Sjdp*/ 55038889Sjdp 55138889Sjdpconst char ** 552130561Sobrienbfd_arch_list (void) 55338889Sjdp{ 55438889Sjdp int vec_length = 0; 55538889Sjdp const char **name_ptr; 55638889Sjdp const char **name_list; 55738889Sjdp const bfd_arch_info_type * const *app; 55889857Sobrien bfd_size_type amt; 55938889Sjdp 56077298Sobrien /* Determine the number of architectures. */ 56138889Sjdp vec_length = 0; 56238889Sjdp for (app = bfd_archures_list; *app != NULL; app++) 56338889Sjdp { 56438889Sjdp const bfd_arch_info_type *ap; 56538889Sjdp for (ap = *app; ap != NULL; ap = ap->next) 56638889Sjdp { 56738889Sjdp vec_length++; 56838889Sjdp } 56938889Sjdp } 57038889Sjdp 57189857Sobrien amt = (vec_length + 1) * sizeof (char **); 572130561Sobrien name_list = bfd_malloc (amt); 57338889Sjdp if (name_list == NULL) 57438889Sjdp return NULL; 57538889Sjdp 57677298Sobrien /* Point the list at each of the names. */ 57738889Sjdp name_ptr = name_list; 57838889Sjdp for (app = bfd_archures_list; *app != NULL; app++) 57938889Sjdp { 58038889Sjdp const bfd_arch_info_type *ap; 58138889Sjdp for (ap = *app; ap != NULL; ap = ap->next) 58238889Sjdp { 58338889Sjdp *name_ptr = ap->printable_name; 58438889Sjdp name_ptr++; 58538889Sjdp } 58638889Sjdp } 58738889Sjdp *name_ptr = NULL; 58838889Sjdp 58938889Sjdp return name_list; 59038889Sjdp} 59138889Sjdp 59238889Sjdp/* 59338889SjdpFUNCTION 59433965Sjdp bfd_arch_get_compatible 59533965Sjdp 59633965SjdpSYNOPSIS 597130561Sobrien const bfd_arch_info_type *bfd_arch_get_compatible 598130561Sobrien (const bfd *abfd, const bfd *bbfd, bfd_boolean accept_unknowns); 59933965Sjdp 60033965SjdpDESCRIPTION 601130561Sobrien Determine whether two BFDs' architectures and machine types 602130561Sobrien are compatible. Calculates the lowest common denominator 603130561Sobrien between the two architectures and machine types implied by 604130561Sobrien the BFDs and returns a pointer to an <<arch_info>> structure 605130561Sobrien describing the compatible machine. 60633965Sjdp*/ 60733965Sjdp 60833965Sjdpconst bfd_arch_info_type * 609130561Sobrienbfd_arch_get_compatible (const bfd *abfd, 610130561Sobrien const bfd *bbfd, 611130561Sobrien bfd_boolean accept_unknowns) 61233965Sjdp{ 613130561Sobrien const bfd * ubfd = NULL; 61433965Sjdp 615130561Sobrien /* Look for an unknown architecture. */ 616130561Sobrien if (((ubfd = abfd) && ubfd->arch_info->arch == bfd_arch_unknown) 617130561Sobrien || ((ubfd = bbfd) && ubfd->arch_info->arch == bfd_arch_unknown)) 618130561Sobrien { 619130561Sobrien /* We can allow an unknown architecture if accept_unknowns 620130561Sobrien is true, or if the target is the "binary" format, which 621130561Sobrien has an unknown architecture. Since the binary format can 622130561Sobrien only be set by explicit request from the user, it is safe 623130561Sobrien to assume that they know what they are doing. */ 624130561Sobrien if (accept_unknowns 625130561Sobrien || strcmp (bfd_get_target (ubfd), "binary") == 0) 626130561Sobrien return ubfd->arch_info; 627130561Sobrien return NULL; 628130561Sobrien } 629130561Sobrien 63033965Sjdp /* Otherwise architecture-specific code has to decide. */ 63133965Sjdp return abfd->arch_info->compatible (abfd->arch_info, bbfd->arch_info); 63233965Sjdp} 63333965Sjdp 63433965Sjdp/* 63533965SjdpINTERNAL_DEFINITION 63633965Sjdp bfd_default_arch_struct 63733965Sjdp 63833965SjdpDESCRIPTION 63933965Sjdp The <<bfd_default_arch_struct>> is an item of 64033965Sjdp <<bfd_arch_info_type>> which has been initialized to a fairly 64133965Sjdp generic state. A BFD starts life by pointing to this 64233965Sjdp structure, until the correct back end has determined the real 64333965Sjdp architecture of the file. 64433965Sjdp 64533965Sjdp.extern const bfd_arch_info_type bfd_default_arch_struct; 64633965Sjdp*/ 64733965Sjdp 64877298Sobrienconst bfd_arch_info_type bfd_default_arch_struct = { 649130561Sobrien 32, 32, 8, bfd_arch_unknown, 0, "unknown", "unknown", 2, TRUE, 65077298Sobrien bfd_default_compatible, 65177298Sobrien bfd_default_scan, 65277298Sobrien 0, 65333965Sjdp}; 65433965Sjdp 65533965Sjdp/* 65633965SjdpFUNCTION 65733965Sjdp bfd_set_arch_info 65833965Sjdp 65933965SjdpSYNOPSIS 660130561Sobrien void bfd_set_arch_info (bfd *abfd, const bfd_arch_info_type *arg); 66133965Sjdp 66233965SjdpDESCRIPTION 66333965Sjdp Set the architecture info of @var{abfd} to @var{arg}. 66433965Sjdp*/ 66533965Sjdp 66633965Sjdpvoid 667130561Sobrienbfd_set_arch_info (bfd *abfd, const bfd_arch_info_type *arg) 66833965Sjdp{ 66933965Sjdp abfd->arch_info = arg; 67033965Sjdp} 67133965Sjdp 67233965Sjdp/* 67333965SjdpINTERNAL_FUNCTION 67433965Sjdp bfd_default_set_arch_mach 67533965Sjdp 67633965SjdpSYNOPSIS 677130561Sobrien bfd_boolean bfd_default_set_arch_mach 678130561Sobrien (bfd *abfd, enum bfd_architecture arch, unsigned long mach); 67933965Sjdp 68033965SjdpDESCRIPTION 68133965Sjdp Set the architecture and machine type in BFD @var{abfd} 68233965Sjdp to @var{arch} and @var{mach}. Find the correct 68333965Sjdp pointer to a structure and insert it into the <<arch_info>> 68477298Sobrien pointer. 68533965Sjdp*/ 68633965Sjdp 687130561Sobrienbfd_boolean 688130561Sobrienbfd_default_set_arch_mach (bfd *abfd, 689130561Sobrien enum bfd_architecture arch, 690130561Sobrien unsigned long mach) 69133965Sjdp{ 69299461Sobrien abfd->arch_info = bfd_lookup_arch (arch, mach); 69399461Sobrien if (abfd->arch_info != NULL) 694130561Sobrien return TRUE; 69533965Sjdp 69633965Sjdp abfd->arch_info = &bfd_default_arch_struct; 69733965Sjdp bfd_set_error (bfd_error_bad_value); 698130561Sobrien return FALSE; 69933965Sjdp} 70033965Sjdp 70133965Sjdp/* 70233965SjdpFUNCTION 70333965Sjdp bfd_get_arch 70433965Sjdp 70533965SjdpSYNOPSIS 706130561Sobrien enum bfd_architecture bfd_get_arch (bfd *abfd); 70733965Sjdp 70833965SjdpDESCRIPTION 70933965Sjdp Return the enumerated type which describes the BFD @var{abfd}'s 71033965Sjdp architecture. 71133965Sjdp*/ 71233965Sjdp 71333965Sjdpenum bfd_architecture 714130561Sobrienbfd_get_arch (bfd *abfd) 71533965Sjdp{ 71677298Sobrien return abfd->arch_info->arch; 71733965Sjdp} 71833965Sjdp 71933965Sjdp/* 72033965SjdpFUNCTION 72133965Sjdp bfd_get_mach 72233965Sjdp 72333965SjdpSYNOPSIS 724130561Sobrien unsigned long bfd_get_mach (bfd *abfd); 72533965Sjdp 72633965SjdpDESCRIPTION 72733965Sjdp Return the long type which describes the BFD @var{abfd}'s 72833965Sjdp machine. 72933965Sjdp*/ 73033965Sjdp 73177298Sobrienunsigned long 732130561Sobrienbfd_get_mach (bfd *abfd) 73333965Sjdp{ 73477298Sobrien return abfd->arch_info->mach; 73533965Sjdp} 73633965Sjdp 73733965Sjdp/* 73833965SjdpFUNCTION 73933965Sjdp bfd_arch_bits_per_byte 74033965Sjdp 74133965SjdpSYNOPSIS 742130561Sobrien unsigned int bfd_arch_bits_per_byte (bfd *abfd); 74333965Sjdp 74433965SjdpDESCRIPTION 74533965Sjdp Return the number of bits in one of the BFD @var{abfd}'s 74633965Sjdp architecture's bytes. 74733965Sjdp*/ 74833965Sjdp 74933965Sjdpunsigned int 750130561Sobrienbfd_arch_bits_per_byte (bfd *abfd) 75133965Sjdp{ 75233965Sjdp return abfd->arch_info->bits_per_byte; 75333965Sjdp} 75433965Sjdp 75533965Sjdp/* 75633965SjdpFUNCTION 75733965Sjdp bfd_arch_bits_per_address 75833965Sjdp 75933965SjdpSYNOPSIS 760130561Sobrien unsigned int bfd_arch_bits_per_address (bfd *abfd); 76133965Sjdp 76233965SjdpDESCRIPTION 76333965Sjdp Return the number of bits in one of the BFD @var{abfd}'s 76433965Sjdp architecture's addresses. 76533965Sjdp*/ 76633965Sjdp 76733965Sjdpunsigned int 768130561Sobrienbfd_arch_bits_per_address (bfd *abfd) 76933965Sjdp{ 77033965Sjdp return abfd->arch_info->bits_per_address; 77133965Sjdp} 77233965Sjdp 77333965Sjdp/* 77477298SobrienINTERNAL_FUNCTION 77533965Sjdp bfd_default_compatible 77633965Sjdp 77733965SjdpSYNOPSIS 77833965Sjdp const bfd_arch_info_type *bfd_default_compatible 779130561Sobrien (const bfd_arch_info_type *a, const bfd_arch_info_type *b); 78033965Sjdp 78133965SjdpDESCRIPTION 78233965Sjdp The default function for testing for compatibility. 78333965Sjdp*/ 78433965Sjdp 78533965Sjdpconst bfd_arch_info_type * 786130561Sobrienbfd_default_compatible (const bfd_arch_info_type *a, 787130561Sobrien const bfd_arch_info_type *b) 78833965Sjdp{ 78933965Sjdp if (a->arch != b->arch) 79033965Sjdp return NULL; 79133965Sjdp 79294536Sobrien if (a->bits_per_word != b->bits_per_word) 79394536Sobrien return NULL; 79494536Sobrien 79533965Sjdp if (a->mach > b->mach) 79633965Sjdp return a; 79733965Sjdp 79833965Sjdp if (b->mach > a->mach) 79933965Sjdp return b; 80033965Sjdp 80133965Sjdp return a; 80233965Sjdp} 80333965Sjdp 80433965Sjdp/* 80533965SjdpINTERNAL_FUNCTION 80633965Sjdp bfd_default_scan 80733965Sjdp 80833965SjdpSYNOPSIS 809130561Sobrien bfd_boolean bfd_default_scan 810130561Sobrien (const struct bfd_arch_info *info, const char *string); 81133965Sjdp 81233965SjdpDESCRIPTION 81333965Sjdp The default function for working out whether this is an 81433965Sjdp architecture hit and a machine hit. 81533965Sjdp*/ 81633965Sjdp 817130561Sobrienbfd_boolean 818130561Sobrienbfd_default_scan (const bfd_arch_info_type *info, const char *string) 81933965Sjdp{ 82033965Sjdp const char *ptr_src; 82133965Sjdp const char *ptr_tst; 82233965Sjdp unsigned long number; 82333965Sjdp enum bfd_architecture arch; 82438889Sjdp const char *printable_name_colon; 82533965Sjdp 82638889Sjdp /* Exact match of the architecture name (ARCH_NAME) and also the 82777298Sobrien default architecture? */ 82838889Sjdp if (strcasecmp (string, info->arch_name) == 0 82938889Sjdp && info->the_default) 830130561Sobrien return TRUE; 83133965Sjdp 83277298Sobrien /* Exact match of the machine name (PRINTABLE_NAME)? */ 83338889Sjdp if (strcasecmp (string, info->printable_name) == 0) 834130561Sobrien return TRUE; 83577298Sobrien 83638889Sjdp /* Given that printable_name contains no colon, attempt to match: 83777298Sobrien ARCH_NAME [ ":" ] PRINTABLE_NAME? */ 83838889Sjdp printable_name_colon = strchr (info->printable_name, ':'); 83938889Sjdp if (printable_name_colon == NULL) 84038889Sjdp { 84189857Sobrien size_t strlen_arch_name = strlen (info->arch_name); 84238889Sjdp if (strncasecmp (string, info->arch_name, strlen_arch_name) == 0) 84338889Sjdp { 84438889Sjdp if (string[strlen_arch_name] == ':') 84538889Sjdp { 84638889Sjdp if (strcasecmp (string + strlen_arch_name + 1, 84738889Sjdp info->printable_name) == 0) 848130561Sobrien return TRUE; 84938889Sjdp } 85038889Sjdp else 85138889Sjdp { 85238889Sjdp if (strcasecmp (string + strlen_arch_name, 85338889Sjdp info->printable_name) == 0) 854130561Sobrien return TRUE; 85538889Sjdp } 85638889Sjdp } 85738889Sjdp } 85838889Sjdp 85938889Sjdp /* Given that PRINTABLE_NAME has the form: <arch> ":" <mach>; 86077298Sobrien Attempt to match: <arch> <mach>? */ 86138889Sjdp if (printable_name_colon != NULL) 86238889Sjdp { 86389857Sobrien size_t colon_index = printable_name_colon - info->printable_name; 86438889Sjdp if (strncasecmp (string, info->printable_name, colon_index) == 0 86538889Sjdp && strcasecmp (string + colon_index, 86638889Sjdp info->printable_name + colon_index + 1) == 0) 867130561Sobrien return TRUE; 86838889Sjdp } 86938889Sjdp 87038889Sjdp /* Given that PRINTABLE_NAME has the form: <arch> ":" <mach>; Do not 871130561Sobrien attempt to match just <mach>, it could be ambiguous. This test 87277298Sobrien is left until later. */ 87338889Sjdp 87477298Sobrien /* NOTE: The below is retained for compatibility only. Please do 87577298Sobrien not add to this code. */ 87638889Sjdp 87733965Sjdp /* See how much of the supplied string matches with the 87833965Sjdp architecture, eg the string m68k:68020 would match the 68k entry 87977298Sobrien up to the :, then we get left with the machine number. */ 88033965Sjdp 88177298Sobrien for (ptr_src = string, ptr_tst = info->arch_name; 88233965Sjdp *ptr_src && *ptr_tst; 88377298Sobrien ptr_src++, ptr_tst++) 88433965Sjdp { 88577298Sobrien if (*ptr_src != *ptr_tst) 88677298Sobrien break; 88733965Sjdp } 88833965Sjdp 88933965Sjdp /* Chewed up as much of the architecture as will match, skip any 89077298Sobrien colons. */ 89133965Sjdp if (*ptr_src == ':') 89233965Sjdp ptr_src++; 89377298Sobrien 89433965Sjdp if (*ptr_src == 0) 89533965Sjdp { 89677298Sobrien /* Nothing more, then only keep this one if it is the default 89777298Sobrien machine for this architecture. */ 89833965Sjdp return info->the_default; 89933965Sjdp } 90033965Sjdp 90133965Sjdp number = 0; 90289857Sobrien while (ISDIGIT (*ptr_src)) 90333965Sjdp { 90477298Sobrien number = number * 10 + *ptr_src - '0'; 90533965Sjdp ptr_src++; 90633965Sjdp } 90733965Sjdp 90838889Sjdp /* NOTE: The below is retained for compatibility only. 90977298Sobrien PLEASE DO NOT ADD TO THIS CODE. */ 91038889Sjdp 91177298Sobrien switch (number) 91233965Sjdp { 91338889Sjdp /* FIXME: These are needed to parse IEEE objects. */ 91477298Sobrien /* The following seven case's are here only for compatibility with 91577298Sobrien older binutils (at least IEEE objects from binutils 2.9.1 require 91677298Sobrien them). */ 91777298Sobrien case bfd_mach_m68000: 91877298Sobrien case bfd_mach_m68010: 91977298Sobrien case bfd_mach_m68020: 92077298Sobrien case bfd_mach_m68030: 92177298Sobrien case bfd_mach_m68040: 92277298Sobrien case bfd_mach_m68060: 92377298Sobrien case bfd_mach_cpu32: 92438889Sjdp arch = bfd_arch_m68k; 92577298Sobrien break; 92677298Sobrien case 68000: 92777298Sobrien arch = bfd_arch_m68k; 92838889Sjdp number = bfd_mach_m68000; 92933965Sjdp break; 93038889Sjdp case 68010: 93138889Sjdp arch = bfd_arch_m68k; 93238889Sjdp number = bfd_mach_m68010; 93333965Sjdp break; 93438889Sjdp case 68020: 93538889Sjdp arch = bfd_arch_m68k; 93638889Sjdp number = bfd_mach_m68020; 93733965Sjdp break; 93833965Sjdp case 68030: 93938889Sjdp arch = bfd_arch_m68k; 94038889Sjdp number = bfd_mach_m68030; 94138889Sjdp break; 94233965Sjdp case 68040: 94338889Sjdp arch = bfd_arch_m68k; 94438889Sjdp number = bfd_mach_m68040; 94538889Sjdp break; 94660484Sobrien case 68060: 94760484Sobrien arch = bfd_arch_m68k; 94860484Sobrien number = bfd_mach_m68060; 94960484Sobrien break; 95033965Sjdp case 68332: 95138889Sjdp arch = bfd_arch_m68k; 95260484Sobrien number = bfd_mach_cpu32; 95333965Sjdp break; 95478828Sobrien case 5200: 95578828Sobrien arch = bfd_arch_m68k; 95678828Sobrien number = bfd_mach_mcf5200; 95778828Sobrien break; 95878828Sobrien case 5206: 95978828Sobrien arch = bfd_arch_m68k; 96078828Sobrien number = bfd_mach_mcf5206e; 96178828Sobrien break; 96278828Sobrien case 5307: 96378828Sobrien arch = bfd_arch_m68k; 96478828Sobrien number = bfd_mach_mcf5307; 96578828Sobrien break; 96678828Sobrien case 5407: 96778828Sobrien arch = bfd_arch_m68k; 96878828Sobrien number = bfd_mach_mcf5407; 96978828Sobrien break; 970130561Sobrien case 5282: 971130561Sobrien arch = bfd_arch_m68k; 972130561Sobrien number = bfd_mach_mcf528x; 973130561Sobrien break; 97433965Sjdp 97533965Sjdp case 32000: 97633965Sjdp arch = bfd_arch_we32k; 97733965Sjdp break; 97833965Sjdp 97938889Sjdp case 3000: 98038889Sjdp arch = bfd_arch_mips; 98138889Sjdp number = bfd_mach_mips3000; 98233965Sjdp break; 98333965Sjdp 98433965Sjdp case 4000: 98533965Sjdp arch = bfd_arch_mips; 98638889Sjdp number = bfd_mach_mips4000; 98733965Sjdp break; 98833965Sjdp 98933965Sjdp case 6000: 99033965Sjdp arch = bfd_arch_rs6000; 99133965Sjdp break; 99233965Sjdp 99360484Sobrien case 7410: 99460484Sobrien arch = bfd_arch_sh; 99560484Sobrien number = bfd_mach_sh_dsp; 99660484Sobrien break; 99760484Sobrien 99860484Sobrien case 7708: 99960484Sobrien arch = bfd_arch_sh; 100060484Sobrien number = bfd_mach_sh3; 100160484Sobrien break; 100260484Sobrien 100360484Sobrien case 7729: 100460484Sobrien arch = bfd_arch_sh; 100560484Sobrien number = bfd_mach_sh3_dsp; 100660484Sobrien break; 100760484Sobrien 100860484Sobrien case 7750: 100960484Sobrien arch = bfd_arch_sh; 101060484Sobrien number = bfd_mach_sh4; 101160484Sobrien break; 101260484Sobrien 101377298Sobrien default: 1014130561Sobrien return FALSE; 101533965Sjdp } 101633965Sjdp 101777298Sobrien if (arch != info->arch) 1018130561Sobrien return FALSE; 101933965Sjdp 102033965Sjdp if (number != info->mach) 1021130561Sobrien return FALSE; 102233965Sjdp 1023130561Sobrien return TRUE; 102433965Sjdp} 102533965Sjdp 102633965Sjdp/* 102733965SjdpFUNCTION 102833965Sjdp bfd_get_arch_info 102933965Sjdp 103033965SjdpSYNOPSIS 1031130561Sobrien const bfd_arch_info_type *bfd_get_arch_info (bfd *abfd); 103233965Sjdp 103333965SjdpDESCRIPTION 103433965Sjdp Return the architecture info struct in @var{abfd}. 103533965Sjdp*/ 103633965Sjdp 103733965Sjdpconst bfd_arch_info_type * 1038130561Sobrienbfd_get_arch_info (bfd *abfd) 103933965Sjdp{ 104033965Sjdp return abfd->arch_info; 104133965Sjdp} 104233965Sjdp 104333965Sjdp/* 104433965SjdpFUNCTION 104533965Sjdp bfd_lookup_arch 104633965Sjdp 104733965SjdpSYNOPSIS 104833965Sjdp const bfd_arch_info_type *bfd_lookup_arch 1049130561Sobrien (enum bfd_architecture arch, unsigned long machine); 105033965Sjdp 105133965SjdpDESCRIPTION 1052130561Sobrien Look for the architecture info structure which matches the 105333965Sjdp arguments @var{arch} and @var{machine}. A machine of 0 matches the 105433965Sjdp machine/architecture structure which marks itself as the 105533965Sjdp default. 105633965Sjdp*/ 105733965Sjdp 105877298Sobrienconst bfd_arch_info_type * 1059130561Sobrienbfd_lookup_arch (enum bfd_architecture arch, unsigned long machine) 106033965Sjdp{ 106133965Sjdp const bfd_arch_info_type * const *app, *ap; 106233965Sjdp 106333965Sjdp for (app = bfd_archures_list; *app != NULL; app++) 106433965Sjdp { 106533965Sjdp for (ap = *app; ap != NULL; ap = ap->next) 106633965Sjdp { 106733965Sjdp if (ap->arch == arch 106833965Sjdp && (ap->mach == machine 106933965Sjdp || (machine == 0 && ap->the_default))) 107033965Sjdp return ap; 107133965Sjdp } 107233965Sjdp } 107333965Sjdp 107433965Sjdp return NULL; 107533965Sjdp} 107633965Sjdp 107733965Sjdp/* 107833965SjdpFUNCTION 107933965Sjdp bfd_printable_arch_mach 108033965Sjdp 108133965SjdpSYNOPSIS 108233965Sjdp const char *bfd_printable_arch_mach 1083130561Sobrien (enum bfd_architecture arch, unsigned long machine); 108433965Sjdp 108533965SjdpDESCRIPTION 108633965Sjdp Return a printable string representing the architecture and 108777298Sobrien machine type. 108833965Sjdp 108933965Sjdp This routine is depreciated. 109033965Sjdp*/ 109133965Sjdp 109233965Sjdpconst char * 1093130561Sobrienbfd_printable_arch_mach (enum bfd_architecture arch, unsigned long machine) 109433965Sjdp{ 109577298Sobrien const bfd_arch_info_type *ap = bfd_lookup_arch (arch, machine); 109633965Sjdp 109777298Sobrien if (ap) 109877298Sobrien return ap->printable_name; 109977298Sobrien return "UNKNOWN!"; 110033965Sjdp} 110160484Sobrien 110260484Sobrien/* 110360484SobrienFUNCTION 110460484Sobrien bfd_octets_per_byte 110560484Sobrien 110660484SobrienSYNOPSIS 1107130561Sobrien unsigned int bfd_octets_per_byte (bfd *abfd); 110860484Sobrien 110960484SobrienDESCRIPTION 111060484Sobrien Return the number of octets (8-bit quantities) per target byte 111160484Sobrien (minimum addressable unit). In most cases, this will be one, but some 111260484Sobrien DSP targets have 16, 32, or even 48 bits per byte. 111360484Sobrien*/ 111460484Sobrien 111560484Sobrienunsigned int 1116130561Sobrienbfd_octets_per_byte (bfd *abfd) 111760484Sobrien{ 111877298Sobrien return bfd_arch_mach_octets_per_byte (bfd_get_arch (abfd), 111977298Sobrien bfd_get_mach (abfd)); 112060484Sobrien} 112160484Sobrien 112260484Sobrien/* 112360484SobrienFUNCTION 112460484Sobrien bfd_arch_mach_octets_per_byte 112560484Sobrien 112660484SobrienSYNOPSIS 1127130561Sobrien unsigned int bfd_arch_mach_octets_per_byte 1128130561Sobrien (enum bfd_architecture arch, unsigned long machine); 112960484Sobrien 113060484SobrienDESCRIPTION 113160484Sobrien See bfd_octets_per_byte. 113277298Sobrien 113360484Sobrien This routine is provided for those cases where a bfd * is not 113460484Sobrien available 113560484Sobrien*/ 113660484Sobrien 113760484Sobrienunsigned int 1138130561Sobrienbfd_arch_mach_octets_per_byte (enum bfd_architecture arch, 1139130561Sobrien unsigned long mach) 114060484Sobrien{ 114177298Sobrien const bfd_arch_info_type *ap = bfd_lookup_arch (arch, mach); 114277298Sobrien 114377298Sobrien if (ap) 114477298Sobrien return ap->bits_per_byte / 8; 114577298Sobrien return 1; 114660484Sobrien} 1147