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