PR macros/7961:
authorTom Tromey <tromey@redhat.com>
Wed, 27 Jun 2012 18:08:41 +0000 (18:08 +0000)
committerTom Tromey <tromey@redhat.com>
Wed, 27 Jun 2012 18:08:41 +0000 (18:08 +0000)
* 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.

gdb/ChangeLog
gdb/ada-lang.c
gdb/breakpoint.c
gdb/eval.c
gdb/expression.h
gdb/parse.c
gdb/testsuite/ChangeLog
gdb/testsuite/gdb.base/macscp.exp
gdb/testsuite/gdb.base/macscp1.c
gdb/tracepoint.c
gdb/varobj.c

index 7b96f2965aeb0c858340e89c47bb098ea0e7b998..0e1cd3c6711faf6d6737ae04a2c91804344aa8ce 100644 (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
index 7afcef8d4a8592f9567d5c10244aa0368c259c73..aa090af81bd7f04fde80c2c3fbd385830986b513 100644 (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 "
index 12ab2713426de4578b064b422d02f06d62c74f39..71a5e193969dec1113a1544014e229c0dd4f9209 100644 (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)
index 7f1dfac0cc70f3b4cf44dfb62fc989c9df655025..3d434066767d82142a7d9561dccee043a7541284 100644 (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);
index ace58f2b4764599394de7d242911eb6fdd3f718c..004a60e85c2e93243ba900bd26e75eee9e840481 100644 (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.  */
index 0d0467d9ce23cb7882b2de80b38e29eb873cf774..c372f407241933b7be4957fec46f848be9a04c8d 100644 (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)
index 283bd033c4263eaa1c25d62bfa71ebf3de9c3963..b8ded368d8131b7597302c8db4b565e11688a81c 100644 (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.
index 5f29204e97a00ddea3f433a15d5725514989160a..1f995d570643e5f86a8844ab9a0503ec7412c02f 100644 (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" \
index b1eb0b4490aec8adecc8e379bbf77ae353f4de2c..09a4c0dd182d4c1fe404a8d7018dbe9ca40a60ef 100644 (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 */
 }
index 6d76f4b1bfca6d474befc47d03566e1816106199..e4fd2d3810d807d06af8d94f8599b7568005aeba 100644 (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);
 
index 308649972108ad8a954abf511d3b7737c8b66ba3..42e2ce4f3bd3db336e4d51cb301737ebf75adbf1 100644 (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);