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