| OLD | NEW |
| 1 /* Helper routines for C++ support in GDB. | 1 /* Helper routines for C++ support in GDB. |
| 2 Copyright (C) 2002-2005, 2007-2012 Free Software Foundation, Inc. | 2 Copyright (C) 2002-2005, 2007-2012 Free Software Foundation, Inc. |
| 3 | 3 |
| 4 Contributed by MontaVista Software. | 4 Contributed by MontaVista Software. |
| 5 | 5 |
| 6 This file is part of GDB. | 6 This file is part of GDB. |
| 7 | 7 |
| 8 This program is free software; you can redistribute it and/or modify | 8 This program is free software; you can redistribute it and/or modify |
| 9 it under the terms of the GNU General Public License as published by | 9 it under the terms of the GNU General Public License as published by |
| 10 the Free Software Foundation; either version 3 of the License, or | 10 the Free Software Foundation; either version 3 of the License, or |
| (...skipping 16 matching lines...) Expand all Loading... |
| 27 #include "dictionary.h" | 27 #include "dictionary.h" |
| 28 #include "objfiles.h" | 28 #include "objfiles.h" |
| 29 #include "frame.h" | 29 #include "frame.h" |
| 30 #include "symtab.h" | 30 #include "symtab.h" |
| 31 #include "block.h" | 31 #include "block.h" |
| 32 #include "complaints.h" | 32 #include "complaints.h" |
| 33 #include "gdbtypes.h" | 33 #include "gdbtypes.h" |
| 34 #include "exceptions.h" | 34 #include "exceptions.h" |
| 35 #include "expression.h" | 35 #include "expression.h" |
| 36 #include "value.h" | 36 #include "value.h" |
| 37 #include "cp-abi.h" |
| 37 | 38 |
| 38 #include "safe-ctype.h" | 39 #include "safe-ctype.h" |
| 39 | 40 |
| 40 #include "psymtab.h" | 41 #include "psymtab.h" |
| 41 | 42 |
| 42 #define d_left(dc) (dc)->u.s_binary.left | 43 #define d_left(dc) (dc)->u.s_binary.left |
| 43 #define d_right(dc) (dc)->u.s_binary.right | 44 #define d_right(dc) (dc)->u.s_binary.right |
| 44 | 45 |
| 45 /* Functions related to demangled name parsing. */ | 46 /* Functions related to demangled name parsing. */ |
| 46 | 47 |
| (...skipping 18 matching lines...) Expand all Loading... |
| 65 | 66 |
| 66 /* The list of "maint cplus" commands. */ | 67 /* The list of "maint cplus" commands. */ |
| 67 | 68 |
| 68 struct cmd_list_element *maint_cplus_cmd_list = NULL; | 69 struct cmd_list_element *maint_cplus_cmd_list = NULL; |
| 69 | 70 |
| 70 /* The actual commands. */ | 71 /* The actual commands. */ |
| 71 | 72 |
| 72 static void maint_cplus_command (char *arg, int from_tty); | 73 static void maint_cplus_command (char *arg, int from_tty); |
| 73 static void first_component_command (char *arg, int from_tty); | 74 static void first_component_command (char *arg, int from_tty); |
| 74 | 75 |
| 75 /* Operator validation. | |
| 76 NOTE: Multi-byte operators (usually the assignment variety | |
| 77 operator) must appear before the single byte version, i.e., "+=" | |
| 78 before "+". */ | |
| 79 static const char *operator_tokens[] = | |
| 80 { | |
| 81 "++", "+=", "+", "->*", "->", "--", "-=", "-", "*=", "*", | |
| 82 "/=", "/", "%=", "%", "!=", "==", "!", "&&", "<<=", "<<", | |
| 83 ">>=", ">>", "<=", "<", ">=", ">", "~", "&=", "&", "|=", | |
| 84 "||", "|", "^=", "^", "=", "()", "[]", ",", "new", "delete" | |
| 85 /* new[] and delete[] require special whitespace handling */ | |
| 86 }; | |
| 87 | |
| 88 /* A list of typedefs which should not be substituted by replace_typedefs. */ | 76 /* A list of typedefs which should not be substituted by replace_typedefs. */ |
| 89 static const char * const ignore_typedefs[] = | 77 static const char * const ignore_typedefs[] = |
| 90 { | 78 { |
| 91 "std::istream", "std::iostream", "std::ostream", "std::string" | 79 "std::istream", "std::iostream", "std::ostream", "std::string" |
| 92 }; | 80 }; |
| 93 | 81 |
| 94 static void | 82 static void |
| 95 replace_typedefs (struct demangle_parse_info *info, | 83 replace_typedefs (struct demangle_parse_info *info, |
| 96 struct demangle_component *ret_comp); | 84 struct demangle_component *ret_comp); |
| 97 | 85 |
| (...skipping 423 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 521 return NULL; | 509 return NULL; |
| 522 | 510 |
| 523 info = cp_demangled_name_to_comp (string, NULL); | 511 info = cp_demangled_name_to_comp (string, NULL); |
| 524 if (info == NULL) | 512 if (info == NULL) |
| 525 return NULL; | 513 return NULL; |
| 526 | 514 |
| 527 estimated_len = strlen (string) * 2; | 515 estimated_len = strlen (string) * 2; |
| 528 ret = cp_comp_to_string (info->tree, estimated_len); | 516 ret = cp_comp_to_string (info->tree, estimated_len); |
| 529 cp_demangled_name_parse_free (info); | 517 cp_demangled_name_parse_free (info); |
| 530 | 518 |
| 519 if (ret == NULL) |
| 520 { |
| 521 warning (_("internal error: string \"%s\" failed to be canonicalized"), |
| 522 string); |
| 523 return NULL; |
| 524 } |
| 525 |
| 531 if (strcmp (string, ret) == 0) | 526 if (strcmp (string, ret) == 0) |
| 532 { | 527 { |
| 533 xfree (ret); | 528 xfree (ret); |
| 534 return NULL; | 529 return NULL; |
| 535 } | 530 } |
| 536 | 531 |
| 537 return ret; | 532 return ret; |
| 538 } | 533 } |
| 539 | 534 |
| 540 /* Convert a mangled name to a demangle_component tree. *MEMORY is | 535 /* Convert a mangled name to a demangle_component tree. *MEMORY is |
| (...skipping 597 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1138 return sym_return_val; | 1133 return sym_return_val; |
| 1139 } | 1134 } |
| 1140 | 1135 |
| 1141 /* Add all symbols with a name matching NAME in BLOCK to the overload | 1136 /* Add all symbols with a name matching NAME in BLOCK to the overload |
| 1142 list. */ | 1137 list. */ |
| 1143 | 1138 |
| 1144 static void | 1139 static void |
| 1145 make_symbol_overload_list_block (const char *name, | 1140 make_symbol_overload_list_block (const char *name, |
| 1146 const struct block *block) | 1141 const struct block *block) |
| 1147 { | 1142 { |
| 1148 struct dict_iterator iter; | 1143 struct block_iterator iter; |
| 1149 struct symbol *sym; | 1144 struct symbol *sym; |
| 1150 | 1145 |
| 1151 const struct dictionary *dict = BLOCK_DICT (block); | 1146 for (sym = block_iter_name_first (block, name, &iter); |
| 1152 | |
| 1153 for (sym = dict_iter_name_first (dict, name, &iter); | |
| 1154 sym != NULL; | 1147 sym != NULL; |
| 1155 sym = dict_iter_name_next (name, &iter)) | 1148 sym = block_iter_name_next (name, &iter)) |
| 1156 overload_list_add_symbol (sym, name); | 1149 overload_list_add_symbol (sym, name); |
| 1157 } | 1150 } |
| 1158 | 1151 |
| 1159 /* Adds the function FUNC_NAME from NAMESPACE to the overload set. */ | 1152 /* Adds the function FUNC_NAME from NAMESPACE to the overload set. */ |
| 1160 | 1153 |
| 1161 static void | 1154 static void |
| 1162 make_symbol_overload_list_namespace (const char *func_name, | 1155 make_symbol_overload_list_namespace (const char *func_name, |
| 1163 const char *namespace) | 1156 const char *namespace) |
| 1164 { | 1157 { |
| 1165 const char *name; | 1158 const char *name; |
| (...skipping 25 matching lines...) Expand all Loading... |
| 1191 } | 1184 } |
| 1192 | 1185 |
| 1193 /* Search the namespace of the given type and namespace of and public | 1186 /* Search the namespace of the given type and namespace of and public |
| 1194 base types. */ | 1187 base types. */ |
| 1195 | 1188 |
| 1196 static void | 1189 static void |
| 1197 make_symbol_overload_list_adl_namespace (struct type *type, | 1190 make_symbol_overload_list_adl_namespace (struct type *type, |
| 1198 const char *func_name) | 1191 const char *func_name) |
| 1199 { | 1192 { |
| 1200 char *namespace; | 1193 char *namespace; |
| 1201 char *type_name; | 1194 const char *type_name; |
| 1202 int i, prefix_len; | 1195 int i, prefix_len; |
| 1203 | 1196 |
| 1204 while (TYPE_CODE (type) == TYPE_CODE_PTR | 1197 while (TYPE_CODE (type) == TYPE_CODE_PTR |
| 1205 || TYPE_CODE (type) == TYPE_CODE_REF | 1198 || TYPE_CODE (type) == TYPE_CODE_REF |
| 1206 || TYPE_CODE (type) == TYPE_CODE_ARRAY | 1199 || TYPE_CODE (type) == TYPE_CODE_ARRAY |
| 1207 || TYPE_CODE (type) == TYPE_CODE_TYPEDEF) | 1200 || TYPE_CODE (type) == TYPE_CODE_TYPEDEF) |
| 1208 { | 1201 { |
| 1209 if (TYPE_CODE (type) == TYPE_CODE_TYPEDEF) | 1202 if (TYPE_CODE (type) == TYPE_CODE_TYPEDEF) |
| 1210 type = check_typedef(type); | 1203 type = check_typedef(type); |
| 1211 else | 1204 else |
| (...skipping 108 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1320 make_symbol_overload_list_namespace (func_name, namespace); | 1313 make_symbol_overload_list_namespace (func_name, namespace); |
| 1321 } | 1314 } |
| 1322 | 1315 |
| 1323 /* This does the bulk of the work of finding overloaded symbols. | 1316 /* This does the bulk of the work of finding overloaded symbols. |
| 1324 FUNC_NAME is the name of the overloaded function we're looking for | 1317 FUNC_NAME is the name of the overloaded function we're looking for |
| 1325 (possibly including namespace info). */ | 1318 (possibly including namespace info). */ |
| 1326 | 1319 |
| 1327 static void | 1320 static void |
| 1328 make_symbol_overload_list_qualified (const char *func_name) | 1321 make_symbol_overload_list_qualified (const char *func_name) |
| 1329 { | 1322 { |
| 1330 struct symbol *sym; | |
| 1331 struct symtab *s; | 1323 struct symtab *s; |
| 1332 struct objfile *objfile; | 1324 struct objfile *objfile; |
| 1333 const struct block *b, *surrounding_static_block = 0; | 1325 const struct block *b, *surrounding_static_block = 0; |
| 1334 struct dict_iterator iter; | |
| 1335 const struct dictionary *dict; | |
| 1336 | 1326 |
| 1337 /* Look through the partial symtabs for all symbols which begin by | 1327 /* Look through the partial symtabs for all symbols which begin by |
| 1338 matching FUNC_NAME. Make sure we read that symbol table in. */ | 1328 matching FUNC_NAME. Make sure we read that symbol table in. */ |
| 1339 | 1329 |
| 1340 ALL_OBJFILES (objfile) | 1330 ALL_OBJFILES (objfile) |
| 1341 { | 1331 { |
| 1342 if (objfile->sf) | 1332 if (objfile->sf) |
| 1343 objfile->sf->qf->expand_symtabs_for_function (objfile, func_name); | 1333 objfile->sf->qf->expand_symtabs_for_function (objfile, func_name); |
| 1344 } | 1334 } |
| 1345 | 1335 |
| (...skipping 98 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1444 prefix = alloca (len + 1); | 1434 prefix = alloca (len + 1); |
| 1445 | 1435 |
| 1446 memcpy (prefix, arg, len); | 1436 memcpy (prefix, arg, len); |
| 1447 prefix[len] = '\0'; | 1437 prefix[len] = '\0'; |
| 1448 | 1438 |
| 1449 printf_unfiltered ("%s\n", prefix); | 1439 printf_unfiltered ("%s\n", prefix); |
| 1450 } | 1440 } |
| 1451 | 1441 |
| 1452 extern initialize_file_ftype _initialize_cp_support; /* -Wmissing-prototypes */ | 1442 extern initialize_file_ftype _initialize_cp_support; /* -Wmissing-prototypes */ |
| 1453 | 1443 |
| 1454 #define SKIP_SPACE(P) \ | |
| 1455 do \ | |
| 1456 { \ | |
| 1457 while (*(P) == ' ' || *(P) == '\t') \ | |
| 1458 ++(P); \ | |
| 1459 } \ | |
| 1460 while (0) | |
| 1461 | 1444 |
| 1462 /* Returns the length of the operator name or 0 if INPUT does not | 1445 /* Implement "info vtbl". */ |
| 1463 point to a valid C++ operator. INPUT should start with | 1446 |
| 1464 "operator". */ | 1447 static void |
| 1465 int | 1448 info_vtbl_command (char *arg, int from_tty) |
| 1466 cp_validate_operator (const char *input) | |
| 1467 { | 1449 { |
| 1468 int i; | 1450 struct value *value; |
| 1469 char *copy; | |
| 1470 const char *p; | |
| 1471 struct expression *expr; | |
| 1472 struct value *val; | |
| 1473 struct gdb_exception except; | |
| 1474 | 1451 |
| 1475 p = input; | 1452 value = parse_and_eval (arg); |
| 1476 | 1453 cplus_print_vtable (value); |
| 1477 if (strncmp (p, "operator", 8) == 0) | |
| 1478 { | |
| 1479 int valid = 0; | |
| 1480 | |
| 1481 p += 8; | |
| 1482 SKIP_SPACE (p); | |
| 1483 for (i = 0; | |
| 1484 » i < sizeof (operator_tokens) / sizeof (operator_tokens[0]); | |
| 1485 » ++i) | |
| 1486 » { | |
| 1487 » int length = strlen (operator_tokens[i]); | |
| 1488 | |
| 1489 » /* By using strncmp here, we MUST have operator_tokens | |
| 1490 » ordered! See additional notes where operator_tokens is | |
| 1491 » defined above. */ | |
| 1492 » if (strncmp (p, operator_tokens[i], length) == 0) | |
| 1493 » { | |
| 1494 » const char *op = p; | |
| 1495 | |
| 1496 » valid = 1; | |
| 1497 » p += length; | |
| 1498 | |
| 1499 » if (strncmp (op, "new", 3) == 0 | |
| 1500 » » || strncmp (op, "delete", 6) == 0) | |
| 1501 » » { | |
| 1502 | |
| 1503 » » /* Special case: new[] and delete[]. We must be | |
| 1504 » » careful to swallow whitespace before/in "[]". */ | |
| 1505 » » SKIP_SPACE (p); | |
| 1506 | |
| 1507 » » if (*p == '[') | |
| 1508 » » { | |
| 1509 » » ++p; | |
| 1510 » » SKIP_SPACE (p); | |
| 1511 » » if (*p == ']') | |
| 1512 » » » ++p; | |
| 1513 » » else | |
| 1514 » » » valid = 0; | |
| 1515 » » } | |
| 1516 » » } | |
| 1517 | |
| 1518 » if (valid) | |
| 1519 » » return (p - input); | |
| 1520 » } | |
| 1521 » } | |
| 1522 | |
| 1523 /* Check input for a conversion operator. */ | |
| 1524 | |
| 1525 /* Skip past base typename. */ | |
| 1526 while (*p != '*' && *p != '&' && *p != 0 && *p != ' ') | |
| 1527 » ++p; | |
| 1528 SKIP_SPACE (p); | |
| 1529 | |
| 1530 /* Add modifiers '*' / '&'. */ | |
| 1531 while (*p == '*' || *p == '&') | |
| 1532 » { | |
| 1533 » ++p; | |
| 1534 » SKIP_SPACE (p); | |
| 1535 » } | |
| 1536 | |
| 1537 /* Check for valid type. [Remember: input starts with | |
| 1538 » "operator".] */ | |
| 1539 copy = savestring (input + 8, p - input - 8); | |
| 1540 expr = NULL; | |
| 1541 val = NULL; | |
| 1542 TRY_CATCH (except, RETURN_MASK_ALL) | |
| 1543 » { | |
| 1544 » expr = parse_expression (copy); | |
| 1545 » val = evaluate_type (expr); | |
| 1546 » } | |
| 1547 | |
| 1548 xfree (copy); | |
| 1549 if (expr) | |
| 1550 » xfree (expr); | |
| 1551 | |
| 1552 if (val != NULL && value_type (val) != NULL) | |
| 1553 » return (p - input); | |
| 1554 } | |
| 1555 | |
| 1556 return 0; | |
| 1557 } | 1454 } |
| 1558 | 1455 |
| 1559 void | 1456 void |
| 1560 _initialize_cp_support (void) | 1457 _initialize_cp_support (void) |
| 1561 { | 1458 { |
| 1562 add_prefix_cmd ("cplus", class_maintenance, | 1459 add_prefix_cmd ("cplus", class_maintenance, |
| 1563 maint_cplus_command, | 1460 maint_cplus_command, |
| 1564 _("C++ maintenance commands."), | 1461 _("C++ maintenance commands."), |
| 1565 &maint_cplus_cmd_list, | 1462 &maint_cplus_cmd_list, |
| 1566 "maintenance cplus ", | 1463 "maintenance cplus ", |
| 1567 0, &maintenancelist); | 1464 0, &maintenancelist); |
| 1568 add_alias_cmd ("cp", "cplus", | 1465 add_alias_cmd ("cp", "cplus", |
| 1569 class_maintenance, 1, | 1466 class_maintenance, 1, |
| 1570 &maintenancelist); | 1467 &maintenancelist); |
| 1571 | 1468 |
| 1572 add_cmd ("first_component", | 1469 add_cmd ("first_component", |
| 1573 class_maintenance, | 1470 class_maintenance, |
| 1574 first_component_command, | 1471 first_component_command, |
| 1575 _("Print the first class/namespace component of NAME."), | 1472 _("Print the first class/namespace component of NAME."), |
| 1576 &maint_cplus_cmd_list); | 1473 &maint_cplus_cmd_list); |
| 1474 |
| 1475 add_info ("vtbl", info_vtbl_command, |
| 1476 _("Show the virtual function table for a C++ object.\n\ |
| 1477 Usage: info vtbl EXPRESSION\n\ |
| 1478 Evaluate EXPRESSION and display the virtual function table for the\n\ |
| 1479 resulting object.")); |
| 1577 } | 1480 } |
| OLD | NEW |