38 #include "safe-ctype.h" 41 #define d_left(dc) (dc)->u.s_binary.left 42 #define d_right(dc) (dc)->u.s_binary.right 58 const char *oload_name);
61 const char *the_namespace);
72 "std::istream",
"std::iostream",
"std::ostream",
"std::string" 77 struct demangle_component *ret_comp,
90 *len = strlen (
string);
91 return (
char *) obstack_copy (obstack,
string, *len);
104 if (!ISIDST (
string[0]))
110 if (
string[0] ==
'u' && strcmp (&
string[1],
"nsigned") == 0)
112 else if (
string[0] ==
's' && strcmp (&
string[1],
"igned") == 0)
116 while (ISIDNUM (
string[1]))
119 if (
string[1] ==
'\0')
132 struct demangle_component *ret_comp,
142 name = (
char *) alloca (ret_comp->u.s_name.len + 1);
143 memcpy (
name, ret_comp->u.s_name.s, ret_comp->u.s_name.len);
144 name[ret_comp->u.s_name.len] =
'\0';
171 const char *new_name = (*finder) (otype, data);
173 if (new_name != NULL)
175 ret_comp->u.s_name.s = new_name;
176 ret_comp->u.s_name.len = strlen (new_name);
190 std::unique_ptr<demangle_parse_info> i;
208 struct type *last = otype;
274 ret_comp->u.s_name.s =
name;
275 ret_comp->u.s_name.len = len;
291 struct demangle_component *ret_comp,
296 struct demangle_component *comp = ret_comp;
303 while (comp->type == DEMANGLE_COMPONENT_QUAL_NAME)
305 if (
d_left (comp)->
type == DEMANGLE_COMPONENT_NAME)
307 struct demangle_component newobj;
310 newobj.type = DEMANGLE_COMPONENT_NAME;
312 = (
char *) obstack_copy0 (&info->
obstack,
314 newobj.u.s_name.len = buf.
size ();
335 d_left (ret_comp)->type = DEMANGLE_COMPONENT_NAME;
336 d_left (ret_comp)->u.s_name.s = s;
337 d_left (ret_comp)->u.s_name.len = slen;
367 if (comp->type == DEMANGLE_COMPONENT_NAME)
369 buf.
write (comp->u.s_name.s, comp->u.s_name.len);
374 ret_comp->type = DEMANGLE_COMPONENT_NAME;
376 = (
char *) obstack_copy0 (&info->
obstack,
378 ret_comp->u.s_name.len = buf.
size ();
395 while (
d_left (ret_comp) != NULL
396 && (
d_left (ret_comp)->
type == DEMANGLE_COMPONENT_CONST
397 ||
d_left (ret_comp)->
type == DEMANGLE_COMPONENT_VOLATILE))
408 struct demangle_component *ret_comp,
415 && (ret_comp->type == DEMANGLE_COMPONENT_NAME
416 || ret_comp->type == DEMANGLE_COMPONENT_QUAL_NAME
417 || ret_comp->type == DEMANGLE_COMPONENT_TEMPLATE
418 || ret_comp->type == DEMANGLE_COMPONENT_BUILTIN_TYPE))
423 if (local_name != NULL)
425 struct symbol *sym = NULL;
441 const char *new_name = (*finder) (otype, data);
443 if (new_name != NULL)
445 ret_comp->type = DEMANGLE_COMPONENT_NAME;
446 ret_comp->u.s_name.s = new_name;
447 ret_comp->u.s_name.len = strlen (new_name);
454 switch (ret_comp->type)
456 case DEMANGLE_COMPONENT_ARGLIST:
460 case DEMANGLE_COMPONENT_FUNCTION_TYPE:
461 case DEMANGLE_COMPONENT_TEMPLATE:
462 case DEMANGLE_COMPONENT_TEMPLATE_ARGLIST:
463 case DEMANGLE_COMPONENT_TYPED_NAME:
468 case DEMANGLE_COMPONENT_NAME:
472 case DEMANGLE_COMPONENT_QUAL_NAME:
476 case DEMANGLE_COMPONENT_LOCAL_NAME:
477 case DEMANGLE_COMPONENT_CTOR:
478 case DEMANGLE_COMPONENT_ARRAY_TYPE:
479 case DEMANGLE_COMPONENT_PTRMEM_TYPE:
483 case DEMANGLE_COMPONENT_CONST:
484 case DEMANGLE_COMPONENT_RESTRICT:
485 case DEMANGLE_COMPONENT_VOLATILE:
486 case DEMANGLE_COMPONENT_VOLATILE_THIS:
487 case DEMANGLE_COMPONENT_CONST_THIS:
488 case DEMANGLE_COMPONENT_RESTRICT_THIS:
489 case DEMANGLE_COMPONENT_POINTER:
490 case DEMANGLE_COMPONENT_REFERENCE:
491 case DEMANGLE_COMPONENT_RVALUE_REFERENCE:
513 unsigned int estimated_len;
514 std::unique_ptr<demangle_parse_info> info;
516 estimated_len = strlen (
string) * 2;
554 std::unique_ptr<demangle_parse_info> info;
555 unsigned int estimated_len;
564 estimated_len = strlen (
string) * 2;
570 warning (
_(
"internal error: string \"%s\" failed to be canonicalized"),
589 static std::unique_ptr<demangle_parse_info>
591 void **memory,
char **demangled_p)
593 char *demangled_name;
597 if (mangled_name[0] ==
'_' && mangled_name[1] ==
'Z')
599 struct demangle_component *ret;
601 ret = cplus_demangle_v3_components (mangled_name,
615 if (demangled_name == NULL)
620 std::unique_ptr<demangle_parse_info> info
625 xfree (demangled_name);
629 *demangled_p = demangled_name;
638 void *storage = NULL;
639 char *demangled_name = NULL;
641 struct demangle_component *ret_comp, *prev_comp, *cur_comp;
642 std::unique_ptr<demangle_parse_info> info;
646 &storage, &demangled_name);
651 ret_comp = info->tree;
656 switch (ret_comp->type)
658 case DEMANGLE_COMPONENT_CONST:
659 case DEMANGLE_COMPONENT_RESTRICT:
660 case DEMANGLE_COMPONENT_VOLATILE:
661 case DEMANGLE_COMPONENT_CONST_THIS:
662 case DEMANGLE_COMPONENT_RESTRICT_THIS:
663 case DEMANGLE_COMPONENT_VOLATILE_THIS:
664 case DEMANGLE_COMPONENT_VENDOR_TYPE_QUAL:
665 ret_comp =
d_left (ret_comp);
673 if (ret_comp->type == DEMANGLE_COMPONENT_TYPED_NAME)
674 ret_comp =
d_left (ret_comp);
678 if (ret_comp->type == DEMANGLE_COMPONENT_TEMPLATE)
679 ret_comp =
d_left (ret_comp);
688 switch (cur_comp->type)
690 case DEMANGLE_COMPONENT_QUAL_NAME:
691 case DEMANGLE_COMPONENT_LOCAL_NAME:
692 prev_comp = cur_comp;
695 case DEMANGLE_COMPONENT_TEMPLATE:
696 case DEMANGLE_COMPONENT_NAME:
697 case DEMANGLE_COMPONENT_CTOR:
698 case DEMANGLE_COMPONENT_DTOR:
699 case DEMANGLE_COMPONENT_OPERATOR:
700 case DEMANGLE_COMPONENT_EXTENDED_OPERATOR:
709 if (cur_comp != NULL && prev_comp != NULL)
712 *prev_comp = *
d_left (prev_comp);
719 xfree (demangled_name);
720 return ret.release ();
728 static struct demangle_component *
731 struct demangle_component *ret_comp = comp, *last_template;
735 last_template = NULL;
737 switch (ret_comp->type)
739 case DEMANGLE_COMPONENT_QUAL_NAME:
740 case DEMANGLE_COMPONENT_LOCAL_NAME:
743 case DEMANGLE_COMPONENT_TYPED_NAME:
744 ret_comp =
d_left (ret_comp);
746 case DEMANGLE_COMPONENT_TEMPLATE:
748 last_template = ret_comp;
749 ret_comp =
d_left (ret_comp);
751 case DEMANGLE_COMPONENT_CONST:
752 case DEMANGLE_COMPONENT_RESTRICT:
753 case DEMANGLE_COMPONENT_VOLATILE:
754 case DEMANGLE_COMPONENT_CONST_THIS:
755 case DEMANGLE_COMPONENT_RESTRICT_THIS:
756 case DEMANGLE_COMPONENT_VOLATILE_THIS:
757 case DEMANGLE_COMPONENT_VENDOR_TYPE_QUAL:
758 ret_comp =
d_left (ret_comp);
760 case DEMANGLE_COMPONENT_NAME:
761 case DEMANGLE_COMPONENT_CTOR:
762 case DEMANGLE_COMPONENT_DTOR:
763 case DEMANGLE_COMPONENT_OPERATOR:
764 case DEMANGLE_COMPONENT_EXTENDED_OPERATOR:
774 d_left (last_template) = ret_comp;
775 return last_template;
786 void *storage = NULL;
787 char *demangled_name = NULL;
789 struct demangle_component *ret_comp;
790 std::unique_ptr<demangle_parse_info> info;
793 &storage, &demangled_name);
799 if (ret_comp != NULL)
805 xfree (demangled_name);
806 return ret.release ();
819 struct demangle_component *ret_comp;
820 std::unique_ptr<demangle_parse_info> info;
828 if (ret_comp != NULL)
831 return ret.release ();
844 struct demangle_component *ret_comp;
845 std::unique_ptr<demangle_parse_info> info;
848 if (demangled_name == NULL)
856 ret_comp = info->tree;
858 switch (ret_comp->type)
860 case DEMANGLE_COMPONENT_CONST:
861 case DEMANGLE_COMPONENT_RESTRICT:
862 case DEMANGLE_COMPONENT_VOLATILE:
863 case DEMANGLE_COMPONENT_CONST_THIS:
864 case DEMANGLE_COMPONENT_RESTRICT_THIS:
865 case DEMANGLE_COMPONENT_VOLATILE_THIS:
866 case DEMANGLE_COMPONENT_VENDOR_TYPE_QUAL:
867 ret_comp =
d_left (ret_comp);
875 if (ret_comp->type == DEMANGLE_COMPONENT_TYPED_NAME)
877 else if (!require_params
878 && (ret_comp->type == DEMANGLE_COMPONENT_NAME
879 || ret_comp->type == DEMANGLE_COMPONENT_QUAL_NAME
880 || ret_comp->type == DEMANGLE_COMPONENT_TEMPLATE))
905 if (demangled_name[0] ==
'\0' && completion_mode)
911 if (without_params == NULL && completion_mode)
915 while (!copy.empty ())
919 if (without_params != NULL)
924 return without_params;
983 unsigned int index = 0;
990 int operator_possible = 1;
1006 if (
name[index] !=
':')
1009 return strlen (
name);
1013 operator_possible = 1;
1022 if (
name[index] !=
':')
1025 return strlen (
name);
1029 operator_possible = 1;
1038 return strlen (
name);
1045 if (
name[index + 1] ==
':')
1050 if (operator_possible
1054 while (ISSPACE(
name[index]))
1056 switch (
name[index])
1064 if (
name[index + 1] ==
'<')
1071 if (
name[index + 1] ==
'>')
1084 operator_possible = 0;
1096 operator_possible = 1;
1099 operator_possible = 0;
1112 "unexpected demangled name '%s'",
name);
1125 unsigned int previous_len = 0;
1127 while (
name[current_len] !=
'\0')
1130 previous_len = current_len;
1136 return previous_len;
1147 const char *oload_name)
1170 if (strcmp (sym_name.get (), oload_name) != 0)
1190 const char *the_namespace)
1204 if (the_namespace[0] ==
'\0')
1208 char *concatenated_name
1209 = (
char *) alloca (strlen (the_namespace) + 2 + strlen (func_name) + 1);
1210 strcpy (concatenated_name, the_namespace);
1211 strcat (concatenated_name,
"::");
1212 strcat (concatenated_name, func_name);
1213 name = concatenated_name;
1243 const char *the_namespace)
1248 if (the_namespace[0] ==
'\0')
1252 char *concatenated_name
1253 = (
char *) alloca (strlen (the_namespace) + 2 + strlen (func_name) + 1);
1255 strcpy (concatenated_name, the_namespace);
1256 strcat (concatenated_name,
"::");
1257 strcat (concatenated_name, func_name);
1258 name = concatenated_name;
1278 const char *func_name)
1280 char *the_namespace;
1281 const char *type_name;
1297 if (type_name == NULL)
1302 if (prefix_len != 0)
1304 the_namespace = (
char *) alloca (prefix_len + 1);
1305 strncpy (the_namespace, type_name, prefix_len);
1306 the_namespace[prefix_len] =
'\0';
1327 const char *func_name)
1333 for (i = 1; i <= nargs; i++)
1347 const char *the_namespace)
1361 current = current->
next)
1372 if (strcmp (the_namespace, current->
import_dest) == 0)
1397 const struct block *b, *surrounding_static_block = 0;
1431 if (b == surrounding_static_block)
1442 struct symbol * rtti_sym;
1443 struct type * rtti_type;
1449 if (rtti_sym == NULL)
1451 warning (
_(
"RTTI symbol not found for class '%s'"),
name);
1457 warning (
_(
"RTTI symbol for class '%s' is not a type"),
name);
1472 warning (
_(
"RTTI symbol for class '%s' is a namespace"),
name);
1475 warning (
_(
"RTTI symbol for class '%s' has bad type"),
name);
1482 #ifdef HAVE_WORKING_FORK 1520 char *result = NULL;
1521 int crash_signal = 0;
1523 #ifdef HAVE_WORKING_FORK 1524 #if defined (HAVE_SIGACTION) && defined (SA_RESTART) 1525 struct sigaction sa, old_sa;
1529 static int core_dump_allowed = -1;
1531 if (core_dump_allowed == -1)
1535 if (!core_dump_allowed)
1541 #if defined (HAVE_SIGACTION) && defined (SA_RESTART) 1543 sigemptyset (&sa.sa_mask);
1544 #ifdef HAVE_SIGALTSTACK 1545 sa.sa_flags = SA_ONSTACK;
1549 sigaction (SIGSEGV, &sa, &old_sa);
1558 if (crash_signal == 0)
1559 result = bfd_demangle (NULL,
name, options);
1561 #ifdef HAVE_WORKING_FORK 1564 #if defined (HAVE_SIGACTION) && defined (SA_RESTART) 1565 sigaction (SIGSEGV, &old_sa, NULL);
1567 signal (SIGSEGV,
ofunc);
1570 if (crash_signal != 0)
1572 static int error_reported = 0;
1574 if (!error_reported)
1578 "(demangler failed with signal %d)"),
1579 name, crash_signal);
1583 "demangler-warning", short_msg.c_str ());
1589 if (core_dump_allowed)
1591 _(
"%s\nAttempting to dump core.\n"),
1614 *demangled =
gdb_demangle (mangled, DMGL_PARAMS | DMGL_ANSI);
1615 return *demangled != NULL;
1629 if (prefix_len != 0)
1630 search_name += prefix_len + 2;
1632 unsigned int hash = 0;
1633 for (
const char *
string = search_name; *
string !=
'\0'; ++
string)
1643 &&
string[5] !=
':')
1687 const char *lookup_name,
1688 size_t lookup_name_len,
1694 = (comp_match_res != NULL ? &comp_match_res->
match_for_lcd : NULL);
1701 if (comp_match_res != NULL)
1731 if (sname[len] ==
'\0')
1750 = (comp_match_res != NULL ? &comp_match_res->
match_for_lcd : NULL);
1759 if (comp_match_res != NULL)
1784 mode, comp_match_res);
1810 test_cp_symbol_name_matches ()
1812 #define CHECK_MATCH(SYMBOL, INPUT) \ 1813 SELF_CHECK (cp_symbol_name_matches_1 (SYMBOL, \ 1814 INPUT, sizeof (INPUT) - 1, \ 1815 strncmp_iw_mode::MATCH_PARAMS, \ 1818 #define CHECK_NOT_MATCH(SYMBOL, INPUT) \ 1819 SELF_CHECK (!cp_symbol_name_matches_1 (SYMBOL, \ 1820 INPUT, sizeof (INPUT) - 1, \ 1821 strncmp_iw_mode::MATCH_PARAMS, \ 1826 #define CHECK_MATCH_C(SYMBOL, INPUT) \ 1829 CHECK_MATCH (SYMBOL, INPUT); \ 1830 for (size_t i = 0; i < sizeof (INPUT) - 1; i++) \ 1831 SELF_CHECK (cp_symbol_name_matches_1 (SYMBOL, INPUT, i, \ 1832 strncmp_iw_mode::NORMAL, \ 1838 #define CHECK_NOT_MATCH_C(SYMBOL, INPUT) \ 1841 CHECK_NOT_MATCH (SYMBOL, INPUT); \ 1842 SELF_CHECK (!cp_symbol_name_matches_1 (SYMBOL, INPUT, \ 1843 sizeof (INPUT) - 1, \ 1844 strncmp_iw_mode::NORMAL, \ 1849 CHECK_MATCH_C (
"function()",
"function");
1850 CHECK_MATCH_C (
"function(int)",
"function");
1853 CHECK_MATCH_C (
"function()",
"function ()");
1854 CHECK_MATCH_C (
"function ( )",
"function()");
1855 CHECK_MATCH_C (
"function ()",
"function( )");
1856 CHECK_MATCH_C (
"func(int)",
"func( int )");
1857 CHECK_MATCH_C (
"func(int)",
"func ( int ) ");
1858 CHECK_MATCH_C (
"func ( int )",
"func( int )");
1859 CHECK_MATCH_C (
"func ( int )",
"func ( int ) ");
1862 CHECK_NOT_MATCH (
"func",
"function");
1863 CHECK_NOT_MATCH (
"function",
"func");
1864 CHECK_NOT_MATCH (
"function()",
"func");
1868 CHECK_MATCH_C (
"function(int)",
"function(int)");
1869 CHECK_NOT_MATCH_C (
"function(int)",
"function()");
1872 CHECK_NOT_MATCH_C (
"function",
"func tion");
1873 CHECK_NOT_MATCH_C (
"func__tion",
"func_ _tion");
1874 CHECK_NOT_MATCH_C (
"func11tion",
"func1 1tion");
1878 CHECK_NOT_MATCH_C (
"func tion",
"function");
1879 CHECK_NOT_MATCH_C (
"func1 1tion",
"func11tion");
1880 CHECK_NOT_MATCH_C (
"func_ _tion",
"func__tion");
1883 CHECK_NOT_MATCH_C (
"func(param)",
"func(par am)");
1886 CHECK_NOT_MATCH_C (
"operator<<",
"opera tor<<");
1887 CHECK_NOT_MATCH_C (
"operator<<",
"operator< <");
1888 CHECK_NOT_MATCH_C (
"operator<<",
"operator < <");
1889 CHECK_NOT_MATCH_C (
"operator==",
"operator= =");
1890 CHECK_NOT_MATCH_C (
"operator==",
"operator = =");
1891 CHECK_MATCH_C (
"operator<<",
"operator <<");
1892 CHECK_MATCH_C (
"operator<<()",
"operator <<");
1893 CHECK_NOT_MATCH_C (
"operator<<()",
"operator<<(int)");
1894 CHECK_NOT_MATCH_C (
"operator<<(int)",
"operator<<()");
1895 CHECK_MATCH_C (
"operator==",
"operator ==");
1896 CHECK_MATCH_C (
"operator==()",
"operator ==");
1897 CHECK_MATCH_C (
"operator <<",
"operator<<");
1898 CHECK_MATCH_C (
"operator ==",
"operator==");
1899 CHECK_MATCH_C (
"operator bool",
"operator bool");
1900 CHECK_MATCH_C (
"operator bool ()",
"operator bool");
1901 CHECK_MATCH_C (
"operatorX<<",
"operatorX < <");
1902 CHECK_MATCH_C (
"Xoperator<<",
"Xoperator < <");
1904 CHECK_MATCH_C (
"operator()(int)",
"operator()(int)");
1905 CHECK_MATCH_C (
"operator()(int)",
"operator ( ) ( int )");
1906 CHECK_MATCH_C (
"operator()<long>(int)",
"operator ( ) < long > ( int )");
1908 CHECK_NOT_MATCH (
"operator()(int)",
"operator");
1912 CHECK_NOT_MATCH_C (
"operator/=()",
"operator ^=");
1914 CHECK_NOT_MATCH_C (
"operator>>",
"operator[]");
1916 CHECK_NOT_MATCH_C (
"operator>>()",
"operator[]()");
1918 CHECK_MATCH_C (
"base::operator char*()",
"base::operator char*()");
1919 CHECK_MATCH_C (
"base::operator char*()",
"base::operator char * ()");
1920 CHECK_MATCH_C (
"base::operator char**()",
"base::operator char * * ()");
1921 CHECK_MATCH (
"base::operator char**()",
"base::operator char * *");
1922 CHECK_MATCH_C (
"base::operator*()",
"base::operator*()");
1923 CHECK_NOT_MATCH_C (
"base::operator char*()",
"base::operatorc");
1924 CHECK_NOT_MATCH (
"base::operator char*()",
"base::operator char");
1925 CHECK_NOT_MATCH (
"base::operator char*()",
"base::operat");
1928 CHECK_NOT_MATCH_C (
"foo::bar",
"foo: :bar");
1929 CHECK_MATCH_C (
"foo::bar",
"foo :: bar");
1930 CHECK_MATCH_C (
"foo :: bar",
"foo::bar");
1932 CHECK_MATCH_C (
"abc::def::ghi()",
"abc::def::ghi()");
1933 CHECK_MATCH_C (
"abc::def::ghi ( )",
"abc::def::ghi()");
1934 CHECK_MATCH_C (
"abc::def::ghi()",
"abc::def::ghi ( )");
1935 CHECK_MATCH_C (
"function()",
"function()");
1936 CHECK_MATCH_C (
"bar::function()",
"bar::function()");
1941 CHECK_MATCH_C (
"foo::function()",
"function");
1942 CHECK_MATCH_C (
"foo::function(int)",
"function");
1943 CHECK_MATCH_C (
"foo::bar::function()",
"function");
1944 CHECK_MATCH_C (
"bar::function()",
"bar::function");
1945 CHECK_MATCH_C (
"foo::bar::function()",
"bar::function");
1946 CHECK_MATCH_C (
"foo::bar::function(int)",
"bar::function");
1949 CHECK_MATCH_C (
"foo::function()",
"function()");
1950 CHECK_MATCH_C (
"foo::bar::function()",
"function()");
1951 CHECK_MATCH_C (
"foo::function(int)",
"function(int)");
1952 CHECK_MATCH_C (
"foo::function()",
"foo::function()");
1953 CHECK_MATCH_C (
"foo::bar::function()",
"bar::function()");
1954 CHECK_MATCH_C (
"foo::bar::function(int)",
"bar::function(int)");
1955 CHECK_MATCH_C (
"bar::function()",
"bar::function()");
1957 CHECK_NOT_MATCH_C (
"foo::bar::function(int)",
"bar::function()");
1959 CHECK_MATCH_C (
"(anonymous namespace)::bar::function(int)",
1960 "bar::function(int)");
1961 CHECK_MATCH_C (
"foo::(anonymous namespace)::bar::function(int)",
1965 CHECK_NOT_MATCH_C (
"function()",
"bar::function");
1966 CHECK_NOT_MATCH_C (
"function()",
"bar::function()");
1969 CHECK_NOT_MATCH_C (
"foo::function()",
"::function");
1970 CHECK_NOT_MATCH_C (
"foo::function()",
"::function()");
1971 CHECK_NOT_MATCH_C (
"foo::function(int)",
"::function()");
1972 CHECK_NOT_MATCH_C (
"foo::function(int)",
"::function(int)");
1978 CHECK_MATCH_C (
"function[abi:foo]()",
"function");
1979 CHECK_MATCH_C (
"function[abi:foo](int)",
"function");
1980 CHECK_MATCH_C (
"function[abi:foo]()",
"function ()");
1981 CHECK_NOT_MATCH_C (
"function[abi:foo]()",
"function (int)");
1983 CHECK_MATCH_C (
"function[abi:foo]()",
"function[abi:foo]");
1984 CHECK_MATCH_C (
"function[abi:foo](int)",
"function[abi:foo]");
1985 CHECK_MATCH_C (
"function[abi:foo]()",
"function[abi:foo] ()");
1986 CHECK_MATCH_C (
"function[abi:foo][abi:bar]()",
"function");
1987 CHECK_MATCH_C (
"function[abi:foo][abi:bar](int)",
"function");
1988 CHECK_MATCH_C (
"function[abi:foo][abi:bar]()",
"function[abi:foo]");
1989 CHECK_MATCH_C (
"function[abi:foo][abi:bar](int)",
"function[abi:foo]");
1990 CHECK_MATCH_C (
"function[abi:foo][abi:bar]()",
"function[abi:foo] ()");
1991 CHECK_NOT_MATCH_C (
"function[abi:foo][abi:bar]()",
"function[abi:foo] (int)");
1993 CHECK_MATCH_C (
"function [abi:foo][abi:bar] ( )",
"function [abi:foo]");
1997 CHECK_NOT_MATCH_C (
"function()",
"function[abi:foo]()");
1998 CHECK_NOT_MATCH_C (
"function()",
"function[abi:foo]");
2005 quote (
const char *str)
2019 check_remove_params (
const char *file,
int line,
2020 const char *
name,
const char *expected,
2021 bool completion_mode)
2026 if ((expected == NULL) != (result == NULL)
2027 || (expected != NULL
2028 && strcmp (result.get (), expected) != 0))
2030 error (
_(
"%s:%d: make-paramless self-test failed: (completion=%d) " 2031 "\"%s\" -> %s, expected %s"),
2032 file, line, completion_mode,
name,
2033 quote (result.get ()).c_str (), quote (expected).c_str ());
2040 test_cp_remove_params ()
2044 #define CHECK(NAME, EXPECTED) \ 2047 check_remove_params (__FILE__, __LINE__, NAME, EXPECTED, false); \ 2048 check_remove_params (__FILE__, __LINE__, NAME, EXPECTED, true); \ 2055 #define CHECK_INCOMPL(NAME, EXPECTED) \ 2058 check_remove_params (__FILE__, __LINE__, NAME, NULL, false); \ 2059 check_remove_params (__FILE__, __LINE__, NAME, EXPECTED, true); \ 2063 CHECK (
"function()",
"function");
2065 CHECK (
"function() const",
"function");
2067 CHECK (
"(anonymous namespace)::A::B::C",
2068 "(anonymous namespace)::A::B::C");
2070 CHECK (
"A::(anonymous namespace)",
2071 "A::(anonymous namespace)");
2075 CHECK (
"A::foo<int>()",
2081 CHECK (
"A::foo<(anonymous namespace)::B>::func(int)",
2082 "A::foo<(anonymous namespace)::B>::func");
2085 "A::foo<(anonymous namespace)::B>::func");
2088 "A::foo<(anonymous namespace)::B>");
2091 "A::foo<(anonymous namespace)::B>");
2093 CHECK (
"A::foo<(anonymous namespace)::B>",
2094 "A::foo<(anonymous namespace)::B>");
2102 CHECK (
"A::foo<void(int)>::func(int)",
2103 "A::foo<void(int)>::func");
2113 #undef CHECK_INCOMPL 2126 "by the name of a command.\n"));
2128 "maintenance cplus ",
2146 prefix = (
char *) alloca (len + 1);
2148 memcpy (prefix, arg, len);
2170 _(
"C++ maintenance commands."),
2172 "maintenance cplus ",
2181 _(
"Print the first class/namespace component of NAME."),
2185 _(
"Show the virtual function table for a C++ object.\n\ 2186 Usage: info vtbl EXPRESSION\n\ 2187 Evaluate EXPRESSION and display the virtual function table for the\n\ 2188 resulting object."));
2190 #ifdef HAVE_WORKING_FORK 2193 Set whether to attempt to catch demangler crashes."),
_(
"\ 2194 Show whether to attempt to catch demangler crashes."),
_(
"\ 2195 If enabled GDB will attempt to catch demangler crashes and\n\ 2196 display the offending symbol."),
2205 selftests::test_cp_symbol_name_matches);
2207 selftests::test_cp_remove_params);
#define CHECK(LANG, NAME, EXPECTED)
static int cp_already_canonical(const char *string)
struct std::unique_ptr< demangle_parse_info > cp_demangled_name_to_comp(const char *demangled_name, const char **errmsg)
static void maint_cplus_command(const char *arg, int from_tty)
#define TYPE_N_BASECLASSES(thistype)
void cp_merge_demangle_parse_infos(struct demangle_parse_info *dest, struct demangle_component *target, struct demangle_parse_info *src)
static struct symbol ** sym_return_val
static const char *const ignore_typedefs[]
static gdb::unique_xmalloc_ptr< char > cp_remove_params_1(const char *demangled_name, bool require_params)
gdb::unique_xmalloc_ptr< char > cp_comp_to_string(struct demangle_component *result, int estimated_len)
static void demangled_name_complaint(const char *name)
void warning(const char *fmt,...)
const char * symbol_search_name(const struct general_symbol_info *gsymbol)
#define TYPE_NAME(thistype)
const std::string & lookup_name() const
const struct block * block_global_block(const struct block *block)
char * cp_func_name(const char *full_name)
bool completion_mode() const
static int sym_return_val_index
struct cmd_list_element * add_info(const char *name, cmd_const_cfunc_ftype *fun, const char *doc)
#define SYMBOL_CLASS(symbol)
static int sym_return_val_size
bool() symbol_name_matcher_ftype(const char *symbol_search_name, const lookup_name_info &lookup_name, completion_match_result *comp_match_res)
struct cmd_list_element * add_cmd(const char *name, enum command_class theclass, const char *doc, struct cmd_list_element **list)
void type_print(struct type *type, const char *varstring, struct ui_file *stream, int show)
void write(const char *buf, long length_buf) override
#define BLOCKVECTOR_BLOCK(blocklist, n)
struct block_symbol lookup_symbol(const char *name, const struct block *block, domain_enum domain, struct field_of_this_result *is_a_field_of_this)
char * skip_spaces(char *chp)
static unsigned int cp_find_first_component_aux(const char *name, int permissive)
void demangler_warning(const char *file, int line, const char *string,...)
static bool cp_symbol_name_matches_1(const char *symbol_search_name, const char *lookup_name, size_t lookup_name_len, strncmp_iw_mode mode, completion_match_result *comp_match_res)
static void replace_typedefs(struct demangle_parse_info *info, struct demangle_component *ret_comp, canonicalization_ftype *finder, void *data)
struct cmd_list_element * maintenance_set_cmdlist
char * method_name_from_physname(const char *physname)
unsigned int cp_search_name_hash(const char *search_name)
int strncmp_iw_with_mode(const char *string1, const char *string2, size_t string2_len, strncmp_iw_mode mode, enum language language, completion_match_for_lcd *match_for_lcd)
#define TYPE_IS_REFERENCE(t)
struct symbol ** make_symbol_overload_list_adl(struct type **arg_types, int nargs, const char *func_name)
struct cmd_list_element * add_prefix_cmd(const char *name, enum command_class theclass, cmd_const_cfunc_ftype *fun, const char *doc, struct cmd_list_element **prefixlist, const char *prefixname, int allow_unknown, struct cmd_list_element **list)
symbol_name_match_type match_type() const
scoped_restore_tmpl< T > make_scoped_restore(T *var)
static void make_symbol_overload_list_qualified(const char *func_name)
char * gdb_demangle(const char *name, int options)
struct type * check_typedef(struct type *type)
std::string cp_canonicalize_string_no_typedefs(const char *string)
#define CATCH(EXCEPTION, MASK)
static SIGJMP_BUF gdb_demangle_jmp_buf
std::unique_ptr< T, xfree_deleter< T > > unique_xmalloc_ptr
struct type * cp_lookup_rtti_type(const char *name, struct block *block)
#define SIGLONGJMP(buf, val)
objfile(bfd *, const char *, objfile_flags)
struct symbol ** make_symbol_overload_list(const char *func_name, const char *the_namespace)
unsigned int cp_find_first_component(const char *name)
void fprintf_unfiltered(struct ui_file *stream, const char *format,...)
#define SYMBOL_HASH_NEXT(hash, c)
#define gdb_assert_not_reached(message)
const struct sym_fns * sf
void _initialize_cp_support(void)
struct cleanup * make_cleanup(make_cleanup_ftype *function, void *arg)
static void info_vtbl_command(const char *arg, int from_tty)
#define ALL_COMPUNITS(objfile, cu)
struct using_direct * block_using(const struct block *block)
#define BLOCK_SUPERBLOCK(bl)
struct cmd_list_element * maint_cplus_cmd_list
static struct demangle_component * unqualified_name_from_comp(struct demangle_component *comp)
#define SYMBOL_LINKAGE_NAME(symbol)
const char *() canonicalization_ftype(struct type *, void *)
#define complaint(COMPLAINTS, FMT,...)
static int startswith(const char *string, const char *pattern)
symbol_name_matcher_ftype * cp_get_symbol_name_matcher(const lookup_name_info &lookup_name)
#define TYPE_BASECLASS(thistype, index)
void(* expand_symtabs_for_function)(struct objfile *objfile, const char *func_name)
void printf_unfiltered(const char *format,...)
static void make_symbol_overload_list_namespace(const char *func_name, const char *the_namespace)
virtual void puts(const char *str)
completion_match_for_lcd match_for_lcd
static void ours_for_output()
struct cmd_list_element * add_alias_cmd(const char *name, cmd_list_element *old, enum command_class theclass, int abbrev_flag, struct cmd_list_element **list)
unsigned long hash(const void *addr, int length)
std::string cp_canonicalize_string_full(const char *string, canonicalization_ftype *finder, void *data)
struct using_direct * next
static bool cp_symbol_name_matches(const char *symbol_search_name, const lookup_name_info &lookup_name, completion_match_result *comp_match_res)
PTR xrealloc(PTR ptr, size_t size)
char * cp_class_name_from_physname(const char *physname)
static void check_cv_qualifiers(struct demangle_component *ret_comp)
#define COMPUNIT_BLOCKVECTOR(cust)
static std::unique_ptr< demangle_parse_info > mangled_name_to_comp(const char *mangled_name, int options, void **memory, char **demangled_p)
void help_list(struct cmd_list_element *list, const char *cmdtype, enum command_class theclass, struct ui_file *stream)
void discard_cleanups(struct cleanup *old_chain)
const demangle_for_lookup_info & cplus() const
#define TYPE_TARGET_TYPE(thistype)
void set_match(const char *m, const char *m_for_lcd=NULL)
static void overload_list_add_symbol(struct symbol *sym, const char *oload_name)
static void make_symbol_overload_list_block(const char *name, const struct block *block)
const struct block * block_static_block(const struct block *block)
#define TYPE_CODE(thistype)
const char * c_str() const
struct complaints * symfile_complaints
gdb::unique_xmalloc_ptr< char > cp_remove_params_if_any(const char *demangled_name, bool completion_mode)
int gdb_sniff_from_mangled_name(const char *mangled, char **demangled)
void add_setshow_boolean_cmd(const char *name, enum command_class theclass, int *var, const char *set_doc, const char *show_doc, const char *help_doc, cmd_const_sfunc_ftype *set_func, show_value_ftype *show_func, struct cmd_list_element **set_list, struct cmd_list_element **show_list)
static int inspect_type(struct demangle_parse_info *info, struct demangle_component *ret_comp, canonicalization_ftype *finder, void *data)
static bool cp_fq_symbol_name_matches(const char *symbol_search_name, const lookup_name_info &lookup_name, completion_match_result *comp_match_res)
std::string cp_canonicalize_string(const char *string)
static int gdb_demangle_attempt_core_dump
std::string string_printf(const char *fmt,...)
static sighandler_t ofunc
#define TYPE_TAG_NAME(type)
const struct block * get_selected_block(CORE_ADDR *addr_in_block)
#define SYMBOL_NATURAL_NAME(symbol)
struct value * parse_and_eval(const char *exp)
#define BASETYPE_VIA_PUBLIC(thistype, index)
#define CHECK_INCOMPL(LANG, NAME, EXPECTED)
int can_dump_core(enum resource_limit_kind limit_kind)
#define SYMBOL_TYPE(symbol)
struct cmd_list_element * maintenancelist
void warn_cant_dump_core(const char *reason)
static int catch_demangler_crashes
void cplus_print_vtable(struct value *value)
#define ALL_BLOCK_SYMBOLS_WITH_NAME(block, name, iter, sym)
#define ALL_OBJFILES(obj)
static void make_symbol_overload_list_adl_namespace(struct type *type, const char *func_name)
const struct quick_symbol_functions * qf
static void first_component_command(const char *arg, int from_tty)
struct cmd_list_element * maintenance_show_cmdlist
unsigned int cp_entire_prefix_len(const char *name)
static void replace_typedefs_qualified_name(struct demangle_parse_info *info, struct demangle_component *ret_comp, canonicalization_ftype *finder, void *data)
void register_test(const std::string &name, selftest *test)
void error(const char *fmt,...)
static void make_symbol_overload_list_using(const char *func_name, const char *the_namespace)
static char * copy_string_to_obstack(struct obstack *obstack, const char *string, long *len)
static void gdb_demangle_signal_handler(int signo)
gdb::unique_xmalloc_ptr< char > cp_remove_params(const char *demangled_name)