* coff-tic80.c (coff_rtype_to_howto): Define
[deliverable/binutils-gdb.git] / bfd / archures.c
CommitLineData
c618de01 1/* BFD library support routines for architectures.
fd8d7c31 2 Copyright (C) 1990, 91, 92, 93, 94, 95, 96, 1997 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)
9fda1a39
SC
105. bfd_arch_mips, {* MIPS Rxxxx *}
106. bfd_arch_i386, {* Intel 386 *}
9676e446
SG
107.#define bfd_mach_i386_i386 0
108.#define bfd_mach_i386_i8086 1
71c0bae0 109. bfd_arch_we32k, {* AT&T WE32xxx *}
9fda1a39
SC
110. bfd_arch_tahoe, {* CCI/Harris Tahoe *}
111. bfd_arch_i860, {* Intel 860 *}
112. bfd_arch_romp, {* IBM ROMP PC/RT *}
113. bfd_arch_alliant, {* Alliant *}
114. bfd_arch_convex, {* Convex *}
115. bfd_arch_m88k, {* Motorola 88xxx *}
116. bfd_arch_pyramid, {* Pyramid Technology *}
117. bfd_arch_h8300, {* Hitachi H8/300 *}
2e235c93
ILT
118.#define bfd_mach_h8300 1
119.#define bfd_mach_h8300h 2
34255b70 120.#define bfd_mach_h8300s 3
d94aca1a 121. bfd_arch_powerpc, {* PowerPC *}
9fda1a39 122. bfd_arch_rs6000, {* IBM RS/6000 *}
e3c01e92 123. bfd_arch_hppa, {* HP PA RISC *}
efc2b064
JL
124. {* start-sanitize-d10v *}
125. bfd_arch_d10v, {* Mitsubishi D10V *}
126. {* end-sanitize-d10v *}
fd8d7c31
MH
127. {* start-sanitize-d30v *}
128. bfd_arch_d30v, {* Mitsubishi D30V *}
129. {* end-sanitize-d30v *}
71c0bae0
KR
130. bfd_arch_z8k, {* Zilog Z8000 *}
131.#define bfd_mach_z8001 1
132.#define bfd_mach_z8002 2
2e235c93
ILT
133. bfd_arch_h8500, {* Hitachi H8/500 *}
134. bfd_arch_sh, {* Hitachi SH *}
135. bfd_arch_alpha, {* Dec Alpha *}
d94aca1a
MT
136. bfd_arch_arm, {* Advanced Risc Machines ARM *}
137. bfd_arch_ns32k, {* National Semiconductors ns32000 *}
b7577823 138. bfd_arch_w65, {* WDC 65816 *}
fd8d7c31
MH
139. {* start-sanitize-tic80 *}
140. bfd_arch_tic80, {* TI TMS320c80 (MVP) *}
141. {* end-sanitize-tic80 *}
efc2b064
JL
142. {* start-sanitize-v850 *}
143. bfd_arch_v850, {* NEC V850 *}
144. {* end-sanitize-v850 *}
37648010
KR
145. {* start-sanitize-arc *}
146. bfd_arch_arc, {* Argonaut RISC Core *}
b7577823
ILT
147.#define bfd_mach_arc_base 0
148.#define bfd_mach_arc_host 1
149.#define bfd_mach_arc_graphics 2
150.#define bfd_mach_arc_audio 3
37648010 151. {* end-sanitize-arc *}
efc2b064
JL
152. {* start-sanitize-m32r *}
153. bfd_arch_m32r, {* Mitsubishi M32R *}
154. {* end-sanitize-m32r *}
cd6213ff
FF
155. bfd_arch_mn10200, {* Matsushita MN10200 *}
156. bfd_arch_mn10300, {* Matsushita MN10300 *}
9fda1a39
SC
157. bfd_arch_last
158. };
c618de01 159
c618de01
SC
160
161*/
162
9fda1a39
SC
163/*
164
165SUBSECTION
166 bfd_arch_info
167
168DESCRIPTION
169 This structure contains information on architectures for use
170 within BFD.
171
9fda1a39
SC
172.
173.typedef struct bfd_arch_info
174.{
175. int bits_per_word;
176. int bits_per_address;
177. int bits_per_byte;
178. enum bfd_architecture arch;
ae115e51 179. unsigned long mach;
5bc513b4
DE
180. const char *arch_name;
181. const char *printable_name;
ce07dd7c
KR
182. unsigned int section_align_power;
183. {* true if this is the default machine for the architecture *}
9fda1a39 184. boolean the_default;
5bc513b4
DE
185. const struct bfd_arch_info * (*compatible)
186. PARAMS ((const struct bfd_arch_info *a,
187. const struct bfd_arch_info *b));
9fda1a39 188.
5bc513b4 189. boolean (*scan) PARAMS ((const struct bfd_arch_info *, const char *));
9fda1a39 190.
5bc513b4 191. const struct bfd_arch_info *next;
9fda1a39 192.} bfd_arch_info_type;
4e6f9223
SC
193*/
194
5bc513b4
DE
195extern const bfd_arch_info_type bfd_a29k_arch;
196extern const bfd_arch_info_type bfd_alpha_arch;
197/* start-sanitize-arc */
198extern const bfd_arch_info_type bfd_arc_arch;
199/* end-sanitize-arc */
200extern const bfd_arch_info_type bfd_arm_arch;
efc2b064
JL
201/* start-sanitize-d10v */
202extern const bfd_arch_info_type bfd_d10v_arch;
203/* end-sanitize-d10v */
fd8d7c31
MH
204/* start-sanitize-d30v */
205extern const bfd_arch_info_type bfd_d30v_arch;
206/* end-sanitize-d30v */
5bc513b4
DE
207extern const bfd_arch_info_type bfd_h8300_arch;
208extern const bfd_arch_info_type bfd_h8500_arch;
209extern const bfd_arch_info_type bfd_hppa_arch;
210extern const bfd_arch_info_type bfd_i386_arch;
211extern const bfd_arch_info_type bfd_i860_arch;
212extern const bfd_arch_info_type bfd_i960_arch;
efc2b064
JL
213/* start-sanitize-m32r */
214extern const bfd_arch_info_type bfd_m32r_arch;
215/* end-sanitize-m32r */
5bc513b4
DE
216extern const bfd_arch_info_type bfd_m68k_arch;
217extern const bfd_arch_info_type bfd_m88k_arch;
218extern const bfd_arch_info_type bfd_mips_arch;
cd6213ff
FF
219extern const bfd_arch_info_type bfd_mn10200_arch;
220extern const bfd_arch_info_type bfd_mn10300_arch;
5bc513b4
DE
221extern const bfd_arch_info_type bfd_powerpc_arch;
222extern const bfd_arch_info_type bfd_rs6000_arch;
223extern const bfd_arch_info_type bfd_sh_arch;
5bc513b4 224extern const bfd_arch_info_type bfd_sparc_arch;
cd6213ff
FF
225/* start-sanitize-tic80 */
226extern const bfd_arch_info_type bfd_tic80_arch;
227/* end-sanitize-tic80 */
5bc513b4
DE
228extern const bfd_arch_info_type bfd_vax_arch;
229extern const bfd_arch_info_type bfd_we32k_arch;
230extern const bfd_arch_info_type bfd_z8k_arch;
231extern const bfd_arch_info_type bfd_ns32k_arch;
232extern const bfd_arch_info_type bfd_w65_arch;
efc2b064
JL
233/* start-sanitize-v850 */
234extern const bfd_arch_info_type bfd_v850_arch;
235/* end-sanitize-v850 */
5bc513b4
DE
236
237static const bfd_arch_info_type * const bfd_archures_list[] =
238{
239#ifdef SELECT_ARCHITECTURES
240 SELECT_ARCHITECTURES,
241#else
242 &bfd_a29k_arch,
243 &bfd_alpha_arch,
244/* start-sanitize-arc */
245 &bfd_arc_arch,
246/* end-sanitize-arc */
247 &bfd_arm_arch,
efc2b064
JL
248/* start-sanitize-d10v */
249 &bfd_d10v_arch,
250/* end-sanitize-d10v */
fd8d7c31
MH
251/* start-sanitize-d30v */
252 &bfd_d30v_arch,
253/* end-sanitize-d30v */
5bc513b4
DE
254 &bfd_h8300_arch,
255 &bfd_h8500_arch,
256 &bfd_hppa_arch,
257 &bfd_i386_arch,
258 &bfd_i860_arch,
259 &bfd_i960_arch,
efc2b064
JL
260/* start-sanitize-m32r */
261 &bfd_m32r_arch,
262/* end-sanitize-m32r */
5bc513b4
DE
263 &bfd_m68k_arch,
264 &bfd_m88k_arch,
265 &bfd_mips_arch,
cd6213ff
FF
266 &bfd_mn10200_arch,
267 &bfd_mn10300_arch,
5bc513b4
DE
268 &bfd_powerpc_arch,
269 &bfd_rs6000_arch,
270 &bfd_sh_arch,
5bc513b4 271 &bfd_sparc_arch,
fd8d7c31
MH
272/* start-sanitize-tic80 */
273 &bfd_tic80_arch,
274/* end-sanitize-tic80 */
5bc513b4
DE
275 &bfd_vax_arch,
276 &bfd_we32k_arch,
277 &bfd_z8k_arch,
278 &bfd_ns32k_arch,
279 &bfd_w65_arch,
efc2b064
JL
280/* start-sanitize-v850*/
281 &bfd_v850_arch,
282/* end-sanitize-v850 */
5bc513b4
DE
283#endif
284 0
285};
4a81b561 286
9fda1a39 287/*
9fda1a39
SC
288FUNCTION
289 bfd_printable_name
4e6f9223 290
ce07dd7c 291SYNOPSIS
5bc513b4 292 const char *bfd_printable_name(bfd *abfd);
ce07dd7c 293
9fda1a39
SC
294DESCRIPTION
295 Return a printable string representing the architecture and machine
c188b0be 296 from the pointer to the architecture info structure.
4e6f9223 297
4e6f9223
SC
298*/
299
5bc513b4 300const char *
d94aca1a
MT
301bfd_printable_name (abfd)
302 bfd *abfd;
4e6f9223
SC
303{
304 return abfd->arch_info->printable_name;
4a81b561
DHW
305}
306
4e6f9223
SC
307
308
9fda1a39
SC
309/*
310FUNCTION
311 bfd_scan_arch
4e6f9223 312
ce07dd7c 313SYNOPSIS
5bc513b4 314 const bfd_arch_info_type *bfd_scan_arch(const char *string);
ce07dd7c 315
9fda1a39 316DESCRIPTION
c188b0be
DM
317 Figure out if BFD supports any cpu which could be described with
318 the name @var{string}. Return a pointer to an <<arch_info>>
9fda1a39
SC
319 structure if a machine is found, otherwise NULL.
320
c618de01 321*/
4a81b561 322
5bc513b4 323const bfd_arch_info_type *
d94aca1a 324bfd_scan_arch (string)
5bc513b4 325 const char *string;
4a81b561 326{
5bc513b4 327 const bfd_arch_info_type * const *app, *ap;
4e6f9223
SC
328
329 /* Look through all the installed architectures */
5bc513b4
DE
330 for (app = bfd_archures_list; *app != NULL; app++)
331 {
332 for (ap = *app; ap != NULL; ap = ap->next)
333 {
334 if (ap->scan (ap, string))
335 return ap;
336 }
337 }
338
339 return NULL;
4e6f9223
SC
340}
341
4a81b561 342
4a81b561 343
9fda1a39
SC
344/*
345FUNCTION
346 bfd_arch_get_compatible
347
ce07dd7c 348SYNOPSIS
5bc513b4
DE
349 const bfd_arch_info_type *bfd_arch_get_compatible(
350 const bfd *abfd,
351 const bfd *bbfd);
4e6f9223 352
ce07dd7c 353DESCRIPTION
c188b0be
DM
354 Determine whether two BFDs'
355 architectures and machine types are compatible. Calculates
9fda1a39
SC
356 the lowest common denominator between the two architectures
357 and machine types implied by the BFDs and returns a pointer to
c188b0be 358 an <<arch_info>> structure describing the compatible machine.
4e6f9223
SC
359*/
360
5bc513b4 361const bfd_arch_info_type *
d94aca1a 362bfd_arch_get_compatible (abfd, bbfd)
5bc513b4
DE
363 const bfd *abfd;
364 const bfd *bbfd;
4e6f9223 365{
b7577823
ILT
366 /* If either architecture is unknown, then all we can do is assume
367 the user knows what he's doing. */
368 if (abfd->arch_info->arch == bfd_arch_unknown)
369 return bbfd->arch_info;
370 if (bbfd->arch_info->arch == bfd_arch_unknown)
371 return abfd->arch_info;
372
373 /* Otherwise architecture-specific code has to decide. */
5bc513b4 374 return abfd->arch_info->compatible (abfd->arch_info, bbfd->arch_info);
4a81b561
DHW
375}
376
4e6f9223 377
9fda1a39 378/*
ce07dd7c 379INTERNAL_DEFINITION
9fda1a39 380 bfd_default_arch_struct
4e6f9223 381
9fda1a39 382DESCRIPTION
ce07dd7c
KR
383 The <<bfd_default_arch_struct>> is an item of
384 <<bfd_arch_info_type>> which has been initialized to a fairly
385 generic state. A BFD starts life by pointing to this
386 structure, until the correct back end has determined the real
387 architecture of the file.
9fda1a39 388
5bc513b4 389.extern const bfd_arch_info_type bfd_default_arch_struct;
4e6f9223 390
4e6f9223
SC
391*/
392
5bc513b4 393const bfd_arch_info_type bfd_default_arch_struct =
9fda1a39 394{
2e235c93 395 32,32,8,bfd_arch_unknown,0,"unknown","unknown",2,true,
9fda1a39
SC
396 bfd_default_compatible,
397 bfd_default_scan,
398 0,
9fda1a39 399};
4e6f9223 400
9fda1a39
SC
401/*
402FUNCTION
403 bfd_set_arch_info
4e6f9223 404
9fda1a39 405SYNOPSIS
5bc513b4 406 void bfd_set_arch_info(bfd *abfd, const bfd_arch_info_type *arg);
4e6f9223 407
c188b0be
DM
408DESCRIPTION
409 Set the architecture info of @var{abfd} to @var{arg}.
4e6f9223
SC
410*/
411
d94aca1a
MT
412void
413bfd_set_arch_info (abfd, arg)
414 bfd *abfd;
5bc513b4 415 const bfd_arch_info_type *arg;
4a81b561 416{
4e6f9223
SC
417 abfd->arch_info = arg;
418}
419
9fda1a39 420/*
ce07dd7c 421INTERNAL_FUNCTION
9fda1a39
SC
422 bfd_default_set_arch_mach
423
9fda1a39
SC
424SYNOPSIS
425 boolean bfd_default_set_arch_mach(bfd *abfd,
426 enum bfd_architecture arch,
427 unsigned long mach);
4e6f9223 428
ce07dd7c 429DESCRIPTION
c188b0be
DM
430 Set the architecture and machine type in BFD @var{abfd}
431 to @var{arch} and @var{mach}. Find the correct
432 pointer to a structure and insert it into the <<arch_info>>
ce07dd7c 433 pointer.
4e6f9223
SC
434*/
435
d94aca1a
MT
436boolean
437bfd_default_set_arch_mach (abfd, arch, mach)
438 bfd *abfd;
439 enum bfd_architecture arch;
5bc513b4 440 unsigned long mach;
4e6f9223 441{
5bc513b4 442 const bfd_arch_info_type * const *app, *ap;
4a81b561 443
5bc513b4
DE
444 for (app = bfd_archures_list; *app != NULL; app++)
445 {
446 for (ap = *app; ap != NULL; ap = ap->next)
447 {
448 if (ap->arch == arch
449 && (ap->mach == mach
450 || (mach == 0 && ap->the_default)))
451 {
452 abfd->arch_info = ap;
453 return true;
454 }
455 }
456 }
4e6f9223 457
5bc513b4
DE
458 abfd->arch_info = &bfd_default_arch_struct;
459 bfd_set_error (bfd_error_bad_value);
460 return false;
4a81b561 461}
4a81b561 462
4e6f9223 463
9fda1a39
SC
464/*
465FUNCTION
466 bfd_get_arch
4e6f9223 467
ce07dd7c
KR
468SYNOPSIS
469 enum bfd_architecture bfd_get_arch(bfd *abfd);
470
9fda1a39 471DESCRIPTION
c188b0be
DM
472 Return the enumerated type which describes the BFD @var{abfd}'s
473 architecture.
4e6f9223 474
4e6f9223
SC
475*/
476
d94aca1a
MT
477enum bfd_architecture
478bfd_get_arch (abfd)
479 bfd *abfd;
9fda1a39 480{
4e6f9223 481 return abfd->arch_info->arch;
9fda1a39 482}
4e6f9223 483
9fda1a39
SC
484/*
485FUNCTION
486 bfd_get_mach
4e6f9223 487
ce07dd7c
KR
488SYNOPSIS
489 unsigned long bfd_get_mach(bfd *abfd);
490
9fda1a39 491DESCRIPTION
c188b0be
DM
492 Return the long type which describes the BFD @var{abfd}'s
493 machine.
4e6f9223
SC
494*/
495
9fda1a39 496unsigned long
d94aca1a
MT
497bfd_get_mach (abfd)
498 bfd *abfd;
4a81b561 499{
4e6f9223 500 return abfd->arch_info->mach;
9fda1a39 501}
4e6f9223 502
9fda1a39
SC
503/*
504FUNCTION
505 bfd_arch_bits_per_byte
4e6f9223 506
ce07dd7c
KR
507SYNOPSIS
508 unsigned int bfd_arch_bits_per_byte(bfd *abfd);
509
9fda1a39 510DESCRIPTION
c188b0be
DM
511 Return the number of bits in one of the BFD @var{abfd}'s
512 architecture's bytes.
4e6f9223 513
4e6f9223
SC
514*/
515
d94aca1a
MT
516unsigned int
517bfd_arch_bits_per_byte (abfd)
518 bfd *abfd;
c188b0be
DM
519{
520 return abfd->arch_info->bits_per_byte;
521}
4e6f9223 522
9fda1a39
SC
523/*
524FUNCTION
525 bfd_arch_bits_per_address
4e6f9223 526
9fda1a39
SC
527SYNOPSIS
528 unsigned int bfd_arch_bits_per_address(bfd *abfd);
ce07dd7c
KR
529
530DESCRIPTION
c188b0be
DM
531 Return the number of bits in one of the BFD @var{abfd}'s
532 architecture's addresses.
4e6f9223
SC
533*/
534
d94aca1a
MT
535unsigned int
536bfd_arch_bits_per_address (abfd)
537 bfd *abfd;
c188b0be
DM
538{
539 return abfd->arch_info->bits_per_address;
540}
4e6f9223
SC
541
542
9fda1a39 543/*
ce07dd7c 544INTERNAL_FUNCTION
9fda1a39 545 bfd_default_compatible
4e6f9223 546
9fda1a39 547SYNOPSIS
5bc513b4
DE
548 const bfd_arch_info_type *bfd_default_compatible
549 (const bfd_arch_info_type *a,
550 const bfd_arch_info_type *b);
ce07dd7c
KR
551
552DESCRIPTION
553 The default function for testing for compatibility.
4e6f9223
SC
554*/
555
5bc513b4 556const bfd_arch_info_type *
d94aca1a 557bfd_default_compatible (a,b)
5bc513b4
DE
558 const bfd_arch_info_type *a;
559 const bfd_arch_info_type *b;
4e6f9223 560{
5bc513b4
DE
561 if (a->arch != b->arch)
562 return NULL;
4e6f9223 563
5bc513b4 564 if (a->mach > b->mach)
4e6f9223 565 return a;
5bc513b4
DE
566
567 if (b->mach > a->mach)
4e6f9223 568 return b;
5bc513b4 569
4e6f9223 570 return a;
4a81b561
DHW
571}
572
573
9fda1a39 574/*
ce07dd7c 575INTERNAL_FUNCTION
9fda1a39
SC
576 bfd_default_scan
577
9fda1a39 578SYNOPSIS
5bc513b4 579 boolean bfd_default_scan(const struct bfd_arch_info *info, const char *string);
4e6f9223 580
ce07dd7c
KR
581DESCRIPTION
582 The default function for working out whether this is an
583 architecture hit and a machine hit.
4e6f9223
SC
584*/
585
586boolean
d94aca1a 587bfd_default_scan (info, string)
5bc513b4
DE
588 const struct bfd_arch_info *info;
589 const char *string;
4a81b561 590{
5bc513b4
DE
591 const char *ptr_src;
592 const char *ptr_tst;
b7577823
ILT
593 unsigned long number;
594 enum bfd_architecture arch;
5bc513b4 595
b7577823 596 /* First test for an exact match */
5bc513b4
DE
597 if (strcmp (string, info->printable_name) == 0)
598 return true;
b7577823
ILT
599
600 /* See how much of the supplied string matches with the
601 architecture, eg the string m68k:68020 would match the 68k entry
602 up to the :, then we get left with the machine number */
603
5bc513b4 604 for (ptr_src = string, ptr_tst = info->arch_name;
b7577823 605 *ptr_src && *ptr_tst;
5bc513b4 606 ptr_src++, ptr_tst++)
9fda1a39 607 {
b7577823 608 if (*ptr_src != *ptr_tst) break;
9fda1a39 609 }
4e6f9223 610
b7577823
ILT
611 /* Chewed up as much of the architecture as will match, skip any
612 colons */
5bc513b4
DE
613 if (*ptr_src == ':')
614 ptr_src++;
4e6f9223 615
5bc513b4
DE
616 if (*ptr_src == 0)
617 {
618 /* nothing more, then only keep this one if it is the default
619 machine for this architecture */
620 return info->the_default;
621 }
622
b7577823 623 number = 0;
5bc513b4
DE
624 while (isdigit(*ptr_src))
625 {
626 number = number * 10 + *ptr_src - '0';
627 ptr_src++;
628 }
b7577823
ILT
629
630 switch (number)
9fda1a39 631 {
b7577823
ILT
632 case 65:
633 arch = bfd_arch_w65;
634 break;
635
636 case 300:
2e235c93
ILT
637 arch = bfd_arch_h8300;
638 break;
639
b7577823 640 case 500:
2e235c93
ILT
641 arch = bfd_arch_h8500;
642 break;
643
b7577823
ILT
644 case 68010:
645 case 68020:
646 case 68030:
647 case 68040:
648 case 68332:
649 case 68050:
650 case 68000:
651 arch = bfd_arch_m68k;
652 break;
5bc513b4 653
b7577823
ILT
654 case 386:
655 case 80386:
656 case 486:
657 case 80486:
658 arch = bfd_arch_i386;
659 break;
5bc513b4 660
b7577823
ILT
661 case 29000:
662 arch = bfd_arch_a29k;
663 break;
4a81b561 664
b7577823
ILT
665 case 8000:
666 arch = bfd_arch_z8k;
667 break;
71c0bae0 668
b7577823
ILT
669 case 32000:
670 arch = bfd_arch_we32k;
671 break;
4e6f9223 672
b7577823
ILT
673 case 860:
674 case 80860:
675 arch = bfd_arch_i860;
676 break;
677 case 960:
678 case 80960:
679 arch = bfd_arch_i960;
680 break;
71c0bae0 681
b7577823
ILT
682 case 2000:
683 case 3000:
684 case 4000:
685 case 4400:
686 arch = bfd_arch_mips;
687 break;
4a81b561 688
b7577823
ILT
689 case 6000:
690 arch = bfd_arch_rs6000;
691 break;
9fda1a39 692
b7577823
ILT
693 default:
694 return false;
9fda1a39 695 }
5bc513b4 696
b7577823
ILT
697 if (arch != info->arch)
698 return false;
9fda1a39 699
b7577823
ILT
700 if (number != info->mach)
701 return false;
9fda1a39 702
b7577823 703 return true;
4a81b561 704}
c618de01
SC
705
706
9fda1a39
SC
707/*
708FUNCTION
709 bfd_get_arch_info
c618de01 710
9fda1a39 711SYNOPSIS
5bc513b4 712 const bfd_arch_info_type * bfd_get_arch_info(bfd *abfd);
c618de01 713
c188b0be
DM
714DESCRIPTION
715 Return the architecture info struct in @var{abfd}.
4e6f9223 716*/
c618de01 717
5bc513b4 718const bfd_arch_info_type *
d94aca1a
MT
719bfd_get_arch_info (abfd)
720 bfd *abfd;
4e6f9223 721{
5bc513b4 722 return abfd->arch_info;
4e6f9223 723}
cbdc7909
JG
724
725
9fda1a39
SC
726/*
727FUNCTION
728 bfd_lookup_arch
729
9fda1a39 730SYNOPSIS
5bc513b4 731 const bfd_arch_info_type *bfd_lookup_arch
9fda1a39
SC
732 (enum bfd_architecture
733 arch,
ae115e51 734 unsigned long machine);
cbdc7909 735
ce07dd7c 736DESCRIPTION
c188b0be
DM
737 Look for the architecure info structure which matches the
738 arguments @var{arch} and @var{machine}. A machine of 0 matches the
ce07dd7c
KR
739 machine/architecture structure which marks itself as the
740 default.
cbdc7909
JG
741*/
742
5bc513b4 743const bfd_arch_info_type *
d94aca1a
MT
744bfd_lookup_arch (arch, machine)
745 enum bfd_architecture arch;
ae115e51 746 unsigned long machine;
cbdc7909 747{
5bc513b4
DE
748 const bfd_arch_info_type * const *app, *ap;
749
750 for (app = bfd_archures_list; *app != NULL; app++)
751 {
752 for (ap = *app; ap != NULL; ap = ap->next)
753 {
754 if (ap->arch == arch
755 && (ap->mach == machine
756 || (machine == 0 && ap->the_default)))
757 return ap;
9fda1a39 758 }
5bc513b4
DE
759 }
760
761 return NULL;
cbdc7909
JG
762}
763
764
9fda1a39
SC
765/*
766FUNCTION
767 bfd_printable_arch_mach
768
ce07dd7c 769SYNOPSIS
5bc513b4 770 const char *bfd_printable_arch_mach
ce07dd7c
KR
771 (enum bfd_architecture arch, unsigned long machine);
772
9fda1a39
SC
773DESCRIPTION
774 Return a printable string representing the architecture and
775 machine type.
cbdc7909 776
c188b0be 777 This routine is depreciated.
cbdc7909
JG
778*/
779
5bc513b4 780const char *
d94aca1a
MT
781bfd_printable_arch_mach (arch, machine)
782 enum bfd_architecture arch;
783 unsigned long machine;
cbdc7909 784{
5bc513b4
DE
785 const bfd_arch_info_type *ap = bfd_lookup_arch (arch, machine);
786
787 if (ap)
788 return ap->printable_name;
9fda1a39 789 return "UNKNOWN!";
cbdc7909 790}
This page took 0.429452 seconds and 4 git commands to generate.