133965Sjdp/* BFD library support routines for architectures. 278828Sobrien Copyright 1990, 1991, 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999, 3218822Sdim 2000, 2001, 2002, 2003, 2004, 2005, 2006, 2007 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 23218822Sdim#include "sysdep.h" 2433965Sjdp#include "bfd.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 83218822Sdim.#define bfd_mach_fido 9 84218822Sdim.#define bfd_mach_mcf_isa_a_nodiv 10 85218822Sdim.#define bfd_mach_mcf_isa_a 11 86218822Sdim.#define bfd_mach_mcf_isa_a_mac 12 87218822Sdim.#define bfd_mach_mcf_isa_a_emac 13 88218822Sdim.#define bfd_mach_mcf_isa_aplus 14 89218822Sdim.#define bfd_mach_mcf_isa_aplus_mac 15 90218822Sdim.#define bfd_mach_mcf_isa_aplus_emac 16 91218822Sdim.#define bfd_mach_mcf_isa_b_nousp 17 92218822Sdim.#define bfd_mach_mcf_isa_b_nousp_mac 18 93218822Sdim.#define bfd_mach_mcf_isa_b_nousp_emac 19 94218822Sdim.#define bfd_mach_mcf_isa_b 20 95218822Sdim.#define bfd_mach_mcf_isa_b_mac 21 96218822Sdim.#define bfd_mach_mcf_isa_b_emac 22 97218822Sdim.#define bfd_mach_mcf_isa_b_float 23 98218822Sdim.#define bfd_mach_mcf_isa_b_float_mac 24 99218822Sdim.#define bfd_mach_mcf_isa_b_float_emac 25 100218822Sdim.#define bfd_mach_mcf_isa_c 26 101218822Sdim.#define bfd_mach_mcf_isa_c_mac 27 102218822Sdim.#define bfd_mach_mcf_isa_c_emac 28 10377298Sobrien. bfd_arch_vax, {* DEC Vax *} 10433965Sjdp. bfd_arch_i960, {* Intel 960 *} 10533965Sjdp. {* The order of the following is important. 10677298Sobrien. lower number indicates a machine type that 10733965Sjdp. only accepts a subset of the instructions 10833965Sjdp. available to machines with higher numbers. 10933965Sjdp. The exception is the "ca", which is 11077298Sobrien. incompatible with all other machines except 11191041Sobrien. "core". *} 11233965Sjdp. 11333965Sjdp.#define bfd_mach_i960_core 1 11433965Sjdp.#define bfd_mach_i960_ka_sa 2 11533965Sjdp.#define bfd_mach_i960_kb_sb 3 11633965Sjdp.#define bfd_mach_i960_mc 4 11733965Sjdp.#define bfd_mach_i960_xa 5 11833965Sjdp.#define bfd_mach_i960_ca 6 11933965Sjdp.#define bfd_mach_i960_jx 7 12033965Sjdp.#define bfd_mach_i960_hx 8 12133965Sjdp. 12291041Sobrien. bfd_arch_or32, {* OpenRISC 32 *} 12391041Sobrien. 12433965Sjdp. bfd_arch_sparc, {* SPARC *} 12533965Sjdp.#define bfd_mach_sparc 1 12633965Sjdp.{* The difference between v8plus and v9 is that v9 is a true 64 bit env. *} 12733965Sjdp.#define bfd_mach_sparc_sparclet 2 12833965Sjdp.#define bfd_mach_sparc_sparclite 3 12933965Sjdp.#define bfd_mach_sparc_v8plus 4 13091041Sobrien.#define bfd_mach_sparc_v8plusa 5 {* with ultrasparc add'ns. *} 13160484Sobrien.#define bfd_mach_sparc_sparclite_le 6 13260484Sobrien.#define bfd_mach_sparc_v9 7 13391041Sobrien.#define bfd_mach_sparc_v9a 8 {* with ultrasparc add'ns. *} 13491041Sobrien.#define bfd_mach_sparc_v8plusb 9 {* with cheetah add'ns. *} 13591041Sobrien.#define bfd_mach_sparc_v9b 10 {* with cheetah add'ns. *} 13633965Sjdp.{* Nonzero if MACH has the v9 instruction set. *} 13733965Sjdp.#define bfd_mach_sparc_v9_p(mach) \ 13877298Sobrien. ((mach) >= bfd_mach_sparc_v8plus && (mach) <= bfd_mach_sparc_v9b \ 13977298Sobrien. && (mach) != bfd_mach_sparc_sparclite_le) 140218822Sdim.{* Nonzero if MACH is a 64 bit sparc architecture. *} 141218822Sdim.#define bfd_mach_sparc_64bit_p(mach) \ 142218822Sdim. ((mach) >= bfd_mach_sparc_v9 && (mach) != bfd_mach_sparc_v8plusb) 143218822Sdim. bfd_arch_spu, {* PowerPC SPU *} 144218822Sdim.#define bfd_mach_spu 256 14533965Sjdp. bfd_arch_mips, {* MIPS Rxxxx *} 14638889Sjdp.#define bfd_mach_mips3000 3000 14738889Sjdp.#define bfd_mach_mips3900 3900 14838889Sjdp.#define bfd_mach_mips4000 4000 14938889Sjdp.#define bfd_mach_mips4010 4010 15038889Sjdp.#define bfd_mach_mips4100 4100 15160484Sobrien.#define bfd_mach_mips4111 4111 152130561Sobrien.#define bfd_mach_mips4120 4120 15338889Sjdp.#define bfd_mach_mips4300 4300 15438889Sjdp.#define bfd_mach_mips4400 4400 15538889Sjdp.#define bfd_mach_mips4600 4600 15638889Sjdp.#define bfd_mach_mips4650 4650 15738889Sjdp.#define bfd_mach_mips5000 5000 158130561Sobrien.#define bfd_mach_mips5400 5400 159130561Sobrien.#define bfd_mach_mips5500 5500 16038889Sjdp.#define bfd_mach_mips6000 6000 161130561Sobrien.#define bfd_mach_mips7000 7000 16238889Sjdp.#define bfd_mach_mips8000 8000 163208737Sjmallett.#define bfd_mach_mips9000 9000 16438889Sjdp.#define bfd_mach_mips10000 10000 16578828Sobrien.#define bfd_mach_mips12000 12000 16638889Sjdp.#define bfd_mach_mips16 16 16777298Sobrien.#define bfd_mach_mips5 5 168208737Sjmallett.#define bfd_mach_mips_octeon 6502 16977298Sobrien.#define bfd_mach_mips_sb1 12310201 {* octal 'SB', 01 *} 17089857Sobrien.#define bfd_mach_mipsisa32 32 171130561Sobrien.#define bfd_mach_mipsisa32r2 33 17289857Sobrien.#define bfd_mach_mipsisa64 64 173130561Sobrien.#define bfd_mach_mipsisa64r2 65 17433965Sjdp. bfd_arch_i386, {* Intel 386 *} 175130561Sobrien.#define bfd_mach_i386_i386 1 176130561Sobrien.#define bfd_mach_i386_i8086 2 177130561Sobrien.#define bfd_mach_i386_i386_intel_syntax 3 178130561Sobrien.#define bfd_mach_x86_64 64 179130561Sobrien.#define bfd_mach_x86_64_intel_syntax 65 18033965Sjdp. bfd_arch_we32k, {* AT&T WE32xxx *} 18133965Sjdp. bfd_arch_tahoe, {* CCI/Harris Tahoe *} 18233965Sjdp. bfd_arch_i860, {* Intel 860 *} 18360484Sobrien. bfd_arch_i370, {* IBM 360/370 Mainframes *} 18433965Sjdp. bfd_arch_romp, {* IBM ROMP PC/RT *} 18533965Sjdp. bfd_arch_convex, {* Convex *} 18633965Sjdp. bfd_arch_m88k, {* Motorola 88xxx *} 187130561Sobrien. bfd_arch_m98k, {* Motorola 98xxx *} 18833965Sjdp. bfd_arch_pyramid, {* Pyramid Technology *} 189130561Sobrien. bfd_arch_h8300, {* Renesas H8/300 (formerly Hitachi H8/300) *} 190130561Sobrien.#define bfd_mach_h8300 1 191130561Sobrien.#define bfd_mach_h8300h 2 192130561Sobrien.#define bfd_mach_h8300s 3 193130561Sobrien.#define bfd_mach_h8300hn 4 194130561Sobrien.#define bfd_mach_h8300sn 5 195130561Sobrien.#define bfd_mach_h8300sx 6 196130561Sobrien.#define bfd_mach_h8300sxn 7 19789857Sobrien. bfd_arch_pdp11, {* DEC PDP-11 *} 19833965Sjdp. bfd_arch_powerpc, {* PowerPC *} 199130561Sobrien.#define bfd_mach_ppc 32 200130561Sobrien.#define bfd_mach_ppc64 64 20177298Sobrien.#define bfd_mach_ppc_403 403 20277298Sobrien.#define bfd_mach_ppc_403gc 4030 20377298Sobrien.#define bfd_mach_ppc_505 505 20477298Sobrien.#define bfd_mach_ppc_601 601 20577298Sobrien.#define bfd_mach_ppc_602 602 20677298Sobrien.#define bfd_mach_ppc_603 603 20777298Sobrien.#define bfd_mach_ppc_ec603e 6031 20877298Sobrien.#define bfd_mach_ppc_604 604 20977298Sobrien.#define bfd_mach_ppc_620 620 21077298Sobrien.#define bfd_mach_ppc_630 630 21177298Sobrien.#define bfd_mach_ppc_750 750 21277298Sobrien.#define bfd_mach_ppc_860 860 21377298Sobrien.#define bfd_mach_ppc_a35 35 21477298Sobrien.#define bfd_mach_ppc_rs64ii 642 21577298Sobrien.#define bfd_mach_ppc_rs64iii 643 21677298Sobrien.#define bfd_mach_ppc_7400 7400 217130561Sobrien.#define bfd_mach_ppc_e500 500 21833965Sjdp. bfd_arch_rs6000, {* IBM RS/6000 *} 219130561Sobrien.#define bfd_mach_rs6k 6000 22077298Sobrien.#define bfd_mach_rs6k_rs1 6001 22177298Sobrien.#define bfd_mach_rs6k_rsc 6003 22277298Sobrien.#define bfd_mach_rs6k_rs2 6002 22333965Sjdp. bfd_arch_hppa, {* HP PA RISC *} 224130561Sobrien.#define bfd_mach_hppa10 10 225130561Sobrien.#define bfd_mach_hppa11 11 226130561Sobrien.#define bfd_mach_hppa20 20 227130561Sobrien.#define bfd_mach_hppa20w 25 22833965Sjdp. bfd_arch_d10v, {* Mitsubishi D10V *} 229130561Sobrien.#define bfd_mach_d10v 1 23060484Sobrien.#define bfd_mach_d10v_ts2 2 23160484Sobrien.#define bfd_mach_d10v_ts3 3 23260484Sobrien. bfd_arch_d30v, {* Mitsubishi D30V *} 233104834Sobrien. bfd_arch_dlx, {* DLX *} 23477298Sobrien. bfd_arch_m68hc11, {* Motorola 68HC11 *} 23577298Sobrien. bfd_arch_m68hc12, {* Motorola 68HC12 *} 236130561Sobrien.#define bfd_mach_m6812_default 0 237130561Sobrien.#define bfd_mach_m6812 1 238130561Sobrien.#define bfd_mach_m6812s 2 23933965Sjdp. bfd_arch_z8k, {* Zilog Z8000 *} 24033965Sjdp.#define bfd_mach_z8001 1 24133965Sjdp.#define bfd_mach_z8002 2 242130561Sobrien. bfd_arch_h8500, {* Renesas H8/500 (formerly Hitachi H8/500) *} 243130561Sobrien. bfd_arch_sh, {* Renesas / SuperH SH (formerly Hitachi SH) *} 244130561Sobrien.#define bfd_mach_sh 1 24560484Sobrien.#define bfd_mach_sh2 0x20 24660484Sobrien.#define bfd_mach_sh_dsp 0x2d 247218822Sdim.#define bfd_mach_sh2a 0x2a 248218822Sdim.#define bfd_mach_sh2a_nofpu 0x2b 249218822Sdim.#define bfd_mach_sh2a_nofpu_or_sh4_nommu_nofpu 0x2a1 250218822Sdim.#define bfd_mach_sh2a_nofpu_or_sh3_nommu 0x2a2 251218822Sdim.#define bfd_mach_sh2a_or_sh4 0x2a3 252218822Sdim.#define bfd_mach_sh2a_or_sh3e 0x2a4 253130561Sobrien.#define bfd_mach_sh2e 0x2e 25438889Sjdp.#define bfd_mach_sh3 0x30 255218822Sdim.#define bfd_mach_sh3_nommu 0x31 25660484Sobrien.#define bfd_mach_sh3_dsp 0x3d 25738889Sjdp.#define bfd_mach_sh3e 0x3e 25838889Sjdp.#define bfd_mach_sh4 0x40 259130561Sobrien.#define bfd_mach_sh4_nofpu 0x41 260218822Sdim.#define bfd_mach_sh4_nommu_nofpu 0x42 261130561Sobrien.#define bfd_mach_sh4a 0x4a 262130561Sobrien.#define bfd_mach_sh4a_nofpu 0x4b 263130561Sobrien.#define bfd_mach_sh4al_dsp 0x4d 26491041Sobrien.#define bfd_mach_sh5 0x50 26533965Sjdp. bfd_arch_alpha, {* Dec Alpha *} 26660484Sobrien.#define bfd_mach_alpha_ev4 0x10 26760484Sobrien.#define bfd_mach_alpha_ev5 0x20 26860484Sobrien.#define bfd_mach_alpha_ev6 0x30 26991041Sobrien. bfd_arch_arm, {* Advanced Risc Machines ARM. *} 270130561Sobrien.#define bfd_mach_arm_unknown 0 27138889Sjdp.#define bfd_mach_arm_2 1 27260484Sobrien.#define bfd_mach_arm_2a 2 27338889Sjdp.#define bfd_mach_arm_3 3 27438889Sjdp.#define bfd_mach_arm_3M 4 27560484Sobrien.#define bfd_mach_arm_4 5 27638889Sjdp.#define bfd_mach_arm_4T 6 27760484Sobrien.#define bfd_mach_arm_5 7 27860484Sobrien.#define bfd_mach_arm_5T 8 27977298Sobrien.#define bfd_mach_arm_5TE 9 28077298Sobrien.#define bfd_mach_arm_XScale 10 281130561Sobrien.#define bfd_mach_arm_ep9312 11 282130561Sobrien.#define bfd_mach_arm_iWMMXt 12 283218822Sdim.#define bfd_mach_arm_iWMMXt2 13 28433965Sjdp. bfd_arch_ns32k, {* National Semiconductors ns32000 *} 28533965Sjdp. bfd_arch_w65, {* WDC 65816 *} 28638889Sjdp. bfd_arch_tic30, {* Texas Instruments TMS320C30 *} 287130561Sobrien. bfd_arch_tic4x, {* Texas Instruments TMS320C3X/4X *} 288130561Sobrien.#define bfd_mach_tic3x 30 289130561Sobrien.#define bfd_mach_tic4x 40 29077298Sobrien. bfd_arch_tic54x, {* Texas Instruments TMS320C54X *} 29160484Sobrien. bfd_arch_tic80, {* TI TMS320c80 (MVP) *} 29238889Sjdp. bfd_arch_v850, {* NEC V850 *} 293130561Sobrien.#define bfd_mach_v850 1 29460484Sobrien.#define bfd_mach_v850e 'E' 295130561Sobrien.#define bfd_mach_v850e1 '1' 29677298Sobrien. bfd_arch_arc, {* ARC Cores *} 297130561Sobrien.#define bfd_mach_arc_5 5 298130561Sobrien.#define bfd_mach_arc_6 6 299130561Sobrien.#define bfd_mach_arc_7 7 300130561Sobrien.#define bfd_mach_arc_8 8 301218822Sdim. bfd_arch_m32c, {* Renesas M16C/M32C. *} 302218822Sdim.#define bfd_mach_m16c 0x75 303218822Sdim.#define bfd_mach_m32c 0x78 304130561Sobrien. bfd_arch_m32r, {* Renesas M32R (formerly Mitsubishi M32R/D) *} 305130561Sobrien.#define bfd_mach_m32r 1 {* For backwards compatibility. *} 30660484Sobrien.#define bfd_mach_m32rx 'x' 307130561Sobrien.#define bfd_mach_m32r2 '2' 30833965Sjdp. bfd_arch_mn10200, {* Matsushita MN10200 *} 30933965Sjdp. bfd_arch_mn10300, {* Matsushita MN10300 *} 31060484Sobrien.#define bfd_mach_mn10300 300 31160484Sobrien.#define bfd_mach_am33 330 312130561Sobrien.#define bfd_mach_am33_2 332 31360484Sobrien. bfd_arch_fr30, 31460484Sobrien.#define bfd_mach_fr30 0x46523330 315104834Sobrien. bfd_arch_frv, 316130561Sobrien.#define bfd_mach_frv 1 317130561Sobrien.#define bfd_mach_frvsimple 2 318104834Sobrien.#define bfd_mach_fr300 300 319104834Sobrien.#define bfd_mach_fr400 400 320218822Sdim.#define bfd_mach_fr450 450 321104834Sobrien.#define bfd_mach_frvtomcat 499 {* fr500 prototype *} 322104834Sobrien.#define bfd_mach_fr500 500 323130561Sobrien.#define bfd_mach_fr550 550 32460484Sobrien. bfd_arch_mcore, 325218822Sdim. bfd_arch_mep, 326218822Sdim.#define bfd_mach_mep 1 327218822Sdim.#define bfd_mach_mep_h1 0x6831 32877298Sobrien. bfd_arch_ia64, {* HP/Intel ia64 *} 329130561Sobrien.#define bfd_mach_ia64_elf64 64 330130561Sobrien.#define bfd_mach_ia64_elf32 32 331130561Sobrien. bfd_arch_ip2k, {* Ubicom IP2K microcontrollers. *} 332130561Sobrien.#define bfd_mach_ip2022 1 333130561Sobrien.#define bfd_mach_ip2022ext 2 334130561Sobrien. bfd_arch_iq2000, {* Vitesse IQ2000. *} 335130561Sobrien.#define bfd_mach_iq2000 1 336130561Sobrien.#define bfd_mach_iq10 2 337218822Sdim. bfd_arch_mt, 338218822Sdim.#define bfd_mach_ms1 1 339218822Sdim.#define bfd_mach_mrisc2 2 340218822Sdim.#define bfd_mach_ms2 3 34160484Sobrien. bfd_arch_pj, 34291041Sobrien. bfd_arch_avr, {* Atmel AVR microcontrollers. *} 34360484Sobrien.#define bfd_mach_avr1 1 34460484Sobrien.#define bfd_mach_avr2 2 34560484Sobrien.#define bfd_mach_avr3 3 34660484Sobrien.#define bfd_mach_avr4 4 34777298Sobrien.#define bfd_mach_avr5 5 348218822Sdim.#define bfd_mach_avr6 6 349218822Sdim. bfd_arch_bfin, {* ADI Blackfin *} 350218822Sdim.#define bfd_mach_bfin 1 351218822Sdim. bfd_arch_cr16, {* National Semiconductor CompactRISC (ie CR16). *} 352218822Sdim.#define bfd_mach_cr16 1 353218822Sdim. bfd_arch_cr16c, {* National Semiconductor CompactRISC. *} 354218822Sdim.#define bfd_mach_cr16c 1 355218822Sdim. bfd_arch_crx, {* National Semiconductor CRX. *} 356218822Sdim.#define bfd_mach_crx 1 35777298Sobrien. bfd_arch_cris, {* Axis CRIS *} 358218822Sdim.#define bfd_mach_cris_v0_v10 255 359218822Sdim.#define bfd_mach_cris_v32 32 360218822Sdim.#define bfd_mach_cris_v10_v32 1032 36189857Sobrien. bfd_arch_s390, {* IBM s390 *} 362130561Sobrien.#define bfd_mach_s390_31 31 363130561Sobrien.#define bfd_mach_s390_64 64 364218822Sdim. bfd_arch_score, {* Sunplus score *} 36589857Sobrien. bfd_arch_openrisc, {* OpenRISC *} 36691041Sobrien. bfd_arch_mmix, {* Donald Knuth's educational processor. *} 36789857Sobrien. bfd_arch_xstormy16, 368130561Sobrien.#define bfd_mach_xstormy16 1 369130561Sobrien. bfd_arch_msp430, {* Texas Instruments MSP430 architecture. *} 370130561Sobrien.#define bfd_mach_msp11 11 371130561Sobrien.#define bfd_mach_msp110 110 372130561Sobrien.#define bfd_mach_msp12 12 373130561Sobrien.#define bfd_mach_msp13 13 374130561Sobrien.#define bfd_mach_msp14 14 375130561Sobrien.#define bfd_mach_msp15 15 376218822Sdim.#define bfd_mach_msp16 16 377218822Sdim.#define bfd_mach_msp21 21 378130561Sobrien.#define bfd_mach_msp31 31 379130561Sobrien.#define bfd_mach_msp32 32 380130561Sobrien.#define bfd_mach_msp33 33 381130561Sobrien.#define bfd_mach_msp41 41 382130561Sobrien.#define bfd_mach_msp42 42 383130561Sobrien.#define bfd_mach_msp43 43 384130561Sobrien.#define bfd_mach_msp44 44 385218822Sdim. bfd_arch_xc16x, {* Infineon's XC16X Series. *} 386218822Sdim.#define bfd_mach_xc16x 1 387218822Sdim.#define bfd_mach_xc16xl 2 388218822Sdim.#define bfd_mach_xc16xs 3 389130561Sobrien. bfd_arch_xtensa, {* Tensilica's Xtensa cores. *} 390130561Sobrien.#define bfd_mach_xtensa 1 391218822Sdim. bfd_arch_maxq, {* Dallas MAXQ 10/20 *} 392218822Sdim.#define bfd_mach_maxq10 10 393218822Sdim.#define bfd_mach_maxq20 20 394218822Sdim. bfd_arch_z80, 395218822Sdim.#define bfd_mach_z80strict 1 {* No undocumented opcodes. *} 396218822Sdim.#define bfd_mach_z80 3 {* With ixl, ixh, iyl, and iyh. *} 397218822Sdim.#define bfd_mach_z80full 7 {* All undocumented instructions. *} 398218822Sdim.#define bfd_mach_r800 11 {* R800: successor with multiplication. *} 39933965Sjdp. bfd_arch_last 40033965Sjdp. }; 40133965Sjdp*/ 40233965Sjdp 40333965Sjdp/* 40433965SjdpSUBSECTION 40533965Sjdp bfd_arch_info 40633965Sjdp 40733965SjdpDESCRIPTION 40833965Sjdp This structure contains information on architectures for use 40933965Sjdp within BFD. 41033965Sjdp 41133965Sjdp. 41277298Sobrien.typedef struct bfd_arch_info 41333965Sjdp.{ 41433965Sjdp. int bits_per_word; 41533965Sjdp. int bits_per_address; 41633965Sjdp. int bits_per_byte; 41733965Sjdp. enum bfd_architecture arch; 41833965Sjdp. unsigned long mach; 41933965Sjdp. const char *arch_name; 42033965Sjdp. const char *printable_name; 42133965Sjdp. unsigned int section_align_power; 422130561Sobrien. {* TRUE if this is the default machine for the architecture. 42399461Sobrien. The default arch should be the first entry for an arch so that 42499461Sobrien. all the entries for that arch can be accessed via <<next>>. *} 425130561Sobrien. bfd_boolean the_default; 42633965Sjdp. const struct bfd_arch_info * (*compatible) 427130561Sobrien. (const struct bfd_arch_info *a, const struct bfd_arch_info *b); 42833965Sjdp. 429130561Sobrien. bfd_boolean (*scan) (const struct bfd_arch_info *, const char *); 43033965Sjdp. 43133965Sjdp. const struct bfd_arch_info *next; 43291041Sobrien.} 43391041Sobrien.bfd_arch_info_type; 43491041Sobrien. 43533965Sjdp*/ 43633965Sjdp 43733965Sjdpextern const bfd_arch_info_type bfd_alpha_arch; 43838889Sjdpextern const bfd_arch_info_type bfd_arc_arch; 43933965Sjdpextern const bfd_arch_info_type bfd_arm_arch; 44091041Sobrienextern const bfd_arch_info_type bfd_avr_arch; 441218822Sdimextern const bfd_arch_info_type bfd_bfin_arch; 442218822Sdimextern const bfd_arch_info_type bfd_cr16_arch; 443218822Sdimextern const bfd_arch_info_type bfd_cr16c_arch; 44477298Sobrienextern const bfd_arch_info_type bfd_cris_arch; 445218822Sdimextern const bfd_arch_info_type bfd_crx_arch; 44633965Sjdpextern const bfd_arch_info_type bfd_d10v_arch; 44760484Sobrienextern const bfd_arch_info_type bfd_d30v_arch; 448104834Sobrienextern const bfd_arch_info_type bfd_dlx_arch; 44991041Sobrienextern const bfd_arch_info_type bfd_fr30_arch; 450104834Sobrienextern const bfd_arch_info_type bfd_frv_arch; 45133965Sjdpextern const bfd_arch_info_type bfd_h8300_arch; 45233965Sjdpextern const bfd_arch_info_type bfd_h8500_arch; 45333965Sjdpextern const bfd_arch_info_type bfd_hppa_arch; 45460484Sobrienextern const bfd_arch_info_type bfd_i370_arch; 45533965Sjdpextern const bfd_arch_info_type bfd_i386_arch; 45633965Sjdpextern const bfd_arch_info_type bfd_i860_arch; 45733965Sjdpextern const bfd_arch_info_type bfd_i960_arch; 45891041Sobrienextern const bfd_arch_info_type bfd_ia64_arch; 459130561Sobrienextern const bfd_arch_info_type bfd_ip2k_arch; 460130561Sobrienextern const bfd_arch_info_type bfd_iq2000_arch; 461218822Sdimextern const bfd_arch_info_type bfd_m32c_arch; 46233965Sjdpextern const bfd_arch_info_type bfd_m32r_arch; 46377298Sobrienextern const bfd_arch_info_type bfd_m68hc11_arch; 46477298Sobrienextern const bfd_arch_info_type bfd_m68hc12_arch; 46533965Sjdpextern const bfd_arch_info_type bfd_m68k_arch; 46633965Sjdpextern const bfd_arch_info_type bfd_m88k_arch; 467218822Sdimextern const bfd_arch_info_type bfd_maxq_arch; 46891041Sobrienextern const bfd_arch_info_type bfd_mcore_arch; 469218822Sdimextern const bfd_arch_info_type bfd_mep_arch; 47033965Sjdpextern const bfd_arch_info_type bfd_mips_arch; 47191041Sobrienextern const bfd_arch_info_type bfd_mmix_arch; 47233965Sjdpextern const bfd_arch_info_type bfd_mn10200_arch; 47333965Sjdpextern const bfd_arch_info_type bfd_mn10300_arch; 474130561Sobrienextern const bfd_arch_info_type bfd_msp430_arch; 475218822Sdimextern const bfd_arch_info_type bfd_mt_arch; 47691041Sobrienextern const bfd_arch_info_type bfd_ns32k_arch; 47791041Sobrienextern const bfd_arch_info_type bfd_openrisc_arch; 47891041Sobrienextern const bfd_arch_info_type bfd_or32_arch; 47989857Sobrienextern const bfd_arch_info_type bfd_pdp11_arch; 48091041Sobrienextern const bfd_arch_info_type bfd_pj_arch; 48191041Sobrienextern const bfd_arch_info_type bfd_powerpc_archs[]; 48291041Sobrien#define bfd_powerpc_arch bfd_powerpc_archs[0] 48333965Sjdpextern const bfd_arch_info_type bfd_rs6000_arch; 48491041Sobrienextern const bfd_arch_info_type bfd_s390_arch; 485218822Sdimextern const bfd_arch_info_type bfd_score_arch; 48633965Sjdpextern const bfd_arch_info_type bfd_sh_arch; 48733965Sjdpextern const bfd_arch_info_type bfd_sparc_arch; 488218822Sdimextern const bfd_arch_info_type bfd_spu_arch; 48938889Sjdpextern const bfd_arch_info_type bfd_tic30_arch; 490130561Sobrienextern const bfd_arch_info_type bfd_tic4x_arch; 49177298Sobrienextern const bfd_arch_info_type bfd_tic54x_arch; 49260484Sobrienextern const bfd_arch_info_type bfd_tic80_arch; 49391041Sobrienextern const bfd_arch_info_type bfd_v850_arch; 49433965Sjdpextern const bfd_arch_info_type bfd_vax_arch; 49533965Sjdpextern const bfd_arch_info_type bfd_we32k_arch; 49633965Sjdpextern const bfd_arch_info_type bfd_w65_arch; 49789857Sobrienextern const bfd_arch_info_type bfd_xstormy16_arch; 498130561Sobrienextern const bfd_arch_info_type bfd_xtensa_arch; 499218822Sdimextern const bfd_arch_info_type bfd_xc16x_arch; 500218822Sdimextern const bfd_arch_info_type bfd_z80_arch; 50191041Sobrienextern const bfd_arch_info_type bfd_z8k_arch; 50233965Sjdp 50391041Sobrienstatic const bfd_arch_info_type * const bfd_archures_list[] = 50491041Sobrien { 50533965Sjdp#ifdef SELECT_ARCHITECTURES 50691041Sobrien SELECT_ARCHITECTURES, 50733965Sjdp#else 50891041Sobrien &bfd_alpha_arch, 50991041Sobrien &bfd_arc_arch, 51091041Sobrien &bfd_arm_arch, 51191041Sobrien &bfd_avr_arch, 512218822Sdim &bfd_bfin_arch, 513218822Sdim &bfd_cr16_arch, 514218822Sdim &bfd_cr16c_arch, 51591041Sobrien &bfd_cris_arch, 516218822Sdim &bfd_crx_arch, 51791041Sobrien &bfd_d10v_arch, 51891041Sobrien &bfd_d30v_arch, 519104834Sobrien &bfd_dlx_arch, 52091041Sobrien &bfd_fr30_arch, 521104834Sobrien &bfd_frv_arch, 52291041Sobrien &bfd_h8300_arch, 52391041Sobrien &bfd_h8500_arch, 52491041Sobrien &bfd_hppa_arch, 52591041Sobrien &bfd_i370_arch, 52691041Sobrien &bfd_i386_arch, 52791041Sobrien &bfd_i860_arch, 52891041Sobrien &bfd_i960_arch, 52991041Sobrien &bfd_ia64_arch, 530130561Sobrien &bfd_ip2k_arch, 531130561Sobrien &bfd_iq2000_arch, 532218822Sdim &bfd_m32c_arch, 53391041Sobrien &bfd_m32r_arch, 53491041Sobrien &bfd_m68hc11_arch, 53591041Sobrien &bfd_m68hc12_arch, 53691041Sobrien &bfd_m68k_arch, 53791041Sobrien &bfd_m88k_arch, 538218822Sdim &bfd_maxq_arch, 53991041Sobrien &bfd_mcore_arch, 540218822Sdim &bfd_mep_arch, 54191041Sobrien &bfd_mips_arch, 54291041Sobrien &bfd_mmix_arch, 54391041Sobrien &bfd_mn10200_arch, 54491041Sobrien &bfd_mn10300_arch, 545218822Sdim &bfd_mt_arch, 546130561Sobrien &bfd_msp430_arch, 54791041Sobrien &bfd_ns32k_arch, 54891041Sobrien &bfd_openrisc_arch, 54991041Sobrien &bfd_or32_arch, 55091041Sobrien &bfd_pdp11_arch, 55191041Sobrien &bfd_powerpc_arch, 55291041Sobrien &bfd_rs6000_arch, 55391041Sobrien &bfd_s390_arch, 554218822Sdim &bfd_score_arch, 55591041Sobrien &bfd_sh_arch, 55691041Sobrien &bfd_sparc_arch, 557218822Sdim &bfd_spu_arch, 55891041Sobrien &bfd_tic30_arch, 559130561Sobrien &bfd_tic4x_arch, 56091041Sobrien &bfd_tic54x_arch, 56191041Sobrien &bfd_tic80_arch, 56291041Sobrien &bfd_v850_arch, 56391041Sobrien &bfd_vax_arch, 56491041Sobrien &bfd_w65_arch, 56591041Sobrien &bfd_we32k_arch, 56691041Sobrien &bfd_xstormy16_arch, 567130561Sobrien &bfd_xtensa_arch, 568218822Sdim &bfd_xc16x_arch, 569218822Sdim &bfd_z80_arch, 57091041Sobrien &bfd_z8k_arch, 57133965Sjdp#endif 57233965Sjdp 0 57333965Sjdp}; 57433965Sjdp 57533965Sjdp/* 57633965SjdpFUNCTION 57733965Sjdp bfd_printable_name 57833965Sjdp 57933965SjdpSYNOPSIS 580130561Sobrien const char *bfd_printable_name (bfd *abfd); 58133965Sjdp 58233965SjdpDESCRIPTION 58333965Sjdp Return a printable string representing the architecture and machine 58433965Sjdp from the pointer to the architecture info structure. 58533965Sjdp 58633965Sjdp*/ 58733965Sjdp 58833965Sjdpconst char * 589130561Sobrienbfd_printable_name (bfd *abfd) 59033965Sjdp{ 59133965Sjdp return abfd->arch_info->printable_name; 59233965Sjdp} 59333965Sjdp 59433965Sjdp/* 59533965SjdpFUNCTION 59633965Sjdp bfd_scan_arch 59733965Sjdp 59833965SjdpSYNOPSIS 599130561Sobrien const bfd_arch_info_type *bfd_scan_arch (const char *string); 60033965Sjdp 60133965SjdpDESCRIPTION 60233965Sjdp Figure out if BFD supports any cpu which could be described with 60333965Sjdp the name @var{string}. Return a pointer to an <<arch_info>> 60433965Sjdp structure if a machine is found, otherwise NULL. 60533965Sjdp*/ 60633965Sjdp 60733965Sjdpconst bfd_arch_info_type * 608130561Sobrienbfd_scan_arch (const char *string) 60933965Sjdp{ 61033965Sjdp const bfd_arch_info_type * const *app, *ap; 61133965Sjdp 61277298Sobrien /* Look through all the installed architectures. */ 61333965Sjdp for (app = bfd_archures_list; *app != NULL; app++) 61433965Sjdp { 61533965Sjdp for (ap = *app; ap != NULL; ap = ap->next) 61633965Sjdp { 61733965Sjdp if (ap->scan (ap, string)) 61833965Sjdp return ap; 61933965Sjdp } 62033965Sjdp } 62133965Sjdp 62233965Sjdp return NULL; 62333965Sjdp} 62433965Sjdp 62533965Sjdp/* 62633965SjdpFUNCTION 62738889Sjdp bfd_arch_list 62838889Sjdp 62938889SjdpSYNOPSIS 630130561Sobrien const char **bfd_arch_list (void); 63138889Sjdp 63238889SjdpDESCRIPTION 63338889Sjdp Return a freshly malloced NULL-terminated vector of the names 63438889Sjdp of all the valid BFD architectures. Do not modify the names. 63538889Sjdp*/ 63638889Sjdp 63738889Sjdpconst char ** 638130561Sobrienbfd_arch_list (void) 63938889Sjdp{ 64038889Sjdp int vec_length = 0; 64138889Sjdp const char **name_ptr; 64238889Sjdp const char **name_list; 64338889Sjdp const bfd_arch_info_type * const *app; 64489857Sobrien bfd_size_type amt; 64538889Sjdp 64677298Sobrien /* Determine the number of architectures. */ 64738889Sjdp vec_length = 0; 64838889Sjdp for (app = bfd_archures_list; *app != NULL; app++) 64938889Sjdp { 65038889Sjdp const bfd_arch_info_type *ap; 65138889Sjdp for (ap = *app; ap != NULL; ap = ap->next) 65238889Sjdp { 65338889Sjdp vec_length++; 65438889Sjdp } 65538889Sjdp } 65638889Sjdp 65789857Sobrien amt = (vec_length + 1) * sizeof (char **); 658130561Sobrien name_list = bfd_malloc (amt); 65938889Sjdp if (name_list == NULL) 66038889Sjdp return NULL; 66138889Sjdp 66277298Sobrien /* Point the list at each of the names. */ 66338889Sjdp name_ptr = name_list; 66438889Sjdp for (app = bfd_archures_list; *app != NULL; app++) 66538889Sjdp { 66638889Sjdp const bfd_arch_info_type *ap; 66738889Sjdp for (ap = *app; ap != NULL; ap = ap->next) 66838889Sjdp { 66938889Sjdp *name_ptr = ap->printable_name; 67038889Sjdp name_ptr++; 67138889Sjdp } 67238889Sjdp } 67338889Sjdp *name_ptr = NULL; 67438889Sjdp 67538889Sjdp return name_list; 67638889Sjdp} 67738889Sjdp 67838889Sjdp/* 67938889SjdpFUNCTION 68033965Sjdp bfd_arch_get_compatible 68133965Sjdp 68233965SjdpSYNOPSIS 683130561Sobrien const bfd_arch_info_type *bfd_arch_get_compatible 684130561Sobrien (const bfd *abfd, const bfd *bbfd, bfd_boolean accept_unknowns); 68533965Sjdp 68633965SjdpDESCRIPTION 687130561Sobrien Determine whether two BFDs' architectures and machine types 688130561Sobrien are compatible. Calculates the lowest common denominator 689130561Sobrien between the two architectures and machine types implied by 690130561Sobrien the BFDs and returns a pointer to an <<arch_info>> structure 691130561Sobrien describing the compatible machine. 69233965Sjdp*/ 69333965Sjdp 69433965Sjdpconst bfd_arch_info_type * 695130561Sobrienbfd_arch_get_compatible (const bfd *abfd, 696130561Sobrien const bfd *bbfd, 697130561Sobrien bfd_boolean accept_unknowns) 69833965Sjdp{ 699130561Sobrien const bfd * ubfd = NULL; 70033965Sjdp 701130561Sobrien /* Look for an unknown architecture. */ 702130561Sobrien if (((ubfd = abfd) && ubfd->arch_info->arch == bfd_arch_unknown) 703130561Sobrien || ((ubfd = bbfd) && ubfd->arch_info->arch == bfd_arch_unknown)) 704130561Sobrien { 705130561Sobrien /* We can allow an unknown architecture if accept_unknowns 706130561Sobrien is true, or if the target is the "binary" format, which 707130561Sobrien has an unknown architecture. Since the binary format can 708130561Sobrien only be set by explicit request from the user, it is safe 709130561Sobrien to assume that they know what they are doing. */ 710130561Sobrien if (accept_unknowns 711130561Sobrien || strcmp (bfd_get_target (ubfd), "binary") == 0) 712130561Sobrien return ubfd->arch_info; 713130561Sobrien return NULL; 714130561Sobrien } 715130561Sobrien 71633965Sjdp /* Otherwise architecture-specific code has to decide. */ 71733965Sjdp return abfd->arch_info->compatible (abfd->arch_info, bbfd->arch_info); 71833965Sjdp} 71933965Sjdp 72033965Sjdp/* 72133965SjdpINTERNAL_DEFINITION 72233965Sjdp bfd_default_arch_struct 72333965Sjdp 72433965SjdpDESCRIPTION 72533965Sjdp The <<bfd_default_arch_struct>> is an item of 72633965Sjdp <<bfd_arch_info_type>> which has been initialized to a fairly 72733965Sjdp generic state. A BFD starts life by pointing to this 72833965Sjdp structure, until the correct back end has determined the real 72933965Sjdp architecture of the file. 73033965Sjdp 73133965Sjdp.extern const bfd_arch_info_type bfd_default_arch_struct; 73233965Sjdp*/ 73333965Sjdp 73477298Sobrienconst bfd_arch_info_type bfd_default_arch_struct = { 735130561Sobrien 32, 32, 8, bfd_arch_unknown, 0, "unknown", "unknown", 2, TRUE, 73677298Sobrien bfd_default_compatible, 73777298Sobrien bfd_default_scan, 73877298Sobrien 0, 73933965Sjdp}; 74033965Sjdp 74133965Sjdp/* 74233965SjdpFUNCTION 74333965Sjdp bfd_set_arch_info 74433965Sjdp 74533965SjdpSYNOPSIS 746130561Sobrien void bfd_set_arch_info (bfd *abfd, const bfd_arch_info_type *arg); 74733965Sjdp 74833965SjdpDESCRIPTION 74933965Sjdp Set the architecture info of @var{abfd} to @var{arg}. 75033965Sjdp*/ 75133965Sjdp 75233965Sjdpvoid 753130561Sobrienbfd_set_arch_info (bfd *abfd, const bfd_arch_info_type *arg) 75433965Sjdp{ 75533965Sjdp abfd->arch_info = arg; 75633965Sjdp} 75733965Sjdp 75833965Sjdp/* 75933965SjdpINTERNAL_FUNCTION 76033965Sjdp bfd_default_set_arch_mach 76133965Sjdp 76233965SjdpSYNOPSIS 763130561Sobrien bfd_boolean bfd_default_set_arch_mach 764130561Sobrien (bfd *abfd, enum bfd_architecture arch, unsigned long mach); 76533965Sjdp 76633965SjdpDESCRIPTION 76733965Sjdp Set the architecture and machine type in BFD @var{abfd} 76833965Sjdp to @var{arch} and @var{mach}. Find the correct 76933965Sjdp pointer to a structure and insert it into the <<arch_info>> 77077298Sobrien pointer. 77133965Sjdp*/ 77233965Sjdp 773130561Sobrienbfd_boolean 774130561Sobrienbfd_default_set_arch_mach (bfd *abfd, 775130561Sobrien enum bfd_architecture arch, 776130561Sobrien unsigned long mach) 77733965Sjdp{ 77899461Sobrien abfd->arch_info = bfd_lookup_arch (arch, mach); 77999461Sobrien if (abfd->arch_info != NULL) 780130561Sobrien return TRUE; 78133965Sjdp 78233965Sjdp abfd->arch_info = &bfd_default_arch_struct; 78333965Sjdp bfd_set_error (bfd_error_bad_value); 784130561Sobrien return FALSE; 78533965Sjdp} 78633965Sjdp 78733965Sjdp/* 78833965SjdpFUNCTION 78933965Sjdp bfd_get_arch 79033965Sjdp 79133965SjdpSYNOPSIS 792130561Sobrien enum bfd_architecture bfd_get_arch (bfd *abfd); 79333965Sjdp 79433965SjdpDESCRIPTION 79533965Sjdp Return the enumerated type which describes the BFD @var{abfd}'s 79633965Sjdp architecture. 79733965Sjdp*/ 79833965Sjdp 79933965Sjdpenum bfd_architecture 800130561Sobrienbfd_get_arch (bfd *abfd) 80133965Sjdp{ 80277298Sobrien return abfd->arch_info->arch; 80333965Sjdp} 80433965Sjdp 80533965Sjdp/* 80633965SjdpFUNCTION 80733965Sjdp bfd_get_mach 80833965Sjdp 80933965SjdpSYNOPSIS 810130561Sobrien unsigned long bfd_get_mach (bfd *abfd); 81133965Sjdp 81233965SjdpDESCRIPTION 81333965Sjdp Return the long type which describes the BFD @var{abfd}'s 81433965Sjdp machine. 81533965Sjdp*/ 81633965Sjdp 81777298Sobrienunsigned long 818130561Sobrienbfd_get_mach (bfd *abfd) 81933965Sjdp{ 82077298Sobrien return abfd->arch_info->mach; 82133965Sjdp} 82233965Sjdp 82333965Sjdp/* 82433965SjdpFUNCTION 82533965Sjdp bfd_arch_bits_per_byte 82633965Sjdp 82733965SjdpSYNOPSIS 828130561Sobrien unsigned int bfd_arch_bits_per_byte (bfd *abfd); 82933965Sjdp 83033965SjdpDESCRIPTION 83133965Sjdp Return the number of bits in one of the BFD @var{abfd}'s 83233965Sjdp architecture's bytes. 83333965Sjdp*/ 83433965Sjdp 83533965Sjdpunsigned int 836130561Sobrienbfd_arch_bits_per_byte (bfd *abfd) 83733965Sjdp{ 83833965Sjdp return abfd->arch_info->bits_per_byte; 83933965Sjdp} 84033965Sjdp 84133965Sjdp/* 84233965SjdpFUNCTION 84333965Sjdp bfd_arch_bits_per_address 84433965Sjdp 84533965SjdpSYNOPSIS 846130561Sobrien unsigned int bfd_arch_bits_per_address (bfd *abfd); 84733965Sjdp 84833965SjdpDESCRIPTION 84933965Sjdp Return the number of bits in one of the BFD @var{abfd}'s 85033965Sjdp architecture's addresses. 85133965Sjdp*/ 85233965Sjdp 85333965Sjdpunsigned int 854130561Sobrienbfd_arch_bits_per_address (bfd *abfd) 85533965Sjdp{ 85633965Sjdp return abfd->arch_info->bits_per_address; 85733965Sjdp} 85833965Sjdp 85933965Sjdp/* 86077298SobrienINTERNAL_FUNCTION 86133965Sjdp bfd_default_compatible 86233965Sjdp 86333965SjdpSYNOPSIS 86433965Sjdp const bfd_arch_info_type *bfd_default_compatible 865130561Sobrien (const bfd_arch_info_type *a, const bfd_arch_info_type *b); 86633965Sjdp 86733965SjdpDESCRIPTION 86833965Sjdp The default function for testing for compatibility. 86933965Sjdp*/ 87033965Sjdp 87133965Sjdpconst bfd_arch_info_type * 872130561Sobrienbfd_default_compatible (const bfd_arch_info_type *a, 873130561Sobrien const bfd_arch_info_type *b) 87433965Sjdp{ 87533965Sjdp if (a->arch != b->arch) 87633965Sjdp return NULL; 87733965Sjdp 87894536Sobrien if (a->bits_per_word != b->bits_per_word) 87994536Sobrien return NULL; 88094536Sobrien 88133965Sjdp if (a->mach > b->mach) 88233965Sjdp return a; 88333965Sjdp 88433965Sjdp if (b->mach > a->mach) 88533965Sjdp return b; 88633965Sjdp 88733965Sjdp return a; 88833965Sjdp} 88933965Sjdp 89033965Sjdp/* 89133965SjdpINTERNAL_FUNCTION 89233965Sjdp bfd_default_scan 89333965Sjdp 89433965SjdpSYNOPSIS 895130561Sobrien bfd_boolean bfd_default_scan 896130561Sobrien (const struct bfd_arch_info *info, const char *string); 89733965Sjdp 89833965SjdpDESCRIPTION 89933965Sjdp The default function for working out whether this is an 90033965Sjdp architecture hit and a machine hit. 90133965Sjdp*/ 90233965Sjdp 903130561Sobrienbfd_boolean 904130561Sobrienbfd_default_scan (const bfd_arch_info_type *info, const char *string) 90533965Sjdp{ 90633965Sjdp const char *ptr_src; 90733965Sjdp const char *ptr_tst; 90833965Sjdp unsigned long number; 90933965Sjdp enum bfd_architecture arch; 91038889Sjdp const char *printable_name_colon; 91133965Sjdp 91238889Sjdp /* Exact match of the architecture name (ARCH_NAME) and also the 91377298Sobrien default architecture? */ 91438889Sjdp if (strcasecmp (string, info->arch_name) == 0 91538889Sjdp && info->the_default) 916130561Sobrien return TRUE; 91733965Sjdp 91877298Sobrien /* Exact match of the machine name (PRINTABLE_NAME)? */ 91938889Sjdp if (strcasecmp (string, info->printable_name) == 0) 920130561Sobrien return TRUE; 92177298Sobrien 92238889Sjdp /* Given that printable_name contains no colon, attempt to match: 92377298Sobrien ARCH_NAME [ ":" ] PRINTABLE_NAME? */ 92438889Sjdp printable_name_colon = strchr (info->printable_name, ':'); 92538889Sjdp if (printable_name_colon == NULL) 92638889Sjdp { 92789857Sobrien size_t strlen_arch_name = strlen (info->arch_name); 92838889Sjdp if (strncasecmp (string, info->arch_name, strlen_arch_name) == 0) 92938889Sjdp { 93038889Sjdp if (string[strlen_arch_name] == ':') 93138889Sjdp { 93238889Sjdp if (strcasecmp (string + strlen_arch_name + 1, 93338889Sjdp info->printable_name) == 0) 934130561Sobrien return TRUE; 93538889Sjdp } 93638889Sjdp else 93738889Sjdp { 93838889Sjdp if (strcasecmp (string + strlen_arch_name, 93938889Sjdp info->printable_name) == 0) 940130561Sobrien return TRUE; 94138889Sjdp } 94238889Sjdp } 94338889Sjdp } 94438889Sjdp 94538889Sjdp /* Given that PRINTABLE_NAME has the form: <arch> ":" <mach>; 94677298Sobrien Attempt to match: <arch> <mach>? */ 94738889Sjdp if (printable_name_colon != NULL) 94838889Sjdp { 94989857Sobrien size_t colon_index = printable_name_colon - info->printable_name; 95038889Sjdp if (strncasecmp (string, info->printable_name, colon_index) == 0 95138889Sjdp && strcasecmp (string + colon_index, 95238889Sjdp info->printable_name + colon_index + 1) == 0) 953130561Sobrien return TRUE; 95438889Sjdp } 95538889Sjdp 95638889Sjdp /* Given that PRINTABLE_NAME has the form: <arch> ":" <mach>; Do not 957130561Sobrien attempt to match just <mach>, it could be ambiguous. This test 95877298Sobrien is left until later. */ 95938889Sjdp 96077298Sobrien /* NOTE: The below is retained for compatibility only. Please do 96177298Sobrien not add to this code. */ 96238889Sjdp 96333965Sjdp /* See how much of the supplied string matches with the 96433965Sjdp architecture, eg the string m68k:68020 would match the 68k entry 96577298Sobrien up to the :, then we get left with the machine number. */ 96633965Sjdp 96777298Sobrien for (ptr_src = string, ptr_tst = info->arch_name; 96833965Sjdp *ptr_src && *ptr_tst; 96977298Sobrien ptr_src++, ptr_tst++) 97033965Sjdp { 97177298Sobrien if (*ptr_src != *ptr_tst) 97277298Sobrien break; 97333965Sjdp } 97433965Sjdp 97533965Sjdp /* Chewed up as much of the architecture as will match, skip any 97677298Sobrien colons. */ 97733965Sjdp if (*ptr_src == ':') 97833965Sjdp ptr_src++; 97977298Sobrien 98033965Sjdp if (*ptr_src == 0) 98133965Sjdp { 98277298Sobrien /* Nothing more, then only keep this one if it is the default 98377298Sobrien machine for this architecture. */ 98433965Sjdp return info->the_default; 98533965Sjdp } 98633965Sjdp 98733965Sjdp number = 0; 98889857Sobrien while (ISDIGIT (*ptr_src)) 98933965Sjdp { 99077298Sobrien number = number * 10 + *ptr_src - '0'; 99133965Sjdp ptr_src++; 99233965Sjdp } 99333965Sjdp 99438889Sjdp /* NOTE: The below is retained for compatibility only. 99577298Sobrien PLEASE DO NOT ADD TO THIS CODE. */ 99638889Sjdp 99777298Sobrien switch (number) 99833965Sjdp { 99938889Sjdp /* FIXME: These are needed to parse IEEE objects. */ 100077298Sobrien /* The following seven case's are here only for compatibility with 100177298Sobrien older binutils (at least IEEE objects from binutils 2.9.1 require 100277298Sobrien them). */ 100377298Sobrien case bfd_mach_m68000: 100477298Sobrien case bfd_mach_m68010: 100577298Sobrien case bfd_mach_m68020: 100677298Sobrien case bfd_mach_m68030: 100777298Sobrien case bfd_mach_m68040: 100877298Sobrien case bfd_mach_m68060: 100977298Sobrien case bfd_mach_cpu32: 101038889Sjdp arch = bfd_arch_m68k; 101177298Sobrien break; 101277298Sobrien case 68000: 101377298Sobrien arch = bfd_arch_m68k; 101438889Sjdp number = bfd_mach_m68000; 101533965Sjdp break; 101638889Sjdp case 68010: 101738889Sjdp arch = bfd_arch_m68k; 101838889Sjdp number = bfd_mach_m68010; 101933965Sjdp break; 102038889Sjdp case 68020: 102138889Sjdp arch = bfd_arch_m68k; 102238889Sjdp number = bfd_mach_m68020; 102333965Sjdp break; 102433965Sjdp case 68030: 102538889Sjdp arch = bfd_arch_m68k; 102638889Sjdp number = bfd_mach_m68030; 102738889Sjdp break; 102833965Sjdp case 68040: 102938889Sjdp arch = bfd_arch_m68k; 103038889Sjdp number = bfd_mach_m68040; 103138889Sjdp break; 103260484Sobrien case 68060: 103360484Sobrien arch = bfd_arch_m68k; 103460484Sobrien number = bfd_mach_m68060; 103560484Sobrien break; 103633965Sjdp case 68332: 103738889Sjdp arch = bfd_arch_m68k; 103860484Sobrien number = bfd_mach_cpu32; 103933965Sjdp break; 104078828Sobrien case 5200: 104178828Sobrien arch = bfd_arch_m68k; 1042218822Sdim number = bfd_mach_mcf_isa_a_nodiv; 104378828Sobrien break; 104478828Sobrien case 5206: 104578828Sobrien arch = bfd_arch_m68k; 1046218822Sdim number = bfd_mach_mcf_isa_a_mac; 104778828Sobrien break; 104878828Sobrien case 5307: 104978828Sobrien arch = bfd_arch_m68k; 1050218822Sdim number = bfd_mach_mcf_isa_a_mac; 105178828Sobrien break; 105278828Sobrien case 5407: 105378828Sobrien arch = bfd_arch_m68k; 1054218822Sdim number = bfd_mach_mcf_isa_b_nousp_mac; 105578828Sobrien break; 1056130561Sobrien case 5282: 1057130561Sobrien arch = bfd_arch_m68k; 1058218822Sdim number = bfd_mach_mcf_isa_aplus_emac; 1059130561Sobrien break; 106033965Sjdp 106133965Sjdp case 32000: 106233965Sjdp arch = bfd_arch_we32k; 106333965Sjdp break; 106433965Sjdp 106538889Sjdp case 3000: 106638889Sjdp arch = bfd_arch_mips; 106738889Sjdp number = bfd_mach_mips3000; 106833965Sjdp break; 106933965Sjdp 107033965Sjdp case 4000: 107133965Sjdp arch = bfd_arch_mips; 107238889Sjdp number = bfd_mach_mips4000; 107333965Sjdp break; 107433965Sjdp 107533965Sjdp case 6000: 107633965Sjdp arch = bfd_arch_rs6000; 107733965Sjdp break; 107833965Sjdp 107960484Sobrien case 7410: 108060484Sobrien arch = bfd_arch_sh; 108160484Sobrien number = bfd_mach_sh_dsp; 108260484Sobrien break; 108360484Sobrien 108460484Sobrien case 7708: 108560484Sobrien arch = bfd_arch_sh; 108660484Sobrien number = bfd_mach_sh3; 108760484Sobrien break; 108860484Sobrien 108960484Sobrien case 7729: 109060484Sobrien arch = bfd_arch_sh; 109160484Sobrien number = bfd_mach_sh3_dsp; 109260484Sobrien break; 109360484Sobrien 109460484Sobrien case 7750: 109560484Sobrien arch = bfd_arch_sh; 109660484Sobrien number = bfd_mach_sh4; 109760484Sobrien break; 109860484Sobrien 109977298Sobrien default: 1100130561Sobrien return FALSE; 110133965Sjdp } 110233965Sjdp 110377298Sobrien if (arch != info->arch) 1104130561Sobrien return FALSE; 110533965Sjdp 110633965Sjdp if (number != info->mach) 1107130561Sobrien return FALSE; 110833965Sjdp 1109130561Sobrien return TRUE; 111033965Sjdp} 111133965Sjdp 111233965Sjdp/* 111333965SjdpFUNCTION 111433965Sjdp bfd_get_arch_info 111533965Sjdp 111633965SjdpSYNOPSIS 1117130561Sobrien const bfd_arch_info_type *bfd_get_arch_info (bfd *abfd); 111833965Sjdp 111933965SjdpDESCRIPTION 112033965Sjdp Return the architecture info struct in @var{abfd}. 112133965Sjdp*/ 112233965Sjdp 112333965Sjdpconst bfd_arch_info_type * 1124130561Sobrienbfd_get_arch_info (bfd *abfd) 112533965Sjdp{ 112633965Sjdp return abfd->arch_info; 112733965Sjdp} 112833965Sjdp 112933965Sjdp/* 113033965SjdpFUNCTION 113133965Sjdp bfd_lookup_arch 113233965Sjdp 113333965SjdpSYNOPSIS 113433965Sjdp const bfd_arch_info_type *bfd_lookup_arch 1135130561Sobrien (enum bfd_architecture arch, unsigned long machine); 113633965Sjdp 113733965SjdpDESCRIPTION 1138130561Sobrien Look for the architecture info structure which matches the 113933965Sjdp arguments @var{arch} and @var{machine}. A machine of 0 matches the 114033965Sjdp machine/architecture structure which marks itself as the 114133965Sjdp default. 114233965Sjdp*/ 114333965Sjdp 114477298Sobrienconst bfd_arch_info_type * 1145130561Sobrienbfd_lookup_arch (enum bfd_architecture arch, unsigned long machine) 114633965Sjdp{ 114733965Sjdp const bfd_arch_info_type * const *app, *ap; 114833965Sjdp 114933965Sjdp for (app = bfd_archures_list; *app != NULL; app++) 115033965Sjdp { 115133965Sjdp for (ap = *app; ap != NULL; ap = ap->next) 115233965Sjdp { 115333965Sjdp if (ap->arch == arch 115433965Sjdp && (ap->mach == machine 115533965Sjdp || (machine == 0 && ap->the_default))) 115633965Sjdp return ap; 115733965Sjdp } 115833965Sjdp } 115933965Sjdp 116033965Sjdp return NULL; 116133965Sjdp} 116233965Sjdp 116333965Sjdp/* 116433965SjdpFUNCTION 116533965Sjdp bfd_printable_arch_mach 116633965Sjdp 116733965SjdpSYNOPSIS 116833965Sjdp const char *bfd_printable_arch_mach 1169130561Sobrien (enum bfd_architecture arch, unsigned long machine); 117033965Sjdp 117133965SjdpDESCRIPTION 117233965Sjdp Return a printable string representing the architecture and 117377298Sobrien machine type. 117433965Sjdp 117533965Sjdp This routine is depreciated. 117633965Sjdp*/ 117733965Sjdp 117833965Sjdpconst char * 1179130561Sobrienbfd_printable_arch_mach (enum bfd_architecture arch, unsigned long machine) 118033965Sjdp{ 118177298Sobrien const bfd_arch_info_type *ap = bfd_lookup_arch (arch, machine); 118233965Sjdp 118377298Sobrien if (ap) 118477298Sobrien return ap->printable_name; 118577298Sobrien return "UNKNOWN!"; 118633965Sjdp} 118760484Sobrien 118860484Sobrien/* 118960484SobrienFUNCTION 119060484Sobrien bfd_octets_per_byte 119160484Sobrien 119260484SobrienSYNOPSIS 1193130561Sobrien unsigned int bfd_octets_per_byte (bfd *abfd); 119460484Sobrien 119560484SobrienDESCRIPTION 119660484Sobrien Return the number of octets (8-bit quantities) per target byte 119760484Sobrien (minimum addressable unit). In most cases, this will be one, but some 119860484Sobrien DSP targets have 16, 32, or even 48 bits per byte. 119960484Sobrien*/ 120060484Sobrien 120160484Sobrienunsigned int 1202130561Sobrienbfd_octets_per_byte (bfd *abfd) 120360484Sobrien{ 120477298Sobrien return bfd_arch_mach_octets_per_byte (bfd_get_arch (abfd), 120577298Sobrien bfd_get_mach (abfd)); 120660484Sobrien} 120760484Sobrien 120860484Sobrien/* 120960484SobrienFUNCTION 121060484Sobrien bfd_arch_mach_octets_per_byte 121160484Sobrien 121260484SobrienSYNOPSIS 1213130561Sobrien unsigned int bfd_arch_mach_octets_per_byte 1214130561Sobrien (enum bfd_architecture arch, unsigned long machine); 121560484Sobrien 121660484SobrienDESCRIPTION 121760484Sobrien See bfd_octets_per_byte. 121877298Sobrien 121960484Sobrien This routine is provided for those cases where a bfd * is not 122060484Sobrien available 122160484Sobrien*/ 122260484Sobrien 122360484Sobrienunsigned int 1224130561Sobrienbfd_arch_mach_octets_per_byte (enum bfd_architecture arch, 1225130561Sobrien unsigned long mach) 122660484Sobrien{ 122777298Sobrien const bfd_arch_info_type *ap = bfd_lookup_arch (arch, mach); 122877298Sobrien 122977298Sobrien if (ap) 123077298Sobrien return ap->bits_per_byte / 8; 123177298Sobrien return 1; 123260484Sobrien} 1233