Branch data Line data Source code
1 : : /* Register names and numbers for i386 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 i386_
37 : : #include "libebl_CPU.h"
38 : :
39 : : ssize_t
40 : 652 : i386_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 [ + + ]: 652 : if (name == NULL)
46 : : return 46;
47 : :
48 [ + - ]: 644 : if (regno < 0 || regno > 45 || namelen < 6)
49 : : return -1;
50 : :
51 : 644 : *prefix = "%";
52 : 644 : *bits = 32;
53 : 644 : *type = DW_ATE_unsigned;
54 [ + + ]: 644 : if (regno < 11)
55 : : {
56 : 410 : *setname = "integer";
57 [ + + ]: 410 : if (regno < 9)
58 : 394 : *type = DW_ATE_signed;
59 : : }
60 [ + + ]: 234 : else if (regno < 19)
61 : : {
62 : 48 : *setname = "x87";
63 : 48 : *type = DW_ATE_float;
64 : 48 : *bits = 80;
65 : : }
66 [ + + ]: 186 : else if (regno < 29)
67 : : {
68 : 60 : *setname = "SSE";
69 : 60 : *bits = 128;
70 : : }
71 [ + + ]: 126 : else if (regno < 37)
72 : : {
73 : 48 : *setname = "MMX";
74 : 48 : *bits = 64;
75 : : }
76 [ + + ]: 78 : else if (regno < 40)
77 : 18 : *setname = "FPU-control";
78 : : else
79 : : {
80 : 60 : *setname = "segment";
81 : 60 : *bits = 16;
82 : : }
83 : :
84 [ + + + + : 644 : switch (regno)
+ + + + +
+ + + ]
85 : : {
86 : 238 : static const char baseregs[][2] =
87 : : {
88 : : {'a', 'x'},
89 : : {'c', 'x'},
90 : : {'d', 'x'},
91 : : {'b', 'x'},
92 : : {'s', 'p'},
93 : : {'b', 'p'},
94 : : {'s', 'i'},
95 : : {'d', 'i'},
96 : : {'i', 'p'},
97 : : };
98 : :
99 : 238 : case 4:
100 : : case 5:
101 : : case 8:
102 : 238 : *type = DW_ATE_address;
103 : 394 : FALLTHROUGH;
104 : 394 : case 0 ... 3:
105 : : case 6 ... 7:
106 : 394 : name[0] = 'e';
107 : 394 : name[1] = baseregs[regno][0];
108 : 394 : name[2] = baseregs[regno][1];
109 : 394 : namelen = 3;
110 : 394 : break;
111 : :
112 : : case 9:
113 : 10 : return stpcpy (name, "eflags") + 1 - name;
114 : : case 10:
115 : 6 : return stpcpy (name, "trapno") + 1 - name;
116 : :
117 : 48 : case 11 ... 18:
118 : 48 : name[0] = 's';
119 : 48 : name[1] = 't';
120 : 48 : name[2] = regno - 11 + '0';
121 : 48 : namelen = 3;
122 : 48 : break;
123 : :
124 : 48 : case 21 ... 28:
125 : 48 : name[0] = 'x';
126 : 48 : name[1] = 'm';
127 : 48 : name[2] = 'm';
128 : 48 : name[3] = regno - 21 + '0';
129 : 48 : namelen = 4;
130 : 48 : break;
131 : :
132 : 48 : case 29 ... 36:
133 : 48 : name[0] = 'm';
134 : 48 : name[1] = 'm';
135 : 48 : name[2] = regno - 29 + '0';
136 : 48 : namelen = 3;
137 : 48 : break;
138 : :
139 : 6 : case 37:
140 : 6 : *bits = 16;
141 : 6 : return stpcpy (name, "fctrl") + 1 - name;
142 : 6 : case 38:
143 : 6 : *bits = 16;
144 : 6 : return stpcpy (name, "fstat") + 1 - name;
145 : : case 39:
146 : 6 : return stpcpy (name, "mxcsr") + 1 - name;
147 : :
148 : 60 : case 40 ... 45:
149 : 60 : name[0] = "ecsdfg"[regno - 40];
150 : 60 : name[1] = 's';
151 : 60 : namelen = 2;
152 : 60 : break;
153 : :
154 : 12 : default:
155 : 12 : *setname = NULL;
156 : 12 : return 0;
157 : : }
158 : :
159 : 598 : name[namelen++] = '\0';
160 : 598 : return namelen;
161 : : }
|