1 |
/* BFD support for the Axis CRIS architecture. |
/* BFD support for the Axis CRIS architecture. |
2 |
Copyright 2000 Free Software Foundation, Inc. |
Copyright 2000, 2002, 2004, 2005 Free Software Foundation, Inc. |
3 |
Contributed by Axis Communications AB. |
Contributed by Axis Communications AB. |
4 |
Written by Hans-Peter Nilsson. |
Written by Hans-Peter Nilsson. |
5 |
|
|
23 |
#include "sysdep.h" |
#include "sysdep.h" |
24 |
#include "libbfd.h" |
#include "libbfd.h" |
25 |
|
|
26 |
const bfd_arch_info_type |
/* This routine is provided two arch_infos and returns the lowest common |
27 |
bfd_cris_arch = |
denominator. CRIS v0..v10 vs. v32 are not compatible in general, but |
28 |
|
there's a compatible subset for which we provide an arch_info. */ |
29 |
|
|
30 |
|
static const bfd_arch_info_type * get_compatible |
31 |
|
PARAMS ((const bfd_arch_info_type *, const bfd_arch_info_type *)); |
32 |
|
|
33 |
|
static const bfd_arch_info_type * |
34 |
|
get_compatible (a,b) |
35 |
|
const bfd_arch_info_type *a; |
36 |
|
const bfd_arch_info_type *b; |
37 |
|
{ |
38 |
|
/* Arches must match. */ |
39 |
|
if (a->arch != b->arch) |
40 |
|
return NULL; |
41 |
|
|
42 |
|
/* If either is the compatible mach, return the other. */ |
43 |
|
if (a->mach == bfd_mach_cris_v10_v32) |
44 |
|
return b; |
45 |
|
if (b->mach == bfd_mach_cris_v10_v32) |
46 |
|
return a; |
47 |
|
|
48 |
|
#if 0 |
49 |
|
/* The code below is disabled but kept as a warning. |
50 |
|
See ldlang.c:lang_check. Quite illogically, incompatible arches |
51 |
|
(as signalled by this function) are only *warned* about, while with |
52 |
|
this function signalling compatible ones, we can have the |
53 |
|
cris_elf_merge_private_bfd_data function return an error. This is |
54 |
|
undoubtedly a FIXME: in general. Also, the |
55 |
|
command_line.warn_mismatch flag and the --no-warn-mismatch option |
56 |
|
are misnamed for the multitude of ports that signal compatibility: |
57 |
|
it is there an error, not a warning. We work around it by |
58 |
|
pretending matching machs here. */ |
59 |
|
|
60 |
|
/* Except for the compatible mach, machs must match. */ |
61 |
|
if (a->mach != b->mach) |
62 |
|
return NULL; |
63 |
|
#endif |
64 |
|
|
65 |
|
return a; |
66 |
|
} |
67 |
|
|
68 |
|
#define N(NUMBER, PRINT, NEXT) \ |
69 |
|
{ 32, 32, 8, bfd_arch_cris, NUMBER, "cris", PRINT, 1, FALSE, \ |
70 |
|
get_compatible, bfd_default_scan, NEXT } |
71 |
|
|
72 |
|
static const bfd_arch_info_type bfd_cris_arch_compat_v10_v32 = |
73 |
|
N (bfd_mach_cris_v10_v32, "cris:common_v10_v32", NULL); |
74 |
|
|
75 |
|
static const bfd_arch_info_type bfd_cris_arch_v32 = |
76 |
|
N (bfd_mach_cris_v32, "crisv32", &bfd_cris_arch_compat_v10_v32); |
77 |
|
|
78 |
|
const bfd_arch_info_type bfd_cris_arch = |
79 |
{ |
{ |
80 |
32, /* There's 32 bits_per_word. */ |
32, /* There's 32 bits_per_word. */ |
81 |
32, /* There's 32 bits_per_address. */ |
32, /* There's 32 bits_per_address. */ |
83 |
bfd_arch_cris, /* One of enum bfd_architecture, defined |
bfd_arch_cris, /* One of enum bfd_architecture, defined |
84 |
in archures.c and provided in |
in archures.c and provided in |
85 |
generated header files. */ |
generated header files. */ |
86 |
0xff, /* Only 1 machine, but #255 for |
bfd_mach_cris_v0_v10, /* Random BFD-internal number for this |
87 |
historical reasons. */ |
machine, similarly listed in |
88 |
|
archures.c. Not emitted in output. */ |
89 |
"cris", /* The arch_name. */ |
"cris", /* The arch_name. */ |
90 |
"cris", /* The printable name is the same. */ |
"cris", /* The printable name is the same. */ |
91 |
1, /* Section alignment power; each section |
1, /* Section alignment power; each section |
92 |
is aligned to (only) 2^1 bytes. */ |
is aligned to (only) 2^1 bytes. */ |
93 |
true, /* This is the default "machine", since |
TRUE, /* This is the default "machine". */ |
94 |
there's only one. */ |
get_compatible, /* A function for testing |
|
bfd_default_compatible, /* A default function for testing |
|
95 |
"machine" compatibility of two |
"machine" compatibility of two |
96 |
bfd_arch_info_type. */ |
bfd_arch_info_type. */ |
97 |
bfd_default_scan, /* Check if an bfd_arch_info_type is a |
bfd_default_scan, /* Check if a bfd_arch_info_type is a |
98 |
match. */ |
match. */ |
99 |
NULL /* Pointer to next bfd_arch_info_type in |
&bfd_cris_arch_v32 /* Pointer to next bfd_arch_info_type in |
100 |
the same family. */ |
the same family. */ |
101 |
}; |
}; |
102 |
|
|