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