PR macros/7961:

* varobj.c (varobj_create): Update.
	(varobj_set_value): Update.
	* tracepoint.c (validate_actionline): Update.
	(encode_actions_1): Update.
	* parse.c (parse_exp_1): Add 'pc' argument.
	(parse_exp_in_context): Add 'pc' argument.  Change how
	expression_context_pc is set.
	(parse_expression): Update.
	(parse_field_expression): Update.
	* expression.h (parse_exp_1): Update.
	* eval.c (parse_to_comma_and_eval): Update.
	* breakpoint.c (set_breakpoint_condition): Update.
	(update_watchpoint): Update.
	(init_breakpoint_sal): Update
	(find_condition_and_thread): Update.
	(watch_command_1): Update.
	(update_breakpoint_locations): Update.
	* ada-lang.c (ada_read_renaming_var_value): Update.
	(create_excep_cond_exprs): Update.
testsuite
	* gdb.base/macscp1.c (macscp_expr): Add breakpoint comment.
	* gdb.base/macscp.exp (maybe_kfail): Add test for macro scope.
This commit is contained in:
Tom Tromey 2012-06-27 18:08:41 +00:00
parent c83ee9021b
commit 1bb9788dbb
11 changed files with 84 additions and 30 deletions

View File

@ -1,3 +1,26 @@
2012-06-27 Tom Tromey <tromey@redhat.com>
PR macros/7961:
* varobj.c (varobj_create): Update.
(varobj_set_value): Update.
* tracepoint.c (validate_actionline): Update.
(encode_actions_1): Update.
* parse.c (parse_exp_1): Add 'pc' argument.
(parse_exp_in_context): Add 'pc' argument. Change how
expression_context_pc is set.
(parse_expression): Update.
(parse_field_expression): Update.
* expression.h (parse_exp_1): Update.
* eval.c (parse_to_comma_and_eval): Update.
* breakpoint.c (set_breakpoint_condition): Update.
(update_watchpoint): Update.
(init_breakpoint_sal): Update
(find_condition_and_thread): Update.
(watch_command_1): Update.
(update_breakpoint_locations): Update.
* ada-lang.c (ada_read_renaming_var_value): Update.
(create_excep_cond_exprs): Update.
2012-06-27 Doug Evans <dje@google.com>
* dwarf2read.c (per_cu_header_read_in): Simplify, and handle

View File

@ -4060,7 +4060,7 @@ ada_read_renaming_var_value (struct symbol *renaming_sym,
sym_name = xstrdup (SYMBOL_LINKAGE_NAME (renaming_sym));
old_chain = make_cleanup (xfree, sym_name);
expr = parse_exp_1 (&sym_name, block, 0);
expr = parse_exp_1 (&sym_name, 0, block, 0);
make_cleanup (free_current_contents, &expr);
value = evaluate_expression (expr);
@ -11140,7 +11140,8 @@ create_excep_cond_exprs (struct ada_catchpoint *c)
s = cond_string;
TRY_CATCH (e, RETURN_MASK_ERROR)
{
exp = parse_exp_1 (&s, block_for_pc (bl->address), 0);
exp = parse_exp_1 (&s, bl->address,
block_for_pc (bl->address), 0);
}
if (e.reason < 0)
warning (_("failed to reevaluate internal exception condition "

View File

@ -926,7 +926,7 @@ set_breakpoint_condition (struct breakpoint *b, char *exp,
innermost_block = NULL;
arg = exp;
w->cond_exp = parse_exp_1 (&arg, 0, 0);
w->cond_exp = parse_exp_1 (&arg, 0, 0, 0);
if (*arg)
error (_("Junk at end of expression"));
w->cond_exp_valid_block = innermost_block;
@ -939,7 +939,8 @@ set_breakpoint_condition (struct breakpoint *b, char *exp,
{
arg = exp;
loc->cond =
parse_exp_1 (&arg, block_for_pc (loc->address), 0);
parse_exp_1 (&arg, loc->address,
block_for_pc (loc->address), 0);
if (*arg)
error (_("Junk at end of expression"));
}
@ -1731,7 +1732,7 @@ update_watchpoint (struct watchpoint *b, int reparse)
b->exp = NULL;
}
s = b->exp_string_reparse ? b->exp_string_reparse : b->exp_string;
b->exp = parse_exp_1 (&s, b->exp_valid_block, 0);
b->exp = parse_exp_1 (&s, 0, b->exp_valid_block, 0);
/* If the meaning of expression itself changed, the old value is
no longer relevant. We don't want to report a watchpoint hit
to the user when the old value and the new value may actually
@ -1752,7 +1753,7 @@ update_watchpoint (struct watchpoint *b, int reparse)
}
s = b->base.cond_string;
b->cond_exp = parse_exp_1 (&s, b->cond_exp_valid_block, 0);
b->cond_exp = parse_exp_1 (&s, 0, b->cond_exp_valid_block, 0);
}
}
@ -8765,7 +8766,8 @@ init_breakpoint_sal (struct breakpoint *b, struct gdbarch *gdbarch,
if (b->cond_string)
{
char *arg = b->cond_string;
loc->cond = parse_exp_1 (&arg, block_for_pc (loc->address), 0);
loc->cond = parse_exp_1 (&arg, loc->address,
block_for_pc (loc->address), 0);
if (*arg)
error (_("Garbage '%s' follows condition"), arg);
}
@ -9052,7 +9054,7 @@ find_condition_and_thread (char *tok, CORE_ADDR pc,
struct expression *expr;
tok = cond_start = end_tok + 1;
expr = parse_exp_1 (&tok, block_for_pc (pc), 0);
expr = parse_exp_1 (&tok, pc, block_for_pc (pc), 0);
xfree (expr);
cond_end = tok;
*cond_string = savestring (cond_start, cond_end - cond_start);
@ -10572,7 +10574,7 @@ watch_command_1 (char *arg, int accessflag, int from_tty,
/* Parse the rest of the arguments. */
innermost_block = NULL;
exp_start = arg;
exp = parse_exp_1 (&arg, 0, 0);
exp = parse_exp_1 (&arg, 0, 0, 0);
exp_end = arg;
/* Remove trailing whitespace from the expression before saving it.
This makes the eventual display of the expression string a bit
@ -10627,7 +10629,7 @@ watch_command_1 (char *arg, int accessflag, int from_tty,
innermost_block = NULL;
tok = cond_start = end_tok + 1;
cond = parse_exp_1 (&tok, 0, 0);
cond = parse_exp_1 (&tok, 0, 0, 0);
/* The watchpoint expression may not be local, but the condition
may still be. E.g.: `watch global if local > 0'. */
@ -13677,7 +13679,8 @@ update_breakpoint_locations (struct breakpoint *b,
s = b->cond_string;
TRY_CATCH (e, RETURN_MASK_ERROR)
{
new_loc->cond = parse_exp_1 (&s, block_for_pc (sals.sals[i].pc),
new_loc->cond = parse_exp_1 (&s, sals.sals[i].pc,
block_for_pc (sals.sals[i].pc),
0);
}
if (e.reason < 0)

View File

@ -125,7 +125,7 @@ parse_and_eval (char *exp)
struct value *
parse_to_comma_and_eval (char **expp)
{
struct expression *expr = parse_exp_1 (expp, (struct block *) 0, 1);
struct expression *expr = parse_exp_1 (expp, 0, (struct block *) 0, 1);
struct value *val;
struct cleanup *old_chain =
make_cleanup (free_current_contents, &expr);

View File

@ -100,7 +100,8 @@ extern struct expression *parse_expression (char *);
extern struct type *parse_field_expression (char *, char **);
extern struct expression *parse_exp_1 (char **, struct block *, int);
extern struct expression *parse_exp_1 (char **, CORE_ADDR pc, struct block *,
int);
/* For use by parsers; set if we want to parse an expression and
attempt to complete a field name. */

View File

@ -116,7 +116,8 @@ static void free_funcalls (void *ignore);
static int prefixify_subexp (struct expression *, struct expression *, int,
int);
static struct expression *parse_exp_in_context (char **, struct block *, int,
static struct expression *parse_exp_in_context (char **, CORE_ADDR,
struct block *, int,
int, int *);
void _initialize_parse (void);
@ -1097,9 +1098,9 @@ prefixify_subexp (struct expression *inexpr,
If COMMA is nonzero, stop if a comma is reached. */
struct expression *
parse_exp_1 (char **stringptr, struct block *block, int comma)
parse_exp_1 (char **stringptr, CORE_ADDR pc, struct block *block, int comma)
{
return parse_exp_in_context (stringptr, block, comma, 0, NULL);
return parse_exp_in_context (stringptr, pc, block, comma, 0, NULL);
}
/* As for parse_exp_1, except that if VOID_CONTEXT_P, then
@ -1110,8 +1111,8 @@ parse_exp_1 (char **stringptr, struct block *block, int comma)
is left untouched. */
static struct expression *
parse_exp_in_context (char **stringptr, struct block *block, int comma,
int void_context_p, int *out_subexp)
parse_exp_in_context (char **stringptr, CORE_ADDR pc, struct block *block,
int comma, int void_context_p, int *out_subexp)
{
volatile struct gdb_exception except;
struct cleanup *old_chain;
@ -1138,8 +1139,10 @@ parse_exp_in_context (char **stringptr, struct block *block, int comma,
/* If no context specified, try using the current frame, if any. */
if (!expression_context_block)
expression_context_block = get_selected_block (&expression_context_pc);
else
else if (pc == 0)
expression_context_pc = BLOCK_START (expression_context_block);
else
expression_context_pc = pc;
/* Fall back to using the current source static context, if any. */
@ -1227,7 +1230,7 @@ parse_expression (char *string)
{
struct expression *exp;
exp = parse_exp_1 (&string, 0, 0);
exp = parse_exp_1 (&string, 0, 0, 0);
if (*string)
error (_("Junk after end of expression."));
return exp;
@ -1252,7 +1255,7 @@ parse_field_expression (char *string, char **name)
TRY_CATCH (except, RETURN_MASK_ERROR)
{
in_parse_field = 1;
exp = parse_exp_in_context (&string, 0, 0, 0, &subexp);
exp = parse_exp_in_context (&string, 0, 0, 0, 0, &subexp);
}
in_parse_field = 0;
if (except.reason < 0 || ! exp)

View File

@ -1,3 +1,8 @@
2012-06-27 Tom Tromey <tromey@redhat.com>
* gdb.base/macscp1.c (macscp_expr): Add breakpoint comment.
* gdb.base/macscp.exp (maybe_kfail): Add test for macro scope.
2012-06-27 Tom Tromey <tromey@redhat.com>
* gdb.dwarf2/pr10770.exp: Use standard_testfile.

View File

@ -440,6 +440,17 @@ gdb_test "break [gdb_get_line_number "set breakpoint here"]" \
"Breakpoint.*at.* file .*, line.*" \
"breakpoint macscp_expr"
gdb_test "cond \$bpnum foo == MACRO_TO_EXPAND" \
"No symbol \"MACRO_TO_EXPAND\" in current context\." \
"macro MACRO_TO_EXPAND not in scope at breakpoint"
# Note that we choose the condition so that this breakpoint never
# stops.
set l2 [gdb_get_line_number "set second breakpoint here"]
gdb_test "break $l2 if foo != MACRO_TO_EXPAND" \
"Breakpoint.*at.*" \
"breakpoint macscp_expr using MACRO_TO_EXPAND"
gdb_test "continue" "foo = 0;.*" "continue to macsp_expr"
gdb_test "print address.addr" \
@ -450,7 +461,7 @@ gdb_test "print MACRO_TO_EXPAND" \
"No symbol \"MACRO_TO_EXPAND\" in current context\." \
"print expression with macro before define."
gdb_test "next" "foo = 1;" "next to definition 1"
gdb_test "next" "foo = 1;.*here.*/" "next to definition 1"
gdb_test "print MACRO_TO_EXPAND" \
" = 0" \

View File

@ -89,7 +89,7 @@ macscp_expr (void)
foo = 0; /* set breakpoint here */
#define MACRO_TO_EXPAND foo
foo = 1;
foo = 1; /* set second breakpoint here */
#undef MACRO_TO_EXPAND
foo = 2; /* stopping point for line test */
}

View File

@ -734,7 +734,8 @@ validate_actionline (char **line, struct breakpoint *b)
for (loc = t->base.loc; loc; loc = loc->next)
{
p = tmp_p;
exp = parse_exp_1 (&p, block_for_pc (loc->address), 1);
exp = parse_exp_1 (&p, loc->address,
block_for_pc (loc->address), 1);
old_chain = make_cleanup (free_current_contents, &exp);
if (exp->elts[0].opcode == OP_VAR_VALUE)
@ -787,7 +788,8 @@ validate_actionline (char **line, struct breakpoint *b)
{
p = tmp_p;
/* Only expressions are allowed for this action. */
exp = parse_exp_1 (&p, block_for_pc (loc->address), 1);
exp = parse_exp_1 (&p, loc->address,
block_for_pc (loc->address), 1);
old_chain = make_cleanup (free_current_contents, &exp);
/* We have something to evaluate, make sure that the expr to
@ -1452,7 +1454,7 @@ encode_actions_1 (struct command_line *action,
struct cleanup *old_chain = NULL;
struct cleanup *old_chain1 = NULL;
exp = parse_exp_1 (&action_exp,
exp = parse_exp_1 (&action_exp, tloc->address,
block_for_pc (tloc->address), 1);
old_chain = make_cleanup (free_current_contents, &exp);
@ -1542,7 +1544,7 @@ encode_actions_1 (struct command_line *action,
struct cleanup *old_chain = NULL;
struct cleanup *old_chain1 = NULL;
exp = parse_exp_1 (&action_exp,
exp = parse_exp_1 (&action_exp, tloc->address,
block_for_pc (tloc->address), 1);
old_chain = make_cleanup (free_current_contents, &exp);

View File

@ -624,6 +624,7 @@ varobj_create (char *objname,
enum varobj_languages lang;
struct value *value = NULL;
volatile struct gdb_exception except;
CORE_ADDR pc;
/* Parse and evaluate the expression, filling in as much of the
variable's data as possible. */
@ -650,9 +651,13 @@ varobj_create (char *objname,
if (type == USE_SELECTED_FRAME)
var->root->floating = 1;
pc = 0;
block = NULL;
if (fi != NULL)
block = get_frame_block (fi, 0);
{
block = get_frame_block (fi, 0);
pc = get_frame_pc (fi);
}
p = expression;
innermost_block = NULL;
@ -660,7 +665,7 @@ varobj_create (char *objname,
return a sensible error. */
TRY_CATCH (except, RETURN_MASK_ERROR)
{
var->root->exp = parse_exp_1 (&p, block, 0);
var->root->exp = parse_exp_1 (&p, pc, block, 0);
}
if (except.reason < 0)
@ -1471,7 +1476,7 @@ varobj_set_value (struct varobj *var, char *expression)
gdb_assert (varobj_editable_p (var));
input_radix = 10; /* ALWAYS reset to decimal temporarily. */
exp = parse_exp_1 (&s, 0, 0);
exp = parse_exp_1 (&s, 0, 0, 0);
TRY_CATCH (except, RETURN_MASK_ERROR)
{
value = evaluate_expression (exp);