OLD | NEW |
1 /* Target description support for GDB. | 1 /* Target description support for GDB. |
2 | 2 |
3 Copyright (C) 2006-2012 Free Software Foundation, Inc. | 3 Copyright (C) 2006-2013 Free Software Foundation, Inc. |
4 | 4 |
5 Contributed by CodeSourcery. | 5 Contributed by CodeSourcery. |
6 | 6 |
7 This file is part of GDB. | 7 This file is part of GDB. |
8 | 8 |
9 This program is free software; you can redistribute it and/or modify | 9 This program is free software; you can redistribute it and/or modify |
10 it under the terms of the GNU General Public License as published by | 10 it under the terms of the GNU General Public License as published by |
11 the Free Software Foundation; either version 3 of the License, or | 11 the Free Software Foundation; either version 3 of the License, or |
12 (at your option) any later version. | 12 (at your option) any later version. |
13 | 13 |
(...skipping 13 matching lines...) Expand all Loading... |
27 #include "target.h" | 27 #include "target.h" |
28 #include "target-descriptions.h" | 28 #include "target-descriptions.h" |
29 #include "vec.h" | 29 #include "vec.h" |
30 #include "xml-support.h" | 30 #include "xml-support.h" |
31 #include "xml-tdesc.h" | 31 #include "xml-tdesc.h" |
32 #include "osabi.h" | 32 #include "osabi.h" |
33 | 33 |
34 #include "gdb_assert.h" | 34 #include "gdb_assert.h" |
35 #include "gdb_obstack.h" | 35 #include "gdb_obstack.h" |
36 #include "hashtab.h" | 36 #include "hashtab.h" |
| 37 #include "inferior.h" |
37 | 38 |
38 /* Types. */ | 39 /* Types. */ |
39 | 40 |
40 typedef struct property | 41 typedef struct property |
41 { | 42 { |
42 char *key; | 43 char *key; |
43 char *value; | 44 char *value; |
44 } property_s; | 45 } property_s; |
45 DEF_VEC_O(property_s); | 46 DEF_VEC_O(property_s); |
46 | 47 |
(...skipping 177 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
224 numbering). */ | 225 numbering). */ |
225 VEC(tdesc_arch_reg) *arch_regs; | 226 VEC(tdesc_arch_reg) *arch_regs; |
226 | 227 |
227 /* Functions which report the register name, type, and reggroups for | 228 /* Functions which report the register name, type, and reggroups for |
228 pseudo-registers. */ | 229 pseudo-registers. */ |
229 gdbarch_register_name_ftype *pseudo_register_name; | 230 gdbarch_register_name_ftype *pseudo_register_name; |
230 gdbarch_register_type_ftype *pseudo_register_type; | 231 gdbarch_register_type_ftype *pseudo_register_type; |
231 gdbarch_register_reggroup_p_ftype *pseudo_register_reggroup_p; | 232 gdbarch_register_reggroup_p_ftype *pseudo_register_reggroup_p; |
232 }; | 233 }; |
233 | 234 |
234 /* Global state. These variables are associated with the current | 235 /* Info about an inferior's target description. There's one of these |
235 target; if GDB adds support for multiple simultaneous targets, then | 236 for each inferior. */ |
236 these variables should become target-specific data. */ | |
237 | 237 |
238 /* A flag indicating that a description has already been fetched from | 238 struct target_desc_info |
239 the current target, so it should not be queried again. */ | 239 { |
| 240 /* A flag indicating that a description has already been fetched |
| 241 from the target, so it should not be queried again. */ |
240 | 242 |
241 static int target_desc_fetched; | 243 int fetched; |
242 | 244 |
243 /* The description fetched from the current target, or NULL if the | 245 /* The description fetched from the target, or NULL if the target |
244 current target did not supply any description. Only valid when | 246 did not supply any description. Only valid when |
245 target_desc_fetched is set. Only the description initialization | 247 target_desc_fetched is set. Only the description initialization |
246 code should access this; normally, the description should be | 248 code should access this; normally, the description should be |
247 accessed through the gdbarch object. */ | 249 accessed through the gdbarch object. */ |
248 | 250 |
249 static const struct target_desc *current_target_desc; | 251 const struct target_desc *tdesc; |
250 | 252 |
251 /* Other global variables. */ | 253 /* The filename to read a target description from, as set by "set |
| 254 tdesc filename ..." */ |
252 | 255 |
253 /* The filename to read a target description from. */ | 256 char *filename; |
| 257 }; |
254 | 258 |
255 static char *target_description_filename; | 259 /* Get the inferior INF's target description info, allocating one on |
| 260 the stop if necessary. */ |
| 261 |
| 262 static struct target_desc_info * |
| 263 get_tdesc_info (struct inferior *inf) |
| 264 { |
| 265 if (inf->tdesc_info == NULL) |
| 266 inf->tdesc_info = XCNEW (struct target_desc_info); |
| 267 return inf->tdesc_info; |
| 268 } |
256 | 269 |
257 /* A handle for architecture-specific data associated with the | 270 /* A handle for architecture-specific data associated with the |
258 target description (see struct tdesc_arch_data). */ | 271 target description (see struct tdesc_arch_data). */ |
259 | 272 |
260 static struct gdbarch_data *tdesc_data; | 273 static struct gdbarch_data *tdesc_data; |
261 | 274 |
| 275 /* See target-descriptions.h. */ |
| 276 |
| 277 int |
| 278 target_desc_info_from_user_p (struct target_desc_info *info) |
| 279 { |
| 280 return info != NULL && info->filename != NULL; |
| 281 } |
| 282 |
| 283 /* See target-descriptions.h. */ |
| 284 |
| 285 void |
| 286 copy_inferior_target_desc_info (struct inferior *destinf, struct inferior *srcin
f) |
| 287 { |
| 288 struct target_desc_info *src = get_tdesc_info (srcinf); |
| 289 struct target_desc_info *dest = get_tdesc_info (destinf); |
| 290 |
| 291 dest->fetched = src->fetched; |
| 292 dest->tdesc = src->tdesc; |
| 293 dest->filename = src->filename != NULL ? xstrdup (src->filename) : NULL; |
| 294 } |
| 295 |
| 296 /* See target-descriptions.h. */ |
| 297 |
| 298 void |
| 299 target_desc_info_free (struct target_desc_info *tdesc_info) |
| 300 { |
| 301 if (tdesc_info != NULL) |
| 302 { |
| 303 xfree (tdesc_info->filename); |
| 304 xfree (tdesc_info); |
| 305 } |
| 306 } |
| 307 |
| 308 /* Convenience helper macros. */ |
| 309 |
| 310 #define target_desc_fetched \ |
| 311 get_tdesc_info (current_inferior ())->fetched |
| 312 #define current_target_desc \ |
| 313 get_tdesc_info (current_inferior ())->tdesc |
| 314 #define target_description_filename \ |
| 315 get_tdesc_info (current_inferior ())->filename |
| 316 |
| 317 /* The string manipulated by the "set tdesc filename ..." command. */ |
| 318 |
| 319 static char *tdesc_filename_cmd_string; |
| 320 |
262 /* Fetch the current target's description, and switch the current | 321 /* Fetch the current target's description, and switch the current |
263 architecture to one which incorporates that description. */ | 322 architecture to one which incorporates that description. */ |
264 | 323 |
265 void | 324 void |
266 target_find_description (void) | 325 target_find_description (void) |
267 { | 326 { |
268 /* If we've already fetched a description from the target, don't do | 327 /* If we've already fetched a description from the target, don't do |
269 it again. This allows a target to fetch the description early, | 328 it again. This allows a target to fetch the description early, |
270 during its to_open or to_create_inferior, if it needs extra | 329 during its to_open or to_create_inferior, if it needs extra |
271 information about the target to initialize. */ | 330 information about the target to initialize. */ |
272 if (target_desc_fetched) | 331 if (target_desc_fetched) |
273 return; | 332 return; |
274 | 333 |
275 /* The current architecture should not have any target description | 334 /* The current architecture should not have any target description |
276 specified. It should have been cleared, e.g. when we | 335 specified. It should have been cleared, e.g. when we |
277 disconnected from the previous target. */ | 336 disconnected from the previous target. */ |
278 gdb_assert (gdbarch_target_desc (target_gdbarch) == NULL); | 337 gdb_assert (gdbarch_target_desc (target_gdbarch ()) == NULL); |
279 | 338 |
280 /* First try to fetch an XML description from the user-specified | 339 /* First try to fetch an XML description from the user-specified |
281 file. */ | 340 file. */ |
282 current_target_desc = NULL; | 341 current_target_desc = NULL; |
283 if (target_description_filename != NULL | 342 if (target_description_filename != NULL |
284 && *target_description_filename != '\0') | 343 && *target_description_filename != '\0') |
285 current_target_desc | 344 current_target_desc |
286 = file_read_description_xml (target_description_filename); | 345 = file_read_description_xml (target_description_filename); |
287 | 346 |
288 /* Next try to read the description from the current target using | 347 /* Next try to read the description from the current target using |
(...skipping 12 matching lines...) Expand all Loading... |
301 struct gdbarch_info info; | 360 struct gdbarch_info info; |
302 | 361 |
303 gdbarch_info_init (&info); | 362 gdbarch_info_init (&info); |
304 info.target_desc = current_target_desc; | 363 info.target_desc = current_target_desc; |
305 if (!gdbarch_update_p (info)) | 364 if (!gdbarch_update_p (info)) |
306 warning (_("Architecture rejected target-supplied description")); | 365 warning (_("Architecture rejected target-supplied description")); |
307 else | 366 else |
308 { | 367 { |
309 struct tdesc_arch_data *data; | 368 struct tdesc_arch_data *data; |
310 | 369 |
311 » data = gdbarch_data (target_gdbarch, tdesc_data); | 370 » data = gdbarch_data (target_gdbarch (), tdesc_data); |
312 if (tdesc_has_registers (current_target_desc) | 371 if (tdesc_has_registers (current_target_desc) |
313 && data->arch_regs == NULL) | 372 && data->arch_regs == NULL) |
314 warning (_("Target-supplied registers are not supported " | 373 warning (_("Target-supplied registers are not supported " |
315 "by the current architecture")); | 374 "by the current architecture")); |
316 } | 375 } |
317 } | 376 } |
318 | 377 |
319 /* Now that we know this description is usable, record that we | 378 /* Now that we know this description is usable, record that we |
320 fetched it. */ | 379 fetched it. */ |
321 target_desc_fetched = 1; | 380 target_desc_fetched = 1; |
(...skipping 1178 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1500 } | 1559 } |
1501 | 1560 |
1502 static void | 1561 static void |
1503 show_tdesc_cmd (char *args, int from_tty) | 1562 show_tdesc_cmd (char *args, int from_tty) |
1504 { | 1563 { |
1505 cmd_show_list (tdesc_show_cmdlist, from_tty, ""); | 1564 cmd_show_list (tdesc_show_cmdlist, from_tty, ""); |
1506 } | 1565 } |
1507 | 1566 |
1508 static void | 1567 static void |
1509 unset_tdesc_cmd (char *args, int from_tty) | 1568 unset_tdesc_cmd (char *args, int from_tty) |
error: old chunk mismatch |
None
OLD | NEW |