Branch data Line data Source code
1 : : /* Register names and numbers for PowerPC DWARF.
2 : : Copyright (C) 2005, 2006, 2007 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 ppc_
37 : : #include "libebl_CPU.h"
38 : :
39 : : ssize_t
40 : 11630 : ppc_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 [ + + ]: 11630 : if (name == NULL)
46 : : return 1156;
47 : :
48 [ + - ]: 11620 : if (regno < 0 || regno > 1155 || namelen < 8)
49 : : return -1;
50 : :
51 : 11620 : *prefix = "";
52 [ + + ]: 11620 : *bits = ebl->machine == EM_PPC64 ? 64 : 32;
53 : 23240 : *type = (regno < 32 ? DW_ATE_signed
54 [ + + + + ]: 11620 : : regno < 64 ? DW_ATE_float : DW_ATE_unsigned);
55 : :
56 [ + + + + ]: 11620 : if (regno < 32 || regno == 64 || regno == 66)
57 : 382 : *setname = "integer";
58 [ + + ]: 11228 : else if (regno < 64 || regno == 65)
59 : : {
60 : 338 : *setname = "FPU";
61 [ + + + + ]: 338 : if (ebl->machine != EM_PPC64 && regno < 64)
62 : 192 : *bits = 64;
63 : : }
64 [ + + + + ]: 10890 : else if (regno == 67 || regno == 356 || regno == 612 || regno >= 1124)
65 : : {
66 : 350 : *setname = "vector";
67 [ + + ]: 380 : *bits = regno >= 1124 ? 128 : 32;
68 : : }
69 : : else
70 : 10540 : *setname = "privileged";
71 : :
72 [ + + + + : 11620 : switch (regno)
+ + - + +
+ + + + +
+ + + + +
+ + + + +
+ + + + ]
73 : : {
74 : 128 : case 0 ... 9:
75 : 128 : name[0] = 'r';
76 : 128 : name[1] = regno + '0';
77 : 128 : namelen = 2;
78 : 128 : break;
79 : :
80 : 244 : case 10 ... 31:
81 : 244 : name[0] = 'r';
82 : 244 : name[1] = regno / 10 + '0';
83 : 244 : name[2] = regno % 10 + '0';
84 : 244 : namelen = 3;
85 : 244 : break;
86 : :
87 : 100 : case 32 + 0 ... 32 + 9:
88 : 100 : name[0] = 'f';
89 : 100 : name[1] = (regno - 32) + '0';
90 : 100 : namelen = 2;
91 : 100 : break;
92 : :
93 : 220 : case 32 + 10 ... 32 + 31:
94 : 220 : name[0] = 'f';
95 : 220 : name[1] = (regno - 32) / 10 + '0';
96 : 220 : name[2] = (regno - 32) % 10 + '0';
97 : 220 : namelen = 3;
98 : 220 : break;
99 : :
100 : : case 64:
101 : 10 : return stpcpy (name, "cr") + 1 - name;
102 : : case 65:
103 : 18 : return stpcpy (name, "fpscr") + 1 - name;
104 : : case 66:
105 : 10 : return stpcpy (name, "msr") + 1 - name;
106 : : case 67: /* XXX unofficial assignment */
107 : 10 : return stpcpy (name, "vscr") + 1 - name;
108 : :
109 : 100 : case 70 + 0 ... 70 + 9:
110 : 100 : name[0] = 's';
111 : 100 : name[1] = 'r';
112 : 100 : name[2] = (regno - 70) + '0';
113 : 100 : namelen = 3;
114 : 100 : break;
115 : :
116 : 60 : case 70 + 10 ... 70 + 15:
117 : 60 : name[0] = 's';
118 : 60 : name[1] = 'r';
119 : 60 : name[2] = (regno - 70) / 10 + '0';
120 : 60 : name[3] = (regno - 70) % 10 + '0';
121 : 60 : namelen = 4;
122 : 60 : break;
123 : :
124 : : case 101:
125 : 10 : return stpcpy (name, "xer") + 1 - name;
126 : : case 108:
127 : 10 : return stpcpy (name, "lr") + 1 - name;
128 : : case 109:
129 : 10 : return stpcpy (name, "ctr") + 1 - name;
130 : : case 118:
131 : 10 : return stpcpy (name, "dsisr") + 1 - name;
132 : : case 119:
133 : 10 : return stpcpy (name, "dar") + 1 - name;
134 : : case 122:
135 : 10 : return stpcpy (name, "dec") + 1 - name;
136 : : case 356:
137 : 10 : return stpcpy (name, "vrsave") + 1 - name;
138 : : case 612:
139 : 10 : return stpcpy (name, "spefscr") + 1 - name;
140 : 10 : case 100:
141 [ + + ]: 10 : if (*bits == 32)
142 : 6 : return stpcpy (name, "mq") + 1 - name;
143 : 64 : FALLTHROUGH;
144 : : case 102 ... 107:
145 : 64 : name[0] = 's';
146 : 64 : name[1] = 'p';
147 : 64 : name[2] = 'r';
148 : 64 : name[3] = (regno - 100) + '0';
149 : 64 : namelen = 4;
150 : 64 : break;
151 : :
152 : : case 114:
153 : 10 : return stpcpy (name, "tfhar") + 1 - name;
154 : : case 115:
155 : 10 : return stpcpy (name, "tfiar") + 1 - name;
156 : : case 116:
157 : 10 : return stpcpy (name, "texasr") + 1 - name;
158 : :
159 : 840 : case 110 ... 113:
160 : : case 117:
161 : : case 120 ... 121:
162 : : case 123 ... 199:
163 : 840 : name[0] = 's';
164 : 840 : name[1] = 'p';
165 : 840 : name[2] = 'r';
166 : 840 : name[3] = (regno - 100) / 10 + '0';
167 : 840 : name[4] = (regno - 100) % 10 + '0';
168 : 840 : namelen = 5;
169 : 840 : break;
170 : :
171 : 7980 : case 200 ... 355:
172 : : case 357 ... 611:
173 : : case 613 ... 999:
174 : 7980 : name[0] = 's';
175 : 7980 : name[1] = 'p';
176 : 7980 : name[2] = 'r';
177 : 7980 : name[3] = (regno - 100) / 100 + '0';
178 : 7980 : name[4] = ((regno - 100) % 100 / 10) + '0';
179 : 7980 : name[5] = (regno - 100) % 10 + '0';
180 : 7980 : namelen = 6;
181 : 7980 : break;
182 : :
183 : 100 : case 1124 + 0 ... 1124 + 9:
184 : 100 : name[0] = 'v';
185 : 100 : name[1] = 'r';
186 : 100 : name[2] = (regno - 1124) + '0';
187 : 100 : namelen = 3;
188 : 100 : break;
189 : :
190 : 220 : case 1124 + 10 ... 1124 + 31:
191 : 220 : name[0] = 'v';
192 : 220 : name[1] = 'r';
193 : 220 : name[2] = (regno - 1124) / 10 + '0';
194 : 220 : name[3] = (regno - 1124) % 10 + '0';
195 : 220 : namelen = 4;
196 : 220 : break;
197 : :
198 : 1400 : default:
199 : 1400 : *setname = NULL;
200 : 1400 : return 0;
201 : : }
202 : :
203 : 10056 : name[namelen++] = '\0';
204 : 10056 : return namelen;
205 : : }
206 : :
207 : : __typeof (ppc_register_info)
208 : : ppc64_register_info __attribute__ ((alias ("ppc_register_info")));
|