Imported Upstream version 0.155
[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 elfutils.
4
5    This file is free software; you can redistribute it and/or modify
6    it under the terms of either
7
8      * the GNU Lesser General Public License as published by the Free
9        Software Foundation; either version 3 of the License, or (at
10        your option) any later version
11
12    or
13
14      * the GNU General Public License as published by the Free
15        Software Foundation; either version 2 of the License, or (at
16        your option) any later version
17
18    or both in parallel, as here.
19
20    elfutils is distributed in the hope that it will be useful, but
21    WITHOUT ANY WARRANTY; without even the implied warranty of
22    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
23    General Public License for more details.
24
25    You should have received copies of the GNU General Public License and
26    the GNU Lesser General Public License along with this program.  If
27    not, see <http://www.gnu.org/licenses/>.  */
28
29 #ifdef HAVE_CONFIG_H
30 # include <config.h>
31 #endif
32
33 #include <string.h>
34 #include <dwarf.h>
35
36 #define BACKEND i386_
37 #include "libebl_CPU.h"
38
39 ssize_t
40 ia64_register_info (Ebl *ebl __attribute__ ((unused)),
41                     int regno, char *name, size_t namelen,
42                     const char **prefix, const char **setname,
43                     int *bits, int *type)
44 {
45   if (name == NULL)
46     return 687 + 64;
47
48   if (regno < 0 || regno > 687 + 63 || namelen < 12)
49     return -1;
50
51   *prefix = "ar.";
52   *setname = "application";
53   *bits = 64;
54   *type = DW_ATE_signed;
55   switch (regno)
56     {
57     case 0 ... 9:
58       name[0] = 'r';
59       name[1] = (regno - 0) + '0';
60       namelen = 2;
61       *setname = "integer";
62       *prefix = "";
63       break;
64
65     case 10 ... 99:
66       name[0] = 'r';
67       name[1] = (regno - 0) / 10 + '0';
68       name[2] = (regno - 0) % 10 + '0';
69       namelen = 3;
70       *setname = "integer";
71       *prefix = "";
72       break;
73
74     case 100 ... 127:
75       name[0] = 'r';
76       name[1] = '1';
77       name[2] = (regno - 100) / 10 + '0';
78       name[3] = (regno - 0) % 10 + '0';
79       namelen = 4;
80       *setname = "integer";
81       *prefix = "";
82       break;
83
84     case 128 + 0 ... 128 + 9:
85       name[0] = 'f';
86       name[1] = (regno - 128) + '0';
87       namelen = 2;
88       *type = DW_ATE_float;
89       *bits = 128;
90       *setname = "FPU";
91       *prefix = "";
92       break;
93
94     case 128 + 10 ... 128 + 99:
95       name[0] = 'f';
96       name[1] = (regno - 128) / 10 + '0';
97       name[2] = (regno - 128) % 10 + '0';
98       namelen = 3;
99       *setname = "FPU";
100       *prefix = "";
101       break;
102
103     case 128 + 100 ... 128 + 127:
104       name[0] = 'f';
105       name[1] = '1';
106       name[2] = (regno - 128 - 100) / 10 + '0';
107       name[3] = (regno - 128) % 10 + '0';
108       namelen = 4;
109       *type = DW_ATE_float;
110       *bits = 128;
111       *setname = "FPU";
112       *prefix = "";
113       break;
114
115     case 320 + 0 ... 320 + 7:
116       name[0] = 'b';
117       name[1] = (regno - 320) + '0';
118       namelen = 2;
119       *type = DW_ATE_address;
120       *setname = "branch";
121       *prefix = "";
122       break;
123
124     case 328 ... 333:
125       {
126         static const char named_special[][5] =
127           {
128             "vfp", "vrap", "pr", "ip", "psr", "cfm"
129           };
130         *setname = "special";
131         *prefix = "";
132         *type = regno == 331 ? DW_ATE_address : DW_ATE_unsigned;
133         return stpcpy (name, named_special[regno - 328]) + 1 - name;
134       }
135
136     case 590:
137       *setname = "special";
138       *prefix = "";
139       *type = DW_ATE_unsigned;
140       return stpcpy (name, "bof") + 1 - name;
141
142     case 334 + 0 ... 334 + 7:
143       name[0] = 'k';
144       name[1] = 'r';
145       name[2] = (regno - 334) + '0';
146       namelen = 3;
147       *prefix = "";
148       break;
149
150     case 334 + 8 ... 334 + 127:
151       {
152         static const char named_ar[][9] =
153           {
154             [16 - 8] = "rsc",
155             [17 - 8] = "bsp",
156             [18 - 8] = "bspstore",
157             [19 - 8] = "rnat",
158             [21 - 8] = "fcr",
159             [24 - 8] = "eflag",
160             [25 - 8] = "csd",
161             [26 - 8] = "ssd",
162             [27 - 8] = "cflg",
163             [28 - 8] = "fsr",
164             [29 - 8] = "fir",
165             [30 - 8] = "fdr",
166             [32 - 8] = "ccv",
167             [36 - 8] = "unat",
168             [40 - 8] = "fpsr",
169             [44 - 8] = "itc",
170             [64 - 8] = "pfs",
171             [65 - 8] = "lc",
172             [66 - 8] = "ec",
173           };
174         const size_t idx = regno - (334 + 8);
175         *type = DW_ATE_unsigned;
176         if (idx == 1 || idx == 2)
177           *type = DW_ATE_address;
178         if (idx < sizeof named_ar / sizeof named_ar[0]
179             && named_ar[idx][0] != '\0')
180           return stpcpy (name, named_ar[idx]) + 1 - name;
181
182         name[0] = 'a';
183         name[1] = 'r';
184         switch (regno - 334)
185           {
186           case 0 ... 9:
187             name[2] = (regno - 334) + '0';
188             namelen = 3;
189             break;
190           case 10 ... 99:
191             name[2] = (regno - 334) / 10 + '0';
192             name[3] = (regno - 334) % 10 + '0';
193             namelen = 4;
194             break;
195           case 100 ... 127:
196             name[2] = '1';
197             name[3] = (regno - 334 - 100) / 10 + '0';
198             name[4] = (regno - 334) % 10 + '0';
199             namelen = 5;
200             break;
201           }
202         *prefix = "";
203         break;
204       }
205
206     case 462 + 0 ... 462 + 9:
207       name[0] = 'n';
208       name[1] = 'a';
209       name[2] = 't';
210       name[3] = (regno - 462) + '0';
211       namelen = 4;
212       *setname = "NAT";
213       *type = DW_ATE_boolean;
214       *bits = 1;
215       *prefix = "";
216       break;
217
218     case 462 + 10 ... 462 + 99:
219       name[0] = 'n';
220       name[1] = 'a';
221       name[2] = 't';
222       name[3] = (regno - 462) / 10 + '0';
223       name[4] = (regno - 462) % 10 + '0';
224       namelen = 5;
225       *setname = "NAT";
226       *type = DW_ATE_boolean;
227       *bits = 1;
228       *prefix = "";
229       break;
230
231     case 462 + 100 ... 462 + 127:
232       name[0] = 'n';
233       name[1] = 'a';
234       name[2] = 't';
235       name[3] = '1';
236       name[4] = (regno - 462 - 100) / 10 + '0';
237       name[5] = (regno - 462) % 10 + '0';
238       namelen = 6;
239       *setname = "NAT";
240       *type = DW_ATE_boolean;
241       *bits = 1;
242       *prefix = "";
243       break;
244
245     case 687 + 0 ... 687 + 9:
246       name[0] = 'p';
247       name[1] = (regno - 687) + '0';
248       namelen = 2;
249       *setname = "predicate";
250       *type = DW_ATE_boolean;
251       *bits = 1;
252       *prefix = "";
253       break;
254
255     case 687 + 10 ... 687 + 63:
256       name[0] = 'p';
257       name[1] = (regno - 687) / 10 + '0';
258       name[2] = (regno - 687) % 10 + '0';
259       namelen = 3;
260       *setname = "predicate";
261       *type = DW_ATE_boolean;
262       *bits = 1;
263       *prefix = "";
264       break;
265
266     default:
267       *setname = NULL;
268       return 0;
269     }
270
271   name[namelen++] = '\0';
272   return namelen;
273 }