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