* hppa-hpux-tdep.c (args_for_find_stub, HP_ACC_EH_notify_hook,
HP_ACC_EH_set_hook_value, HP_ACC_EH_notify_callback, HP_ACC_EH_break, HP_ACC_EH_catch_throw, HP_ACC_EH_catch_catch, __eh_notification, hp_cxx_exception_support, hp_cxx_exception_support_initialized, eh_notify_hook_addr, eh_notify_callback_addr, eh_break_addr, eh_catch_throw_addr, break_callback_sal, setup_d_pid_in_inferior, find_stub_with_shl_get, cover_find_stub_with_shl_get, initialize_hp_cxx_exception_support, child_enable_exception_callback, current_ex_event, child_get_current_exception_event): Remove. (hppa_hpux_inferior_created): Remove. (hppa_hpux_init_abi): Do not install hppa_hpux_inferior_created. * breakpoint.h (deprecated_exception_catchpoints_are_fragile): Remove. (deprecated_exception_support_initialized): Remove. * breakpoint.c (deprecated_exception_catchpoints_are_fragile): Remove. (deprecated_exception_support_initialized): Remove. (breakpoint_init_inferior): Remove handling of non-zero deprecated_exception_catchpoints_are_fragile. * symtab.h (deprecated_hp_som_som_object_present): Remove. * symtab.c (deprecated_hp_som_som_object_present): Remove. * c-typeprint.c (c_type_print_base): Remove handling of non-zero deprecated_hp_som_som_object_present. * eval.c (evaluate_subexp_standard): Likewise. * valops.c (value_cast): Likewise. * parse.c (parse_nested_classes_for_hpacc, coloncolon): Remove. * parser-defs.h (parse_nested_classes_for_hpacc): Remove. * c-exp.y (yylex): Do not call parse_nested_classes_for_hpacc.
This commit is contained in:
parent
5e787d22c9
commit
d3e9c991c8
12 changed files with 32 additions and 909 deletions
181
gdb/parse.c
181
gdb/parse.c
|
@ -554,187 +554,6 @@ handle_register:
|
|||
}
|
||||
|
||||
|
||||
/* Parse a string that is possibly a namespace / nested class
|
||||
specification, i.e., something of the form A::B::C::x. Input
|
||||
(NAME) is the entire string; LEN is the current valid length; the
|
||||
output is a string, TOKEN, which points to the largest recognized
|
||||
prefix which is a series of namespaces or classes. CLASS_PREFIX is
|
||||
another output, which records whether a nested class spec was
|
||||
recognized (= 1) or a fully qualified variable name was found (=
|
||||
0). ARGPTR is side-effected (if non-NULL) to point to beyond the
|
||||
string recognized and consumed by this routine.
|
||||
|
||||
The return value is a pointer to the symbol for the base class or
|
||||
variable if found, or NULL if not found. Callers must check this
|
||||
first -- if NULL, the outputs may not be correct.
|
||||
|
||||
This function is used c-exp.y. This is used specifically to get
|
||||
around HP aCC (and possibly other compilers), which insists on
|
||||
generating names with embedded colons for namespace or nested class
|
||||
members.
|
||||
|
||||
(Argument LEN is currently unused. 1997-08-27)
|
||||
|
||||
Callers must free memory allocated for the output string TOKEN. */
|
||||
|
||||
static const char coloncolon[2] =
|
||||
{':', ':'};
|
||||
|
||||
struct symbol *
|
||||
parse_nested_classes_for_hpacc (char *name, int len, char **token,
|
||||
int *class_prefix, char **argptr)
|
||||
{
|
||||
/* Comment below comes from decode_line_1 which has very similar
|
||||
code, which is called for "break" command parsing. */
|
||||
|
||||
/* We have what looks like a class or namespace
|
||||
scope specification (A::B), possibly with many
|
||||
levels of namespaces or classes (A::B::C::D).
|
||||
|
||||
Some versions of the HP ANSI C++ compiler (as also possibly
|
||||
other compilers) generate class/function/member names with
|
||||
embedded double-colons if they are inside namespaces. To
|
||||
handle this, we loop a few times, considering larger and
|
||||
larger prefixes of the string as though they were single
|
||||
symbols. So, if the initially supplied string is
|
||||
A::B::C::D::foo, we have to look up "A", then "A::B",
|
||||
then "A::B::C", then "A::B::C::D", and finally
|
||||
"A::B::C::D::foo" as single, monolithic symbols, because
|
||||
A, B, C or D may be namespaces.
|
||||
|
||||
Note that namespaces can nest only inside other
|
||||
namespaces, and not inside classes. So we need only
|
||||
consider *prefixes* of the string; there is no need to look up
|
||||
"B::C" separately as a symbol in the previous example. */
|
||||
|
||||
char *p;
|
||||
char *start, *end;
|
||||
char *prefix = NULL;
|
||||
char *tmp;
|
||||
struct symbol *sym_class = NULL;
|
||||
struct symbol *sym_var = NULL;
|
||||
struct type *t;
|
||||
int prefix_len = 0;
|
||||
int done = 0;
|
||||
char *q;
|
||||
|
||||
/* Check for HP-compiled executable -- in other cases
|
||||
return NULL, and caller must default to standard GDB
|
||||
behaviour. */
|
||||
|
||||
if (!deprecated_hp_som_som_object_present)
|
||||
return (struct symbol *) NULL;
|
||||
|
||||
p = name;
|
||||
|
||||
/* Skip over whitespace and possible global "::" */
|
||||
while (*p && (*p == ' ' || *p == '\t'))
|
||||
p++;
|
||||
if (p[0] == ':' && p[1] == ':')
|
||||
p += 2;
|
||||
while (*p && (*p == ' ' || *p == '\t'))
|
||||
p++;
|
||||
|
||||
while (1)
|
||||
{
|
||||
/* Get to the end of the next namespace or class spec. */
|
||||
/* If we're looking at some non-token, fail immediately */
|
||||
start = p;
|
||||
if (!(isalpha (*p) || *p == '$' || *p == '_'))
|
||||
return (struct symbol *) NULL;
|
||||
p++;
|
||||
while (*p && (isalnum (*p) || *p == '$' || *p == '_'))
|
||||
p++;
|
||||
|
||||
if (*p == '<')
|
||||
{
|
||||
/* If we have the start of a template specification,
|
||||
scan right ahead to its end */
|
||||
q = find_template_name_end (p);
|
||||
if (q)
|
||||
p = q;
|
||||
}
|
||||
|
||||
end = p;
|
||||
|
||||
/* Skip over "::" and whitespace for next time around */
|
||||
while (*p && (*p == ' ' || *p == '\t'))
|
||||
p++;
|
||||
if (p[0] == ':' && p[1] == ':')
|
||||
p += 2;
|
||||
while (*p && (*p == ' ' || *p == '\t'))
|
||||
p++;
|
||||
|
||||
/* Done with tokens? */
|
||||
if (!*p || !(isalpha (*p) || *p == '$' || *p == '_'))
|
||||
done = 1;
|
||||
|
||||
tmp = (char *) alloca (prefix_len + end - start + 3);
|
||||
if (prefix)
|
||||
{
|
||||
memcpy (tmp, prefix, prefix_len);
|
||||
memcpy (tmp + prefix_len, coloncolon, 2);
|
||||
memcpy (tmp + prefix_len + 2, start, end - start);
|
||||
tmp[prefix_len + 2 + end - start] = '\000';
|
||||
}
|
||||
else
|
||||
{
|
||||
memcpy (tmp, start, end - start);
|
||||
tmp[end - start] = '\000';
|
||||
}
|
||||
|
||||
prefix = tmp;
|
||||
prefix_len = strlen (prefix);
|
||||
|
||||
/* See if the prefix we have now is something we know about */
|
||||
|
||||
if (!done)
|
||||
{
|
||||
/* More tokens to process, so this must be a class/namespace */
|
||||
sym_class = lookup_symbol (prefix, 0, STRUCT_DOMAIN,
|
||||
0, (struct symtab **) NULL);
|
||||
}
|
||||
else
|
||||
{
|
||||
/* No more tokens, so try as a variable first */
|
||||
sym_var = lookup_symbol (prefix, 0, VAR_DOMAIN,
|
||||
0, (struct symtab **) NULL);
|
||||
/* If failed, try as class/namespace */
|
||||
if (!sym_var)
|
||||
sym_class = lookup_symbol (prefix, 0, STRUCT_DOMAIN,
|
||||
0, (struct symtab **) NULL);
|
||||
}
|
||||
|
||||
if (sym_var ||
|
||||
(sym_class &&
|
||||
(t = check_typedef (SYMBOL_TYPE (sym_class)),
|
||||
(TYPE_CODE (t) == TYPE_CODE_STRUCT
|
||||
|| TYPE_CODE (t) == TYPE_CODE_UNION))))
|
||||
{
|
||||
/* We found a valid token */
|
||||
*token = (char *) xmalloc (prefix_len + 1);
|
||||
memcpy (*token, prefix, prefix_len);
|
||||
(*token)[prefix_len] = '\000';
|
||||
break;
|
||||
}
|
||||
|
||||
/* No variable or class/namespace found, no more tokens */
|
||||
if (done)
|
||||
return (struct symbol *) NULL;
|
||||
}
|
||||
|
||||
/* Out of loop, so we must have found a valid token */
|
||||
if (sym_var)
|
||||
*class_prefix = 0;
|
||||
else
|
||||
*class_prefix = 1;
|
||||
|
||||
if (argptr)
|
||||
*argptr = done ? p : end;
|
||||
|
||||
return sym_var ? sym_var : sym_class; /* found */
|
||||
}
|
||||
|
||||
char *
|
||||
find_template_name_end (char *p)
|
||||
{
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue