archures.c revision 130561
133965Sjdp/* BFD library support routines for architectures. 278828Sobrien Copyright 1990, 1991, 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999, 3130561Sobrien 2000, 2001, 2002, 2003 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 21130561Sobrien Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, 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 14438889Sjdp.#define bfd_mach_mips10000 10000 14578828Sobrien.#define bfd_mach_mips12000 12000 14638889Sjdp.#define bfd_mach_mips16 16 14777298Sobrien.#define bfd_mach_mips5 5 14877298Sobrien.#define bfd_mach_mips_sb1 12310201 {* octal 'SB', 01 *} 14989857Sobrien.#define bfd_mach_mipsisa32 32 150130561Sobrien.#define bfd_mach_mipsisa32r2 33 15189857Sobrien.#define bfd_mach_mipsisa64 64 152130561Sobrien.#define bfd_mach_mipsisa64r2 65 15333965Sjdp. bfd_arch_i386, {* Intel 386 *} 154130561Sobrien.#define bfd_mach_i386_i386 1 155130561Sobrien.#define bfd_mach_i386_i8086 2 156130561Sobrien.#define bfd_mach_i386_i386_intel_syntax 3 157130561Sobrien.#define bfd_mach_x86_64 64 158130561Sobrien.#define bfd_mach_x86_64_intel_syntax 65 15933965Sjdp. bfd_arch_we32k, {* AT&T WE32xxx *} 16033965Sjdp. bfd_arch_tahoe, {* CCI/Harris Tahoe *} 16133965Sjdp. bfd_arch_i860, {* Intel 860 *} 16260484Sobrien. bfd_arch_i370, {* IBM 360/370 Mainframes *} 16333965Sjdp. bfd_arch_romp, {* IBM ROMP PC/RT *} 16433965Sjdp. bfd_arch_alliant, {* Alliant *} 16533965Sjdp. bfd_arch_convex, {* Convex *} 16633965Sjdp. bfd_arch_m88k, {* Motorola 88xxx *} 167130561Sobrien. bfd_arch_m98k, {* Motorola 98xxx *} 16833965Sjdp. bfd_arch_pyramid, {* Pyramid Technology *} 169130561Sobrien. bfd_arch_h8300, {* Renesas H8/300 (formerly Hitachi H8/300) *} 170130561Sobrien.#define bfd_mach_h8300 1 171130561Sobrien.#define bfd_mach_h8300h 2 172130561Sobrien.#define bfd_mach_h8300s 3 173130561Sobrien.#define bfd_mach_h8300hn 4 174130561Sobrien.#define bfd_mach_h8300sn 5 175130561Sobrien.#define bfd_mach_h8300sx 6 176130561Sobrien.#define bfd_mach_h8300sxn 7 17789857Sobrien. bfd_arch_pdp11, {* DEC PDP-11 *} 17833965Sjdp. bfd_arch_powerpc, {* PowerPC *} 179130561Sobrien.#define bfd_mach_ppc 32 180130561Sobrien.#define bfd_mach_ppc64 64 18177298Sobrien.#define bfd_mach_ppc_403 403 18277298Sobrien.#define bfd_mach_ppc_403gc 4030 18377298Sobrien.#define bfd_mach_ppc_505 505 18477298Sobrien.#define bfd_mach_ppc_601 601 18577298Sobrien.#define bfd_mach_ppc_602 602 18677298Sobrien.#define bfd_mach_ppc_603 603 18777298Sobrien.#define bfd_mach_ppc_ec603e 6031 18877298Sobrien.#define bfd_mach_ppc_604 604 18977298Sobrien.#define bfd_mach_ppc_620 620 19077298Sobrien.#define bfd_mach_ppc_630 630 19177298Sobrien.#define bfd_mach_ppc_750 750 19277298Sobrien.#define bfd_mach_ppc_860 860 19377298Sobrien.#define bfd_mach_ppc_a35 35 19477298Sobrien.#define bfd_mach_ppc_rs64ii 642 19577298Sobrien.#define bfd_mach_ppc_rs64iii 643 19677298Sobrien.#define bfd_mach_ppc_7400 7400 197130561Sobrien.#define bfd_mach_ppc_e500 500 19833965Sjdp. bfd_arch_rs6000, {* IBM RS/6000 *} 199130561Sobrien.#define bfd_mach_rs6k 6000 20077298Sobrien.#define bfd_mach_rs6k_rs1 6001 20177298Sobrien.#define bfd_mach_rs6k_rsc 6003 20277298Sobrien.#define bfd_mach_rs6k_rs2 6002 20333965Sjdp. bfd_arch_hppa, {* HP PA RISC *} 204130561Sobrien.#define bfd_mach_hppa10 10 205130561Sobrien.#define bfd_mach_hppa11 11 206130561Sobrien.#define bfd_mach_hppa20 20 207130561Sobrien.#define bfd_mach_hppa20w 25 20833965Sjdp. bfd_arch_d10v, {* Mitsubishi D10V *} 209130561Sobrien.#define bfd_mach_d10v 1 21060484Sobrien.#define bfd_mach_d10v_ts2 2 21160484Sobrien.#define bfd_mach_d10v_ts3 3 21260484Sobrien. bfd_arch_d30v, {* Mitsubishi D30V *} 213104834Sobrien. bfd_arch_dlx, {* DLX *} 21477298Sobrien. bfd_arch_m68hc11, {* Motorola 68HC11 *} 21577298Sobrien. bfd_arch_m68hc12, {* Motorola 68HC12 *} 216130561Sobrien.#define bfd_mach_m6812_default 0 217130561Sobrien.#define bfd_mach_m6812 1 218130561Sobrien.#define bfd_mach_m6812s 2 21933965Sjdp. bfd_arch_z8k, {* Zilog Z8000 *} 22033965Sjdp.#define bfd_mach_z8001 1 22133965Sjdp.#define bfd_mach_z8002 2 222130561Sobrien. bfd_arch_h8500, {* Renesas H8/500 (formerly Hitachi H8/500) *} 223130561Sobrien. bfd_arch_sh, {* Renesas / SuperH SH (formerly Hitachi SH) *} 224130561Sobrien.#define bfd_mach_sh 1 22560484Sobrien.#define bfd_mach_sh2 0x20 22660484Sobrien.#define bfd_mach_sh_dsp 0x2d 227130561Sobrien.#define bfd_mach_sh2e 0x2e 22838889Sjdp.#define bfd_mach_sh3 0x30 22960484Sobrien.#define bfd_mach_sh3_dsp 0x3d 23038889Sjdp.#define bfd_mach_sh3e 0x3e 23138889Sjdp.#define bfd_mach_sh4 0x40 232130561Sobrien.#define bfd_mach_sh4_nofpu 0x41 233130561Sobrien.#define bfd_mach_sh4a 0x4a 234130561Sobrien.#define bfd_mach_sh4a_nofpu 0x4b 235130561Sobrien.#define bfd_mach_sh4al_dsp 0x4d 23691041Sobrien.#define bfd_mach_sh5 0x50 23733965Sjdp. bfd_arch_alpha, {* Dec Alpha *} 23860484Sobrien.#define bfd_mach_alpha_ev4 0x10 23960484Sobrien.#define bfd_mach_alpha_ev5 0x20 24060484Sobrien.#define bfd_mach_alpha_ev6 0x30 24191041Sobrien. bfd_arch_arm, {* Advanced Risc Machines ARM. *} 242130561Sobrien.#define bfd_mach_arm_unknown 0 24338889Sjdp.#define bfd_mach_arm_2 1 24460484Sobrien.#define bfd_mach_arm_2a 2 24538889Sjdp.#define bfd_mach_arm_3 3 24638889Sjdp.#define bfd_mach_arm_3M 4 24760484Sobrien.#define bfd_mach_arm_4 5 24838889Sjdp.#define bfd_mach_arm_4T 6 24960484Sobrien.#define bfd_mach_arm_5 7 25060484Sobrien.#define bfd_mach_arm_5T 8 25177298Sobrien.#define bfd_mach_arm_5TE 9 25277298Sobrien.#define bfd_mach_arm_XScale 10 253130561Sobrien.#define bfd_mach_arm_ep9312 11 254130561Sobrien.#define bfd_mach_arm_iWMMXt 12 25533965Sjdp. bfd_arch_ns32k, {* National Semiconductors ns32000 *} 25633965Sjdp. bfd_arch_w65, {* WDC 65816 *} 25738889Sjdp. bfd_arch_tic30, {* Texas Instruments TMS320C30 *} 258130561Sobrien. bfd_arch_tic4x, {* Texas Instruments TMS320C3X/4X *} 259130561Sobrien.#define bfd_mach_tic3x 30 260130561Sobrien.#define bfd_mach_tic4x 40 26177298Sobrien. bfd_arch_tic54x, {* Texas Instruments TMS320C54X *} 26260484Sobrien. bfd_arch_tic80, {* TI TMS320c80 (MVP) *} 26338889Sjdp. bfd_arch_v850, {* NEC V850 *} 264130561Sobrien.#define bfd_mach_v850 1 26560484Sobrien.#define bfd_mach_v850e 'E' 266130561Sobrien.#define bfd_mach_v850e1 '1' 26777298Sobrien. bfd_arch_arc, {* ARC Cores *} 268130561Sobrien.#define bfd_mach_arc_5 5 269130561Sobrien.#define bfd_mach_arc_6 6 270130561Sobrien.#define bfd_mach_arc_7 7 271130561Sobrien.#define bfd_mach_arc_8 8 272130561Sobrien. bfd_arch_m32r, {* Renesas M32R (formerly Mitsubishi M32R/D) *} 273130561Sobrien.#define bfd_mach_m32r 1 {* For backwards compatibility. *} 27460484Sobrien.#define bfd_mach_m32rx 'x' 275130561Sobrien.#define bfd_mach_m32r2 '2' 27633965Sjdp. bfd_arch_mn10200, {* Matsushita MN10200 *} 27733965Sjdp. bfd_arch_mn10300, {* Matsushita MN10300 *} 27860484Sobrien.#define bfd_mach_mn10300 300 27960484Sobrien.#define bfd_mach_am33 330 280130561Sobrien.#define bfd_mach_am33_2 332 28160484Sobrien. bfd_arch_fr30, 28260484Sobrien.#define bfd_mach_fr30 0x46523330 283104834Sobrien. bfd_arch_frv, 284130561Sobrien.#define bfd_mach_frv 1 285130561Sobrien.#define bfd_mach_frvsimple 2 286104834Sobrien.#define bfd_mach_fr300 300 287104834Sobrien.#define bfd_mach_fr400 400 288104834Sobrien.#define bfd_mach_frvtomcat 499 {* fr500 prototype *} 289104834Sobrien.#define bfd_mach_fr500 500 290130561Sobrien.#define bfd_mach_fr550 550 29160484Sobrien. bfd_arch_mcore, 29277298Sobrien. bfd_arch_ia64, {* HP/Intel ia64 *} 293130561Sobrien.#define bfd_mach_ia64_elf64 64 294130561Sobrien.#define bfd_mach_ia64_elf32 32 295130561Sobrien. bfd_arch_ip2k, {* Ubicom IP2K microcontrollers. *} 296130561Sobrien.#define bfd_mach_ip2022 1 297130561Sobrien.#define bfd_mach_ip2022ext 2 298130561Sobrien. bfd_arch_iq2000, {* Vitesse IQ2000. *} 299130561Sobrien.#define bfd_mach_iq2000 1 300130561Sobrien.#define bfd_mach_iq10 2 30160484Sobrien. bfd_arch_pj, 30291041Sobrien. bfd_arch_avr, {* Atmel AVR microcontrollers. *} 30360484Sobrien.#define bfd_mach_avr1 1 30460484Sobrien.#define bfd_mach_avr2 2 30560484Sobrien.#define bfd_mach_avr3 3 30660484Sobrien.#define bfd_mach_avr4 4 30777298Sobrien.#define bfd_mach_avr5 5 30877298Sobrien. bfd_arch_cris, {* Axis CRIS *} 30989857Sobrien. bfd_arch_s390, {* IBM s390 *} 310130561Sobrien.#define bfd_mach_s390_31 31 311130561Sobrien.#define bfd_mach_s390_64 64 31289857Sobrien. bfd_arch_openrisc, {* OpenRISC *} 31391041Sobrien. bfd_arch_mmix, {* Donald Knuth's educational processor. *} 31489857Sobrien. bfd_arch_xstormy16, 315130561Sobrien.#define bfd_mach_xstormy16 1 316130561Sobrien. bfd_arch_msp430, {* Texas Instruments MSP430 architecture. *} 317130561Sobrien.#define bfd_mach_msp11 11 318130561Sobrien.#define bfd_mach_msp110 110 319130561Sobrien.#define bfd_mach_msp12 12 320130561Sobrien.#define bfd_mach_msp13 13 321130561Sobrien.#define bfd_mach_msp14 14 322130561Sobrien.#define bfd_mach_msp15 15 323130561Sobrien.#define bfd_mach_msp16 16 324130561Sobrien.#define bfd_mach_msp31 31 325130561Sobrien.#define bfd_mach_msp32 32 326130561Sobrien.#define bfd_mach_msp33 33 327130561Sobrien.#define bfd_mach_msp41 41 328130561Sobrien.#define bfd_mach_msp42 42 329130561Sobrien.#define bfd_mach_msp43 43 330130561Sobrien.#define bfd_mach_msp44 44 331130561Sobrien. bfd_arch_xtensa, {* Tensilica's Xtensa cores. *} 332130561Sobrien.#define bfd_mach_xtensa 1 33333965Sjdp. bfd_arch_last 33433965Sjdp. }; 33533965Sjdp*/ 33633965Sjdp 33733965Sjdp/* 33833965SjdpSUBSECTION 33933965Sjdp bfd_arch_info 34033965Sjdp 34133965SjdpDESCRIPTION 34233965Sjdp This structure contains information on architectures for use 34333965Sjdp within BFD. 34433965Sjdp 34533965Sjdp. 34677298Sobrien.typedef struct bfd_arch_info 34733965Sjdp.{ 34833965Sjdp. int bits_per_word; 34933965Sjdp. int bits_per_address; 35033965Sjdp. int bits_per_byte; 35133965Sjdp. enum bfd_architecture arch; 35233965Sjdp. unsigned long mach; 35333965Sjdp. const char *arch_name; 35433965Sjdp. const char *printable_name; 35533965Sjdp. unsigned int section_align_power; 356130561Sobrien. {* TRUE if this is the default machine for the architecture. 35799461Sobrien. The default arch should be the first entry for an arch so that 35899461Sobrien. all the entries for that arch can be accessed via <<next>>. *} 359130561Sobrien. bfd_boolean the_default; 36033965Sjdp. const struct bfd_arch_info * (*compatible) 361130561Sobrien. (const struct bfd_arch_info *a, const struct bfd_arch_info *b); 36233965Sjdp. 363130561Sobrien. bfd_boolean (*scan) (const struct bfd_arch_info *, const char *); 36433965Sjdp. 36533965Sjdp. const struct bfd_arch_info *next; 36691041Sobrien.} 36791041Sobrien.bfd_arch_info_type; 36891041Sobrien. 36933965Sjdp*/ 37033965Sjdp 37133965Sjdpextern const bfd_arch_info_type bfd_a29k_arch; 37233965Sjdpextern const bfd_arch_info_type bfd_alpha_arch; 37338889Sjdpextern const bfd_arch_info_type bfd_arc_arch; 37433965Sjdpextern const bfd_arch_info_type bfd_arm_arch; 37591041Sobrienextern const bfd_arch_info_type bfd_avr_arch; 37677298Sobrienextern const bfd_arch_info_type bfd_cris_arch; 37733965Sjdpextern const bfd_arch_info_type bfd_d10v_arch; 37860484Sobrienextern const bfd_arch_info_type bfd_d30v_arch; 379104834Sobrienextern const bfd_arch_info_type bfd_dlx_arch; 38091041Sobrienextern const bfd_arch_info_type bfd_fr30_arch; 381104834Sobrienextern const bfd_arch_info_type bfd_frv_arch; 38233965Sjdpextern const bfd_arch_info_type bfd_h8300_arch; 38333965Sjdpextern const bfd_arch_info_type bfd_h8500_arch; 38433965Sjdpextern const bfd_arch_info_type bfd_hppa_arch; 38560484Sobrienextern const bfd_arch_info_type bfd_i370_arch; 38633965Sjdpextern const bfd_arch_info_type bfd_i386_arch; 38733965Sjdpextern const bfd_arch_info_type bfd_i860_arch; 38833965Sjdpextern const bfd_arch_info_type bfd_i960_arch; 38991041Sobrienextern const bfd_arch_info_type bfd_ia64_arch; 390130561Sobrienextern const bfd_arch_info_type bfd_ip2k_arch; 391130561Sobrienextern const bfd_arch_info_type bfd_iq2000_arch; 39233965Sjdpextern const bfd_arch_info_type bfd_m32r_arch; 39377298Sobrienextern const bfd_arch_info_type bfd_m68hc11_arch; 39477298Sobrienextern const bfd_arch_info_type bfd_m68hc12_arch; 39533965Sjdpextern const bfd_arch_info_type bfd_m68k_arch; 39633965Sjdpextern const bfd_arch_info_type bfd_m88k_arch; 39791041Sobrienextern const bfd_arch_info_type bfd_mcore_arch; 39833965Sjdpextern const bfd_arch_info_type bfd_mips_arch; 39991041Sobrienextern const bfd_arch_info_type bfd_mmix_arch; 40033965Sjdpextern const bfd_arch_info_type bfd_mn10200_arch; 40133965Sjdpextern const bfd_arch_info_type bfd_mn10300_arch; 402130561Sobrienextern const bfd_arch_info_type bfd_msp430_arch; 40391041Sobrienextern const bfd_arch_info_type bfd_ns32k_arch; 40491041Sobrienextern const bfd_arch_info_type bfd_openrisc_arch; 40591041Sobrienextern const bfd_arch_info_type bfd_or32_arch; 40689857Sobrienextern const bfd_arch_info_type bfd_pdp11_arch; 40791041Sobrienextern const bfd_arch_info_type bfd_pj_arch; 40891041Sobrienextern const bfd_arch_info_type bfd_powerpc_archs[]; 40991041Sobrien#define bfd_powerpc_arch bfd_powerpc_archs[0] 41033965Sjdpextern const bfd_arch_info_type bfd_rs6000_arch; 41191041Sobrienextern const bfd_arch_info_type bfd_s390_arch; 41233965Sjdpextern const bfd_arch_info_type bfd_sh_arch; 41333965Sjdpextern const bfd_arch_info_type bfd_sparc_arch; 41438889Sjdpextern const bfd_arch_info_type bfd_tic30_arch; 415130561Sobrienextern const bfd_arch_info_type bfd_tic4x_arch; 41677298Sobrienextern const bfd_arch_info_type bfd_tic54x_arch; 41760484Sobrienextern const bfd_arch_info_type bfd_tic80_arch; 41891041Sobrienextern const bfd_arch_info_type bfd_v850_arch; 41933965Sjdpextern const bfd_arch_info_type bfd_vax_arch; 42033965Sjdpextern const bfd_arch_info_type bfd_we32k_arch; 42133965Sjdpextern const bfd_arch_info_type bfd_w65_arch; 42289857Sobrienextern const bfd_arch_info_type bfd_xstormy16_arch; 423130561Sobrienextern const bfd_arch_info_type bfd_xtensa_arch; 42491041Sobrienextern const bfd_arch_info_type bfd_z8k_arch; 42533965Sjdp 42691041Sobrienstatic const bfd_arch_info_type * const bfd_archures_list[] = 42791041Sobrien { 42833965Sjdp#ifdef SELECT_ARCHITECTURES 42991041Sobrien SELECT_ARCHITECTURES, 43033965Sjdp#else 43191041Sobrien &bfd_a29k_arch, 43291041Sobrien &bfd_alpha_arch, 43391041Sobrien &bfd_arc_arch, 43491041Sobrien &bfd_arm_arch, 43591041Sobrien &bfd_avr_arch, 43691041Sobrien &bfd_cris_arch, 43791041Sobrien &bfd_d10v_arch, 43891041Sobrien &bfd_d30v_arch, 439104834Sobrien &bfd_dlx_arch, 44091041Sobrien &bfd_fr30_arch, 441104834Sobrien &bfd_frv_arch, 44291041Sobrien &bfd_h8300_arch, 44391041Sobrien &bfd_h8500_arch, 44491041Sobrien &bfd_hppa_arch, 44591041Sobrien &bfd_i370_arch, 44691041Sobrien &bfd_i386_arch, 44791041Sobrien &bfd_i860_arch, 44891041Sobrien &bfd_i960_arch, 44991041Sobrien &bfd_ia64_arch, 450130561Sobrien &bfd_ip2k_arch, 451130561Sobrien &bfd_iq2000_arch, 45291041Sobrien &bfd_m32r_arch, 45391041Sobrien &bfd_m68hc11_arch, 45491041Sobrien &bfd_m68hc12_arch, 45591041Sobrien &bfd_m68k_arch, 45691041Sobrien &bfd_m88k_arch, 45791041Sobrien &bfd_mcore_arch, 45891041Sobrien &bfd_mips_arch, 45991041Sobrien &bfd_mmix_arch, 46091041Sobrien &bfd_mn10200_arch, 46191041Sobrien &bfd_mn10300_arch, 462130561Sobrien &bfd_msp430_arch, 46391041Sobrien &bfd_ns32k_arch, 46491041Sobrien &bfd_openrisc_arch, 46591041Sobrien &bfd_or32_arch, 46691041Sobrien &bfd_pdp11_arch, 46791041Sobrien &bfd_powerpc_arch, 46891041Sobrien &bfd_rs6000_arch, 46991041Sobrien &bfd_s390_arch, 47091041Sobrien &bfd_sh_arch, 47191041Sobrien &bfd_sparc_arch, 47291041Sobrien &bfd_tic30_arch, 473130561Sobrien &bfd_tic4x_arch, 47491041Sobrien &bfd_tic54x_arch, 47591041Sobrien &bfd_tic80_arch, 47691041Sobrien &bfd_v850_arch, 47791041Sobrien &bfd_vax_arch, 47891041Sobrien &bfd_w65_arch, 47991041Sobrien &bfd_we32k_arch, 48091041Sobrien &bfd_xstormy16_arch, 481130561Sobrien &bfd_xtensa_arch, 48291041Sobrien &bfd_z8k_arch, 48333965Sjdp#endif 48433965Sjdp 0 48533965Sjdp}; 48633965Sjdp 48733965Sjdp/* 48833965SjdpFUNCTION 48933965Sjdp bfd_printable_name 49033965Sjdp 49133965SjdpSYNOPSIS 492130561Sobrien const char *bfd_printable_name (bfd *abfd); 49333965Sjdp 49433965SjdpDESCRIPTION 49533965Sjdp Return a printable string representing the architecture and machine 49633965Sjdp from the pointer to the architecture info structure. 49733965Sjdp 49833965Sjdp*/ 49933965Sjdp 50033965Sjdpconst char * 501130561Sobrienbfd_printable_name (bfd *abfd) 50233965Sjdp{ 50333965Sjdp return abfd->arch_info->printable_name; 50433965Sjdp} 50533965Sjdp 50633965Sjdp/* 50733965SjdpFUNCTION 50833965Sjdp bfd_scan_arch 50933965Sjdp 51033965SjdpSYNOPSIS 511130561Sobrien const bfd_arch_info_type *bfd_scan_arch (const char *string); 51233965Sjdp 51333965SjdpDESCRIPTION 51433965Sjdp Figure out if BFD supports any cpu which could be described with 51533965Sjdp the name @var{string}. Return a pointer to an <<arch_info>> 51633965Sjdp structure if a machine is found, otherwise NULL. 51733965Sjdp*/ 51833965Sjdp 51933965Sjdpconst bfd_arch_info_type * 520130561Sobrienbfd_scan_arch (const char *string) 52133965Sjdp{ 52233965Sjdp const bfd_arch_info_type * const *app, *ap; 52333965Sjdp 52477298Sobrien /* Look through all the installed architectures. */ 52533965Sjdp for (app = bfd_archures_list; *app != NULL; app++) 52633965Sjdp { 52733965Sjdp for (ap = *app; ap != NULL; ap = ap->next) 52833965Sjdp { 52933965Sjdp if (ap->scan (ap, string)) 53033965Sjdp return ap; 53133965Sjdp } 53233965Sjdp } 53333965Sjdp 53433965Sjdp return NULL; 53533965Sjdp} 53633965Sjdp 53733965Sjdp/* 53833965SjdpFUNCTION 53938889Sjdp bfd_arch_list 54038889Sjdp 54138889SjdpSYNOPSIS 542130561Sobrien const char **bfd_arch_list (void); 54338889Sjdp 54438889SjdpDESCRIPTION 54538889Sjdp Return a freshly malloced NULL-terminated vector of the names 54638889Sjdp of all the valid BFD architectures. Do not modify the names. 54738889Sjdp*/ 54838889Sjdp 54938889Sjdpconst char ** 550130561Sobrienbfd_arch_list (void) 55138889Sjdp{ 55238889Sjdp int vec_length = 0; 55338889Sjdp const char **name_ptr; 55438889Sjdp const char **name_list; 55538889Sjdp const bfd_arch_info_type * const *app; 55689857Sobrien bfd_size_type amt; 55738889Sjdp 55877298Sobrien /* Determine the number of architectures. */ 55938889Sjdp vec_length = 0; 56038889Sjdp for (app = bfd_archures_list; *app != NULL; app++) 56138889Sjdp { 56238889Sjdp const bfd_arch_info_type *ap; 56338889Sjdp for (ap = *app; ap != NULL; ap = ap->next) 56438889Sjdp { 56538889Sjdp vec_length++; 56638889Sjdp } 56738889Sjdp } 56838889Sjdp 56989857Sobrien amt = (vec_length + 1) * sizeof (char **); 570130561Sobrien name_list = bfd_malloc (amt); 57138889Sjdp if (name_list == NULL) 57238889Sjdp return NULL; 57338889Sjdp 57477298Sobrien /* Point the list at each of the names. */ 57538889Sjdp name_ptr = name_list; 57638889Sjdp for (app = bfd_archures_list; *app != NULL; app++) 57738889Sjdp { 57838889Sjdp const bfd_arch_info_type *ap; 57938889Sjdp for (ap = *app; ap != NULL; ap = ap->next) 58038889Sjdp { 58138889Sjdp *name_ptr = ap->printable_name; 58238889Sjdp name_ptr++; 58338889Sjdp } 58438889Sjdp } 58538889Sjdp *name_ptr = NULL; 58638889Sjdp 58738889Sjdp return name_list; 58838889Sjdp} 58938889Sjdp 59038889Sjdp/* 59138889SjdpFUNCTION 59233965Sjdp bfd_arch_get_compatible 59333965Sjdp 59433965SjdpSYNOPSIS 595130561Sobrien const bfd_arch_info_type *bfd_arch_get_compatible 596130561Sobrien (const bfd *abfd, const bfd *bbfd, bfd_boolean accept_unknowns); 59733965Sjdp 59833965SjdpDESCRIPTION 599130561Sobrien Determine whether two BFDs' architectures and machine types 600130561Sobrien are compatible. Calculates the lowest common denominator 601130561Sobrien between the two architectures and machine types implied by 602130561Sobrien the BFDs and returns a pointer to an <<arch_info>> structure 603130561Sobrien describing the compatible machine. 60433965Sjdp*/ 60533965Sjdp 60633965Sjdpconst bfd_arch_info_type * 607130561Sobrienbfd_arch_get_compatible (const bfd *abfd, 608130561Sobrien const bfd *bbfd, 609130561Sobrien bfd_boolean accept_unknowns) 61033965Sjdp{ 611130561Sobrien const bfd * ubfd = NULL; 61233965Sjdp 613130561Sobrien /* Look for an unknown architecture. */ 614130561Sobrien if (((ubfd = abfd) && ubfd->arch_info->arch == bfd_arch_unknown) 615130561Sobrien || ((ubfd = bbfd) && ubfd->arch_info->arch == bfd_arch_unknown)) 616130561Sobrien { 617130561Sobrien /* We can allow an unknown architecture if accept_unknowns 618130561Sobrien is true, or if the target is the "binary" format, which 619130561Sobrien has an unknown architecture. Since the binary format can 620130561Sobrien only be set by explicit request from the user, it is safe 621130561Sobrien to assume that they know what they are doing. */ 622130561Sobrien if (accept_unknowns 623130561Sobrien || strcmp (bfd_get_target (ubfd), "binary") == 0) 624130561Sobrien return ubfd->arch_info; 625130561Sobrien return NULL; 626130561Sobrien } 627130561Sobrien 62833965Sjdp /* Otherwise architecture-specific code has to decide. */ 62933965Sjdp return abfd->arch_info->compatible (abfd->arch_info, bbfd->arch_info); 63033965Sjdp} 63133965Sjdp 63233965Sjdp/* 63333965SjdpINTERNAL_DEFINITION 63433965Sjdp bfd_default_arch_struct 63533965Sjdp 63633965SjdpDESCRIPTION 63733965Sjdp The <<bfd_default_arch_struct>> is an item of 63833965Sjdp <<bfd_arch_info_type>> which has been initialized to a fairly 63933965Sjdp generic state. A BFD starts life by pointing to this 64033965Sjdp structure, until the correct back end has determined the real 64133965Sjdp architecture of the file. 64233965Sjdp 64333965Sjdp.extern const bfd_arch_info_type bfd_default_arch_struct; 64433965Sjdp*/ 64533965Sjdp 64677298Sobrienconst bfd_arch_info_type bfd_default_arch_struct = { 647130561Sobrien 32, 32, 8, bfd_arch_unknown, 0, "unknown", "unknown", 2, TRUE, 64877298Sobrien bfd_default_compatible, 64977298Sobrien bfd_default_scan, 65077298Sobrien 0, 65133965Sjdp}; 65233965Sjdp 65333965Sjdp/* 65433965SjdpFUNCTION 65533965Sjdp bfd_set_arch_info 65633965Sjdp 65733965SjdpSYNOPSIS 658130561Sobrien void bfd_set_arch_info (bfd *abfd, const bfd_arch_info_type *arg); 65933965Sjdp 66033965SjdpDESCRIPTION 66133965Sjdp Set the architecture info of @var{abfd} to @var{arg}. 66233965Sjdp*/ 66333965Sjdp 66433965Sjdpvoid 665130561Sobrienbfd_set_arch_info (bfd *abfd, const bfd_arch_info_type *arg) 66633965Sjdp{ 66733965Sjdp abfd->arch_info = arg; 66833965Sjdp} 66933965Sjdp 67033965Sjdp/* 67133965SjdpINTERNAL_FUNCTION 67233965Sjdp bfd_default_set_arch_mach 67333965Sjdp 67433965SjdpSYNOPSIS 675130561Sobrien bfd_boolean bfd_default_set_arch_mach 676130561Sobrien (bfd *abfd, enum bfd_architecture arch, unsigned long mach); 67733965Sjdp 67833965SjdpDESCRIPTION 67933965Sjdp Set the architecture and machine type in BFD @var{abfd} 68033965Sjdp to @var{arch} and @var{mach}. Find the correct 68133965Sjdp pointer to a structure and insert it into the <<arch_info>> 68277298Sobrien pointer. 68333965Sjdp*/ 68433965Sjdp 685130561Sobrienbfd_boolean 686130561Sobrienbfd_default_set_arch_mach (bfd *abfd, 687130561Sobrien enum bfd_architecture arch, 688130561Sobrien unsigned long mach) 68933965Sjdp{ 69099461Sobrien abfd->arch_info = bfd_lookup_arch (arch, mach); 69199461Sobrien if (abfd->arch_info != NULL) 692130561Sobrien return TRUE; 69333965Sjdp 69433965Sjdp abfd->arch_info = &bfd_default_arch_struct; 69533965Sjdp bfd_set_error (bfd_error_bad_value); 696130561Sobrien return FALSE; 69733965Sjdp} 69833965Sjdp 69933965Sjdp/* 70033965SjdpFUNCTION 70133965Sjdp bfd_get_arch 70233965Sjdp 70333965SjdpSYNOPSIS 704130561Sobrien enum bfd_architecture bfd_get_arch (bfd *abfd); 70533965Sjdp 70633965SjdpDESCRIPTION 70733965Sjdp Return the enumerated type which describes the BFD @var{abfd}'s 70833965Sjdp architecture. 70933965Sjdp*/ 71033965Sjdp 71133965Sjdpenum bfd_architecture 712130561Sobrienbfd_get_arch (bfd *abfd) 71333965Sjdp{ 71477298Sobrien return abfd->arch_info->arch; 71533965Sjdp} 71633965Sjdp 71733965Sjdp/* 71833965SjdpFUNCTION 71933965Sjdp bfd_get_mach 72033965Sjdp 72133965SjdpSYNOPSIS 722130561Sobrien unsigned long bfd_get_mach (bfd *abfd); 72333965Sjdp 72433965SjdpDESCRIPTION 72533965Sjdp Return the long type which describes the BFD @var{abfd}'s 72633965Sjdp machine. 72733965Sjdp*/ 72833965Sjdp 72977298Sobrienunsigned long 730130561Sobrienbfd_get_mach (bfd *abfd) 73133965Sjdp{ 73277298Sobrien return abfd->arch_info->mach; 73333965Sjdp} 73433965Sjdp 73533965Sjdp/* 73633965SjdpFUNCTION 73733965Sjdp bfd_arch_bits_per_byte 73833965Sjdp 73933965SjdpSYNOPSIS 740130561Sobrien unsigned int bfd_arch_bits_per_byte (bfd *abfd); 74133965Sjdp 74233965SjdpDESCRIPTION 74333965Sjdp Return the number of bits in one of the BFD @var{abfd}'s 74433965Sjdp architecture's bytes. 74533965Sjdp*/ 74633965Sjdp 74733965Sjdpunsigned int 748130561Sobrienbfd_arch_bits_per_byte (bfd *abfd) 74933965Sjdp{ 75033965Sjdp return abfd->arch_info->bits_per_byte; 75133965Sjdp} 75233965Sjdp 75333965Sjdp/* 75433965SjdpFUNCTION 75533965Sjdp bfd_arch_bits_per_address 75633965Sjdp 75733965SjdpSYNOPSIS 758130561Sobrien unsigned int bfd_arch_bits_per_address (bfd *abfd); 75933965Sjdp 76033965SjdpDESCRIPTION 76133965Sjdp Return the number of bits in one of the BFD @var{abfd}'s 76233965Sjdp architecture's addresses. 76333965Sjdp*/ 76433965Sjdp 76533965Sjdpunsigned int 766130561Sobrienbfd_arch_bits_per_address (bfd *abfd) 76733965Sjdp{ 76833965Sjdp return abfd->arch_info->bits_per_address; 76933965Sjdp} 77033965Sjdp 77133965Sjdp/* 77277298SobrienINTERNAL_FUNCTION 77333965Sjdp bfd_default_compatible 77433965Sjdp 77533965SjdpSYNOPSIS 77633965Sjdp const bfd_arch_info_type *bfd_default_compatible 777130561Sobrien (const bfd_arch_info_type *a, const bfd_arch_info_type *b); 77833965Sjdp 77933965SjdpDESCRIPTION 78033965Sjdp The default function for testing for compatibility. 78133965Sjdp*/ 78233965Sjdp 78333965Sjdpconst bfd_arch_info_type * 784130561Sobrienbfd_default_compatible (const bfd_arch_info_type *a, 785130561Sobrien const bfd_arch_info_type *b) 78633965Sjdp{ 78733965Sjdp if (a->arch != b->arch) 78833965Sjdp return NULL; 78933965Sjdp 79094536Sobrien if (a->bits_per_word != b->bits_per_word) 79194536Sobrien return NULL; 79294536Sobrien 79333965Sjdp if (a->mach > b->mach) 79433965Sjdp return a; 79533965Sjdp 79633965Sjdp if (b->mach > a->mach) 79733965Sjdp return b; 79833965Sjdp 79933965Sjdp return a; 80033965Sjdp} 80133965Sjdp 80233965Sjdp/* 80333965SjdpINTERNAL_FUNCTION 80433965Sjdp bfd_default_scan 80533965Sjdp 80633965SjdpSYNOPSIS 807130561Sobrien bfd_boolean bfd_default_scan 808130561Sobrien (const struct bfd_arch_info *info, const char *string); 80933965Sjdp 81033965SjdpDESCRIPTION 81133965Sjdp The default function for working out whether this is an 81233965Sjdp architecture hit and a machine hit. 81333965Sjdp*/ 81433965Sjdp 815130561Sobrienbfd_boolean 816130561Sobrienbfd_default_scan (const bfd_arch_info_type *info, const char *string) 81733965Sjdp{ 81833965Sjdp const char *ptr_src; 81933965Sjdp const char *ptr_tst; 82033965Sjdp unsigned long number; 82133965Sjdp enum bfd_architecture arch; 82238889Sjdp const char *printable_name_colon; 82333965Sjdp 82438889Sjdp /* Exact match of the architecture name (ARCH_NAME) and also the 82577298Sobrien default architecture? */ 82638889Sjdp if (strcasecmp (string, info->arch_name) == 0 82738889Sjdp && info->the_default) 828130561Sobrien return TRUE; 82933965Sjdp 83077298Sobrien /* Exact match of the machine name (PRINTABLE_NAME)? */ 83138889Sjdp if (strcasecmp (string, info->printable_name) == 0) 832130561Sobrien return TRUE; 83377298Sobrien 83438889Sjdp /* Given that printable_name contains no colon, attempt to match: 83577298Sobrien ARCH_NAME [ ":" ] PRINTABLE_NAME? */ 83638889Sjdp printable_name_colon = strchr (info->printable_name, ':'); 83738889Sjdp if (printable_name_colon == NULL) 83838889Sjdp { 83989857Sobrien size_t strlen_arch_name = strlen (info->arch_name); 84038889Sjdp if (strncasecmp (string, info->arch_name, strlen_arch_name) == 0) 84138889Sjdp { 84238889Sjdp if (string[strlen_arch_name] == ':') 84338889Sjdp { 84438889Sjdp if (strcasecmp (string + strlen_arch_name + 1, 84538889Sjdp info->printable_name) == 0) 846130561Sobrien return TRUE; 84738889Sjdp } 84838889Sjdp else 84938889Sjdp { 85038889Sjdp if (strcasecmp (string + strlen_arch_name, 85138889Sjdp info->printable_name) == 0) 852130561Sobrien return TRUE; 85338889Sjdp } 85438889Sjdp } 85538889Sjdp } 85638889Sjdp 85738889Sjdp /* Given that PRINTABLE_NAME has the form: <arch> ":" <mach>; 85877298Sobrien Attempt to match: <arch> <mach>? */ 85938889Sjdp if (printable_name_colon != NULL) 86038889Sjdp { 86189857Sobrien size_t colon_index = printable_name_colon - info->printable_name; 86238889Sjdp if (strncasecmp (string, info->printable_name, colon_index) == 0 86338889Sjdp && strcasecmp (string + colon_index, 86438889Sjdp info->printable_name + colon_index + 1) == 0) 865130561Sobrien return TRUE; 86638889Sjdp } 86738889Sjdp 86838889Sjdp /* Given that PRINTABLE_NAME has the form: <arch> ":" <mach>; Do not 869130561Sobrien attempt to match just <mach>, it could be ambiguous. This test 87077298Sobrien is left until later. */ 87138889Sjdp 87277298Sobrien /* NOTE: The below is retained for compatibility only. Please do 87377298Sobrien not add to this code. */ 87438889Sjdp 87533965Sjdp /* See how much of the supplied string matches with the 87633965Sjdp architecture, eg the string m68k:68020 would match the 68k entry 87777298Sobrien up to the :, then we get left with the machine number. */ 87833965Sjdp 87977298Sobrien for (ptr_src = string, ptr_tst = info->arch_name; 88033965Sjdp *ptr_src && *ptr_tst; 88177298Sobrien ptr_src++, ptr_tst++) 88233965Sjdp { 88377298Sobrien if (*ptr_src != *ptr_tst) 88477298Sobrien break; 88533965Sjdp } 88633965Sjdp 88733965Sjdp /* Chewed up as much of the architecture as will match, skip any 88877298Sobrien colons. */ 88933965Sjdp if (*ptr_src == ':') 89033965Sjdp ptr_src++; 89177298Sobrien 89233965Sjdp if (*ptr_src == 0) 89333965Sjdp { 89477298Sobrien /* Nothing more, then only keep this one if it is the default 89577298Sobrien machine for this architecture. */ 89633965Sjdp return info->the_default; 89733965Sjdp } 89833965Sjdp 89933965Sjdp number = 0; 90089857Sobrien while (ISDIGIT (*ptr_src)) 90133965Sjdp { 90277298Sobrien number = number * 10 + *ptr_src - '0'; 90333965Sjdp ptr_src++; 90433965Sjdp } 90533965Sjdp 90638889Sjdp /* NOTE: The below is retained for compatibility only. 90777298Sobrien PLEASE DO NOT ADD TO THIS CODE. */ 90838889Sjdp 90977298Sobrien switch (number) 91033965Sjdp { 91138889Sjdp /* FIXME: These are needed to parse IEEE objects. */ 91277298Sobrien /* The following seven case's are here only for compatibility with 91377298Sobrien older binutils (at least IEEE objects from binutils 2.9.1 require 91477298Sobrien them). */ 91577298Sobrien case bfd_mach_m68000: 91677298Sobrien case bfd_mach_m68010: 91777298Sobrien case bfd_mach_m68020: 91877298Sobrien case bfd_mach_m68030: 91977298Sobrien case bfd_mach_m68040: 92077298Sobrien case bfd_mach_m68060: 92177298Sobrien case bfd_mach_cpu32: 92238889Sjdp arch = bfd_arch_m68k; 92377298Sobrien break; 92477298Sobrien case 68000: 92577298Sobrien arch = bfd_arch_m68k; 92638889Sjdp number = bfd_mach_m68000; 92733965Sjdp break; 92838889Sjdp case 68010: 92938889Sjdp arch = bfd_arch_m68k; 93038889Sjdp number = bfd_mach_m68010; 93133965Sjdp break; 93238889Sjdp case 68020: 93338889Sjdp arch = bfd_arch_m68k; 93438889Sjdp number = bfd_mach_m68020; 93533965Sjdp break; 93633965Sjdp case 68030: 93738889Sjdp arch = bfd_arch_m68k; 93838889Sjdp number = bfd_mach_m68030; 93938889Sjdp break; 94033965Sjdp case 68040: 94138889Sjdp arch = bfd_arch_m68k; 94238889Sjdp number = bfd_mach_m68040; 94338889Sjdp break; 94460484Sobrien case 68060: 94560484Sobrien arch = bfd_arch_m68k; 94660484Sobrien number = bfd_mach_m68060; 94760484Sobrien break; 94833965Sjdp case 68332: 94938889Sjdp arch = bfd_arch_m68k; 95060484Sobrien number = bfd_mach_cpu32; 95133965Sjdp break; 95278828Sobrien case 5200: 95378828Sobrien arch = bfd_arch_m68k; 95478828Sobrien number = bfd_mach_mcf5200; 95578828Sobrien break; 95678828Sobrien case 5206: 95778828Sobrien arch = bfd_arch_m68k; 95878828Sobrien number = bfd_mach_mcf5206e; 95978828Sobrien break; 96078828Sobrien case 5307: 96178828Sobrien arch = bfd_arch_m68k; 96278828Sobrien number = bfd_mach_mcf5307; 96378828Sobrien break; 96478828Sobrien case 5407: 96578828Sobrien arch = bfd_arch_m68k; 96678828Sobrien number = bfd_mach_mcf5407; 96778828Sobrien break; 968130561Sobrien case 5282: 969130561Sobrien arch = bfd_arch_m68k; 970130561Sobrien number = bfd_mach_mcf528x; 971130561Sobrien break; 97233965Sjdp 97333965Sjdp case 32000: 97433965Sjdp arch = bfd_arch_we32k; 97533965Sjdp break; 97633965Sjdp 97738889Sjdp case 3000: 97838889Sjdp arch = bfd_arch_mips; 97938889Sjdp number = bfd_mach_mips3000; 98033965Sjdp break; 98133965Sjdp 98233965Sjdp case 4000: 98333965Sjdp arch = bfd_arch_mips; 98438889Sjdp number = bfd_mach_mips4000; 98533965Sjdp break; 98633965Sjdp 98733965Sjdp case 6000: 98833965Sjdp arch = bfd_arch_rs6000; 98933965Sjdp break; 99033965Sjdp 99160484Sobrien case 7410: 99260484Sobrien arch = bfd_arch_sh; 99360484Sobrien number = bfd_mach_sh_dsp; 99460484Sobrien break; 99560484Sobrien 99660484Sobrien case 7708: 99760484Sobrien arch = bfd_arch_sh; 99860484Sobrien number = bfd_mach_sh3; 99960484Sobrien break; 100060484Sobrien 100160484Sobrien case 7729: 100260484Sobrien arch = bfd_arch_sh; 100360484Sobrien number = bfd_mach_sh3_dsp; 100460484Sobrien break; 100560484Sobrien 100660484Sobrien case 7750: 100760484Sobrien arch = bfd_arch_sh; 100860484Sobrien number = bfd_mach_sh4; 100960484Sobrien break; 101060484Sobrien 101177298Sobrien default: 1012130561Sobrien return FALSE; 101333965Sjdp } 101433965Sjdp 101577298Sobrien if (arch != info->arch) 1016130561Sobrien return FALSE; 101733965Sjdp 101833965Sjdp if (number != info->mach) 1019130561Sobrien return FALSE; 102033965Sjdp 1021130561Sobrien return TRUE; 102233965Sjdp} 102333965Sjdp 102433965Sjdp/* 102533965SjdpFUNCTION 102633965Sjdp bfd_get_arch_info 102733965Sjdp 102833965SjdpSYNOPSIS 1029130561Sobrien const bfd_arch_info_type *bfd_get_arch_info (bfd *abfd); 103033965Sjdp 103133965SjdpDESCRIPTION 103233965Sjdp Return the architecture info struct in @var{abfd}. 103333965Sjdp*/ 103433965Sjdp 103533965Sjdpconst bfd_arch_info_type * 1036130561Sobrienbfd_get_arch_info (bfd *abfd) 103733965Sjdp{ 103833965Sjdp return abfd->arch_info; 103933965Sjdp} 104033965Sjdp 104133965Sjdp/* 104233965SjdpFUNCTION 104333965Sjdp bfd_lookup_arch 104433965Sjdp 104533965SjdpSYNOPSIS 104633965Sjdp const bfd_arch_info_type *bfd_lookup_arch 1047130561Sobrien (enum bfd_architecture arch, unsigned long machine); 104833965Sjdp 104933965SjdpDESCRIPTION 1050130561Sobrien Look for the architecture info structure which matches the 105133965Sjdp arguments @var{arch} and @var{machine}. A machine of 0 matches the 105233965Sjdp machine/architecture structure which marks itself as the 105333965Sjdp default. 105433965Sjdp*/ 105533965Sjdp 105677298Sobrienconst bfd_arch_info_type * 1057130561Sobrienbfd_lookup_arch (enum bfd_architecture arch, unsigned long machine) 105833965Sjdp{ 105933965Sjdp const bfd_arch_info_type * const *app, *ap; 106033965Sjdp 106133965Sjdp for (app = bfd_archures_list; *app != NULL; app++) 106233965Sjdp { 106333965Sjdp for (ap = *app; ap != NULL; ap = ap->next) 106433965Sjdp { 106533965Sjdp if (ap->arch == arch 106633965Sjdp && (ap->mach == machine 106733965Sjdp || (machine == 0 && ap->the_default))) 106833965Sjdp return ap; 106933965Sjdp } 107033965Sjdp } 107133965Sjdp 107233965Sjdp return NULL; 107333965Sjdp} 107433965Sjdp 107533965Sjdp/* 107633965SjdpFUNCTION 107733965Sjdp bfd_printable_arch_mach 107833965Sjdp 107933965SjdpSYNOPSIS 108033965Sjdp const char *bfd_printable_arch_mach 1081130561Sobrien (enum bfd_architecture arch, unsigned long machine); 108233965Sjdp 108333965SjdpDESCRIPTION 108433965Sjdp Return a printable string representing the architecture and 108577298Sobrien machine type. 108633965Sjdp 108733965Sjdp This routine is depreciated. 108833965Sjdp*/ 108933965Sjdp 109033965Sjdpconst char * 1091130561Sobrienbfd_printable_arch_mach (enum bfd_architecture arch, unsigned long machine) 109233965Sjdp{ 109377298Sobrien const bfd_arch_info_type *ap = bfd_lookup_arch (arch, machine); 109433965Sjdp 109577298Sobrien if (ap) 109677298Sobrien return ap->printable_name; 109777298Sobrien return "UNKNOWN!"; 109833965Sjdp} 109960484Sobrien 110060484Sobrien/* 110160484SobrienFUNCTION 110260484Sobrien bfd_octets_per_byte 110360484Sobrien 110460484SobrienSYNOPSIS 1105130561Sobrien unsigned int bfd_octets_per_byte (bfd *abfd); 110660484Sobrien 110760484SobrienDESCRIPTION 110860484Sobrien Return the number of octets (8-bit quantities) per target byte 110960484Sobrien (minimum addressable unit). In most cases, this will be one, but some 111060484Sobrien DSP targets have 16, 32, or even 48 bits per byte. 111160484Sobrien*/ 111260484Sobrien 111360484Sobrienunsigned int 1114130561Sobrienbfd_octets_per_byte (bfd *abfd) 111560484Sobrien{ 111677298Sobrien return bfd_arch_mach_octets_per_byte (bfd_get_arch (abfd), 111777298Sobrien bfd_get_mach (abfd)); 111860484Sobrien} 111960484Sobrien 112060484Sobrien/* 112160484SobrienFUNCTION 112260484Sobrien bfd_arch_mach_octets_per_byte 112360484Sobrien 112460484SobrienSYNOPSIS 1125130561Sobrien unsigned int bfd_arch_mach_octets_per_byte 1126130561Sobrien (enum bfd_architecture arch, unsigned long machine); 112760484Sobrien 112860484SobrienDESCRIPTION 112960484Sobrien See bfd_octets_per_byte. 113077298Sobrien 113160484Sobrien This routine is provided for those cases where a bfd * is not 113260484Sobrien available 113360484Sobrien*/ 113460484Sobrien 113560484Sobrienunsigned int 1136130561Sobrienbfd_arch_mach_octets_per_byte (enum bfd_architecture arch, 1137130561Sobrien unsigned long mach) 113860484Sobrien{ 113977298Sobrien const bfd_arch_info_type *ap = bfd_lookup_arch (arch, mach); 114077298Sobrien 114177298Sobrien if (ap) 114277298Sobrien return ap->bits_per_byte / 8; 114377298Sobrien return 1; 114460484Sobrien} 1145