]> Git Repo - binutils.git/blob - bfd/cpu-h8300.c
daily update
[binutils.git] / bfd / cpu-h8300.c
1 /* BFD library support routines for the Renesas H8/300 architecture.
2    Copyright 1990, 1991, 1992, 1993, 1994, 1995, 1996, 2000, 2001, 2002, 2003
3    Free Software Foundation, Inc.
4    Hacked by Steve Chamberlain of Cygnus Support.
5
6    This file is part of BFD, the Binary File Descriptor library.
7
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.
12
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.
17
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., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.  */
21
22 #include "bfd.h"
23 #include "sysdep.h"
24 #include "libbfd.h"
25
26 static bfd_boolean h8300_scan
27   PARAMS ((const struct bfd_arch_info *, const char *));
28 static const bfd_arch_info_type * compatible
29   PARAMS ((const bfd_arch_info_type *, const bfd_arch_info_type *));
30
31 static bfd_boolean
32 h8300_scan (info, string)
33      const struct bfd_arch_info *info;
34      const char *string;
35 {
36   if (*string != 'h' && *string != 'H')
37     return FALSE;
38
39   string++;
40   if (*string != '8')
41     return FALSE;
42
43   string++;
44   if (*string == '/')
45     string++;
46
47   if (*string != '3')
48     return FALSE;
49   string++;
50   if (*string != '0')
51     return FALSE;
52   string++;
53   if (*string != '0')
54     return FALSE;
55   string++;
56   if (*string == '-')
57     string++;
58
59   /* In ELF linker scripts, we typically express the architecture/machine
60      as architecture:machine.
61
62      So if we've matched so far and encounter a colon, try to match the
63      string following the colon.  */
64   if (*string == ':')
65     {
66       string++;
67       return h8300_scan (info, string);
68     }
69
70   if (*string == 'h' || *string == 'H')
71     {
72       string++;
73       if (*string == 'n' || *string == 'N')
74         return (info->mach == bfd_mach_h8300hn);
75
76       return (info->mach == bfd_mach_h8300h);
77     }
78   else if (*string == 's' || *string == 'S')
79     {
80       string++;
81       if (*string == 'n' || *string == 'N')
82         return (info->mach == bfd_mach_h8300sn);
83
84       return (info->mach == bfd_mach_h8300s);
85     }
86   else
87     return info->mach == bfd_mach_h8300;
88 }
89
90 /* This routine is provided two arch_infos and works out the machine
91    which would be compatible with both and returns a pointer to its
92    info structure.  */
93
94 static const bfd_arch_info_type *
95 compatible (in, out)
96      const bfd_arch_info_type *in;
97      const bfd_arch_info_type *out;
98 {
99   /* It's really not a good idea to mix and match modes.  */
100   if (in->arch != out->arch || in->mach != out->mach)
101     return 0;
102   else
103     return in;
104 }
105
106 static const bfd_arch_info_type h8300sn_info_struct =
107 {
108   32,                           /* 32 bits in a word.  */
109   32,                           /* 32 bits in an address.  */
110   8,                            /* 8 bits in a byte.  */
111   bfd_arch_h8300,
112   bfd_mach_h8300sn,
113   "h8300sn",                    /* Architecture name.  */
114   "h8300sn",                    /* Printable name.  */
115   1,
116   FALSE,                        /* The default machine.  */
117   compatible,
118   h8300_scan,
119   0
120 };
121
122
123 static const bfd_arch_info_type h8300hn_info_struct =
124 {
125   32,                           /* 32 bits in a word.  */
126   32,                           /* 32 bits in an address.  */
127   8,                            /* 8 bits in a byte.  */
128   bfd_arch_h8300,
129   bfd_mach_h8300hn,
130   "h8300hn",                    /* Architecture name.  */
131   "h8300hn",                    /* Printable name.  */
132   1,
133   FALSE,                        /* The default machine.  */
134   compatible,
135   h8300_scan,
136   &h8300sn_info_struct
137 };
138
139 static const bfd_arch_info_type h8300s_info_struct =
140 {
141   32,                           /* 32 bits in a word.  */
142   32,                           /* 32 bits in an address.  */
143   8,                            /* 8 bits in a byte.  */
144   bfd_arch_h8300,
145   bfd_mach_h8300s,
146   "h8300s",                     /* Architecture name.  */
147   "h8300s",                     /* Printable name.  */
148   1,
149   FALSE,                        /* The default machine.  */
150   compatible,
151   h8300_scan,
152   & h8300hn_info_struct
153 };
154
155 static const bfd_arch_info_type h8300h_info_struct =
156 {
157   32,                           /* 32 bits in a word.  */
158   32,                           /* 32 bits in an address.  */
159   8,                            /* 8 bits in a byte.  */
160   bfd_arch_h8300,
161   bfd_mach_h8300h,
162   "h8300h",                     /* Architecture name.  */
163   "h8300h",                     /* Printable name.  */
164   1,
165   FALSE,                        /* The default machine.  */
166   compatible,
167   h8300_scan,
168   &h8300s_info_struct
169 };
170
171 const bfd_arch_info_type bfd_h8300_arch =
172 {
173   16,                           /* 16 bits in a word.  */
174   16,                           /* 16 bits in an address.  */
175   8,                            /* 8 bits in a byte.  */
176   bfd_arch_h8300,
177   bfd_mach_h8300,
178   "h8300",                      /* Architecture name.  */
179   "h8300",                      /* Printable name.  */
180   1,
181   TRUE,                         /* The default machine.  */
182   compatible,
183   h8300_scan,
184   &h8300h_info_struct
185 };
This page took 0.034198 seconds and 4 git commands to generate.