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