* gdb.texinfo: Add some credits, mention bug monitor.
[deliverable/binutils-gdb.git] / bfd / archures.c
CommitLineData
c618de01 1/* BFD library support routines for architectures.
36df40e0 2 Copyright (C) 1990, 91-97, 1998 Free Software Foundation, Inc.
4e6f9223
SC
3 Hacked by John Gilmore and Steve Chamberlain of Cygnus Support.
4
c618de01 5This file is part of BFD, the Binary File Descriptor library.
4a81b561 6
c618de01 7This program is free software; you can redistribute it and/or modify
4a81b561 8it under the terms of the GNU General Public License as published by
c618de01
SC
9the Free Software Foundation; either version 2 of the License, or
10(at your option) any later version.
4a81b561 11
c618de01 12This program is distributed in the hope that it will be useful,
4a81b561
DHW
13but WITHOUT ANY WARRANTY; without even the implied warranty of
14MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15GNU General Public License for more details.
16
17You should have received a copy of the GNU General Public License
c618de01 18along with this program; if not, write to the Free Software
b7577823 19Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */
c618de01 20
5bc513b4
DE
21#include "bfd.h"
22#include "sysdep.h"
23#include "libbfd.h"
24#include <ctype.h>
25
9fda1a39 26/*
4e6f9223 27
9fda1a39
SC
28SECTION
29 Architectures
30
c188b0be
DM
31 BFD keeps one atom in a BFD describing the
32 architecture of the data attached to the BFD: a pointer to a
9fda1a39
SC
33 <<bfd_arch_info_type>>.
34
c188b0be 35 Pointers to structures can be requested independently of a BFD
9fda1a39 36 so that an architecture's information can be interrogated
c188b0be 37 without access to an open BFD.
9fda1a39 38
c188b0be
DM
39 The architecture information is provided by each architecture package.
40 The set of default architectures is selected by the macro
9fda1a39 41 <<SELECT_ARCHITECTURES>>. This is normally set up in the
d94aca1a 42 @file{config/@var{target}.mt} file of your choice. If the name is not
9fda1a39
SC
43 defined, then all the architectures supported are included.
44
45 When BFD starts up, all the architectures are called with an
46 initialize method. It is up to the architecture back end to
71c0bae0 47 insert as many items into the list of architectures as it wants to;
9fda1a39
SC
48 generally this would be one for each machine and one for the
49 default case (an item with a machine field of 0).
c188b0be 50
d94aca1a 51 BFD's idea of an architecture is implemented in @file{archures.c}.
c618de01
SC
52*/
53
9fda1a39
SC
54/*
55
56SUBSECTION
57 bfd_architecture
58
59DESCRIPTION
60 This enum gives the object file's CPU architecture, in a
c188b0be
DM
61 global sense---i.e., what processor family does it belong to?
62 Another field indicates which processor within
9fda1a39 63 the family is in use. The machine gives a number which
c188b0be
DM
64 distinguishes different versions of the architecture,
65 containing, for example, 2 and 3 for Intel i960 KA and i960 KB,
9fda1a39
SC
66 and 68020 and 68030 for Motorola 68020 and 68030.
67
68.enum bfd_architecture
69.{
70. bfd_arch_unknown, {* File arch not known *}
71. bfd_arch_obscure, {* Arch known, not one of these *}
72. bfd_arch_m68k, {* Motorola 68xxx *}
73. bfd_arch_vax, {* DEC Vax *}
74. bfd_arch_i960, {* Intel 960 *}
75. {* The order of the following is important.
76. lower number indicates a machine type that
77. only accepts a subset of the instructions
78. available to machines with higher numbers.
79. The exception is the "ca", which is
80. incompatible with all other machines except
81. "core". *}
82.
83.#define bfd_mach_i960_core 1
84.#define bfd_mach_i960_ka_sa 2
85.#define bfd_mach_i960_kb_sb 3
86.#define bfd_mach_i960_mc 4
87.#define bfd_mach_i960_xa 5
88.#define bfd_mach_i960_ca 6
34255b70 89.#define bfd_mach_i960_jx 7
cbe75cb6 90.#define bfd_mach_i960_hx 8
9fda1a39
SC
91.
92. bfd_arch_a29k, {* AMD 29000 *}
93. bfd_arch_sparc, {* SPARC *}
5bc513b4 94.#define bfd_mach_sparc 1
cbe75cb6 95.{* The difference between v8plus and v9 is that v9 is a true 64 bit env. *}
34255b70
JL
96.#define bfd_mach_sparc_sparclet 2
97.#define bfd_mach_sparc_sparclite 3
98.#define bfd_mach_sparc_v8plus 4
99.#define bfd_mach_sparc_v8plusa 5 {* with ultrasparc add'ns *}
100.#define bfd_mach_sparc_v9 6
101.#define bfd_mach_sparc_v9a 7 {* with ultrasparc add'ns *}
049f3d4c 102.{* Nonzero if MACH has the v9 instruction set. *}
34255b70
JL
103.#define bfd_mach_sparc_v9_p(mach) \
104. ((mach) >= bfd_mach_sparc_v8plus && (mach) <= bfd_mach_sparc_v9a)
36df40e0 105. bfd_arch_mips, {* MIPS Rxxxx *}
29410c45
JL
106. {* start-sanitize-tx19 *}
107.#define bfd_mach_mips1900 1900
108. {* end-sanitize-tx19 *}
cd66558c 109.#define bfd_mach_mips3000 3000
29410c45 110.#define bfd_mach_mips3900 3900
cd66558c 111.#define bfd_mach_mips4000 4000
29410c45
JL
112.#define bfd_mach_mips4010 4010
113.#define bfd_mach_mips4100 4100
114.#define bfd_mach_mips4300 4300
115.#define bfd_mach_mips4400 4400
116.#define bfd_mach_mips4600 4600
117.#define bfd_mach_mips4650 4650
ad4413e6
GRK
118. {* start-sanitize-vr4320 *}
119.#define bfd_mach_mips4320 4320
f8ca1a47 120. {* end-sanitize-vr4320 *}
29410c45
JL
121. {* start-sanitize-tx49 *}
122.#define bfd_mach_mips4900 4900
123. {* end-sanitize-tx49 *}
124.#define bfd_mach_mips5000 5000
cd66558c 125. {* start-sanitize-vr5400 *}
29410c45 126.#define bfd_mach_mips5400 5400
cd66558c 127. {* end-sanitize-vr5400 *}
29410c45
JL
128. {* start-sanitize-r5900 *}
129.#define bfd_mach_mips5900 5900
130. {* end-sanitize-r5900 *}
131.#define bfd_mach_mips6000 6000
132.#define bfd_mach_mips8000 8000
133.#define bfd_mach_mips10000 10000
134.#define bfd_mach_mips16 16
36df40e0
DE
135. {* start-sanitize-sky *}
136. {* The DVP is a machine within the mips architecture. *}
137.#define bfd_mach_dvp_dma 42000
ad4413e6 138.#define bfd_mach_dvp_vif 42001
36df40e0 139.#define bfd_mach_dvp_vu 42002
ad4413e6 140.#define bfd_mach_dvp_gif 42003
36df40e0
DE
141.#define bfd_mach_dvp_p(mach) ((mach) >= 42000 && (mach) <= 42003)
142. {* end-sanitize-sky *}
9fda1a39 143. bfd_arch_i386, {* Intel 386 *}
9676e446
SG
144.#define bfd_mach_i386_i386 0
145.#define bfd_mach_i386_i8086 1
71c0bae0 146. bfd_arch_we32k, {* AT&T WE32xxx *}
9fda1a39
SC
147. bfd_arch_tahoe, {* CCI/Harris Tahoe *}
148. bfd_arch_i860, {* Intel 860 *}
149. bfd_arch_romp, {* IBM ROMP PC/RT *}
150. bfd_arch_alliant, {* Alliant *}
151. bfd_arch_convex, {* Convex *}
152. bfd_arch_m88k, {* Motorola 88xxx *}
153. bfd_arch_pyramid, {* Pyramid Technology *}
154. bfd_arch_h8300, {* Hitachi H8/300 *}
2e235c93
ILT
155.#define bfd_mach_h8300 1
156.#define bfd_mach_h8300h 2
34255b70 157.#define bfd_mach_h8300s 3
d94aca1a 158. bfd_arch_powerpc, {* PowerPC *}
9fda1a39 159. bfd_arch_rs6000, {* IBM RS/6000 *}
e3c01e92 160. bfd_arch_hppa, {* HP PA RISC *}
efc2b064 161. bfd_arch_d10v, {* Mitsubishi D10V *}
fd8d7c31
MH
162. {* start-sanitize-d30v *}
163. bfd_arch_d30v, {* Mitsubishi D30V *}
164. {* end-sanitize-d30v *}
71c0bae0
KR
165. bfd_arch_z8k, {* Zilog Z8000 *}
166.#define bfd_mach_z8001 1
167.#define bfd_mach_z8002 2
2e235c93
ILT
168. bfd_arch_h8500, {* Hitachi H8/500 *}
169. bfd_arch_sh, {* Hitachi SH *}
f40d28bf
AC
170.#define bfd_mach_sh 0
171.#define bfd_mach_sh3 0x30
172.#define bfd_mach_sh3e 0x3e
173. {* start-sanitize-sh4 *}
174.#define bfd_mach_sh4 0x40
175. {* end-sanitize-sh4 *}
2e235c93 176. bfd_arch_alpha, {* Dec Alpha *}
d94aca1a 177. bfd_arch_arm, {* Advanced Risc Machines ARM *}
76af94b9
DE
178.#define bfd_mach_arm_2 1
179.#define bfd_mach_arm_2a 2
180.#define bfd_mach_arm_3 3
181.#define bfd_mach_arm_3M 4
182.#define bfd_mach_arm_4 5
183.#define bfd_mach_arm_4T 6
d94aca1a 184. bfd_arch_ns32k, {* National Semiconductors ns32000 *}
b7577823 185. bfd_arch_w65, {* WDC 65816 *}
ad4413e6 186. bfd_arch_tic30, {* Texas Instruments TMS320C30 *}
fd8d7c31
MH
187. {* start-sanitize-tic80 *}
188. bfd_arch_tic80, {* TI TMS320c80 (MVP) *}
189. {* end-sanitize-tic80 *}
efc2b064 190. bfd_arch_v850, {* NEC V850 *}
f40d28bf 191.#define bfd_mach_v850 0
8988d935 192. {* start-sanitize-v850e *}
f40d28bf 193.#define bfd_mach_v850e 'E'
cd66558c 194.#define bfd_mach_v850ea 'A'
8988d935 195. {* end-sanitize-v850e *}
37648010 196. bfd_arch_arc, {* Argonaut RISC Core *}
b7577823 197.#define bfd_mach_arc_base 0
76af94b9 198. bfd_arch_m32r, {* Mitsubishi M32R/D *}
2e0a5c10 199.#define bfd_mach_m32r 0 {* backwards compatibility *}
20b2c808 200. {* start-sanitize-m32rx *}
2e0a5c10 201.#define bfd_mach_m32rx 'x'
20b2c808 202. {* end-sanitize-m32rx *}
cd6213ff
FF
203. bfd_arch_mn10200, {* Matsushita MN10200 *}
204. bfd_arch_mn10300, {* Matsushita MN10300 *}
9fda1a39
SC
205. bfd_arch_last
206. };
c618de01 207
c618de01
SC
208
209*/
210
9fda1a39
SC
211/*
212
213SUBSECTION
214 bfd_arch_info
215
216DESCRIPTION
217 This structure contains information on architectures for use
218 within BFD.
219
9fda1a39
SC
220.
221.typedef struct bfd_arch_info
222.{
223. int bits_per_word;
224. int bits_per_address;
225. int bits_per_byte;
226. enum bfd_architecture arch;
ae115e51 227. unsigned long mach;
5bc513b4
DE
228. const char *arch_name;
229. const char *printable_name;
ce07dd7c
KR
230. unsigned int section_align_power;
231. {* true if this is the default machine for the architecture *}
9fda1a39 232. boolean the_default;
5bc513b4
DE
233. const struct bfd_arch_info * (*compatible)
234. PARAMS ((const struct bfd_arch_info *a,
235. const struct bfd_arch_info *b));
9fda1a39 236.
5bc513b4 237. boolean (*scan) PARAMS ((const struct bfd_arch_info *, const char *));
9fda1a39 238.
5bc513b4 239. const struct bfd_arch_info *next;
9fda1a39 240.} bfd_arch_info_type;
4e6f9223
SC
241*/
242
5bc513b4
DE
243extern const bfd_arch_info_type bfd_a29k_arch;
244extern const bfd_arch_info_type bfd_alpha_arch;
5bc513b4 245extern const bfd_arch_info_type bfd_arc_arch;
5bc513b4 246extern const bfd_arch_info_type bfd_arm_arch;
efc2b064 247extern const bfd_arch_info_type bfd_d10v_arch;
fd8d7c31
MH
248/* start-sanitize-d30v */
249extern const bfd_arch_info_type bfd_d30v_arch;
250/* end-sanitize-d30v */
5bc513b4
DE
251extern const bfd_arch_info_type bfd_h8300_arch;
252extern const bfd_arch_info_type bfd_h8500_arch;
253extern const bfd_arch_info_type bfd_hppa_arch;
254extern const bfd_arch_info_type bfd_i386_arch;
255extern const bfd_arch_info_type bfd_i860_arch;
256extern const bfd_arch_info_type bfd_i960_arch;
efc2b064 257extern const bfd_arch_info_type bfd_m32r_arch;
5bc513b4
DE
258extern const bfd_arch_info_type bfd_m68k_arch;
259extern const bfd_arch_info_type bfd_m88k_arch;
260extern const bfd_arch_info_type bfd_mips_arch;
cd6213ff
FF
261extern const bfd_arch_info_type bfd_mn10200_arch;
262extern const bfd_arch_info_type bfd_mn10300_arch;
5bc513b4
DE
263extern const bfd_arch_info_type bfd_powerpc_arch;
264extern const bfd_arch_info_type bfd_rs6000_arch;
265extern const bfd_arch_info_type bfd_sh_arch;
5bc513b4 266extern const bfd_arch_info_type bfd_sparc_arch;
ad4413e6 267extern const bfd_arch_info_type bfd_tic30_arch;
cd6213ff
FF
268/* start-sanitize-tic80 */
269extern const bfd_arch_info_type bfd_tic80_arch;
270/* end-sanitize-tic80 */
5bc513b4
DE
271extern const bfd_arch_info_type bfd_vax_arch;
272extern const bfd_arch_info_type bfd_we32k_arch;
273extern const bfd_arch_info_type bfd_z8k_arch;
274extern const bfd_arch_info_type bfd_ns32k_arch;
275extern const bfd_arch_info_type bfd_w65_arch;
efc2b064 276extern const bfd_arch_info_type bfd_v850_arch;
5bc513b4
DE
277
278static const bfd_arch_info_type * const bfd_archures_list[] =
279{
280#ifdef SELECT_ARCHITECTURES
281 SELECT_ARCHITECTURES,
282#else
283 &bfd_a29k_arch,
284 &bfd_alpha_arch,
5bc513b4 285 &bfd_arc_arch,
5bc513b4 286 &bfd_arm_arch,
efc2b064 287 &bfd_d10v_arch,
fd8d7c31
MH
288/* start-sanitize-d30v */
289 &bfd_d30v_arch,
290/* end-sanitize-d30v */
5bc513b4
DE
291 &bfd_h8300_arch,
292 &bfd_h8500_arch,
293 &bfd_hppa_arch,
294 &bfd_i386_arch,
295 &bfd_i860_arch,
296 &bfd_i960_arch,
efc2b064 297 &bfd_m32r_arch,
5bc513b4
DE
298 &bfd_m68k_arch,
299 &bfd_m88k_arch,
300 &bfd_mips_arch,
cd6213ff
FF
301 &bfd_mn10200_arch,
302 &bfd_mn10300_arch,
5bc513b4
DE
303 &bfd_powerpc_arch,
304 &bfd_rs6000_arch,
305 &bfd_sh_arch,
5bc513b4 306 &bfd_sparc_arch,
ad4413e6 307 &bfd_tic30_arch,
fd8d7c31
MH
308/* start-sanitize-tic80 */
309 &bfd_tic80_arch,
310/* end-sanitize-tic80 */
5bc513b4
DE
311 &bfd_vax_arch,
312 &bfd_we32k_arch,
313 &bfd_z8k_arch,
314 &bfd_ns32k_arch,
315 &bfd_w65_arch,
efc2b064 316 &bfd_v850_arch,
8988d935 317#endif
2f88c324 318 0
5bc513b4 319};
4a81b561 320
9fda1a39 321/*
9fda1a39
SC
322FUNCTION
323 bfd_printable_name
4e6f9223 324
ce07dd7c 325SYNOPSIS
5bc513b4 326 const char *bfd_printable_name(bfd *abfd);
ce07dd7c 327
9fda1a39
SC
328DESCRIPTION
329 Return a printable string representing the architecture and machine
c188b0be 330 from the pointer to the architecture info structure.
4e6f9223 331
4e6f9223
SC
332*/
333
5bc513b4 334const char *
d94aca1a
MT
335bfd_printable_name (abfd)
336 bfd *abfd;
4e6f9223
SC
337{
338 return abfd->arch_info->printable_name;
4a81b561
DHW
339}
340
4e6f9223
SC
341
342
9fda1a39
SC
343/*
344FUNCTION
345 bfd_scan_arch
4e6f9223 346
ce07dd7c 347SYNOPSIS
5bc513b4 348 const bfd_arch_info_type *bfd_scan_arch(const char *string);
ce07dd7c 349
9fda1a39 350DESCRIPTION
c188b0be
DM
351 Figure out if BFD supports any cpu which could be described with
352 the name @var{string}. Return a pointer to an <<arch_info>>
9fda1a39
SC
353 structure if a machine is found, otherwise NULL.
354
c618de01 355*/
4a81b561 356
5bc513b4 357const bfd_arch_info_type *
d94aca1a 358bfd_scan_arch (string)
5bc513b4 359 const char *string;
4a81b561 360{
5bc513b4 361 const bfd_arch_info_type * const *app, *ap;
4e6f9223
SC
362
363 /* Look through all the installed architectures */
5bc513b4
DE
364 for (app = bfd_archures_list; *app != NULL; app++)
365 {
366 for (ap = *app; ap != NULL; ap = ap->next)
367 {
368 if (ap->scan (ap, string))
369 return ap;
370 }
371 }
372
373 return NULL;
4e6f9223
SC
374}
375
4a81b561 376
4a81b561 377
eaa9c2e7
AC
378/*
379FUNCTION
380 bfd_arch_list
381
382SYNOPSIS
383 const char **bfd_arch_list(void);
384
385DESCRIPTION
386 Return a freshly malloced NULL-terminated vector of the names
387 of all the valid BFD architectures. Do not modify the names.
388
389*/
390
391const char **
392bfd_arch_list ()
393{
394 int vec_length = 0;
395 const char **name_ptr;
396 const char **name_list;
397 const bfd_arch_info_type * const *app;
398
399 /* Determine the number of architectures */
400 vec_length = 0;
401 for (app = bfd_archures_list; *app != NULL; app++)
402 {
403 const bfd_arch_info_type *ap;
404 for (ap = *app; ap != NULL; ap = ap->next)
405 {
406 vec_length++;
407 }
408 }
409
410 name_list = (CONST char **)
411 bfd_malloc ((vec_length + 1) * sizeof (char **));
412 if (name_list == NULL)
413 return NULL;
414
415 /* Point the list at each of the names */
416 name_ptr = name_list;
417 for (app = bfd_archures_list; *app != NULL; app++)
418 {
419 const bfd_arch_info_type *ap;
420 for (ap = *app; ap != NULL; ap = ap->next)
421 {
422 *name_ptr = ap->printable_name;
423 name_ptr++;
424 }
425 }
426 *name_ptr = NULL;
427
428 return name_list;
429}
430
431
432
9fda1a39
SC
433/*
434FUNCTION
435 bfd_arch_get_compatible
436
ce07dd7c 437SYNOPSIS
5bc513b4
DE
438 const bfd_arch_info_type *bfd_arch_get_compatible(
439 const bfd *abfd,
440 const bfd *bbfd);
4e6f9223 441
ce07dd7c 442DESCRIPTION
c188b0be
DM
443 Determine whether two BFDs'
444 architectures and machine types are compatible. Calculates
9fda1a39
SC
445 the lowest common denominator between the two architectures
446 and machine types implied by the BFDs and returns a pointer to
c188b0be 447 an <<arch_info>> structure describing the compatible machine.
4e6f9223
SC
448*/
449
5bc513b4 450const bfd_arch_info_type *
d94aca1a 451bfd_arch_get_compatible (abfd, bbfd)
5bc513b4
DE
452 const bfd *abfd;
453 const bfd *bbfd;
4e6f9223 454{
b7577823
ILT
455 /* If either architecture is unknown, then all we can do is assume
456 the user knows what he's doing. */
457 if (abfd->arch_info->arch == bfd_arch_unknown)
458 return bbfd->arch_info;
459 if (bbfd->arch_info->arch == bfd_arch_unknown)
460 return abfd->arch_info;
461
462 /* Otherwise architecture-specific code has to decide. */
5bc513b4 463 return abfd->arch_info->compatible (abfd->arch_info, bbfd->arch_info);
4a81b561
DHW
464}
465
4e6f9223 466
9fda1a39 467/*
ce07dd7c 468INTERNAL_DEFINITION
9fda1a39 469 bfd_default_arch_struct
4e6f9223 470
9fda1a39 471DESCRIPTION
ce07dd7c
KR
472 The <<bfd_default_arch_struct>> is an item of
473 <<bfd_arch_info_type>> which has been initialized to a fairly
474 generic state. A BFD starts life by pointing to this
475 structure, until the correct back end has determined the real
476 architecture of the file.
9fda1a39 477
5bc513b4 478.extern const bfd_arch_info_type bfd_default_arch_struct;
4e6f9223 479
4e6f9223
SC
480*/
481
5bc513b4 482const bfd_arch_info_type bfd_default_arch_struct =
9fda1a39 483{
2e235c93 484 32,32,8,bfd_arch_unknown,0,"unknown","unknown",2,true,
9fda1a39
SC
485 bfd_default_compatible,
486 bfd_default_scan,
487 0,
9fda1a39 488};
4e6f9223 489
9fda1a39
SC
490/*
491FUNCTION
492 bfd_set_arch_info
4e6f9223 493
9fda1a39 494SYNOPSIS
5bc513b4 495 void bfd_set_arch_info(bfd *abfd, const bfd_arch_info_type *arg);
4e6f9223 496
c188b0be
DM
497DESCRIPTION
498 Set the architecture info of @var{abfd} to @var{arg}.
4e6f9223
SC
499*/
500
d94aca1a
MT
501void
502bfd_set_arch_info (abfd, arg)
503 bfd *abfd;
5bc513b4 504 const bfd_arch_info_type *arg;
4a81b561 505{
4e6f9223
SC
506 abfd->arch_info = arg;
507}
508
9fda1a39 509/*
ce07dd7c 510INTERNAL_FUNCTION
9fda1a39
SC
511 bfd_default_set_arch_mach
512
9fda1a39
SC
513SYNOPSIS
514 boolean bfd_default_set_arch_mach(bfd *abfd,
515 enum bfd_architecture arch,
516 unsigned long mach);
4e6f9223 517
ce07dd7c 518DESCRIPTION
c188b0be
DM
519 Set the architecture and machine type in BFD @var{abfd}
520 to @var{arch} and @var{mach}. Find the correct
521 pointer to a structure and insert it into the <<arch_info>>
ce07dd7c 522 pointer.
4e6f9223
SC
523*/
524
d94aca1a
MT
525boolean
526bfd_default_set_arch_mach (abfd, arch, mach)
527 bfd *abfd;
528 enum bfd_architecture arch;
5bc513b4 529 unsigned long mach;
4e6f9223 530{
5bc513b4 531 const bfd_arch_info_type * const *app, *ap;
4a81b561 532
5bc513b4
DE
533 for (app = bfd_archures_list; *app != NULL; app++)
534 {
535 for (ap = *app; ap != NULL; ap = ap->next)
536 {
537 if (ap->arch == arch
538 && (ap->mach == mach
539 || (mach == 0 && ap->the_default)))
540 {
541 abfd->arch_info = ap;
542 return true;
543 }
544 }
545 }
4e6f9223 546
5bc513b4
DE
547 abfd->arch_info = &bfd_default_arch_struct;
548 bfd_set_error (bfd_error_bad_value);
549 return false;
4a81b561 550}
4a81b561 551
4e6f9223 552
9fda1a39
SC
553/*
554FUNCTION
555 bfd_get_arch
4e6f9223 556
ce07dd7c
KR
557SYNOPSIS
558 enum bfd_architecture bfd_get_arch(bfd *abfd);
559
9fda1a39 560DESCRIPTION
c188b0be
DM
561 Return the enumerated type which describes the BFD @var{abfd}'s
562 architecture.
4e6f9223 563
4e6f9223
SC
564*/
565
d94aca1a
MT
566enum bfd_architecture
567bfd_get_arch (abfd)
568 bfd *abfd;
9fda1a39 569{
4e6f9223 570 return abfd->arch_info->arch;
9fda1a39 571}
4e6f9223 572
9fda1a39
SC
573/*
574FUNCTION
575 bfd_get_mach
4e6f9223 576
ce07dd7c
KR
577SYNOPSIS
578 unsigned long bfd_get_mach(bfd *abfd);
579
9fda1a39 580DESCRIPTION
c188b0be
DM
581 Return the long type which describes the BFD @var{abfd}'s
582 machine.
4e6f9223
SC
583*/
584
9fda1a39 585unsigned long
d94aca1a
MT
586bfd_get_mach (abfd)
587 bfd *abfd;
4a81b561 588{
4e6f9223 589 return abfd->arch_info->mach;
9fda1a39 590}
4e6f9223 591
9fda1a39
SC
592/*
593FUNCTION
594 bfd_arch_bits_per_byte
4e6f9223 595
ce07dd7c
KR
596SYNOPSIS
597 unsigned int bfd_arch_bits_per_byte(bfd *abfd);
598
9fda1a39 599DESCRIPTION
c188b0be
DM
600 Return the number of bits in one of the BFD @var{abfd}'s
601 architecture's bytes.
4e6f9223 602
4e6f9223
SC
603*/
604
d94aca1a
MT
605unsigned int
606bfd_arch_bits_per_byte (abfd)
607 bfd *abfd;
c188b0be
DM
608{
609 return abfd->arch_info->bits_per_byte;
610}
4e6f9223 611
9fda1a39
SC
612/*
613FUNCTION
614 bfd_arch_bits_per_address
4e6f9223 615
9fda1a39
SC
616SYNOPSIS
617 unsigned int bfd_arch_bits_per_address(bfd *abfd);
ce07dd7c
KR
618
619DESCRIPTION
c188b0be
DM
620 Return the number of bits in one of the BFD @var{abfd}'s
621 architecture's addresses.
4e6f9223
SC
622*/
623
d94aca1a
MT
624unsigned int
625bfd_arch_bits_per_address (abfd)
626 bfd *abfd;
c188b0be
DM
627{
628 return abfd->arch_info->bits_per_address;
629}
4e6f9223
SC
630
631
9fda1a39 632/*
ce07dd7c 633INTERNAL_FUNCTION
9fda1a39 634 bfd_default_compatible
4e6f9223 635
9fda1a39 636SYNOPSIS
5bc513b4
DE
637 const bfd_arch_info_type *bfd_default_compatible
638 (const bfd_arch_info_type *a,
639 const bfd_arch_info_type *b);
ce07dd7c
KR
640
641DESCRIPTION
642 The default function for testing for compatibility.
4e6f9223
SC
643*/
644
5bc513b4 645const bfd_arch_info_type *
d94aca1a 646bfd_default_compatible (a,b)
5bc513b4
DE
647 const bfd_arch_info_type *a;
648 const bfd_arch_info_type *b;
4e6f9223 649{
5bc513b4
DE
650 if (a->arch != b->arch)
651 return NULL;
4e6f9223 652
5bc513b4 653 if (a->mach > b->mach)
4e6f9223 654 return a;
5bc513b4
DE
655
656 if (b->mach > a->mach)
4e6f9223 657 return b;
5bc513b4 658
4e6f9223 659 return a;
4a81b561
DHW
660}
661
662
9fda1a39 663/*
ce07dd7c 664INTERNAL_FUNCTION
9fda1a39
SC
665 bfd_default_scan
666
9fda1a39 667SYNOPSIS
5bc513b4 668 boolean bfd_default_scan(const struct bfd_arch_info *info, const char *string);
4e6f9223 669
ce07dd7c
KR
670DESCRIPTION
671 The default function for working out whether this is an
672 architecture hit and a machine hit.
4e6f9223
SC
673*/
674
675boolean
d94aca1a 676bfd_default_scan (info, string)
5bc513b4
DE
677 const struct bfd_arch_info *info;
678 const char *string;
4a81b561 679{
5bc513b4
DE
680 const char *ptr_src;
681 const char *ptr_tst;
b7577823
ILT
682 unsigned long number;
683 enum bfd_architecture arch;
eaa9c2e7
AC
684 const char *printable_name_colon;
685
686 /* Exact match of the architecture name (ARCH_NAME) and also the
687 default architecture? */
688 if (strcasecmp (string, info->arch_name) == 0
689 && info->the_default)
690 return true;
5bc513b4 691
eaa9c2e7
AC
692 /* Exact match of the machine name (PRINTABLE_NAME)? */
693 if (strcasecmp (string, info->printable_name) == 0)
5bc513b4 694 return true;
eaa9c2e7
AC
695
696 /* Given that printable_name contains no colon, attempt to match:
697 ARCH_NAME [ ":" ] PRINTABLE_NAME? */
698 printable_name_colon = strchr (info->printable_name, ':');
699 if (printable_name_colon == NULL)
700 {
701 int strlen_arch_name = strlen (info->arch_name);
702 if (strncasecmp (string, info->arch_name, strlen_arch_name) == 0)
703 if (string[strlen_arch_name] == ':')
704 {
705 if (strcasecmp (string + strlen_arch_name + 1,
706 info->printable_name) == 0)
707 return true;
708 }
709 else
710 {
711 if (strcasecmp (string + strlen_arch_name,
712 info->printable_name) == 0)
713 return true;
714 }
715 }
716
717 /* Given that PRINTABLE_NAME has the form: <arch> ":" <mach>;
718 Attempt to match: <arch> <mach>? */
719 if (printable_name_colon != NULL)
720 {
721 int colon_index = printable_name_colon - info->printable_name;
722 if (strncasecmp (string, info->printable_name, colon_index) == 0
723 && strcasecmp (string + colon_index,
724 info->printable_name + colon_index + 1) == 0)
725 return true;
726 }
727
728 /* Given that PRINTABLE_NAME has the form: <arch> ":" <mach>; Do not
729 attempt to match just <mach>, it could be ambigious. This test
730 is left until later. */
731
732 /* NOTE: The below is retained for compatibility only. Please do not
733 add to this code */
b7577823
ILT
734
735 /* See how much of the supplied string matches with the
736 architecture, eg the string m68k:68020 would match the 68k entry
737 up to the :, then we get left with the machine number */
738
5bc513b4 739 for (ptr_src = string, ptr_tst = info->arch_name;
b7577823 740 *ptr_src && *ptr_tst;
5bc513b4 741 ptr_src++, ptr_tst++)
9fda1a39 742 {
b7577823 743 if (*ptr_src != *ptr_tst) break;
9fda1a39 744 }
4e6f9223 745
b7577823
ILT
746 /* Chewed up as much of the architecture as will match, skip any
747 colons */
5bc513b4
DE
748 if (*ptr_src == ':')
749 ptr_src++;
4e6f9223 750
5bc513b4
DE
751 if (*ptr_src == 0)
752 {
753 /* nothing more, then only keep this one if it is the default
754 machine for this architecture */
755 return info->the_default;
756 }
757
b7577823 758 number = 0;
5bc513b4
DE
759 while (isdigit(*ptr_src))
760 {
761 number = number * 10 + *ptr_src - '0';
762 ptr_src++;
763 }
b7577823 764
cd66558c
NC
765 /* NOTE: The below is retained for compatibility only.
766 PLEASE DO NOT ADD TO THIS CODE. */
eaa9c2e7 767
b7577823 768 switch (number)
9fda1a39 769 {
b7577823
ILT
770 case 68010:
771 case 68020:
772 case 68030:
773 case 68040:
774 case 68332:
775 case 68050:
776 case 68000:
777 arch = bfd_arch_m68k;
778 break;
5bc513b4 779
b7577823
ILT
780 case 32000:
781 arch = bfd_arch_we32k;
782 break;
4e6f9223 783
b7577823 784 case 3000:
cd66558c
NC
785 arch = bfd_arch_mips;
786 number = bfd_mach_mips3000;
787 break;
788
b7577823 789 case 4000:
b7577823 790 arch = bfd_arch_mips;
cd66558c 791 number = bfd_mach_mips4000;
b7577823 792 break;
4a81b561 793
b7577823
ILT
794 case 6000:
795 arch = bfd_arch_rs6000;
796 break;
9fda1a39 797
b7577823
ILT
798 default:
799 return false;
9fda1a39 800 }
5bc513b4 801
b7577823
ILT
802 if (arch != info->arch)
803 return false;
9fda1a39 804
b7577823
ILT
805 if (number != info->mach)
806 return false;
9fda1a39 807
b7577823 808 return true;
4a81b561 809}
c618de01
SC
810
811
9fda1a39
SC
812/*
813FUNCTION
814 bfd_get_arch_info
c618de01 815
9fda1a39 816SYNOPSIS
5bc513b4 817 const bfd_arch_info_type * bfd_get_arch_info(bfd *abfd);
c618de01 818
c188b0be
DM
819DESCRIPTION
820 Return the architecture info struct in @var{abfd}.
4e6f9223 821*/
c618de01 822
5bc513b4 823const bfd_arch_info_type *
d94aca1a
MT
824bfd_get_arch_info (abfd)
825 bfd *abfd;
4e6f9223 826{
5bc513b4 827 return abfd->arch_info;
4e6f9223 828}
cbdc7909
JG
829
830
9fda1a39
SC
831/*
832FUNCTION
833 bfd_lookup_arch
834
9fda1a39 835SYNOPSIS
5bc513b4 836 const bfd_arch_info_type *bfd_lookup_arch
9fda1a39
SC
837 (enum bfd_architecture
838 arch,
ae115e51 839 unsigned long machine);
cbdc7909 840
ce07dd7c 841DESCRIPTION
c188b0be
DM
842 Look for the architecure info structure which matches the
843 arguments @var{arch} and @var{machine}. A machine of 0 matches the
ce07dd7c
KR
844 machine/architecture structure which marks itself as the
845 default.
cbdc7909
JG
846*/
847
5bc513b4 848const bfd_arch_info_type *
d94aca1a
MT
849bfd_lookup_arch (arch, machine)
850 enum bfd_architecture arch;
ae115e51 851 unsigned long machine;
cbdc7909 852{
5bc513b4
DE
853 const bfd_arch_info_type * const *app, *ap;
854
855 for (app = bfd_archures_list; *app != NULL; app++)
856 {
857 for (ap = *app; ap != NULL; ap = ap->next)
858 {
859 if (ap->arch == arch
860 && (ap->mach == machine
861 || (machine == 0 && ap->the_default)))
862 return ap;
9fda1a39 863 }
5bc513b4
DE
864 }
865
866 return NULL;
cbdc7909
JG
867}
868
869
9fda1a39
SC
870/*
871FUNCTION
872 bfd_printable_arch_mach
873
ce07dd7c 874SYNOPSIS
5bc513b4 875 const char *bfd_printable_arch_mach
ce07dd7c
KR
876 (enum bfd_architecture arch, unsigned long machine);
877
9fda1a39
SC
878DESCRIPTION
879 Return a printable string representing the architecture and
880 machine type.
cbdc7909 881
c188b0be 882 This routine is depreciated.
cbdc7909
JG
883*/
884
5bc513b4 885const char *
d94aca1a
MT
886bfd_printable_arch_mach (arch, machine)
887 enum bfd_architecture arch;
888 unsigned long machine;
cbdc7909 889{
5bc513b4
DE
890 const bfd_arch_info_type *ap = bfd_lookup_arch (arch, machine);
891
892 if (ap)
893 return ap->printable_name;
9fda1a39 894 return "UNKNOWN!";
cbdc7909 895}
This page took 0.268689 seconds and 4 git commands to generate.