Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(444)

Unified Diff: gdb/parse.c

Issue 124383005: GDB 7.6.50 (Closed) Base URL: http://git.chromium.org/native_client/nacl-gdb.git@upstream
Patch Set: Created 6 years, 11 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
« no previous file with comments | « gdb/p-valprint.c ('k') | gdb/parser-defs.h » ('j') | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: gdb/parse.c
diff --git a/gdb/parse.c b/gdb/parse.c
index 529c517c25e612486575390ba4da5b113095f214..4b9ca5de05a225b1e7d8842bae5613d07471154c 100644
--- a/gdb/parse.c
+++ b/gdb/parse.c
@@ -1,7 +1,6 @@
/* Parse expressions for GDB.
- Copyright (C) 1986, 1989-2001, 2004-2005, 2007-2012 Free Software
- Foundation, Inc.
+ Copyright (C) 1986-2013 Free Software Foundation, Inc.
Modified from expread.y by the Department of Computer Science at the
State University of New York at Buffalo, 1991.
@@ -33,7 +32,7 @@
#include "defs.h"
#include <ctype.h>
#include "arch-utils.h"
-#include "gdb_string.h"
+#include <string.h>
#include "symtab.h"
#include "gdbtypes.h"
#include "frame.h"
@@ -71,26 +70,32 @@ const struct exp_descriptor exp_descriptor_standard =
struct expression *expout;
int expout_size;
int expout_ptr;
-struct block *expression_context_block;
+const struct block *expression_context_block;
CORE_ADDR expression_context_pc;
-struct block *innermost_block;
+const struct block *innermost_block;
int arglist_len;
static struct type_stack type_stack;
-char *lexptr;
-char *prev_lexptr;
+const char *lexptr;
+const char *prev_lexptr;
int paren_depth;
int comma_terminates;
-/* True if parsing an expression to find a field reference. This is
- only used by completion. */
-int in_parse_field;
+/* True if parsing an expression to attempt completion. */
+int parse_completion;
/* The index of the last struct expression directly before a '.' or
'->'. This is set when parsing and is only used when completing a
field name. It is -1 if no dereference operation was found. */
static int expout_last_struct = -1;
+
+/* If we are completing a tagged type name, this will be nonzero. */
+static enum type_code expout_tag_completion_type = TYPE_CODE_UNDEF;
+
+/* The token for tagged type name completion. */
+static char *expout_completion_name;
+
-static int expressiondebug = 0;
+static unsigned int expressiondebug = 0;
static void
show_expressiondebug (struct ui_file *file, int from_tty,
struct cmd_list_element *c, const char *value)
@@ -115,9 +120,12 @@ static void free_funcalls (void *ignore);
static int prefixify_subexp (struct expression *, struct expression *, int,
int);
-static struct expression *parse_exp_in_context (char **, CORE_ADDR,
- struct block *, int,
+static struct expression *parse_exp_in_context (const char **, CORE_ADDR,
+ const struct block *, int,
int, int *);
+static struct expression *parse_exp_in_context_1 (const char **, CORE_ADDR,
+ const struct block *, int,
+ int, int *);
void _initialize_parse (void);
@@ -248,7 +256,7 @@ write_exp_elt_sym (struct symbol *expelt)
}
void
-write_exp_elt_block (struct block *b)
+write_exp_elt_block (const struct block *b)
{
union exp_element tmp;
@@ -488,13 +496,14 @@ write_exp_bitstring (struct stoken str)
the expression. */
void
-write_exp_msymbol (struct minimal_symbol *msymbol)
+write_exp_msymbol (struct bound_minimal_symbol bound_msym)
{
- struct objfile *objfile = msymbol_objfile (msymbol);
+ struct minimal_symbol *msymbol = bound_msym.minsym;
+ struct objfile *objfile = bound_msym.objfile;
struct gdbarch *gdbarch = get_objfile_arch (objfile);
CORE_ADDR addr = SYMBOL_VALUE_ADDRESS (msymbol);
- struct obj_section *section = SYMBOL_OBJ_SECTION (msymbol);
+ struct obj_section *section = SYMBOL_OBJ_SECTION (objfile, msymbol);
enum minimal_symbol_type type = MSYMBOL_TYPE (msymbol);
CORE_ADDR pc;
@@ -503,13 +512,14 @@ write_exp_msymbol (struct minimal_symbol *msymbol)
pc = gdbarch_convert_from_func_ptr_addr (gdbarch, addr, &current_target);
if (pc != addr)
{
- struct minimal_symbol *ifunc_msym = lookup_minimal_symbol_by_pc (pc);
+ struct bound_minimal_symbol ifunc_msym = lookup_minimal_symbol_by_pc (pc);
/* In this case, assume we have a code symbol instead of
a data symbol. */
- if (ifunc_msym != NULL && MSYMBOL_TYPE (ifunc_msym) == mst_text_gnu_ifunc
- && SYMBOL_VALUE_ADDRESS (ifunc_msym) == pc)
+ if (ifunc_msym.minsym != NULL
+ && MSYMBOL_TYPE (ifunc_msym.minsym) == mst_text_gnu_ifunc
+ && SYMBOL_VALUE_ADDRESS (ifunc_msym.minsym) == pc)
{
/* A function descriptor has been resolved but PC is still in the
STT_GNU_IFUNC resolver body (such as because inferior does not
@@ -579,9 +589,32 @@ write_exp_msymbol (struct minimal_symbol *msymbol)
void
mark_struct_expression (void)
{
+ gdb_assert (parse_completion
+ && expout_tag_completion_type == TYPE_CODE_UNDEF);
expout_last_struct = expout_ptr;
}
+/* Indicate that the current parser invocation is completing a tag.
+ TAG is the type code of the tag, and PTR and LENGTH represent the
+ start of the tag name. */
+
+void
+mark_completion_tag (enum type_code tag, const char *ptr, int length)
+{
+ gdb_assert (parse_completion
+ && expout_tag_completion_type == TYPE_CODE_UNDEF
+ && expout_completion_name == NULL
+ && expout_last_struct == -1);
+ gdb_assert (tag == TYPE_CODE_UNION
+ || tag == TYPE_CODE_STRUCT
+ || tag == TYPE_CODE_CLASS
+ || tag == TYPE_CODE_ENUM);
+ expout_tag_completion_type = tag;
+ expout_completion_name = xmalloc (length + 1);
+ memcpy (expout_completion_name, ptr, length);
+ expout_completion_name[length] = '\0';
+}
+
/* Recognize tokens that start with '$'. These include:
@@ -608,7 +641,7 @@ void
write_dollar_variable (struct stoken str)
{
struct symbol *sym = NULL;
- struct minimal_symbol *msym = NULL;
+ struct bound_minimal_symbol msym;
struct internalvar *isym = NULL;
/* Handle the tokens $digits; also $ (short for $0) and $$ (short for $$1)
@@ -663,7 +696,7 @@ write_dollar_variable (struct stoken str)
have names beginning with $ or $$. Check for those, first. */
sym = lookup_symbol (copy_name (str), (struct block *) NULL,
- VAR_DOMAIN, (int *) NULL);
+ VAR_DOMAIN, NULL);
if (sym)
{
write_exp_elt_opcode (OP_VAR_VALUE);
@@ -672,8 +705,8 @@ write_dollar_variable (struct stoken str)
write_exp_elt_opcode (OP_VAR_VALUE);
return;
}
- msym = lookup_minimal_symbol (copy_name (str), NULL, NULL);
- if (msym)
+ msym = lookup_bound_minimal_symbol (copy_name (str));
+ if (msym.minsym)
{
write_exp_msymbol (msym);
return;
@@ -700,8 +733,8 @@ handle_register:
}
-char *
-find_template_name_end (char *p)
+const char *
+find_template_name_end (const char *p)
{
int depth = 1;
int just_seen_right = 0;
@@ -910,10 +943,16 @@ operator_length_standard (const struct expression *expr, int endpos,
oplen = 3;
break;
- case BINOP_VAL:
- case UNOP_CAST:
+ case UNOP_CAST_TYPE:
case UNOP_DYNAMIC_CAST:
case UNOP_REINTERPRET_CAST:
+ case UNOP_MEMVAL_TYPE:
+ oplen = 1;
+ args = 2;
+ break;
+
+ case BINOP_VAL:
+ case UNOP_CAST:
case UNOP_MEMVAL:
oplen = 3;
args = 1;
@@ -932,6 +971,9 @@ operator_length_standard (const struct expression *expr, int endpos,
case UNOP_ODD:
case UNOP_ORD:
case UNOP_TRUNC:
+ case OP_TYPEOF:
+ case OP_DECLTYPE:
+ case OP_TYPEID:
oplen = 1;
args = 1;
break;
@@ -943,7 +985,6 @@ operator_length_standard (const struct expression *expr, int endpos,
oplen++;
break;
- case OP_LABELED:
case STRUCTOP_STRUCT:
case STRUCTOP_PTR:
args = 1;
@@ -959,12 +1000,6 @@ operator_length_standard (const struct expression *expr, int endpos,
oplen = 4 + BYTES_TO_EXP_ELEM (oplen + 1);
break;
- case OP_BITSTRING:
- oplen = longest_to_int (expr->elts[endpos - 2].longconst);
- oplen = (oplen + HOST_CHAR_BIT - 1) / HOST_CHAR_BIT;
- oplen = 4 + BYTES_TO_EXP_ELEM (oplen);
- break;
-
case OP_ARRAY:
oplen = 4;
args = longest_to_int (expr->elts[endpos - 2].longconst);
@@ -974,7 +1009,6 @@ operator_length_standard (const struct expression *expr, int endpos,
case TERNOP_COND:
case TERNOP_SLICE:
- case TERNOP_SLICE_COUNT:
args = 3;
break;
@@ -1097,11 +1131,21 @@ prefixify_subexp (struct expression *inexpr,
If COMMA is nonzero, stop if a comma is reached. */
struct expression *
-parse_exp_1 (char **stringptr, CORE_ADDR pc, struct block *block, int comma)
+parse_exp_1 (const char **stringptr, CORE_ADDR pc, const struct block *block,
+ int comma)
{
return parse_exp_in_context (stringptr, pc, block, comma, 0, NULL);
}
+static struct expression *
+parse_exp_in_context (const char **stringptr, CORE_ADDR pc,
+ const struct block *block,
+ int comma, int void_context_p, int *out_subexp)
+{
+ return parse_exp_in_context_1 (stringptr, pc, block, comma,
+ void_context_p, out_subexp);
+}
+
/* As for parse_exp_1, except that if VOID_CONTEXT_P, then
no value is expected from the expression.
OUT_SUBEXP is set when attempting to complete a field name; in this
@@ -1110,11 +1154,12 @@ parse_exp_1 (char **stringptr, CORE_ADDR pc, struct block *block, int comma)
is left untouched. */
static struct expression *
-parse_exp_in_context (char **stringptr, CORE_ADDR pc, struct block *block,
- int comma, int void_context_p, int *out_subexp)
+parse_exp_in_context_1 (const char **stringptr, CORE_ADDR pc,
+ const struct block *block,
+ int comma, int void_context_p, int *out_subexp)
{
volatile struct gdb_exception except;
- struct cleanup *old_chain;
+ struct cleanup *old_chain, *inner_chain;
const struct language_defn *lang = NULL;
int subexp;
@@ -1124,6 +1169,9 @@ parse_exp_in_context (char **stringptr, CORE_ADDR pc, struct block *block,
paren_depth = 0;
type_stack.depth = 0;
expout_last_struct = -1;
+ expout_tag_completion_type = TYPE_CODE_UNDEF;
+ xfree (expout_completion_name);
+ expout_completion_name = NULL;
comma_terminates = comma;
@@ -1181,7 +1229,13 @@ parse_exp_in_context (char **stringptr, CORE_ADDR pc, struct block *block,
else
lang = current_language;
+ /* get_current_arch may reset CURRENT_LANGUAGE via select_frame.
+ While we need CURRENT_LANGUAGE to be set to LANG (for lookup_symbol
+ and others called from *.y) ensure CURRENT_LANGUAGE gets restored
+ to the value matching SELECTED_FRAME as set by get_current_arch. */
initialize_expout (10, lang, get_current_arch ());
+ inner_chain = make_cleanup_restore_current_language ();
+ set_language (lang->la_language);
TRY_CATCH (except, RETURN_MASK_ALL)
{
@@ -1190,15 +1244,13 @@ parse_exp_in_context (char **stringptr, CORE_ADDR pc, struct block *block,
}
if (except.reason < 0)
{
- if (! in_parse_field)
+ if (! parse_completion)
{
xfree (expout);
throw_exception (except);
}
}
- discard_cleanups (old_chain);
-
reallocate_expout ();
/* Convert expression from postfix form as generated by yacc
@@ -1217,6 +1269,9 @@ parse_exp_in_context (char **stringptr, CORE_ADDR pc, struct block *block,
if (expressiondebug)
dump_prefix_expression (expout, gdb_stdlog);
+ do_cleanups (inner_chain);
+ discard_cleanups (old_chain);
+
*stringptr = lexptr;
return expout;
}
@@ -1225,7 +1280,7 @@ parse_exp_in_context (char **stringptr, CORE_ADDR pc, struct block *block,
to use up all of the contents of STRING. */
struct expression *
-parse_expression (char *string)
+parse_expression (const char *string)
{
struct expression *exp;
@@ -1244,7 +1299,8 @@ parse_expression (char *string)
*NAME must be freed by the caller. */
struct type *
-parse_field_expression (char *string, char **name)
+parse_expression_for_completion (const char *string, char **name,
+ enum type_code *code)
{
struct expression *exp = NULL;
struct value *val;
@@ -1253,12 +1309,21 @@ parse_field_expression (char *string, char **name)
TRY_CATCH (except, RETURN_MASK_ERROR)
{
- in_parse_field = 1;
+ parse_completion = 1;
exp = parse_exp_in_context (&string, 0, 0, 0, 0, &subexp);
}
- in_parse_field = 0;
+ parse_completion = 0;
if (except.reason < 0 || ! exp)
return NULL;
+
+ if (expout_tag_completion_type != TYPE_CODE_UNDEF)
+ {
+ *code = expout_tag_completion_type;
+ *name = expout_completion_name;
+ expout_completion_name = NULL;
+ return NULL;
+ }
+
if (expout_last_struct == -1)
{
xfree (exp);
@@ -1732,8 +1797,6 @@ operator_check_standard (struct expression *exp, int pos,
case OP_SCOPE:
case OP_TYPE:
case UNOP_CAST:
- case UNOP_DYNAMIC_CAST:
- case UNOP_REINTERPRET_CAST:
case UNOP_MAX:
case UNOP_MEMVAL:
case UNOP_MIN:
@@ -1853,15 +1916,15 @@ _initialize_parse (void)
type_stack.depth = 0;
type_stack.elements = NULL;
- add_setshow_zinteger_cmd ("expression", class_maintenance,
- &expressiondebug,
- _("Set expression debugging."),
- _("Show expression debugging."),
- _("When non-zero, the internal representation "
- "of expressions will be printed."),
- NULL,
- show_expressiondebug,
- &setdebuglist, &showdebuglist);
+ add_setshow_zuinteger_cmd ("expression", class_maintenance,
+ &expressiondebug,
+ _("Set expression debugging."),
+ _("Show expression debugging."),
+ _("When non-zero, the internal representation "
+ "of expressions will be printed."),
+ NULL,
+ show_expressiondebug,
+ &setdebuglist, &showdebuglist);
add_setshow_boolean_cmd ("parser", class_maintenance,
&parser_debug,
_("Set parser debugging."),
« no previous file with comments | « gdb/p-valprint.c ('k') | gdb/parser-defs.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698