* elfcode.h (elf_map_symbols): Only use section symbols whose
[deliverable/binutils-gdb.git] / bfd / archures.c
... / ...
CommitLineData
1/* BFD library support routines for architectures.
2 Copyright (C) 1990, 91, 92, 93, 94 Free Software Foundation, Inc.
3 Hacked by John Gilmore and Steve Chamberlain of Cygnus Support.
4
5This file is part of BFD, the Binary File Descriptor library.
6
7This program is free software; you can redistribute it and/or modify
8it under the terms of the GNU General Public License as published by
9the Free Software Foundation; either version 2 of the License, or
10(at your option) any later version.
11
12This program is distributed in the hope that it will be useful,
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
18along with this program; if not, write to the Free Software
19Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. */
20
21/*
22
23SECTION
24 Architectures
25
26 BFD keeps one atom in a BFD describing the
27 architecture of the data attached to the BFD: a pointer to a
28 <<bfd_arch_info_type>>.
29
30 Pointers to structures can be requested independently of a BFD
31 so that an architecture's information can be interrogated
32 without access to an open BFD.
33
34 The architecture information is provided by each architecture package.
35 The set of default architectures is selected by the macro
36 <<SELECT_ARCHITECTURES>>. This is normally set up in the
37 @file{config/@var{target}.mt} file of your choice. If the name is not
38 defined, then all the architectures supported are included.
39
40 When BFD starts up, all the architectures are called with an
41 initialize method. It is up to the architecture back end to
42 insert as many items into the list of architectures as it wants to;
43 generally this would be one for each machine and one for the
44 default case (an item with a machine field of 0).
45
46 BFD's idea of an architecture is implemented in @file{archures.c}.
47*/
48
49/*
50
51SUBSECTION
52 bfd_architecture
53
54DESCRIPTION
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 Another field indicates which processor within
58 the family is in use. The machine gives a number which
59 distinguishes 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.
62
63.enum bfd_architecture
64.{
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
76. "core". *}
77.
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
84. {* start-sanitize-i960xl *}
85.#define bfd_mach_i960_xl 7
86. {* end-sanitize-i960xl *}
87.
88. bfd_arch_a29k, {* AMD 29000 *}
89. bfd_arch_sparc, {* SPARC *}
90. bfd_arch_mips, {* MIPS Rxxxx *}
91. bfd_arch_i386, {* Intel 386 *}
92. bfd_arch_we32k, {* AT&T WE32xxx *}
93. bfd_arch_tahoe, {* CCI/Harris Tahoe *}
94. bfd_arch_i860, {* Intel 860 *}
95. bfd_arch_romp, {* IBM ROMP PC/RT *}
96. bfd_arch_alliant, {* Alliant *}
97. bfd_arch_convex, {* Convex *}
98. bfd_arch_m88k, {* Motorola 88xxx *}
99. bfd_arch_pyramid, {* Pyramid Technology *}
100. bfd_arch_h8300, {* Hitachi H8/300 *}
101.#define bfd_mach_h8300 1
102.#define bfd_mach_h8300h 2
103. bfd_arch_powerpc, {* PowerPC *}
104. bfd_arch_rs6000, {* IBM RS/6000 *}
105. bfd_arch_hppa, {* HP PA RISC *}
106. bfd_arch_z8k, {* Zilog Z8000 *}
107.#define bfd_mach_z8001 1
108.#define bfd_mach_z8002 2
109. bfd_arch_h8500, {* Hitachi H8/500 *}
110. bfd_arch_sh, {* Hitachi SH *}
111. bfd_arch_alpha, {* Dec Alpha *}
112. bfd_arch_arm, {* Advanced Risc Machines ARM *}
113. bfd_arch_ns32k, {* National Semiconductors ns32000 *}
114. start-sanitize-rce
115. bfd_arch_rce, {* Motorola RCE *}
116. end-sanitize-rce
117. bfd_arch_last
118. };
119
120
121*/
122
123#include "bfd.h"
124#include "sysdep.h"
125#include "libbfd.h"
126
127/*
128
129SUBSECTION
130 bfd_arch_info
131
132DESCRIPTION
133 This structure contains information on architectures for use
134 within BFD.
135
136.
137.typedef struct bfd_arch_info
138.{
139. int bits_per_word;
140. int bits_per_address;
141. int bits_per_byte;
142. enum bfd_architecture arch;
143. long mach;
144. char *arch_name;
145. CONST char *printable_name;
146. unsigned int section_align_power;
147. {* true if this is the default machine for the architecture *}
148. boolean the_default;
149. CONST struct bfd_arch_info * (*compatible)
150. PARAMS ((CONST struct bfd_arch_info *a,
151. CONST struct bfd_arch_info *b));
152.
153. boolean (*scan) PARAMS ((CONST struct bfd_arch_info *, CONST char *));
154. {* How to disassemble an instruction, producing a printable
155. representation on a specified stdio stream. This isn't
156. defined for most processors at present, because of the size
157. of the additional tables it would drag in, and because gdb
158. wants to use a different interface. *}
159. unsigned int (*disassemble) PARAMS ((bfd_vma addr, CONST char *data,
160. PTR stream));
161.
162. struct bfd_arch_info *next;
163.} bfd_arch_info_type;
164*/
165
166bfd_arch_info_type *bfd_arch_info_list;
167
168
169/*
170FUNCTION
171 bfd_printable_name
172
173SYNOPSIS
174 CONST char *bfd_printable_name(bfd *abfd);
175
176DESCRIPTION
177 Return a printable string representing the architecture and machine
178 from the pointer to the architecture info structure.
179
180*/
181
182CONST char *
183bfd_printable_name (abfd)
184 bfd *abfd;
185{
186 return abfd->arch_info->printable_name;
187}
188
189
190
191/*
192FUNCTION
193 bfd_scan_arch
194
195SYNOPSIS
196 bfd_arch_info_type *bfd_scan_arch(CONST char *string);
197
198DESCRIPTION
199 Figure out if BFD supports any cpu which could be described with
200 the name @var{string}. Return a pointer to an <<arch_info>>
201 structure if a machine is found, otherwise NULL.
202
203*/
204
205bfd_arch_info_type *
206bfd_scan_arch (string)
207 CONST char *string;
208{
209 struct bfd_arch_info *ap;
210
211 /* Look through all the installed architectures */
212 for (ap = bfd_arch_info_list;
213 ap != (bfd_arch_info_type *)NULL;
214 ap = ap->next) {
215
216 if (ap->scan(ap, string))
217 return ap;
218 }
219 return (bfd_arch_info_type *)NULL;
220}
221
222
223
224/*
225FUNCTION
226 bfd_arch_get_compatible
227
228SYNOPSIS
229 CONST bfd_arch_info_type *bfd_arch_get_compatible(
230 CONST bfd *abfd,
231 CONST bfd *bbfd);
232
233DESCRIPTION
234 Determine whether two BFDs'
235 architectures and machine types are compatible. Calculates
236 the lowest common denominator between the two architectures
237 and machine types implied by the BFDs and returns a pointer to
238 an <<arch_info>> structure describing the compatible machine.
239*/
240
241CONST bfd_arch_info_type *
242bfd_arch_get_compatible (abfd, bbfd)
243 CONST bfd *abfd;
244 CONST bfd *bbfd;
245{
246 return abfd->arch_info->compatible(abfd->arch_info,bbfd->arch_info);
247}
248
249
250/*
251INTERNAL_DEFINITION
252 bfd_default_arch_struct
253
254DESCRIPTION
255 The <<bfd_default_arch_struct>> is an item of
256 <<bfd_arch_info_type>> which has been initialized to a fairly
257 generic state. A BFD starts life by pointing to this
258 structure, until the correct back end has determined the real
259 architecture of the file.
260
261.extern bfd_arch_info_type bfd_default_arch_struct;
262
263*/
264
265bfd_arch_info_type bfd_default_arch_struct =
266{
267 32,32,8,bfd_arch_unknown,0,"unknown","unknown",2,true,
268 bfd_default_compatible,
269 bfd_default_scan,
270 0,
271};
272
273/*
274FUNCTION
275 bfd_set_arch_info
276
277SYNOPSIS
278 void bfd_set_arch_info(bfd *abfd, bfd_arch_info_type *arg);
279
280DESCRIPTION
281 Set the architecture info of @var{abfd} to @var{arg}.
282*/
283
284void
285bfd_set_arch_info (abfd, arg)
286 bfd *abfd;
287 bfd_arch_info_type *arg;
288{
289 abfd->arch_info = arg;
290}
291
292/*
293INTERNAL_FUNCTION
294 bfd_default_set_arch_mach
295
296SYNOPSIS
297 boolean bfd_default_set_arch_mach(bfd *abfd,
298 enum bfd_architecture arch,
299 unsigned long mach);
300
301DESCRIPTION
302 Set the architecture and machine type in BFD @var{abfd}
303 to @var{arch} and @var{mach}. Find the correct
304 pointer to a structure and insert it into the <<arch_info>>
305 pointer.
306*/
307
308boolean
309bfd_default_set_arch_mach (abfd, arch, mach)
310 bfd *abfd;
311 enum bfd_architecture arch;
312 unsigned long mach;
313{
314 static struct bfd_arch_info *old_ptr = &bfd_default_arch_struct;
315 boolean found = false;
316 /* run through the table to find the one we want, we keep a little
317 cache to speed things up */
318 if (old_ptr == 0 || arch != old_ptr->arch || mach != old_ptr->mach) {
319 bfd_arch_info_type *ptr;
320 old_ptr = (bfd_arch_info_type *)NULL;
321 for (ptr = bfd_arch_info_list;
322 ptr != (bfd_arch_info_type *)NULL;
323 ptr= ptr->next) {
324 if (ptr->arch == arch &&
325 ((ptr->mach == mach) || (ptr->the_default && mach == 0))) {
326 old_ptr = ptr;
327 found = true;
328 break;
329 }
330 }
331 if (found==false) {
332 /*looked for it and it wasn't there, so put in the default */
333 old_ptr = &bfd_default_arch_struct;
334 bfd_set_error (bfd_error_bad_value);
335 }
336 }
337 else {
338 /* it was in the cache */
339 found = true;
340 }
341
342 abfd->arch_info = old_ptr;
343
344 return found;
345}
346
347
348/*
349FUNCTION
350 bfd_get_arch
351
352SYNOPSIS
353 enum bfd_architecture bfd_get_arch(bfd *abfd);
354
355DESCRIPTION
356 Return the enumerated type which describes the BFD @var{abfd}'s
357 architecture.
358
359*/
360
361enum bfd_architecture
362bfd_get_arch (abfd)
363 bfd *abfd;
364{
365 return abfd->arch_info->arch;
366}
367
368/*
369FUNCTION
370 bfd_get_mach
371
372SYNOPSIS
373 unsigned long bfd_get_mach(bfd *abfd);
374
375DESCRIPTION
376 Return the long type which describes the BFD @var{abfd}'s
377 machine.
378*/
379
380unsigned long
381bfd_get_mach (abfd)
382 bfd *abfd;
383{
384 return abfd->arch_info->mach;
385}
386
387/*
388FUNCTION
389 bfd_arch_bits_per_byte
390
391SYNOPSIS
392 unsigned int bfd_arch_bits_per_byte(bfd *abfd);
393
394DESCRIPTION
395 Return the number of bits in one of the BFD @var{abfd}'s
396 architecture's bytes.
397
398*/
399
400unsigned int
401bfd_arch_bits_per_byte (abfd)
402 bfd *abfd;
403{
404 return abfd->arch_info->bits_per_byte;
405}
406
407/*
408FUNCTION
409 bfd_arch_bits_per_address
410
411SYNOPSIS
412 unsigned int bfd_arch_bits_per_address(bfd *abfd);
413
414DESCRIPTION
415 Return the number of bits in one of the BFD @var{abfd}'s
416 architecture's addresses.
417*/
418
419unsigned int
420bfd_arch_bits_per_address (abfd)
421 bfd *abfd;
422{
423 return abfd->arch_info->bits_per_address;
424}
425
426
427extern void bfd_a29k_arch PARAMS ((void));
428extern void bfd_alpha_arch PARAMS ((void));
429extern void bfd_arm_arch PARAMS ((void));
430extern void bfd_h8300_arch PARAMS ((void));
431extern void bfd_h8500_arch PARAMS ((void));
432extern void bfd_hppa_arch PARAMS ((void));
433extern void bfd_i386_arch PARAMS ((void));
434extern void bfd_i960_arch PARAMS ((void));
435extern void bfd_m68k_arch PARAMS ((void));
436extern void bfd_m88k_arch PARAMS ((void));
437extern void bfd_mips_arch PARAMS ((void));
438extern void bfd_powerpc_arch PARAMS ((void));
439extern void bfd_rs6000_arch PARAMS ((void));
440extern void bfd_sh_arch PARAMS ((void));
441/* start-sanitize-rce */
442extern void bfd_rce_arch PARAMS ((void));
443/* end-sanitize-rce */
444extern void bfd_sparc_arch PARAMS ((void));
445extern void bfd_vax_arch PARAMS ((void));
446extern void bfd_we32k_arch PARAMS ((void));
447extern void bfd_z8k_arch PARAMS ((void));
448extern void bfd_ns32k_arch PARAMS ((void));
449
450static void (*archures_init_table[]) PARAMS ((void)) =
451{
452#ifdef SELECT_ARCHITECTURES
453 SELECT_ARCHITECTURES,
454#else
455 bfd_a29k_arch,
456 bfd_alpha_arch,
457 bfd_arm_arch,
458 bfd_h8300_arch,
459 bfd_h8500_arch,
460 bfd_hppa_arch,
461 bfd_i386_arch,
462 bfd_i960_arch,
463 bfd_m68k_arch,
464 bfd_m88k_arch,
465 bfd_mips_arch,
466 bfd_powerpc_arch,
467 bfd_rs6000_arch,
468 bfd_sh_arch,
469/* start-sanitize-rce */
470 bfd_rce_arch,
471/* end-sanitize-rce */
472 bfd_sparc_arch,
473 bfd_vax_arch,
474 bfd_we32k_arch,
475 bfd_z8k_arch,
476 bfd_ns32k_arch,
477#endif
478 0
479 };
480
481
482
483/*
484INTERNAL_FUNCTION
485 bfd_arch_init
486
487SYNOPSIS
488 void bfd_arch_init(void);
489
490DESCRIPTION
491 Initialize the architecture dispatch table by
492 calling all installed architecture packages and getting them
493 to poke around.
494*/
495
496void
497bfd_arch_init ()
498{
499 void (**ptable) PARAMS ((void));
500 for (ptable = archures_init_table;
501 *ptable ;
502 ptable++)
503 {
504 (*ptable)();
505 }
506}
507
508
509/*
510INTERNAL_FUNCTION
511 bfd_arch_linkin
512
513SYNOPSIS
514 void bfd_arch_linkin(bfd_arch_info_type *ptr);
515
516DESCRIPTION
517 Link the architecture info structure @var{ptr} into the list.
518*/
519
520void
521bfd_arch_linkin (ptr)
522 bfd_arch_info_type *ptr;
523{
524 ptr->next = bfd_arch_info_list;
525 bfd_arch_info_list = ptr;
526}
527
528
529/*
530INTERNAL_FUNCTION
531 bfd_default_compatible
532
533SYNOPSIS
534 CONST bfd_arch_info_type *bfd_default_compatible
535 (CONST bfd_arch_info_type *a,
536 CONST bfd_arch_info_type *b);
537
538DESCRIPTION
539 The default function for testing for compatibility.
540*/
541
542CONST bfd_arch_info_type *
543bfd_default_compatible (a,b)
544 CONST bfd_arch_info_type *a;
545 CONST bfd_arch_info_type *b;
546{
547 if(a->arch != b->arch) return NULL;
548
549 if (a->mach > b->mach) {
550 return a;
551 }
552 if (b->mach > a->mach) {
553 return b;
554 }
555 return a;
556}
557
558
559/*
560INTERNAL_FUNCTION
561 bfd_default_scan
562
563SYNOPSIS
564 boolean bfd_default_scan(CONST struct bfd_arch_info *info, CONST char *string);
565
566DESCRIPTION
567 The default function for working out whether this is an
568 architecture hit and a machine hit.
569*/
570
571boolean
572bfd_default_scan (info, string)
573 CONST struct bfd_arch_info *info;
574 CONST char *string;
575{
576 CONST char *ptr_src;
577 CONST char *ptr_tst;
578 unsigned long number;
579 enum bfd_architecture arch;
580 /* First test for an exact match */
581 if (strcmp(string, info->printable_name) == 0) return true;
582
583 /* See how much of the supplied string matches with the
584 architecture, eg the string m68k:68020 would match the 68k entry
585 up to the :, then we get left with the machine number */
586
587 for (ptr_src = string,
588 ptr_tst = info->arch_name;
589 *ptr_src && *ptr_tst;
590 ptr_src++,
591 ptr_tst++)
592 {
593 if (*ptr_src != *ptr_tst) break;
594 }
595
596 /* Chewed up as much of the architecture as will match, skip any
597 colons */
598 if (*ptr_src == ':') ptr_src++;
599
600 if (*ptr_src == 0) {
601 /* nothing more, then only keep this one if it is the default
602 machine for this architecture */
603 return info->the_default;
604 }
605 number = 0;
606 while (isdigit(*ptr_src)) {
607 number = number * 10 + *ptr_src - '0';
608 ptr_src++;
609 }
610
611 switch (number)
612 {
613 case 300:
614 arch = bfd_arch_h8300;
615 break;
616
617 case 500:
618 arch = bfd_arch_h8500;
619 break;
620
621 case 68010:
622 case 68020:
623 case 68030:
624 case 68040:
625 case 68332:
626 case 68050:
627 case 68000:
628 arch = bfd_arch_m68k;
629 break;
630 case 386:
631 case 80386:
632 case 486:
633 case 80486:
634 arch = bfd_arch_i386;
635 break;
636 case 29000:
637 arch = bfd_arch_a29k;
638 break;
639
640 case 8000:
641 arch = bfd_arch_z8k;
642 break;
643
644 case 32000:
645 arch = bfd_arch_we32k;
646 break;
647
648 case 860:
649 case 80860:
650 arch = bfd_arch_i860;
651 break;
652 case 960:
653 case 80960:
654 arch = bfd_arch_i960;
655 break;
656
657 case 2000:
658 case 3000:
659 case 4000:
660 case 4400:
661 arch = bfd_arch_mips;
662 break;
663
664 case 6000:
665 arch = bfd_arch_rs6000;
666 break;
667
668 default:
669 return false;
670 }
671 if (arch != info->arch)
672 return false;
673
674 if (number != info->mach)
675 return false;
676
677 return true;
678}
679
680
681/*
682FUNCTION
683 bfd_get_arch_info
684
685SYNOPSIS
686 bfd_arch_info_type * bfd_get_arch_info(bfd *abfd);
687
688DESCRIPTION
689 Return the architecture info struct in @var{abfd}.
690*/
691
692bfd_arch_info_type *
693bfd_get_arch_info (abfd)
694 bfd *abfd;
695{
696 return abfd->arch_info;
697}
698
699
700/*
701FUNCTION
702 bfd_lookup_arch
703
704SYNOPSIS
705 bfd_arch_info_type *bfd_lookup_arch
706 (enum bfd_architecture
707 arch,
708 long machine);
709
710DESCRIPTION
711 Look for the architecure info structure which matches the
712 arguments @var{arch} and @var{machine}. A machine of 0 matches the
713 machine/architecture structure which marks itself as the
714 default.
715*/
716
717bfd_arch_info_type *
718bfd_lookup_arch (arch, machine)
719 enum bfd_architecture arch;
720 long machine;
721{
722 bfd_arch_info_type *ap;
723 bfd_check_init();
724 for (ap = bfd_arch_info_list;
725 ap != (bfd_arch_info_type *)NULL;
726 ap = ap->next) {
727 if (ap->arch == arch &&
728 ((ap->mach == machine)
729 || (ap->the_default && machine == 0))) {
730 return ap;
731 }
732 }
733 return (bfd_arch_info_type *)NULL;
734}
735
736
737/*
738FUNCTION
739 bfd_printable_arch_mach
740
741SYNOPSIS
742 CONST char *bfd_printable_arch_mach
743 (enum bfd_architecture arch, unsigned long machine);
744
745DESCRIPTION
746 Return a printable string representing the architecture and
747 machine type.
748
749 This routine is depreciated.
750*/
751
752CONST char *
753bfd_printable_arch_mach (arch, machine)
754 enum bfd_architecture arch;
755 unsigned long machine;
756{
757 bfd_arch_info_type *ap = bfd_lookup_arch(arch, machine);
758 if(ap) return ap->printable_name;
759 return "UNKNOWN!";
760}
This page took 0.024369 seconds and 4 git commands to generate.