diff options
Diffstat (limited to 'contrib/gdb/gdb/parse.c')
-rw-r--r-- | contrib/gdb/gdb/parse.c | 377 |
1 files changed, 122 insertions, 255 deletions
diff --git a/contrib/gdb/gdb/parse.c b/contrib/gdb/gdb/parse.c index b3fbe19..374e88e 100644 --- a/contrib/gdb/gdb/parse.c +++ b/contrib/gdb/gdb/parse.c @@ -47,7 +47,20 @@ #include "inferior.h" /* for NUM_PSEUDO_REGS. NOTE: replace with "gdbarch.h" when appropriate. */ #include "doublest.h" +#include "gdb_assert.h" +#include "block.h" +/* Standard set of definitions for printing, dumping, prefixifying, + * and evaluating expressions. */ + +const struct exp_descriptor exp_descriptor_standard = + { + print_subexp_standard, + operator_length_standard, + op_name_standard, + dump_subexp_body_standard, + evaluate_subexp_standard + }; /* Symbols which architectures can redefine. */ @@ -69,11 +82,13 @@ struct expression *expout; int expout_size; int expout_ptr; struct block *expression_context_block; +CORE_ADDR expression_context_pc; struct block *innermost_block; int arglist_len; union type_stack_elt *type_stack; int type_stack_depth, type_stack_size; char *lexptr; +char *prev_lexptr; char *namecopy; int paren_depth; int comma_terminates; @@ -86,8 +101,8 @@ static void free_funcalls (void *ignore); static void prefixify_expression (struct expression *); -static void -prefixify_subexp (struct expression *, struct expression *, int, int); +static void prefixify_subexp (struct expression *, struct expression *, int, + int); void _initialize_parse (void); @@ -102,47 +117,13 @@ struct funcall static struct funcall *funcall_chain; -/* Assign machine-independent names to certain registers - (unless overridden by the REGISTER_NAMES table) */ - -unsigned num_std_regs = 0; -struct std_regs *std_regs; - -/* The generic method for targets to specify how their registers are - named. The mapping can be derived from three sources: - REGISTER_NAME; std_regs; or a target specific alias hook. */ - -int -target_map_name_to_register (char *str, int len) -{ - int i; - - /* Search register name space. */ - for (i = 0; i < NUM_REGS + NUM_PSEUDO_REGS; i++) - if (REGISTER_NAME (i) && len == strlen (REGISTER_NAME (i)) - && STREQN (str, REGISTER_NAME (i), len)) - { - return i; - } - - /* Try standard aliases. */ - for (i = 0; i < num_std_regs; i++) - if (std_regs[i].name && len == strlen (std_regs[i].name) - && STREQN (str, std_regs[i].name, len)) - { - return std_regs[i].regnum; - } - - return -1; -} - /* Begin counting arguments for a function call, saving the data about any containing call. */ void start_arglist (void) { - register struct funcall *new; + struct funcall *new; new = (struct funcall *) xmalloc (sizeof (struct funcall)); new->next = funcall_chain; @@ -157,8 +138,8 @@ start_arglist (void) int end_arglist (void) { - register int val = arglist_len; - register struct funcall *call = funcall_chain; + int val = arglist_len; + struct funcall *call = funcall_chain; funcall_chain = call->next; arglist_len = call->arglist_len; xfree (call); @@ -171,7 +152,7 @@ end_arglist (void) static void free_funcalls (void *ignore) { - register struct funcall *call, *next; + struct funcall *call, *next; for (call = funcall_chain; call; call = next) { @@ -293,9 +274,9 @@ write_exp_elt_intern (struct internalvar *expelt) void write_exp_string (struct stoken str) { - register int len = str.length; - register int lenelt; - register char *strdata; + int len = str.length; + int lenelt; + char *strdata; /* Compute the number of expression elements required to hold the string (including a null byte terminator), along with one expression element @@ -342,10 +323,10 @@ write_exp_string (struct stoken str) void write_exp_bitstring (struct stoken str) { - register int bits = str.length; /* length in bits */ - register int len = (bits + HOST_CHAR_BIT - 1) / HOST_CHAR_BIT; - register int lenelt; - register char *strdata; + int bits = str.length; /* length in bits */ + int len = (bits + HOST_CHAR_BIT - 1) / HOST_CHAR_BIT; + int lenelt; + char *strdata; /* Compute the number of expression elements required to hold the bitstring, along with one expression element at each end to record the actual @@ -485,7 +466,8 @@ write_dollar_variable (struct stoken str) /* Handle tokens that refer to machine registers: $ followed by a register name. */ - i = target_map_name_to_register (str.ptr + 1, str.length - 1); + i = frame_map_name_to_regnum (deprecated_selected_frame, + str.ptr + 1, str.length - 1); if (i >= 0) goto handle_register; @@ -502,7 +484,7 @@ write_dollar_variable (struct stoken str) symbol table lookup performance is awful, to put it mildly. */ sym = lookup_symbol (copy_name (str), (struct block *) NULL, - VAR_NAMESPACE, (int *) NULL, (struct symtab **) NULL); + VAR_DOMAIN, (int *) NULL, (struct symtab **) NULL); if (sym) { write_exp_elt_opcode (OP_VAR_VALUE); @@ -593,7 +575,7 @@ parse_nested_classes_for_hpacc (char *name, int len, char **token, consider *prefixes* of the string; there is no need to look up "B::C" separately as a symbol in the previous example. */ - register char *p; + char *p; char *start, *end; char *prefix = NULL; char *tmp; @@ -677,17 +659,17 @@ parse_nested_classes_for_hpacc (char *name, int len, char **token, if (!done) { /* More tokens to process, so this must be a class/namespace */ - sym_class = lookup_symbol (prefix, 0, STRUCT_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_NAMESPACE, + 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_NAMESPACE, + sym_class = lookup_symbol (prefix, 0, STRUCT_DOMAIN, 0, (struct symtab **) NULL); } @@ -798,12 +780,12 @@ copy_name (struct stoken token) to prefix form (in which we can conveniently print or execute it). */ static void -prefixify_expression (register struct expression *expr) +prefixify_expression (struct expression *expr) { - register int len = + int len = sizeof (struct expression) + EXP_ELEM_TO_BYTES (expr->nelts); - register struct expression *temp; - register int inpos = expr->nelts, outpos = 0; + struct expression *temp; + int inpos = expr->nelts, outpos = 0; temp = (struct expression *) alloca (len); @@ -813,18 +795,48 @@ prefixify_expression (register struct expression *expr) prefixify_subexp (temp, expr, inpos, outpos); } -/* Return the number of exp_elements in the subexpression of EXPR - whose last exp_element is at index ENDPOS - 1 in EXPR. */ +/* Return the number of exp_elements in the postfix subexpression + of EXPR whose operator is at index ENDPOS - 1 in EXPR. */ int -length_of_subexp (register struct expression *expr, register int endpos) +length_of_subexp (struct expression *expr, int endpos) { - register int oplen = 1; - register int args = 0; - register int i; + int oplen, args, i; + + operator_length (expr, endpos, &oplen, &args); + + while (args > 0) + { + oplen += length_of_subexp (expr, endpos - oplen); + args--; + } + + return oplen; +} + +/* Sets *OPLENP to the length of the operator whose (last) index is + ENDPOS - 1 in EXPR, and sets *ARGSP to the number of arguments that + operator takes. */ + +void +operator_length (struct expression *expr, int endpos, int *oplenp, int *argsp) +{ + expr->language_defn->la_exp_desc->operator_length (expr, endpos, + oplenp, argsp); +} + +/* Default value for operator_length in exp_descriptor vectors. */ + +void +operator_length_standard (struct expression *expr, int endpos, + int *oplenp, int *argsp) +{ + int oplen = 1; + int args = 0; + int i; if (endpos < 1) - error ("?error in length_of_subexp"); + error ("?error in operator_length_standard"); i = (int) expr->elts[endpos - 1].opcode; @@ -861,6 +873,11 @@ length_of_subexp (register struct expression *expr, register int endpos) args = 1 + longest_to_int (expr->elts[endpos - 2].longconst); break; + case OP_OBJC_MSGCALL: /* Objective C message (method) call */ + oplen = 4; + args = 1 + longest_to_int (expr->elts[endpos - 2].longconst); + break; + case UNOP_MAX: case UNOP_MIN: oplen = 3; @@ -892,6 +909,8 @@ length_of_subexp (register struct expression *expr, register int endpos) /* fall through */ case OP_M2_STRING: case OP_STRING: + case OP_OBJC_NSSTRING: /* Objective C Foundation Class NSString constant */ + case OP_OBJC_SELECTOR: /* Objective C "@selector" pseudo-op */ case OP_NAME: case OP_EXPRSTRING: oplen = longest_to_int (expr->elts[endpos - 2].longconst); @@ -930,6 +949,7 @@ length_of_subexp (register struct expression *expr, register int endpos) /* C++ */ case OP_THIS: + case OP_OBJC_SELF: oplen = 2; break; @@ -937,13 +957,8 @@ length_of_subexp (register struct expression *expr, register int endpos) args = 1 + (i < (int) BINOP_END); } - while (args > 0) - { - oplen += length_of_subexp (expr, endpos - oplen); - args--; - } - - return oplen; + *oplenp = oplen; + *argsp = args; } /* Copy the subexpression ending just before index INEND in INEXPR @@ -951,127 +966,16 @@ length_of_subexp (register struct expression *expr, register int endpos) In the process, convert it from suffix to prefix form. */ static void -prefixify_subexp (register struct expression *inexpr, - struct expression *outexpr, register int inend, int outbeg) +prefixify_subexp (struct expression *inexpr, + struct expression *outexpr, int inend, int outbeg) { - register int oplen = 1; - register int args = 0; - register int i; + int oplen; + int args; + int i; int *arglens; enum exp_opcode opcode; - /* Compute how long the last operation is (in OPLEN), - and also how many preceding subexpressions serve as - arguments for it (in ARGS). */ - - opcode = inexpr->elts[inend - 1].opcode; - switch (opcode) - { - /* C++ */ - case OP_SCOPE: - oplen = longest_to_int (inexpr->elts[inend - 2].longconst); - oplen = 5 + BYTES_TO_EXP_ELEM (oplen + 1); - break; - - case OP_LONG: - case OP_DOUBLE: - case OP_VAR_VALUE: - oplen = 4; - break; - - case OP_TYPE: - case OP_BOOL: - case OP_LAST: - case OP_REGISTER: - case OP_INTERNALVAR: - oplen = 3; - break; - - case OP_COMPLEX: - oplen = 1; - args = 2; - break; - - case OP_FUNCALL: - case OP_F77_UNDETERMINED_ARGLIST: - oplen = 3; - args = 1 + longest_to_int (inexpr->elts[inend - 2].longconst); - break; - - case UNOP_MIN: - case UNOP_MAX: - oplen = 3; - break; - - case UNOP_CAST: - case UNOP_MEMVAL: - oplen = 3; - args = 1; - break; - - case UNOP_ABS: - case UNOP_CAP: - case UNOP_CHR: - case UNOP_FLOAT: - case UNOP_HIGH: - case UNOP_ODD: - case UNOP_ORD: - case UNOP_TRUNC: - oplen = 1; - args = 1; - break; - - case STRUCTOP_STRUCT: - case STRUCTOP_PTR: - case OP_LABELED: - args = 1; - /* fall through */ - case OP_M2_STRING: - case OP_STRING: - case OP_NAME: - case OP_EXPRSTRING: - oplen = longest_to_int (inexpr->elts[inend - 2].longconst); - oplen = 4 + BYTES_TO_EXP_ELEM (oplen + 1); - break; - - case OP_BITSTRING: - oplen = longest_to_int (inexpr->elts[inend - 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 (inexpr->elts[inend - 2].longconst); - args -= longest_to_int (inexpr->elts[inend - 3].longconst); - args += 1; - break; - - case TERNOP_COND: - case TERNOP_SLICE: - case TERNOP_SLICE_COUNT: - args = 3; - break; - - case BINOP_ASSIGN_MODIFY: - oplen = 3; - args = 2; - break; - - /* Modula-2 */ - case MULTI_SUBSCRIPT: - oplen = 3; - args = 1 + longest_to_int (inexpr->elts[inend - 2].longconst); - break; - - /* C++ */ - case OP_THIS: - oplen = 2; - break; - - default: - args = 1 + ((int) opcode < (int) BINOP_END); - } + operator_length (inexpr, inend, &oplen, &args); /* Copy the final operator itself, from the end of the input to the beginning of the output. */ @@ -1122,6 +1026,7 @@ parse_exp_1 (char **stringptr, struct block *block, int comma) struct cleanup *old_chain; lexptr = *stringptr; + prev_lexptr = NULL; paren_depth = 0; type_stack_depth = 0; @@ -1134,7 +1039,13 @@ parse_exp_1 (char **stringptr, struct block *block, int comma) old_chain = make_cleanup (free_funcalls, 0 /*ignore*/); funcall_chain = 0; - expression_context_block = block ? block : get_selected_block (); + if (block) + { + expression_context_block = block; + expression_context_pc = BLOCK_START (block); + } + else + expression_context_block = get_selected_block (&expression_context_pc); namecopy = (char *) alloca (strlen (lexptr) + 1); expout_size = 10; @@ -1162,14 +1073,13 @@ parse_exp_1 (char **stringptr, struct block *block, int comma) parser, to a prefix form. */ if (expressiondebug) - dump_prefix_expression (expout, gdb_stdlog, - "before conversion to prefix form"); + dump_raw_expression (expout, gdb_stdlog, + "before conversion to prefix form"); prefixify_expression (expout); if (expressiondebug) - dump_postfix_expression (expout, gdb_stdlog, - "after conversion to prefix form"); + dump_prefix_expression (expout, gdb_stdlog); *stringptr = lexptr; return expout; @@ -1181,7 +1091,7 @@ parse_exp_1 (char **stringptr, struct block *block, int comma) struct expression * parse_expression (char *string) { - register struct expression *exp; + struct expression *exp; exp = parse_exp_1 (&string, 0, 0); if (*string) error ("Junk after end of expression."); @@ -1351,63 +1261,23 @@ build_parse (void) init_type (TYPE_CODE_INT, 1, 0, "<variable (not text or data), no debug info>", NULL); +} - /* create the std_regs table */ - - num_std_regs = 0; -#ifdef PC_REGNUM - if (PC_REGNUM >= 0) - num_std_regs++; -#endif -#ifdef FP_REGNUM - if (FP_REGNUM >= 0) - num_std_regs++; -#endif -#ifdef SP_REGNUM - if (SP_REGNUM >= 0) - num_std_regs++; -#endif -#ifdef PS_REGNUM - if (PS_REGNUM >= 0) - num_std_regs++; -#endif - /* create an empty table */ - std_regs = xmalloc ((num_std_regs + 1) * sizeof *std_regs); - i = 0; - /* fill it in */ -#ifdef PC_REGNUM - if (PC_REGNUM >= 0) - { - std_regs[i].name = "pc"; - std_regs[i].regnum = PC_REGNUM; - i++; - } -#endif -#ifdef FP_REGNUM - if (FP_REGNUM >= 0) - { - std_regs[i].name = "fp"; - std_regs[i].regnum = FP_REGNUM; - i++; - } -#endif -#ifdef SP_REGNUM - if (SP_REGNUM >= 0) - { - std_regs[i].name = "sp"; - std_regs[i].regnum = SP_REGNUM; - i++; - } -#endif -#ifdef PS_REGNUM - if (PS_REGNUM >= 0) +/* This function avoids direct calls to fprintf + in the parser generated debug code. */ +void +parser_fprintf (FILE *x, const char *y, ...) +{ + va_list args; + va_start (args, y); + if (x == stderr) + vfprintf_unfiltered (gdb_stderr, y, args); + else { - std_regs[i].name = "ps"; - std_regs[i].regnum = PS_REGNUM; - i++; + fprintf_unfiltered (gdb_stderr, " Unknown FILE used.\n"); + vfprintf_unfiltered (gdb_stderr, y, args); } -#endif - memset (&std_regs[i], 0, sizeof (std_regs[i])); + va_end (args); } void @@ -1423,13 +1293,10 @@ _initialize_parse (void) /* FIXME - For the moment, handle types by swapping them in and out. Should be using the per-architecture data-pointer and a large struct. */ - register_gdbarch_swap (&msym_text_symbol_type, sizeof (msym_text_symbol_type), NULL); - register_gdbarch_swap (&msym_data_symbol_type, sizeof (msym_data_symbol_type), NULL); - register_gdbarch_swap (&msym_unknown_symbol_type, sizeof (msym_unknown_symbol_type), NULL); - - register_gdbarch_swap (&num_std_regs, sizeof (std_regs), NULL); - register_gdbarch_swap (&std_regs, sizeof (std_regs), NULL); - register_gdbarch_swap (NULL, 0, build_parse); + DEPRECATED_REGISTER_GDBARCH_SWAP (msym_text_symbol_type); + DEPRECATED_REGISTER_GDBARCH_SWAP (msym_data_symbol_type); + DEPRECATED_REGISTER_GDBARCH_SWAP (msym_unknown_symbol_type); + deprecated_register_gdbarch_swap (NULL, 0, build_parse); add_show_from_set ( add_set_cmd ("expression", class_maintenance, var_zinteger, |