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