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
38ssize_t
39sh_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}
189