Imported Upstream version 0.153
[platform/upstream/elfutils.git] / backends / sh_regs.c
1 /* Register names and numbers for SH DWARF.
2    Copyright (C) 2010 Red Hat, Inc.
3    This file is part of Red Hat elfutils.
4    Contributed by Matt Fleming <matt@console-pimps.org>.
5
6    Red Hat elfutils is free software; you can redistribute it and/or modify
7    it under the terms of the GNU General Public License as published by the
8    Free Software Foundation; version 2 of the License.
9
10    Red Hat elfutils is distributed in the hope that it will be useful, but
11    WITHOUT ANY WARRANTY; without even the implied warranty of
12    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
13    General Public License for more details.
14
15    You should have received a copy of the GNU General Public License along
16    with Red Hat elfutils; if not, write to the Free Software Foundation,
17    Inc., 51 Franklin Street, Fifth Floor, Boston MA 02110-1301 USA.
18
19    Red Hat elfutils is an included package of the Open Invention Network.
20    An included package of the Open Invention Network is a package for which
21    Open Invention Network licensees cross-license their patents.  No patent
22    license is granted, either expressly or impliedly, by designation as an
23    included package.  Should you wish to participate in the Open Invention
24    Network licensing program, please visit www.openinventionnetwork.com
25    <http://www.openinventionnetwork.com>.  */
26
27 #ifdef HAVE_CONFIG_H
28 # include <config.h>
29 #endif
30
31 #include <assert.h>
32 #include <dwarf.h>
33 #include <string.h>
34
35 #define BACKEND sh_
36 #include "libebl_CPU.h"
37
38 ssize_t
39 sh_register_info (Ebl *ebl __attribute__ ((unused)),
40                   int regno, char *name, size_t namelen,
41                   const char **prefix, const char **setname,
42                   int *bits, int *type)
43 {
44   if (name == NULL)
45     return 104;
46
47   if (regno < 0 || regno > 103 || namelen < 6)
48     return -1;
49
50   *prefix = NULL;
51   *bits = 32;
52   *type = DW_ATE_signed;
53
54   switch (regno)
55     {
56     case 0 ... 9:
57       *setname = "integer";
58       name[0] = 'r';
59       name[1] = regno + '0';
60       namelen = 2;
61       break;
62
63     case 10 ... 15:
64       *setname = "integer";
65       name[0] = 'r';
66       name[1] = '1';
67       name[2] = regno - 10 + '0';
68       namelen = 3;
69       break;
70
71     case 16:
72       *setname = "system";
73       *type = DW_ATE_address;
74       name[0] = 'p';
75       name[1] = 'c';
76       namelen = 2;
77       break;
78
79     case 17:
80       *setname = "system";
81       *type = DW_ATE_address;
82       name[0] = 'p';
83       name[1] = 'r';
84       namelen = 2;
85       break;
86
87     case 18:
88       *setname = "control";
89       *type = DW_ATE_unsigned;
90       name[0] = 's';
91       name[1] = 'r';
92       namelen = 2;
93       break;
94
95     case 19:
96       *setname = "control";
97       *type = DW_ATE_unsigned;
98       name[0] = 'g';
99       name[1] = 'b';
100       name[2] = 'r';
101       namelen = 3;
102       break;
103
104     case 20:
105       *setname = "system";
106       name[0] = 'm';
107       name[1] = 'a';
108       name[2] = 'c';
109       name[3] = 'h';
110       namelen = 4;
111       break;
112
113     case 21:
114       *setname = "system";
115       name[0] = 'm';
116       name[1] = 'a';
117       name[2] = 'c';
118       name[3] = 'l';
119       namelen = 4;
120
121       break;
122
123     case 23:
124       *setname = "system";
125       *type = DW_ATE_unsigned;
126       name[0] = 'f';
127       name[1] = 'p';
128       name[2] = 'u';
129       name[3] = 'l';
130       namelen = 4;
131       break;
132
133     case 24:
134       *setname = "system";
135       *type = DW_ATE_unsigned;
136       name[0] = 'f';
137       name[1] = 'p';
138       name[2] = 's';
139       name[3] = 'c';
140       name[4] = 'r';
141       namelen = 5;
142       break;
143
144     case 25 ... 34:
145       *setname = "fpu";
146       *type = DW_ATE_float;
147       name[0] = 'f';
148       name[1] = 'r';
149       name[2] = regno - 25 + '0';
150       namelen = 3;
151       break;
152
153     case 35 ... 40:
154       *setname = "fpu";
155       *type = DW_ATE_float;
156       name[0] = 'f';
157       name[1] = 'r';
158       name[2] = '1';
159       name[3] = regno - 35 + '0';
160       namelen = 4;
161       break;
162
163     case 87 ... 96:
164       *type = DW_ATE_float;
165       *setname = "fpu";
166       name[0] = 'x';
167       name[1] = 'f';
168       name[2] = regno - 87 + '0';
169       namelen = 3;
170       break;
171
172     case 97 ... 103:
173       *type = DW_ATE_float;
174       *setname = "fpu";
175       name[0] = 'x';
176       name[1] = 'f';
177       name[2] = '1';
178       name[3] = regno - 97 + '0';
179       namelen = 4;
180       break;
181
182     default:
183       return 0;
184     }
185
186   name[namelen++] = '\0';
187   return namelen;
188 }