linespec rewrite:
* linespec.c (decode_compound): Remove. (enum offset_relative_sign): New enum. (struct line_offset): New struct. (struct linespec): New struct. (struct linespec_state): Move file_symtabs, user_filename, and user_function into struct linespec. Make result an anonymous struct holding vectors of symbolp and minsym_and_objfile_d. Add language member. (enum ls_token_type): New enum. (linespec_keywords): New array. (struct ls_token): New struct. (struct ls_parser): New struct. (linespec_lexer_lex_number): New function. (linespec_lexer_lex_keyword): New function. (is_ada_operator): New function. (skip_quote_char): New function. (copy_token_string): New function. (is_closing_quote_enclosed): New function. (find_parameter_list_end): New function. (linespec_lexer_lex_string): New function. (linespec_lexer_lex_one): New function. (linespec_lexer_consume_token): New function. (linespec_lexer_peek_token): New function. (cplusplus_error): Remove unused function. (find_methods): Update comment. (find_toplevel_char): Return const. (is_objc_method_format): Remove unused function. (find_toplevel_string): New function. (is_linespec_boundary): Remove. (symbol_not_found_error): New function. (find_method_overload_end): Remove function. (unexpected_linespec_error): New function. (keep_name_info): Remove. (linespec_parse_line_offset): New function. (linespec_parse_basic): New function. (canonicalize_linespec): New function. (decode_line_internal): Remove. (create_sals_line_offset): New function adapted from decode_all_digits. (convert_linespec_to_sals): New function. (parse_linespec): New function. (linespec_parser_new): New function. (linespec_state_destructor): Change parameter type to struct linespec_state *. Add language parameter. Remove freeing of moved members. (linespec_parser_delete): New function. (decode_line_full): Use parse_linespec and linespec_parser_new. (decode_line_1): Likewise. (decode_indirect): Rename to ... (linespec_expression_to_pc): ... this and rewrite to simply find CORE_ADDR, storing this result for later conversion to SALs. (locate_first_half): Remove. (deocde_objc): Add parameter LS. Initialize new struct collect_info members. Handle minimal symbols, too. (decode_compound): Delete. (lookup_prefix_sym): Rewrite. (compare_msymbols): New function. (find_method): Rewrite. Do not call cplusplus_error. (symtabs_from_filename): Rewrite. (collect_function_symbols): Delete. (find_function_symbols): Rewrite without ARGPTR-style processing. (decode_all_digits): Delete. (Rewritten as create_sals_line_offset.) (decode_dollar): Adapted and renamed to ... (linespec_parse_variable): ... this. (find_linespec_symbols): New function. (decode_label): Adapted and renamed to ... (find_label_symbols): ... this. (decode_digits_list_mode): Add and use LS argument. (decode_digits_ordinary): Likewise. (collect_symbols): Do not collect SALs, just symbols and msymbols. If in list mode, allow any symbol class. Otherwise, only permit LOC_BLOCK symbols. (minsym_found): Update comments. (search_minsyms_for_name): Do not convert the matching symbol into a SAL. Simply push the symbol and objfile into the result vector. (decode_variable): Delete. Contents adapted into find_linespec_symbols. * cp-support.c (SKIP_SPACE): Remove. (operator_tokens): Remove unused global. (cp_validate_operator): Remove. * cp-support.h (cp_validate_operator): Remove declaration. * gdb.base/advance.exp: Update error message for "advance malformed" test. * gdb.base/break.exp: Likewise for "breakpoint with trailing garbage" test. * gdb.base/hbreak2.exp: Likewise for "hardware breakpoint with trailing garbage" test. * gdb.base/jump.exp: Likewise for "jump with trailing argument junk" test. * gdb.base/sepdebug.exp: Likewise for "breakpoint with trailng garbage" test. * gdb.base/until.exp: Likewise for "malformed until" test. * gdb.cp/ovldbreak.exp: Create the breakpoint table for "breakpoint info (after setting on all)". * gdb.cp/userdef.exp: Remove quoting for "break A2::operator+" tests. * gdb.cp/cplabel.cc: New file. * gdb.cp/cplabel.exp: New test. * gdb.linespec/ls-errs.c: New file. * gdb.linespec/ls-errs.exp: New test.
This commit is contained in:
parent
9d236627e7
commit
40e084e177
@ -1,3 +1,95 @@
|
|||||||
|
2012-04-05 Keith Seitz <keiths@redhat.com>
|
||||||
|
|
||||||
|
* linespec.c (decode_compound): Remove.
|
||||||
|
(enum offset_relative_sign): New enum.
|
||||||
|
(struct line_offset): New struct.
|
||||||
|
(struct linespec): New struct.
|
||||||
|
(struct linespec_state): Move file_symtabs,
|
||||||
|
user_filename, and user_function into struct linespec.
|
||||||
|
Make result an anonymous struct holding vectors of
|
||||||
|
symbolp and minsym_and_objfile_d.
|
||||||
|
Add language member.
|
||||||
|
(enum ls_token_type): New enum.
|
||||||
|
(linespec_keywords): New array.
|
||||||
|
(struct ls_token): New struct.
|
||||||
|
(struct ls_parser): New struct.
|
||||||
|
(linespec_lexer_lex_number): New function.
|
||||||
|
(linespec_lexer_lex_keyword): New function.
|
||||||
|
(is_ada_operator): New function.
|
||||||
|
(skip_quote_char): New function.
|
||||||
|
(copy_token_string): New function.
|
||||||
|
(is_closing_quote_enclosed): New function.
|
||||||
|
(find_parameter_list_end): New function.
|
||||||
|
(linespec_lexer_lex_string): New function.
|
||||||
|
(linespec_lexer_lex_one): New function.
|
||||||
|
(linespec_lexer_consume_token): New function.
|
||||||
|
(linespec_lexer_peek_token): New function.
|
||||||
|
(cplusplus_error): Remove unused function.
|
||||||
|
(find_methods): Update comment.
|
||||||
|
(find_toplevel_char): Return const.
|
||||||
|
(is_objc_method_format): Remove unused function.
|
||||||
|
(find_toplevel_string): New function.
|
||||||
|
(is_linespec_boundary): Remove.
|
||||||
|
(symbol_not_found_error): New function.
|
||||||
|
(find_method_overload_end): Remove function.
|
||||||
|
(unexpected_linespec_error): New function.
|
||||||
|
(keep_name_info): Remove.
|
||||||
|
(linespec_parse_line_offset): New function.
|
||||||
|
(linespec_parse_basic): New function.
|
||||||
|
(canonicalize_linespec): New function.
|
||||||
|
(decode_line_internal): Remove.
|
||||||
|
(create_sals_line_offset): New function adapted from
|
||||||
|
decode_all_digits.
|
||||||
|
(convert_linespec_to_sals): New function.
|
||||||
|
(parse_linespec): New function.
|
||||||
|
(linespec_parser_new): New function.
|
||||||
|
(linespec_state_destructor): Change parameter type to
|
||||||
|
struct linespec_state *.
|
||||||
|
Add language parameter.
|
||||||
|
Remove freeing of moved members.
|
||||||
|
(linespec_parser_delete): New function.
|
||||||
|
(decode_line_full): Use parse_linespec and linespec_parser_new.
|
||||||
|
(decode_line_1): Likewise.
|
||||||
|
(decode_indirect): Rename to ...
|
||||||
|
(linespec_expression_to_pc): ... this and rewrite
|
||||||
|
to simply find CORE_ADDR, storing this result for later
|
||||||
|
conversion to SALs.
|
||||||
|
(locate_first_half): Remove.
|
||||||
|
(deocde_objc): Add parameter LS.
|
||||||
|
Initialize new struct collect_info members.
|
||||||
|
Handle minimal symbols, too.
|
||||||
|
(decode_compound): Delete.
|
||||||
|
(lookup_prefix_sym): Rewrite.
|
||||||
|
(compare_msymbols): New function.
|
||||||
|
(find_method): Rewrite.
|
||||||
|
Do not call cplusplus_error.
|
||||||
|
(symtabs_from_filename): Rewrite.
|
||||||
|
(collect_function_symbols): Delete.
|
||||||
|
(find_function_symbols): Rewrite without ARGPTR-style
|
||||||
|
processing.
|
||||||
|
(decode_all_digits): Delete. (Rewritten as create_sals_line_offset.)
|
||||||
|
(decode_dollar): Adapted and renamed to ...
|
||||||
|
(linespec_parse_variable): ... this.
|
||||||
|
(find_linespec_symbols): New function.
|
||||||
|
(decode_label): Adapted and renamed to ...
|
||||||
|
(find_label_symbols): ... this.
|
||||||
|
(decode_digits_list_mode): Add and use LS argument.
|
||||||
|
(decode_digits_ordinary): Likewise.
|
||||||
|
(collect_symbols): Do not collect SALs, just symbols and msymbols.
|
||||||
|
If in list mode, allow any symbol class. Otherwise, only
|
||||||
|
permit LOC_BLOCK symbols.
|
||||||
|
(minsym_found): Update comments.
|
||||||
|
(search_minsyms_for_name): Do not convert the matching symbol
|
||||||
|
into a SAL. Simply push the symbol and objfile into the
|
||||||
|
result vector.
|
||||||
|
(decode_variable): Delete. Contents adapted into
|
||||||
|
find_linespec_symbols.
|
||||||
|
|
||||||
|
* cp-support.c (SKIP_SPACE): Remove.
|
||||||
|
(operator_tokens): Remove unused global.
|
||||||
|
(cp_validate_operator): Remove.
|
||||||
|
* cp-support.h (cp_validate_operator): Remove declaration.
|
||||||
|
|
||||||
2012-04-03 Jan Kratochvil <jan.kratochvil@redhat.com>
|
2012-04-03 Jan Kratochvil <jan.kratochvil@redhat.com>
|
||||||
|
|
||||||
* cp-valprint.c (cp_print_value_fields): Check valprint_check_validity
|
* cp-valprint.c (cp_print_value_fields): Check valprint_check_validity
|
||||||
|
117
gdb/cp-support.c
117
gdb/cp-support.c
@ -73,19 +73,6 @@ struct cmd_list_element *maint_cplus_cmd_list = NULL;
|
|||||||
static void maint_cplus_command (char *arg, int from_tty);
|
static void maint_cplus_command (char *arg, int from_tty);
|
||||||
static void first_component_command (char *arg, int from_tty);
|
static void first_component_command (char *arg, int from_tty);
|
||||||
|
|
||||||
/* Operator validation.
|
|
||||||
NOTE: Multi-byte operators (usually the assignment variety
|
|
||||||
operator) must appear before the single byte version, i.e., "+="
|
|
||||||
before "+". */
|
|
||||||
static const char *operator_tokens[] =
|
|
||||||
{
|
|
||||||
"++", "+=", "+", "->*", "->", "--", "-=", "-", "*=", "*",
|
|
||||||
"/=", "/", "%=", "%", "!=", "==", "!", "&&", "<<=", "<<",
|
|
||||||
">>=", ">>", "<=", "<", ">=", ">", "~", "&=", "&", "|=",
|
|
||||||
"||", "|", "^=", "^", "=", "()", "[]", ",", "new", "delete"
|
|
||||||
/* new[] and delete[] require special whitespace handling */
|
|
||||||
};
|
|
||||||
|
|
||||||
/* A list of typedefs which should not be substituted by replace_typedefs. */
|
/* A list of typedefs which should not be substituted by replace_typedefs. */
|
||||||
static const char * const ignore_typedefs[] =
|
static const char * const ignore_typedefs[] =
|
||||||
{
|
{
|
||||||
@ -1459,110 +1446,6 @@ first_component_command (char *arg, int from_tty)
|
|||||||
|
|
||||||
extern initialize_file_ftype _initialize_cp_support; /* -Wmissing-prototypes */
|
extern initialize_file_ftype _initialize_cp_support; /* -Wmissing-prototypes */
|
||||||
|
|
||||||
#define SKIP_SPACE(P) \
|
|
||||||
do \
|
|
||||||
{ \
|
|
||||||
while (*(P) == ' ' || *(P) == '\t') \
|
|
||||||
++(P); \
|
|
||||||
} \
|
|
||||||
while (0)
|
|
||||||
|
|
||||||
/* Returns the length of the operator name or 0 if INPUT does not
|
|
||||||
point to a valid C++ operator. INPUT should start with
|
|
||||||
"operator". */
|
|
||||||
int
|
|
||||||
cp_validate_operator (const char *input)
|
|
||||||
{
|
|
||||||
int i;
|
|
||||||
char *copy;
|
|
||||||
const char *p;
|
|
||||||
struct expression *expr;
|
|
||||||
struct value *val;
|
|
||||||
volatile struct gdb_exception except;
|
|
||||||
|
|
||||||
p = input;
|
|
||||||
|
|
||||||
if (strncmp (p, "operator", 8) == 0)
|
|
||||||
{
|
|
||||||
int valid = 0;
|
|
||||||
|
|
||||||
p += 8;
|
|
||||||
SKIP_SPACE (p);
|
|
||||||
for (i = 0;
|
|
||||||
i < sizeof (operator_tokens) / sizeof (operator_tokens[0]);
|
|
||||||
++i)
|
|
||||||
{
|
|
||||||
int length = strlen (operator_tokens[i]);
|
|
||||||
|
|
||||||
/* By using strncmp here, we MUST have operator_tokens
|
|
||||||
ordered! See additional notes where operator_tokens is
|
|
||||||
defined above. */
|
|
||||||
if (strncmp (p, operator_tokens[i], length) == 0)
|
|
||||||
{
|
|
||||||
const char *op = p;
|
|
||||||
|
|
||||||
valid = 1;
|
|
||||||
p += length;
|
|
||||||
|
|
||||||
if (strncmp (op, "new", 3) == 0
|
|
||||||
|| strncmp (op, "delete", 6) == 0)
|
|
||||||
{
|
|
||||||
|
|
||||||
/* Special case: new[] and delete[]. We must be
|
|
||||||
careful to swallow whitespace before/in "[]". */
|
|
||||||
SKIP_SPACE (p);
|
|
||||||
|
|
||||||
if (*p == '[')
|
|
||||||
{
|
|
||||||
++p;
|
|
||||||
SKIP_SPACE (p);
|
|
||||||
if (*p == ']')
|
|
||||||
++p;
|
|
||||||
else
|
|
||||||
valid = 0;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
if (valid)
|
|
||||||
return (p - input);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/* Check input for a conversion operator. */
|
|
||||||
|
|
||||||
/* Skip past base typename. */
|
|
||||||
while (*p != '*' && *p != '&' && *p != 0 && *p != ' ')
|
|
||||||
++p;
|
|
||||||
SKIP_SPACE (p);
|
|
||||||
|
|
||||||
/* Add modifiers '*' / '&'. */
|
|
||||||
while (*p == '*' || *p == '&')
|
|
||||||
{
|
|
||||||
++p;
|
|
||||||
SKIP_SPACE (p);
|
|
||||||
}
|
|
||||||
|
|
||||||
/* Check for valid type. [Remember: input starts with
|
|
||||||
"operator".] */
|
|
||||||
copy = savestring (input + 8, p - input - 8);
|
|
||||||
expr = NULL;
|
|
||||||
val = NULL;
|
|
||||||
TRY_CATCH (except, RETURN_MASK_ALL)
|
|
||||||
{
|
|
||||||
expr = parse_expression (copy);
|
|
||||||
val = evaluate_type (expr);
|
|
||||||
}
|
|
||||||
|
|
||||||
xfree (copy);
|
|
||||||
if (expr)
|
|
||||||
xfree (expr);
|
|
||||||
|
|
||||||
if (val != NULL && value_type (val) != NULL)
|
|
||||||
return (p - input);
|
|
||||||
}
|
|
||||||
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* Implement "info vtbl". */
|
/* Implement "info vtbl". */
|
||||||
|
|
||||||
|
@ -170,8 +170,6 @@ extern struct symbol **make_symbol_overload_list_adl (struct type **arg_types,
|
|||||||
extern struct type *cp_lookup_rtti_type (const char *name,
|
extern struct type *cp_lookup_rtti_type (const char *name,
|
||||||
struct block *block);
|
struct block *block);
|
||||||
|
|
||||||
extern int cp_validate_operator (const char *input);
|
|
||||||
|
|
||||||
/* Functions/variables from cp-namespace.c. */
|
/* Functions/variables from cp-namespace.c. */
|
||||||
|
|
||||||
extern int cp_is_anonymous (const char *namespace);
|
extern int cp_is_anonymous (const char *namespace);
|
||||||
|
3375
gdb/linespec.c
3375
gdb/linespec.c
File diff suppressed because it is too large
Load Diff
@ -1,3 +1,23 @@
|
|||||||
|
2012-04-05 Keith Seitz <keiths@redhat.com>
|
||||||
|
|
||||||
|
* gdb.base/advance.exp: Update error message for
|
||||||
|
"advance malformed" test.
|
||||||
|
* gdb.base/break.exp: Likewise for "breakpoint with
|
||||||
|
trailing garbage" test.
|
||||||
|
* gdb.base/hbreak2.exp: Likewise for "hardware breakpoint
|
||||||
|
with trailing garbage" test.
|
||||||
|
* gdb.base/sepdebug.exp: Likewise for "breakpoint with
|
||||||
|
trailng garbage" test.
|
||||||
|
* gdb.base/until.exp: Likewise for "malformed until" test.
|
||||||
|
* gdb.cp/ovldbreak.exp: Create the breakpoint table
|
||||||
|
for "breakpoint info (after setting on all)".
|
||||||
|
* gdb.cp/userdef.exp: Remove quoting for "break A2::operator+"
|
||||||
|
tests.
|
||||||
|
* gdb.cp/cplabel.cc: New file.
|
||||||
|
* gdb.cp/cplabel.exp: New test.
|
||||||
|
* gdb.linespec/ls-errs.c: New file.
|
||||||
|
* gdb.linespec/ls-errs.exp: New test.
|
||||||
|
|
||||||
2012-04-03 Jan Kratochvil <jan.kratochvil@redhat.com>
|
2012-04-03 Jan Kratochvil <jan.kratochvil@redhat.com>
|
||||||
|
|
||||||
* gdb.trace/unavailable.exp
|
* gdb.trace/unavailable.exp
|
||||||
|
@ -45,7 +45,8 @@ gdb_test "advance [gdb_get_line_number "advance this location"]" \
|
|||||||
# Verify that a malformed "advance" is gracefully caught.
|
# Verify that a malformed "advance" is gracefully caught.
|
||||||
#
|
#
|
||||||
gdb_test "advance [gdb_get_line_number "advance malformed"] then stop" \
|
gdb_test "advance [gdb_get_line_number "advance malformed"] then stop" \
|
||||||
"Junk at end of arguments." "malformed advance"
|
"malformed linespec error: unexpected string, \"then stop\"" \
|
||||||
|
"malformed advance"
|
||||||
|
|
||||||
# Verify that "advance <funcname>" works.
|
# Verify that "advance <funcname>" works.
|
||||||
#
|
#
|
||||||
|
@ -600,7 +600,7 @@ gdb_test "break $bp_location12 thread foo" \
|
|||||||
# trailing garbage.
|
# trailing garbage.
|
||||||
#
|
#
|
||||||
gdb_test "break $bp_location12 foo" \
|
gdb_test "break $bp_location12 foo" \
|
||||||
"Junk at end of arguments.*" \
|
"malformed linespec error: unexpected string, \"foo\".*" \
|
||||||
"breakpoint with trailing garbage disallowed"
|
"breakpoint with trailing garbage disallowed"
|
||||||
|
|
||||||
# Verify that GDB responds gracefully to a "clear" command that has
|
# Verify that GDB responds gracefully to a "clear" command that has
|
||||||
|
@ -356,7 +356,7 @@ gdb_test "hbreak $bp_location12 thread foo" \
|
|||||||
# trailing garbage.
|
# trailing garbage.
|
||||||
#
|
#
|
||||||
gdb_test "hbreak $bp_location12 foo" \
|
gdb_test "hbreak $bp_location12 foo" \
|
||||||
"Junk at end of arguments.*" \
|
"malformed linespec error: unexpected string, \"foo\".*" \
|
||||||
"hardware breakpoint with trailing garbage disallowed"
|
"hardware breakpoint with trailing garbage disallowed"
|
||||||
|
|
||||||
# Verify that GDB responds gracefully to a "clear" command that has
|
# Verify that GDB responds gracefully to a "clear" command that has
|
||||||
|
@ -92,7 +92,7 @@ gdb_test "jump" "Argument required .starting address.*" \
|
|||||||
# trailing junk.
|
# trailing junk.
|
||||||
#
|
#
|
||||||
gdb_test "jump 21 100" \
|
gdb_test "jump 21 100" \
|
||||||
"Junk at end of line specification: 100.*" \
|
"malformed linespec error: unexpected number, \"100\"" \
|
||||||
"jump with trailing argument junk"
|
"jump with trailing argument junk"
|
||||||
|
|
||||||
|
|
||||||
|
@ -408,7 +408,7 @@ gdb_test "break $bp_location12 thread foo" \
|
|||||||
#
|
#
|
||||||
|
|
||||||
gdb_test "break $bp_location12 foo" \
|
gdb_test "break $bp_location12 foo" \
|
||||||
"Junk at end of arguments.*" \
|
"malformed linespec error: unexpected string, \"foo\".*" \
|
||||||
"breakpoint with trailing garbage disallowed"
|
"breakpoint with trailing garbage disallowed"
|
||||||
|
|
||||||
# Verify that GDB responds gracefully to a "clear" command that has
|
# Verify that GDB responds gracefully to a "clear" command that has
|
||||||
|
@ -40,7 +40,8 @@ gdb_test "until $bp_location1" \
|
|||||||
# Verify that a malformed "advance" is gracefully caught.
|
# Verify that a malformed "advance" is gracefully caught.
|
||||||
#
|
#
|
||||||
gdb_test "until 80 then stop" \
|
gdb_test "until 80 then stop" \
|
||||||
"Junk at end of arguments." "malformed until"
|
"malformed linespec error: unexpected string, \"then stop\"." \
|
||||||
|
"malformed until"
|
||||||
|
|
||||||
# Rerun up to factorial, outer invocation
|
# Rerun up to factorial, outer invocation
|
||||||
if { ![runto factorial] } then { gdb_suppress_tests; }
|
if { ![runto factorial] } then { gdb_suppress_tests; }
|
||||||
|
80
gdb/testsuite/gdb.cp/cplabel.cc
Normal file
80
gdb/testsuite/gdb.cp/cplabel.cc
Normal file
@ -0,0 +1,80 @@
|
|||||||
|
/* This testcase is part of GDB, the GNU debugger.
|
||||||
|
|
||||||
|
Copyright 2012 Free Software Foundation, Inc.
|
||||||
|
|
||||||
|
This program is free software; you can redistribute it and/or modify
|
||||||
|
it under the terms of the GNU General Public License as published by
|
||||||
|
the Free Software Foundation; either version 3 of the License, or
|
||||||
|
(at your option) any later version.
|
||||||
|
|
||||||
|
This program is distributed in the hope that it will be useful,
|
||||||
|
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||||
|
GNU General Public License for more details.
|
||||||
|
|
||||||
|
You should have received a copy of the GNU General Public License
|
||||||
|
along with this program. If not, see <http://www.gnu.org/licenses/>. */
|
||||||
|
|
||||||
|
class foo
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
static int bar (void)
|
||||||
|
{
|
||||||
|
int i = 5;
|
||||||
|
bool first = true;
|
||||||
|
|
||||||
|
to_the_top: /* bar:to_the_top */
|
||||||
|
while (1)
|
||||||
|
{
|
||||||
|
if (i == 1)
|
||||||
|
{
|
||||||
|
if (first)
|
||||||
|
{
|
||||||
|
first = false;
|
||||||
|
goto to_the_top;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
goto get_out_of_here;
|
||||||
|
}
|
||||||
|
|
||||||
|
--i;
|
||||||
|
}
|
||||||
|
|
||||||
|
get_out_of_here: /* bar:get_out_of_here */
|
||||||
|
return i;
|
||||||
|
}
|
||||||
|
|
||||||
|
int baz (int a)
|
||||||
|
{
|
||||||
|
int i = a;
|
||||||
|
bool first = true;
|
||||||
|
|
||||||
|
to_the_top: /* baz:to_the_top */
|
||||||
|
while (1)
|
||||||
|
{
|
||||||
|
if (i == 1)
|
||||||
|
{
|
||||||
|
if (first)
|
||||||
|
{
|
||||||
|
first = false;
|
||||||
|
goto to_the_top;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
goto get_out_of_here;
|
||||||
|
}
|
||||||
|
|
||||||
|
--i;
|
||||||
|
}
|
||||||
|
|
||||||
|
get_out_of_here: /* baz:get_out_of_here */
|
||||||
|
return i;
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
int
|
||||||
|
main (void)
|
||||||
|
{
|
||||||
|
foo f;
|
||||||
|
return f.baz (foo::bar () + 3);
|
||||||
|
}
|
||||||
|
|
40
gdb/testsuite/gdb.cp/cplabel.exp
Normal file
40
gdb/testsuite/gdb.cp/cplabel.exp
Normal file
@ -0,0 +1,40 @@
|
|||||||
|
# Copyright 2012 Free Software Foundation, Inc.
|
||||||
|
|
||||||
|
# This program is free software; you can redistribute it and/or modify
|
||||||
|
# it under the terms of the GNU General Public License as published by
|
||||||
|
# the Free Software Foundation; either version 3 of the License, or
|
||||||
|
# (at your option) any later version.
|
||||||
|
#
|
||||||
|
# This program is distributed in the hope that it will be useful,
|
||||||
|
# but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||||
|
# GNU General Public License for more details.
|
||||||
|
#
|
||||||
|
# You should have received a copy of the GNU General Public License
|
||||||
|
# along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||||
|
|
||||||
|
# Tests for breakpoint on labels in methods.
|
||||||
|
|
||||||
|
if {[skip_cplus_tests]} { continue }
|
||||||
|
|
||||||
|
set testfile cplabel
|
||||||
|
set srcfile "$testfile.cc"
|
||||||
|
if {[prepare_for_testing "$testfile.exp" $testfile $srcfile {c++ debug}]} {
|
||||||
|
return -1
|
||||||
|
}
|
||||||
|
|
||||||
|
if {![runto_main]} {
|
||||||
|
untested "could not run to main"
|
||||||
|
return -1
|
||||||
|
}
|
||||||
|
|
||||||
|
set methods {"bar" "baz"}
|
||||||
|
set labels {"to_the_top" "get_out_of_here"}
|
||||||
|
|
||||||
|
foreach m $methods {
|
||||||
|
foreach l $labels {
|
||||||
|
set line [gdb_get_line_number "$m:$l"]
|
||||||
|
gdb_test "break foo::$m:$l" \
|
||||||
|
"Breakpoint $decimal at $hex: file .*/$srcfile, line $line\."
|
||||||
|
}
|
||||||
|
}
|
@ -320,23 +320,17 @@ gdb_expect {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
gdb_test "info break" \
|
# Create the breakpoint table for "info breakpoint".
|
||||||
"Num Type\[\t \]+Disp Enb Address\[\t \]+What.*
|
set bptable "Num Type\[\t \]+Disp Enb Address\[\t \]+What.*\[\r\n]+"
|
||||||
\[0-9\]+\[\t \]+breakpoint keep y\[\t \]+<MULTIPLE>\[\t \]*\r
|
append bptable "\[0-9\]+\[\t \]+breakpoint\[\t \]+keep\[\t \]y\[\t \]+<MULTIPLE>.*\[\r\n\]+"
|
||||||
\[0-9\]+.1\[\t \]+y\[\t \]+$hex\[\t \]+in foo::overload1arg\\(double\\) at.*$srcfile:140\r
|
foreach ovld {void char signed_char unsigned_char short_int \
|
||||||
\[0-9\]+.2\[\t \]+y\[\t \]+$hex\[\t \]+in foo::overload1arg\\(float\\) at.*$srcfile:137\r
|
unsigned_short_int int unsigned_int long_int \
|
||||||
\[0-9\]+.3\[\t \]+y\[\t \]+$hex\[\t \]+in foo::overload1arg\\((unsigned long|long unsigned)( int)?\\) at.*$srcfile:134\r
|
unsigned_long_int float double} {
|
||||||
\[0-9\]+.4\[\t \]+y\[\t \]+$hex\[\t \]+in foo::overload1arg\\(long( int)?\\) at.*$srcfile:131\r
|
append bptable [format "\[0-9\]+.\[0-9\]+\[\t \]+y\[\t \]+$hex\[\t \]+in foo::overload1arg\\(%s\\) at.*$srcfile:%d\[\r\n\]+" \
|
||||||
\[0-9\]+.5\[\t \]+y\[\t \]+$hex\[\t \]+in foo::overload1arg\\((unsigned|unsigned int)\\) at.*$srcfile:128\r
|
$types($ovld) $line($ovld)]
|
||||||
\[0-9\]+.6\[\t \]+y\[\t \]+$hex\[\t \]+in foo::overload1arg\\(int\\) at.*$srcfile:125\r
|
}
|
||||||
\[0-9\]+.7\[\t \]+y\[\t \]+$hex\[\t \]+in foo::overload1arg\\((unsigned short|short unsigned)( int)?\\) at.*$srcfile:122\r
|
|
||||||
\[0-9\]+.8\[\t \]+y\[\t \]+$hex\[\t \]+in foo::overload1arg\\(short( int)?\\) at.*$srcfile:119\r
|
|
||||||
\[0-9\]+.9\[\t \]+y\[\t \]+$hex\[\t \]+in foo::overload1arg\\(unsigned char\\) at.*$srcfile:116\r
|
|
||||||
\[0-9\]+.10\[\t \]+y\[\t \]+$hex\[\t \]+in foo::overload1arg\\(signed char\\) at.*$srcfile:113\r
|
|
||||||
\[0-9\]+.11\[\t \]+y\[\t \]+$hex\[\t \]+in foo::overload1arg\\(char\\) at.*$srcfile:110\r
|
|
||||||
\[0-9\]+.12\[\t \]+y\[\t \]+$hex\[\t \]+in foo::overload1arg\\((void|)\\) at.*$srcfile:107" \
|
|
||||||
"breakpoint info (after setting on all)"
|
|
||||||
|
|
||||||
|
gdb_test "info break" $bptable "breakpoint info (after setting on all)"
|
||||||
|
|
||||||
# Run through each breakpoint.
|
# Run through each breakpoint.
|
||||||
proc continue_to_bp_overloaded {bpnumber might_fail line argtype argument} {
|
proc continue_to_bp_overloaded {bpnumber might_fail line argtype argument} {
|
||||||
|
@ -136,8 +136,8 @@ gdb_test "print one += 7" "\\\$\[0-9\]* = {x = 9, y = 10}"
|
|||||||
gdb_test "print two = one" "\\\$\[0-9\]* = {x = 9, y = 10}"
|
gdb_test "print two = one" "\\\$\[0-9\]* = {x = 9, y = 10}"
|
||||||
|
|
||||||
# Check that GDB tolerates whitespace in operator names.
|
# Check that GDB tolerates whitespace in operator names.
|
||||||
gdb_test "break A2::'operator+'" ".*Breakpoint $decimal at.*"
|
gdb_test "break A2::operator+" ".*Breakpoint $decimal at.*"
|
||||||
gdb_test "break A2::'operator +'" ".*Breakpoint $decimal at.*"
|
gdb_test "break A2::operator +" ".*Breakpoint $decimal at.*"
|
||||||
|
|
||||||
# Check that GDB handles operator* correctly.
|
# Check that GDB handles operator* correctly.
|
||||||
gdb_test "print c" "\\\$\[0-9\]* = {m = {z = .*}}"
|
gdb_test "print c" "\\\$\[0-9\]* = {m = {z = .*}}"
|
||||||
|
29
gdb/testsuite/gdb.linespec/ls-errs.c
Normal file
29
gdb/testsuite/gdb.linespec/ls-errs.c
Normal file
@ -0,0 +1,29 @@
|
|||||||
|
/* This testcase is part of GDB, the GNU debugger.
|
||||||
|
|
||||||
|
Copyright 2012 Free Software Foundation, Inc.
|
||||||
|
|
||||||
|
This program is free software; you can redistribute it and/or modify
|
||||||
|
it under the terms of the GNU General Public License as published by
|
||||||
|
the Free Software Foundation; either version 3 of the License, or
|
||||||
|
(at your option) any later version.
|
||||||
|
|
||||||
|
This program is distributed in the hope that it will be useful,
|
||||||
|
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||||
|
GNU General Public License for more details.
|
||||||
|
|
||||||
|
You should have received a copy of the GNU General Public License
|
||||||
|
along with this program. If not, see <http://www.gnu.org/licenses/>. */
|
||||||
|
|
||||||
|
int myfunction (void) { return 0; }
|
||||||
|
|
||||||
|
int
|
||||||
|
main (void)
|
||||||
|
{
|
||||||
|
int a;
|
||||||
|
|
||||||
|
a = myfunction ();
|
||||||
|
|
||||||
|
here:
|
||||||
|
return a;
|
||||||
|
}
|
189
gdb/testsuite/gdb.linespec/ls-errs.exp
Normal file
189
gdb/testsuite/gdb.linespec/ls-errs.exp
Normal file
@ -0,0 +1,189 @@
|
|||||||
|
# Copyright 2012 Free Software Foundation, Inc.
|
||||||
|
|
||||||
|
# This program is free software; you can redistribute it and/or modify
|
||||||
|
# it under the terms of the GNU General Public License as published by
|
||||||
|
# the Free Software Foundation; either version 3 of the License, or
|
||||||
|
# (at your option) any later version.
|
||||||
|
#
|
||||||
|
# This program is distributed in the hope that it will be useful,
|
||||||
|
# but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||||
|
# GNU General Public License for more details.
|
||||||
|
#
|
||||||
|
# You should have received a copy of the GNU General Public License
|
||||||
|
# along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||||
|
|
||||||
|
# Tests for linespec error conditions
|
||||||
|
|
||||||
|
set base ls-errs
|
||||||
|
set srcfile "$base.c"
|
||||||
|
set testfile "$base.exp"
|
||||||
|
set exefile $base
|
||||||
|
|
||||||
|
if {[prepare_for_testing $testfile $exefile $srcfile \
|
||||||
|
{debug nowarnings}]} {
|
||||||
|
return -1
|
||||||
|
}
|
||||||
|
|
||||||
|
# Turn off the pending breakpoint queries.
|
||||||
|
gdb_test_no_output "set breakpoint pending off"
|
||||||
|
|
||||||
|
# We intentionally do not use gdb_breakpoint for these tests.
|
||||||
|
|
||||||
|
# Add the (invalid) LINESPEC to the test array named in ARRAY_NAME.
|
||||||
|
# Use the index into ::error_messages MSG_ID and ARGS to create
|
||||||
|
# an error message which is the expect result of attempting to
|
||||||
|
# break on the given LINESPEC.
|
||||||
|
proc add {array_name linespec msg_id args} {
|
||||||
|
global error_messages
|
||||||
|
upvar $array_name tests
|
||||||
|
|
||||||
|
lappend tests(linespecs) $linespec
|
||||||
|
set tests("$linespec") [string_to_regexp \
|
||||||
|
[eval format \$error_messages($msg_id) $args]]
|
||||||
|
}
|
||||||
|
|
||||||
|
# Common error message format strings.
|
||||||
|
array set error_messages {
|
||||||
|
invalid_file "No source file named %s."
|
||||||
|
invalid_function "Function \"%s\" not defined."
|
||||||
|
invalid_var_or_func "Undefined convenience variable or function \"%s\" not defined."
|
||||||
|
invalid_function_f "Function \"%s\" not defined in \"%s\"."
|
||||||
|
invalid_var_or_func_f \
|
||||||
|
"Undefined convenience variable or function \"%s\" not defined in \"%s\"."
|
||||||
|
invalid_label "No label \"%s\" defined in function \"%s\"."
|
||||||
|
invalid_offset "No line %d in the current file."
|
||||||
|
invalid_offset_f "No line %d in file \"%s\"."
|
||||||
|
unexpected "malformed linespec error: unexpected %s"
|
||||||
|
unexpected_opt "malformed linespec error: unexpected %s, \"%s\""
|
||||||
|
unmatched_quote "unmatched quote"
|
||||||
|
}
|
||||||
|
|
||||||
|
# Some commonly used whitespace tests around ':'.
|
||||||
|
set spaces [list ":" ": " " :" " : " "\t: " " :\t" "\t:\t" " \t:\t " \
|
||||||
|
"\t \t:\t \t \t"]
|
||||||
|
|
||||||
|
# A list of invalid offsets.
|
||||||
|
set invalid_offsets [list -100 +500 1000]
|
||||||
|
|
||||||
|
# THE_TESTS will hold all of our test information. Array index
|
||||||
|
# "linespecs" will contain the complete list of all linespecs
|
||||||
|
# to be tested. An array index of \"$linespec\" will contain
|
||||||
|
# the expected result.
|
||||||
|
set the_tests(linespecs) {}
|
||||||
|
|
||||||
|
# Try some simple, invalid linespecs involving spaces.
|
||||||
|
foreach x $spaces {
|
||||||
|
add the_tests $x unexpected "colon"
|
||||||
|
}
|
||||||
|
|
||||||
|
# Test invalid filespecs starting with offset. This is done
|
||||||
|
# first so that default offsets are tested.
|
||||||
|
foreach x $invalid_offsets {
|
||||||
|
set offset $x
|
||||||
|
|
||||||
|
# Relative offsets are relative to line 16. Adjust
|
||||||
|
# expected offset from error message accordingly.
|
||||||
|
if {[string index $x 0] == "+" ||
|
||||||
|
[string index $x 0] == "-"} {
|
||||||
|
incr offset 16
|
||||||
|
}
|
||||||
|
add the_tests $x invalid_offset $offset
|
||||||
|
}
|
||||||
|
|
||||||
|
# Test offsets with trailing tokens w/ and w/o spaces.
|
||||||
|
foreach x $spaces {
|
||||||
|
add the_tests "3$x" unexpected "colon"
|
||||||
|
add the_tests "+10$x" unexpected "colon"
|
||||||
|
add the_tests "-10$x" unexpected "colon"
|
||||||
|
}
|
||||||
|
|
||||||
|
foreach x {1 +1 +100 -10} {
|
||||||
|
add the_tests "3 $x" unexpected_opt "number" $x
|
||||||
|
add the_tests "+10 $x" unexpected_opt "number" $x
|
||||||
|
add the_tests "-10 $x" unexpected_opt "number" $x
|
||||||
|
}
|
||||||
|
|
||||||
|
add the_tests "3 foo" unexpected_opt "string" "foo"
|
||||||
|
add the_tests "+10 foo" unexpected_opt "string" "foo"
|
||||||
|
add the_tests "-10 foo" unexpected_opt "string" "foo"
|
||||||
|
|
||||||
|
# Test invalid linespecs starting with filename.
|
||||||
|
foreach x [list "this_file_doesn't_exist.c" \
|
||||||
|
"this file has spaces.c" \
|
||||||
|
"\"file::colons.c\"" \
|
||||||
|
"'file::colons.c'" \
|
||||||
|
"\"this \"file\" has quotes.c\"" \
|
||||||
|
"'this \"file\" has quotes.c'" \
|
||||||
|
"'this 'file' has quotes.c'" \
|
||||||
|
"\"this 'file' has quotes.c\""] {
|
||||||
|
# Remove any quoting from FILENAME for the error message.
|
||||||
|
add the_tests "$x:3" invalid_file [string trim $x \"']
|
||||||
|
}
|
||||||
|
|
||||||
|
# Test unmatched quotes.
|
||||||
|
foreach x {"\"src-file.c'" "'src-file.c"} {
|
||||||
|
add the_tests "$x:3" unmatched_quote
|
||||||
|
}
|
||||||
|
|
||||||
|
add the_tests $srcfile invalid_function $srcfile
|
||||||
|
foreach x {"foo" " foo" " foo "} {
|
||||||
|
# Trim any leading/trailing whitespace for error messages.
|
||||||
|
add the_tests "$srcfile:$x" invalid_function_f [string trim $x] $srcfile
|
||||||
|
add the_tests "$srcfile:main:$x" invalid_label [string trim $x] "main"
|
||||||
|
}
|
||||||
|
|
||||||
|
foreach x $spaces {
|
||||||
|
add the_tests "$srcfile$x" unexpected "end of input"
|
||||||
|
add the_tests "$srcfile:main$x" unexpected "end of input"
|
||||||
|
}
|
||||||
|
|
||||||
|
add the_tests "${srcfile}::" invalid_function "${srcfile}::"
|
||||||
|
add the_tests "$srcfile:3 1" unexpected_opt "number" "1"
|
||||||
|
add the_tests "$srcfile:3 +100" unexpected_opt "number" "+100"
|
||||||
|
add the_tests "$srcfile:3 -100" unexpected_opt "number" "-100"
|
||||||
|
add the_tests "$srcfile:3 foo" unexpected_opt "string" "foo"
|
||||||
|
|
||||||
|
foreach x $invalid_offsets {
|
||||||
|
add the_tests "$srcfile:$x" invalid_offset_f $x $srcfile
|
||||||
|
}
|
||||||
|
|
||||||
|
# Test invalid filespecs starting with function.
|
||||||
|
foreach x {"foobar" "foo::bar" "foo.bar" "foo ." "foo bar" "foo 1" \
|
||||||
|
"foo 0" "foo +10" "foo -10" "foo +100" "foo -100"} {
|
||||||
|
add the_tests $x invalid_function $x
|
||||||
|
}
|
||||||
|
|
||||||
|
foreach x $spaces {
|
||||||
|
add the_tests "main${x}there" invalid_label "there" "main"
|
||||||
|
add the_tests "main:here${x}" unexpected "end of input"
|
||||||
|
}
|
||||||
|
|
||||||
|
add the_tests "main 3" invalid_function "main 3"
|
||||||
|
add the_tests "main +100" invalid_function "main +100"
|
||||||
|
add the_tests "main -100" invalid_function "main -100"
|
||||||
|
add the_tests "main foo" invalid_function "main foo"
|
||||||
|
|
||||||
|
foreach x {"3" "+100" "-100" "foo"} {
|
||||||
|
add the_tests "main:here $x" invalid_label "here $x" "main"
|
||||||
|
}
|
||||||
|
|
||||||
|
foreach x {"if" "task" "thread"} {
|
||||||
|
add the_tests $x unexpected_opt "keyword" $x
|
||||||
|
}
|
||||||
|
|
||||||
|
add the_tests "'main.c'flubber" unexpected_opt "string" "flubber"
|
||||||
|
add the_tests "'main.c',21" invalid_function "main.c"
|
||||||
|
add the_tests "'main.c' " invalid_function "main.c"
|
||||||
|
add the_tests "'main.c'3" unexpected_opt "number" "3"
|
||||||
|
add the_tests "'main.c'+3" unexpected_opt "number" "+3"
|
||||||
|
|
||||||
|
# Test undefined convenience variables.
|
||||||
|
set x {$zippo}
|
||||||
|
add the_tests $x invalid_var_or_func $x
|
||||||
|
add the_tests "$srcfile:$x" invalid_var_or_func_f $x $srcfile
|
||||||
|
|
||||||
|
# Run the tests
|
||||||
|
foreach linespec $the_tests(linespecs) {
|
||||||
|
gdb_test "break $linespec" $the_tests("$linespec")
|
||||||
|
}
|
Loading…
x
Reference in New Issue
Block a user