1 /* BFD library support routines for architectures.
2 Copyright (C) 1990-1991 Free Software Foundation, Inc.
3 Hacked by John Gilmore and Steve Chamberlain of Cygnus Support.
6 This file is part of BFD, the Binary File Descriptor library.
8 This program is free software; you can redistribute it and/or modify
9 it under the terms of the GNU General Public License as published by
10 the Free Software Foundation; either version 2 of the License, or
11 (at your option) any later version.
13 This program is distributed in the hope that it will be useful,
14 but WITHOUT ANY WARRANTY; without even the implied warranty of
15 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
16 GNU General Public License for more details.
18 You should have received a copy of the GNU General Public License
19 along with this program; if not, write to the Free Software
20 Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. */
27 BFD's idea of an architecture is implimented in
28 <<archures.c>>. BFD keeps one atom in a BFD describing the
29 architecture of the data attached to the BFD; a pointer to a
30 <<bfd_arch_info_type>>.
32 Pointers to structures can be requested independently of a bfd
33 so that an architecture's information can be interrogated
34 without access to an open bfd.
36 The arch information is provided by each architecture package.
37 The set of default architectures is selected by the #define
38 <<SELECT_ARCHITECTURES>>. This is normally set up in the
39 <<hosts/*.h>> file of your choice. If the name is not
40 defined, then all the architectures supported are included.
42 When BFD starts up, all the architectures are called with an
43 initialize method. It is up to the architecture back end to
44 insert as many items into the list of architectures as it wants to;
45 generally this would be one for each machine and one for the
46 default case (an item with a machine field of 0).
55 This enum gives the object file's CPU architecture, in a
56 global sense --- i.e., what processor family does it belong to?
57 There is another field, which indicates what processor within
58 the family is in use. The machine gives a number which
59 distingushes different versions of the architecture,
60 containing for example 2 and 3 for Intel i960 KA and i960 KB,
61 and 68020 and 68030 for Motorola 68020 and 68030.
63 .enum bfd_architecture
65 . bfd_arch_unknown, {* File arch not known *}
66 . bfd_arch_obscure, {* Arch known, not one of these *}
67 . bfd_arch_m68k, {* Motorola 68xxx *}
68 . bfd_arch_vax, {* DEC Vax *}
69 . bfd_arch_i960, {* Intel 960 *}
70 . {* The order of the following is important.
71 . lower number indicates a machine type that
72 . only accepts a subset of the instructions
73 . available to machines with higher numbers.
74 . The exception is the "ca", which is
75 . incompatible with all other machines except
78 .#define bfd_mach_i960_core 1
79 .#define bfd_mach_i960_ka_sa 2
80 .#define bfd_mach_i960_kb_sb 3
81 .#define bfd_mach_i960_mc 4
82 .#define bfd_mach_i960_xa 5
83 .#define bfd_mach_i960_ca 6
85 . bfd_arch_a29k, {* AMD 29000 *}
86 . bfd_arch_sparc, {* SPARC *}
87 . bfd_arch_mips, {* MIPS Rxxxx *}
88 . bfd_arch_i386, {* Intel 386 *}
89 . bfd_arch_we32k, {* AT&T WE32xxx *}
90 . bfd_arch_tahoe, {* CCI/Harris Tahoe *}
91 . bfd_arch_i860, {* Intel 860 *}
92 . bfd_arch_romp, {* IBM ROMP PC/RT *}
93 . bfd_arch_alliant, {* Alliant *}
94 . bfd_arch_convex, {* Convex *}
95 . bfd_arch_m88k, {* Motorola 88xxx *}
96 . bfd_arch_pyramid, {* Pyramid Technology *}
97 . bfd_arch_h8300, {* Hitachi H8/300 *}
98 . bfd_arch_rs6000, {* IBM RS/6000 *}
99 . bfd_arch_hppa, {* HP PA RISC *}
100 . bfd_arch_z8k, {* Zilog Z8000 *}
101 .#define bfd_mach_z8001 1
102 .#define bfd_mach_z8002 2
119 This structure contains information on architectures for use
123 .typedef struct bfd_arch_info
126 . int bits_per_address;
128 . enum bfd_architecture arch;
131 . CONST char *printable_name;
132 . unsigned int section_align_power;
133 . {* true if this is the default machine for the architecture *}
134 . boolean the_default;
135 . CONST struct bfd_arch_info * (*compatible)
136 . PARAMS ((CONST struct bfd_arch_info *a,
137 . CONST struct bfd_arch_info *b));
139 . boolean (*scan) PARAMS ((CONST struct bfd_arch_info *, CONST char *));
140 . {* How to disassemble an instruction, producing a printable
141 . representation on a specified stdio stream. This isn't
142 . defined for most processors at present, because of the size
143 . of the additional tables it would drag in, and because gdb
144 . wants to use a different interface. *}
145 . unsigned int (*disassemble) PARAMS ((bfd_vma addr, CONST char *data,
148 . struct bfd_arch_info *next;
149 .} bfd_arch_info_type;
152 bfd_arch_info_type *bfd_arch_info_list;
160 CONST char *bfd_printable_name(bfd *abfd);
163 Return a printable string representing the architecture and machine
164 from the pointer to the arch info structure
169 DEFUN(bfd_printable_name, (abfd),
172 return abfd->arch_info->printable_name;
182 bfd_arch_info_type *bfd_scan_arch(CONST char *);
185 This routine is provided with a string and tries to work out
186 if bfd supports any cpu which could be described with the name
187 provided. The routine returns a pointer to an arch_info
188 structure if a machine is found, otherwise NULL.
193 DEFUN(bfd_scan_arch,(string),
196 struct bfd_arch_info *ap;
198 /* Look through all the installed architectures */
199 for (ap = bfd_arch_info_list;
200 ap != (bfd_arch_info_type *)NULL;
203 if (ap->scan(ap, string))
206 return (bfd_arch_info_type *)NULL;
213 bfd_arch_get_compatible
216 CONST bfd_arch_info_type *bfd_arch_get_compatible(
221 This routine is used to determine whether two BFDs'
222 architectures and achine types are compatible. It calculates
223 the lowest common denominator between the two architectures
224 and machine types implied by the BFDs and returns a pointer to
225 an arch_info structure describing the compatible machine.
228 CONST bfd_arch_info_type *
229 DEFUN(bfd_arch_get_compatible,(abfd, bbfd),
234 return abfd->arch_info->compatible(abfd->arch_info,bbfd->arch_info);
240 bfd_default_arch_struct
243 The <<bfd_default_arch_struct>> is an item of
244 <<bfd_arch_info_type>> which has been initialized to a fairly
245 generic state. A BFD starts life by pointing to this
246 structure, until the correct back end has determined the real
247 architecture of the file.
249 .extern bfd_arch_info_type bfd_default_arch_struct;
253 bfd_arch_info_type bfd_default_arch_struct =
255 32,32,8,bfd_arch_unknown,0,"unknown","unknown",1,true,
256 bfd_default_compatible,
266 void bfd_set_arch_info(bfd *, bfd_arch_info_type *);
270 void DEFUN(bfd_set_arch_info,(abfd, arg),
272 bfd_arch_info_type *arg)
274 abfd->arch_info = arg;
279 bfd_default_set_arch_mach
282 boolean bfd_default_set_arch_mach(bfd *abfd,
283 enum bfd_architecture arch,
287 Set the architecture and machine type in a bfd. This finds the
288 correct pointer to structure and inserts it into the arch_info
292 boolean DEFUN(bfd_default_set_arch_mach,(abfd, arch, mach),
294 enum bfd_architecture arch AND
297 static struct bfd_arch_info *old_ptr = &bfd_default_arch_struct;
298 boolean found = false;
299 /* run through the table to find the one we want, we keep a little
300 cache to speed things up */
301 if (old_ptr == 0 || arch != old_ptr->arch || mach != old_ptr->mach) {
302 bfd_arch_info_type *ptr;
303 old_ptr = (bfd_arch_info_type *)NULL;
304 for (ptr = bfd_arch_info_list;
305 ptr != (bfd_arch_info_type *)NULL;
307 if (ptr->arch == arch &&
308 ((ptr->mach == mach) || (ptr->the_default && mach == 0))) {
315 /*looked for it and it wasn't there, so put in the default */
316 old_ptr = &bfd_default_arch_struct;
321 /* it was in the cache */
325 abfd->arch_info = old_ptr;
339 enum bfd_architecture bfd_get_arch(bfd *abfd);
342 Returns the enumerated type which describes the supplied bfd's
347 enum bfd_architecture DEFUN(bfd_get_arch, (abfd), bfd *abfd)
349 return abfd->arch_info->arch;
357 unsigned long bfd_get_mach(bfd *abfd);
360 Returns the long type which describes the supplied bfd's
365 DEFUN(bfd_get_mach, (abfd), bfd *abfd)
367 return abfd->arch_info->mach;
372 bfd_arch_bits_per_byte
375 unsigned int bfd_arch_bits_per_byte(bfd *abfd);
378 Returns the number of bits in one of the architectures bytes
382 unsigned int DEFUN(bfd_arch_bits_per_byte, (abfd), bfd *abfd)
384 return abfd->arch_info->bits_per_byte;
389 bfd_arch_bits_per_address
392 unsigned int bfd_arch_bits_per_address(bfd *abfd);
395 Returns the number of bits in one of the architectures addresses
398 unsigned int DEFUN(bfd_arch_bits_per_address, (abfd), bfd *abfd)
400 return abfd->arch_info->bits_per_address;
405 extern void bfd_h8300_arch PARAMS ((void));
406 extern void bfd_i960_arch PARAMS ((void));
407 extern void bfd_empty_arch PARAMS ((void));
408 extern void bfd_sparc_arch PARAMS ((void));
409 extern void bfd_m88k_arch PARAMS ((void));
410 extern void bfd_m68k_arch PARAMS ((void));
411 extern void bfd_vax_arch PARAMS ((void));
412 extern void bfd_a29k_arch PARAMS ((void));
413 extern void bfd_mips_arch PARAMS ((void));
414 extern void bfd_i386_arch PARAMS ((void));
415 extern void bfd_rs6000_arch PARAMS ((void));
416 extern void bfd_hppa_arch PARAMS ((void));
417 extern void bfd_z8k_arch PARAMS ((void));
418 extern void bfd_we32k_arch PARAMS ((void));
420 static void (*archures_init_table[]) PARAMS ((void)) =
422 #ifdef SELECT_ARCHITECTURES
423 SELECT_ARCHITECTURES,
449 void bfd_arch_init(void);
452 This routine initializes the architecture dispatch table by
453 calling all installed architecture packages and getting them
458 DEFUN_VOID(bfd_arch_init)
460 void (**ptable) PARAMS ((void));
461 for (ptable = archures_init_table;
475 void bfd_arch_linkin(bfd_arch_info_type *);
478 Link the provided arch info structure into the list
481 void DEFUN(bfd_arch_linkin,(ptr),
482 bfd_arch_info_type *ptr)
484 ptr->next = bfd_arch_info_list;
485 bfd_arch_info_list = ptr;
491 bfd_default_compatible
494 CONST bfd_arch_info_type *bfd_default_compatible
495 (CONST bfd_arch_info_type *a,
496 CONST bfd_arch_info_type *b);
499 The default function for testing for compatibility.
502 CONST bfd_arch_info_type *
503 DEFUN(bfd_default_compatible,(a,b),
504 CONST bfd_arch_info_type *a AND
505 CONST bfd_arch_info_type *b)
507 if(a->arch != b->arch) return NULL;
509 if (a->mach > b->mach) {
512 if (b->mach > a->mach) {
524 boolean bfd_default_scan(CONST struct bfd_arch_info *, CONST char *);
527 The default function for working out whether this is an
528 architecture hit and a machine hit.
532 DEFUN(bfd_default_scan,(info, string),
533 CONST struct bfd_arch_info *info AND
538 unsigned long number;
539 enum bfd_architecture arch;
540 /* First test for an exact match */
541 if (strcmp(string, info->printable_name) == 0) return true;
543 /* See how much of the supplied string matches with the
544 architecture, eg the string m68k:68020 would match the 68k entry
545 up to the :, then we get left with the machine number */
547 for (ptr_src = string,
548 ptr_tst = info->arch_name;
549 *ptr_src && *ptr_tst;
553 if (*ptr_src != *ptr_tst) break;
556 /* Chewed up as much of the architecture as will match, skip any
558 if (*ptr_src == ':') ptr_src++;
561 /* nothing more, then only keep this one if it is the default
562 machine for this architecture */
563 return info->the_default;
566 while (isdigit(*ptr_src)) {
567 number = number * 10 + *ptr_src - '0';
580 arch = bfd_arch_m68k;
586 arch = bfd_arch_i386;
589 arch = bfd_arch_a29k;
597 arch = bfd_arch_we32k;
602 arch = bfd_arch_i860;
606 arch = bfd_arch_i960;
613 arch = bfd_arch_mips;
617 arch = bfd_arch_rs6000;
623 if (arch != info->arch)
626 if (number != info->mach)
641 bfd_arch_info_type * bfd_get_arch_info(bfd *);
646 DEFUN(bfd_get_arch_info,(abfd),
649 return abfd->arch_info;
658 bfd_arch_info_type *bfd_lookup_arch
659 (enum bfd_architecture
664 Look for the architecure info struct which matches the
665 arguments given. A machine of 0 will match the
666 machine/architecture structure which marks itself as the
671 DEFUN(bfd_lookup_arch,(arch, machine),
672 enum bfd_architecture arch AND
675 bfd_arch_info_type *ap;
677 for (ap = bfd_arch_info_list;
678 ap != (bfd_arch_info_type *)NULL;
680 if (ap->arch == arch &&
681 ((ap->mach == machine)
682 || (ap->the_default && machine == 0))) {
686 return (bfd_arch_info_type *)NULL;
693 bfd_printable_arch_mach
696 CONST char * bfd_printable_arch_mach
697 (enum bfd_architecture arch, unsigned long machine);
700 Return a printable string representing the architecture and
703 NB. The use of this routine is depreciated.
707 DEFUN(bfd_printable_arch_mach,(arch, machine),
708 enum bfd_architecture arch AND
709 unsigned long machine)
711 bfd_arch_info_type *ap = bfd_lookup_arch(arch, machine);
712 if(ap) return ap->printable_name;