2007-07-03 Markus Deuling <deuling@de.ibm.com>
[deliverable/binutils-gdb.git] / bfd / cpu-h8300.c
CommitLineData
c2dcd04e 1/* BFD library support routines for the Renesas H8/300 architecture.
9553c638 2 Copyright 1990, 1991, 1992, 1993, 1994, 1995, 1996, 2000, 2001, 2002,
3db64b00 3 2003, 2004, 2007 Free Software Foundation, Inc.
252b5132
RH
4 Hacked by Steve Chamberlain of Cygnus Support.
5
c2dcd04e 6 This file is part of BFD, the Binary File Descriptor library.
252b5132 7
c2dcd04e
NC
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.
252b5132 12
c2dcd04e
NC
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.
252b5132 17
c2dcd04e
NC
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
3e110533 20 Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston, MA 02110-1301, USA. */
252b5132 21
252b5132 22#include "sysdep.h"
3db64b00 23#include "bfd.h"
252b5132
RH
24#include "libbfd.h"
25
b34976b6 26static bfd_boolean
c6baf75e 27h8300_scan (const struct bfd_arch_info *info, const char *string)
252b5132
RH
28{
29 if (*string != 'h' && *string != 'H')
b34976b6 30 return FALSE;
252b5132
RH
31
32 string++;
33 if (*string != '8')
b34976b6 34 return FALSE;
252b5132
RH
35
36 string++;
37 if (*string == '/')
38 string++;
39
40 if (*string != '3')
b34976b6 41 return FALSE;
252b5132
RH
42 string++;
43 if (*string != '0')
b34976b6 44 return FALSE;
252b5132
RH
45 string++;
46 if (*string != '0')
b34976b6 47 return FALSE;
252b5132
RH
48 string++;
49 if (*string == '-')
50 string++;
0a83638b
JL
51
52 /* In ELF linker scripts, we typically express the architecture/machine
53 as architecture:machine.
54
55 So if we've matched so far and encounter a colon, try to match the
56 string following the colon. */
57 if (*string == ':')
58 {
59 string++;
eea78af1 60 return h8300_scan (info, string);
0a83638b
JL
61 }
62
252b5132
RH
63 if (*string == 'h' || *string == 'H')
64 {
8d9cd6b1
NC
65 string++;
66 if (*string == 'n' || *string == 'N')
67 return (info->mach == bfd_mach_h8300hn);
68
252b5132
RH
69 return (info->mach == bfd_mach_h8300h);
70 }
71 else if (*string == 's' || *string == 'S')
72 {
8d9cd6b1
NC
73 string++;
74 if (*string == 'n' || *string == 'N')
75 return (info->mach == bfd_mach_h8300sn);
76
5d1db417 77 if (*string == 'x' || *string == 'X')
f4984206
RS
78 {
79 string++;
80 if (*string == 'n' || *string == 'N')
81 return (info->mach == bfd_mach_h8300sxn);
82
83 return (info->mach == bfd_mach_h8300sx);
84 }
5d1db417 85
252b5132
RH
86 return (info->mach == bfd_mach_h8300s);
87 }
88 else
8d9cd6b1 89 return info->mach == bfd_mach_h8300;
252b5132
RH
90}
91
cc040812
NC
92/* This routine is provided two arch_infos and works out the machine
93 which would be compatible with both and returns a pointer to its
94 info structure. */
252b5132
RH
95
96static const bfd_arch_info_type *
c6baf75e 97compatible (const bfd_arch_info_type *in, const bfd_arch_info_type *out)
252b5132 98{
aa02cc63
AO
99 if (in->arch != out->arch)
100 return 0;
101 if (in->mach == bfd_mach_h8300sx && out->mach == bfd_mach_h8300s)
102 return in;
103 if (in->mach == bfd_mach_h8300s && out->mach == bfd_mach_h8300sx)
104 return out;
105 if (in->mach == bfd_mach_h8300sxn && out->mach == bfd_mach_h8300sn)
106 return in;
107 if (in->mach == bfd_mach_h8300sn && out->mach == bfd_mach_h8300sxn)
108 return out;
252b5132 109 /* It's really not a good idea to mix and match modes. */
aa02cc63 110 if (in->mach != out->mach)
252b5132
RH
111 return 0;
112 else
113 return in;
114}
115
f4984206
RS
116static const bfd_arch_info_type h8300sxn_info_struct =
117{
118 32, /* 32 bits in a word */
d4e2de6b 119 16, /* 16 bits in an address */
f4984206
RS
120 8, /* 8 bits in a byte */
121 bfd_arch_h8300,
122 bfd_mach_h8300sxn,
123 "h8300sxn", /* arch_name */
124 "h8300sxn", /* printable name */
125 1,
126 FALSE, /* the default machine */
127 compatible,
128 h8300_scan,
129 0
130};
131
5d1db417
MS
132static const bfd_arch_info_type h8300sx_info_struct =
133{
134 32, /* 32 bits in a word */
135 32, /* 32 bits in an address */
136 8, /* 8 bits in a byte */
137 bfd_arch_h8300,
138 bfd_mach_h8300sx,
139 "h8300sx", /* arch_name */
140 "h8300sx", /* printable name */
141 1,
142 FALSE, /* the default machine */
143 compatible,
144 h8300_scan,
f4984206 145 &h8300sxn_info_struct
5d1db417
MS
146};
147
8d9cd6b1
NC
148static const bfd_arch_info_type h8300sn_info_struct =
149{
150 32, /* 32 bits in a word. */
d4e2de6b 151 16, /* 16 bits in an address. */
8d9cd6b1
NC
152 8, /* 8 bits in a byte. */
153 bfd_arch_h8300,
154 bfd_mach_h8300sn,
155 "h8300sn", /* Architecture name. */
156 "h8300sn", /* Printable name. */
157 1,
158 FALSE, /* The default machine. */
159 compatible,
160 h8300_scan,
5d1db417 161 &h8300sx_info_struct
8d9cd6b1
NC
162};
163
8d9cd6b1
NC
164static const bfd_arch_info_type h8300hn_info_struct =
165{
166 32, /* 32 bits in a word. */
d4e2de6b 167 16, /* 16 bits in an address. */
8d9cd6b1
NC
168 8, /* 8 bits in a byte. */
169 bfd_arch_h8300,
170 bfd_mach_h8300hn,
171 "h8300hn", /* Architecture name. */
172 "h8300hn", /* Printable name. */
173 1,
174 FALSE, /* The default machine. */
175 compatible,
176 h8300_scan,
177 &h8300sn_info_struct
178};
179
4c7aad1c 180static const bfd_arch_info_type h8300s_info_struct =
252b5132 181{
8d9cd6b1
NC
182 32, /* 32 bits in a word. */
183 32, /* 32 bits in an address. */
184 8, /* 8 bits in a byte. */
252b5132 185 bfd_arch_h8300,
4c7aad1c 186 bfd_mach_h8300s,
8d9cd6b1
NC
187 "h8300s", /* Architecture name. */
188 "h8300s", /* Printable name. */
252b5132 189 1,
8d9cd6b1 190 FALSE, /* The default machine. */
252b5132
RH
191 compatible,
192 h8300_scan,
8d9cd6b1 193 & h8300hn_info_struct
252b5132
RH
194};
195
196static const bfd_arch_info_type h8300h_info_struct =
197{
8d9cd6b1
NC
198 32, /* 32 bits in a word. */
199 32, /* 32 bits in an address. */
200 8, /* 8 bits in a byte. */
252b5132
RH
201 bfd_arch_h8300,
202 bfd_mach_h8300h,
8d9cd6b1
NC
203 "h8300h", /* Architecture name. */
204 "h8300h", /* Printable name. */
252b5132 205 1,
8d9cd6b1 206 FALSE, /* The default machine. */
252b5132
RH
207 compatible,
208 h8300_scan,
4c7aad1c 209 &h8300s_info_struct
252b5132
RH
210};
211
212const bfd_arch_info_type bfd_h8300_arch =
213{
8d9cd6b1
NC
214 16, /* 16 bits in a word. */
215 16, /* 16 bits in an address. */
216 8, /* 8 bits in a byte. */
252b5132 217 bfd_arch_h8300,
4c7aad1c 218 bfd_mach_h8300,
8d9cd6b1
NC
219 "h8300", /* Architecture name. */
220 "h8300", /* Printable name. */
252b5132 221 1,
8d9cd6b1 222 TRUE, /* The default machine. */
252b5132
RH
223 compatible,
224 h8300_scan,
4c7aad1c 225 &h8300h_info_struct
252b5132 226};
2808c7aa
RS
227
228/* Pad the given address to 32 bits, converting 16-bit and 24-bit
229 addresses into the values they would have had on a h8s target. */
230
231bfd_vma
232bfd_h8300_pad_address (bfd *abfd, bfd_vma address)
233{
234 /* Cope with bfd_vma's larger than 32 bits. */
235 address &= 0xffffffffu;
236
237 switch (bfd_get_mach (abfd))
238 {
239 case bfd_mach_h8300:
240 case bfd_mach_h8300hn:
241 case bfd_mach_h8300sn:
242 case bfd_mach_h8300sxn:
243 /* Sign extend a 16-bit address. */
244 if (address >= 0x8000)
245 return address | 0xffff0000u;
246 return address;
247
248 case bfd_mach_h8300h:
249 /* Sign extend a 24-bit address. */
250 if (address >= 0x800000)
251 return address | 0xff000000u;
252 return address;
253
254 case bfd_mach_h8300s:
255 case bfd_mach_h8300sx:
256 return address;
257
258 default:
259 abort ();
260 }
261}
This page took 0.365378 seconds and 4 git commands to generate.