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