Imported Upstream version 0.153
[platform/upstream/elfutils.git] / backends / ia64_regs.c
1 /* Register names and numbers for IA64 DWARF.
2    Copyright (C) 2006 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 i386_
34 #include "libebl_CPU.h"
35
36 ssize_t
37 ia64_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 687 + 64;
44
45   if (regno < 0 || regno > 687 + 63 || namelen < 12)
46     return -1;
47
48   *prefix = "ar.";
49   *setname = "application";
50   *bits = 64;
51   *type = DW_ATE_signed;
52   switch (regno)
53     {
54     case 0 ... 9:
55       name[0] = 'r';
56       name[1] = (regno - 0) + '0';
57       namelen = 2;
58       *setname = "integer";
59       *prefix = "";
60       break;
61
62     case 10 ... 99:
63       name[0] = 'r';
64       name[1] = (regno - 0) / 10 + '0';
65       name[2] = (regno - 0) % 10 + '0';
66       namelen = 3;
67       *setname = "integer";
68       *prefix = "";
69       break;
70
71     case 100 ... 127:
72       name[0] = 'r';
73       name[1] = '1';
74       name[2] = (regno - 100) / 10 + '0';
75       name[3] = (regno - 0) % 10 + '0';
76       namelen = 4;
77       *setname = "integer";
78       *prefix = "";
79       break;
80
81     case 128 + 0 ... 128 + 9:
82       name[0] = 'f';
83       name[1] = (regno - 128) + '0';
84       namelen = 2;
85       *type = DW_ATE_float;
86       *bits = 128;
87       *setname = "FPU";
88       *prefix = "";
89       break;
90
91     case 128 + 10 ... 128 + 99:
92       name[0] = 'f';
93       name[1] = (regno - 128) / 10 + '0';
94       name[2] = (regno - 128) % 10 + '0';
95       namelen = 3;
96       *setname = "FPU";
97       *prefix = "";
98       break;
99
100     case 128 + 100 ... 128 + 127:
101       name[0] = 'f';
102       name[1] = '1';
103       name[2] = (regno - 128 - 100) / 10 + '0';
104       name[3] = (regno - 128) % 10 + '0';
105       namelen = 4;
106       *type = DW_ATE_float;
107       *bits = 128;
108       *setname = "FPU";
109       *prefix = "";
110       break;
111
112     case 320 + 0 ... 320 + 7:
113       name[0] = 'b';
114       name[1] = (regno - 320) + '0';
115       namelen = 2;
116       *type = DW_ATE_address;
117       *setname = "branch";
118       *prefix = "";
119       break;
120
121     case 328 ... 333:
122       {
123         static const char named_special[][5] =
124           {
125             "vfp", "vrap", "pr", "ip", "psr", "cfm"
126           };
127         *setname = "special";
128         *prefix = "";
129         *type = regno == 331 ? DW_ATE_address : DW_ATE_unsigned;
130         return stpcpy (name, named_special[regno - 328]) + 1 - name;
131       }
132
133     case 590:
134       *setname = "special";
135       *prefix = "";
136       *type = DW_ATE_unsigned;
137       return stpcpy (name, "bof") + 1 - name;
138
139     case 334 + 0 ... 334 + 7:
140       name[0] = 'k';
141       name[1] = 'r';
142       name[2] = (regno - 334) + '0';
143       namelen = 3;
144       *prefix = "";
145       break;
146
147     case 334 + 8 ... 334 + 127:
148       {
149         static const char named_ar[][9] =
150           {
151             [16 - 8] = "rsc",
152             [17 - 8] = "bsp",
153             [18 - 8] = "bspstore",
154             [19 - 8] = "rnat",
155             [21 - 8] = "fcr",
156             [24 - 8] = "eflag",
157             [25 - 8] = "csd",
158             [26 - 8] = "ssd",
159             [27 - 8] = "cflg",
160             [28 - 8] = "fsr",
161             [29 - 8] = "fir",
162             [30 - 8] = "fdr",
163             [32 - 8] = "ccv",
164             [36 - 8] = "unat",
165             [40 - 8] = "fpsr",
166             [44 - 8] = "itc",
167             [64 - 8] = "pfs",
168             [65 - 8] = "lc",
169             [66 - 8] = "ec",
170           };
171         const size_t idx = regno - (334 + 8);
172         *type = DW_ATE_unsigned;
173         if (idx == 1 || idx == 2)
174           *type = DW_ATE_address;
175         if (idx < sizeof named_ar / sizeof named_ar[0]
176             && named_ar[idx][0] != '\0')
177           return stpcpy (name, named_ar[idx]) + 1 - name;
178
179         name[0] = 'a';
180         name[1] = 'r';
181         switch (regno - 334)
182           {
183           case 0 ... 9:
184             name[2] = (regno - 334) + '0';
185             namelen = 3;
186             break;
187           case 10 ... 99:
188             name[2] = (regno - 334) / 10 + '0';
189             name[3] = (regno - 334) % 10 + '0';
190             namelen = 4;
191             break;
192           case 100 ... 127:
193             name[2] = '1';
194             name[3] = (regno - 334 - 100) / 10 + '0';
195             name[4] = (regno - 334) % 10 + '0';
196             namelen = 5;
197             break;
198           }
199         *prefix = "";
200         break;
201       }
202
203     case 462 + 0 ... 462 + 9:
204       name[0] = 'n';
205       name[1] = 'a';
206       name[2] = 't';
207       name[3] = (regno - 462) + '0';
208       namelen = 4;
209       *setname = "NAT";
210       *type = DW_ATE_boolean;
211       *bits = 1;
212       *prefix = "";
213       break;
214
215     case 462 + 10 ... 462 + 99:
216       name[0] = 'n';
217       name[1] = 'a';
218       name[2] = 't';
219       name[3] = (regno - 462) / 10 + '0';
220       name[4] = (regno - 462) % 10 + '0';
221       namelen = 5;
222       *setname = "NAT";
223       *type = DW_ATE_boolean;
224       *bits = 1;
225       *prefix = "";
226       break;
227
228     case 462 + 100 ... 462 + 127:
229       name[0] = 'n';
230       name[1] = 'a';
231       name[2] = 't';
232       name[3] = '1';
233       name[4] = (regno - 462 - 100) / 10 + '0';
234       name[5] = (regno - 462) % 10 + '0';
235       namelen = 6;
236       *setname = "NAT";
237       *type = DW_ATE_boolean;
238       *bits = 1;
239       *prefix = "";
240       break;
241
242     case 687 + 0 ... 687 + 9:
243       name[0] = 'p';
244       name[1] = (regno - 687) + '0';
245       namelen = 2;
246       *setname = "predicate";
247       *type = DW_ATE_boolean;
248       *bits = 1;
249       *prefix = "";
250       break;
251
252     case 687 + 10 ... 687 + 63:
253       name[0] = 'p';
254       name[1] = (regno - 687) / 10 + '0';
255       name[2] = (regno - 687) % 10 + '0';
256       namelen = 3;
257       *setname = "predicate";
258       *type = DW_ATE_boolean;
259       *bits = 1;
260       *prefix = "";
261       break;
262
263     default:
264       *setname = NULL;
265       return 0;
266     }
267
268   name[namelen++] = '\0';
269   return namelen;
270 }