Brian Silverman | 8649792 | 2018-02-10 19:28:39 -0500 | [diff] [blame] | 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 | } |