/* concurrent assignment (a,b,c:=c-b,a-c,b-a) ** NR: number of variables 3 ** ALIST: list of variables a,b,c ** ELIST: expression leaving values on the stack c-b,a-c,b-a */ Expression *assign_expression(int nr, Argument *alist, Expression *elist) { /* assignment is a special operator */ Type *tlist; Type ct; int i; Expression *e1; if ((i=left_on_stack(elist)) != nr) return 0; tlist = type_of_expression(elist); for (i=0; i<nr; i++) { ct = get_type(alist[i]); if (IsConst(ct)) { fprintf(stderr, "Unable to make assignments to constants.\n"); return 0; } if (!get_operator(tlist[i], OPASSIGN, NoRefType(ct))) { fprintf(stderr, "Assignment not defined for %s:=%s.\n", lookup_typename(ct), lookup_typename(tlist[i])); return 0; } } i=nr; while (i) { i--; e1=make_expression(alist[i]); e1=combine_expression(elist, e1, OPASSIGN); if (!e1) return 0; elist=e1; } return elist; }
struct value * evaluate_subexp_c (struct type *expect_type, struct expression *exp, int *pos, enum noside noside) { enum exp_opcode op = exp->elts[*pos].opcode; switch (op) { case OP_STRING: { int oplen, limit; struct type *type; struct obstack output; struct cleanup *cleanup; struct value *result; enum c_string_type dest_type; const char *dest_charset; int satisfy_expected = 0; obstack_init (&output); cleanup = make_cleanup_obstack_free (&output); ++*pos; oplen = longest_to_int (exp->elts[*pos].longconst); ++*pos; limit = *pos + BYTES_TO_EXP_ELEM (oplen + 1); dest_type = (enum c_string_type) longest_to_int (exp->elts[*pos].longconst); switch (dest_type & ~C_CHAR) { case C_STRING: type = language_string_char_type (exp->language_defn, exp->gdbarch); break; case C_WIDE_STRING: type = lookup_typename (exp->language_defn, exp->gdbarch, "wchar_t", NULL, 0); break; case C_STRING_16: type = lookup_typename (exp->language_defn, exp->gdbarch, "char16_t", NULL, 0); break; case C_STRING_32: type = lookup_typename (exp->language_defn, exp->gdbarch, "char32_t", NULL, 0); break; default: internal_error (__FILE__, __LINE__, _("unhandled c_string_type")); } /* Ensure TYPE_LENGTH is valid for TYPE. */ check_typedef (type); /* If the caller expects an array of some integral type, satisfy them. If something odder is expected, rely on the caller to cast. */ if (expect_type && TYPE_CODE (expect_type) == TYPE_CODE_ARRAY) { struct type *element_type = check_typedef (TYPE_TARGET_TYPE (expect_type)); if (TYPE_CODE (element_type) == TYPE_CODE_INT || TYPE_CODE (element_type) == TYPE_CODE_CHAR) { type = element_type; satisfy_expected = 1; } } dest_charset = charset_for_string_type (dest_type, exp->gdbarch); ++*pos; while (*pos < limit) { int len; len = longest_to_int (exp->elts[*pos].longconst); ++*pos; if (noside != EVAL_SKIP) parse_one_string (&output, &exp->elts[*pos].string, len, dest_charset, type); *pos += BYTES_TO_EXP_ELEM (len); } /* Skip the trailing length and opcode. */ *pos += 2; if (noside == EVAL_SKIP) { /* Return a dummy value of the appropriate type. */ if (expect_type != NULL) result = allocate_value (expect_type); else if ((dest_type & C_CHAR) != 0) result = allocate_value (type); else result = value_cstring ("", 0, type); do_cleanups (cleanup); return result; } if ((dest_type & C_CHAR) != 0) { LONGEST value; if (obstack_object_size (&output) != TYPE_LENGTH (type)) error (_("Could not convert character " "constant to target character set")); value = unpack_long (type, (gdb_byte *) obstack_base (&output)); result = value_from_longest (type, value); } else { int i; /* Write the terminating character. */ for (i = 0; i < TYPE_LENGTH (type); ++i) obstack_1grow (&output, 0); if (satisfy_expected) { LONGEST low_bound, high_bound; int element_size = TYPE_LENGTH (type); if (get_discrete_bounds (TYPE_INDEX_TYPE (expect_type), &low_bound, &high_bound) < 0) { low_bound = 0; high_bound = (TYPE_LENGTH (expect_type) / element_size) - 1; } if (obstack_object_size (&output) / element_size > (high_bound - low_bound + 1)) error (_("Too many array elements")); result = allocate_value (expect_type); memcpy (value_contents_raw (result), obstack_base (&output), obstack_object_size (&output)); } else result = value_cstring (obstack_base (&output), obstack_object_size (&output), type); } do_cleanups (cleanup); return result; } break; default: break; } return evaluate_subexp_standard (expect_type, exp, pos, noside); }
struct block_symbol cp_lookup_symbol_imports_or_template (const char *scope, const char *name, const struct block *block, const domain_enum domain) { struct symbol *function = BLOCK_FUNCTION (block); struct block_symbol result; if (symbol_lookup_debug) { fprintf_unfiltered (gdb_stdlog, "cp_lookup_symbol_imports_or_template" " (%s, %s, %s, %s)\n", scope, name, host_address_to_string (block), domain_name (domain)); } if (function != NULL && SYMBOL_LANGUAGE (function) == language_cplus) { /* Search the function's template parameters. */ if (SYMBOL_IS_CPLUS_TEMPLATE_FUNCTION (function)) { struct template_symbol *templ = (struct template_symbol *) function; struct symbol *sym = search_symbol_list (name, templ->n_template_arguments, templ->template_arguments); if (sym != NULL) { if (symbol_lookup_debug) { fprintf_unfiltered (gdb_stdlog, "cp_lookup_symbol_imports_or_template" " (...) = %s\n", host_address_to_string (sym)); } return (struct block_symbol) {sym, block}; } } /* Search the template parameters of the function's defining context. */ if (SYMBOL_NATURAL_NAME (function)) { struct type *context; char *name_copy = xstrdup (SYMBOL_NATURAL_NAME (function)); struct cleanup *cleanups = make_cleanup (xfree, name_copy); const struct language_defn *lang = language_def (language_cplus); struct gdbarch *arch = symbol_arch (function); const struct block *parent = BLOCK_SUPERBLOCK (block); struct symbol *sym; while (1) { unsigned int prefix_len = cp_entire_prefix_len (name_copy); if (prefix_len == 0) context = NULL; else { name_copy[prefix_len] = '\0'; context = lookup_typename (lang, arch, name_copy, parent, 1); } if (context == NULL) break; sym = search_symbol_list (name, TYPE_N_TEMPLATE_ARGUMENTS (context), TYPE_TEMPLATE_ARGUMENTS (context)); if (sym != NULL) { do_cleanups (cleanups); if (symbol_lookup_debug) { fprintf_unfiltered (gdb_stdlog, "cp_lookup_symbol_imports_or_template (...) = %s\n", host_address_to_string (sym)); } return (struct block_symbol) {sym, parent}; } } do_cleanups (cleanups); } }
/* combine two expression with an operator. Unary operators ** only use the first argument. ** The function automatically chooses that operator that correctly ** converts the sub expressions to the correct types. ** If no operator is given, the two expressions are combined into ** a list. If only the first expression is given and no operator, ** then an evaluate operator is added if necessary, which ensures ** that the value is placed in a stack variable (which needed for ** concurrent assignments). */ Expression *combine_expression(Expression *e1, Expression *e2, Operator op) { Expression *te, *tf; OpStruct *os; int i; Type *restype; Type t[3]; if (!op) { i=1; te=e1; while (1) { if (te->type==ArgType) i=1; else i=0; if (!te->next) break; te=te->next; } if (!e2 && i) { te->next=malloc(sizeof(Expression)); te->next->restype=NoRefType(te->restype); te=te->next; te->type=OpType; te->delta=-1; te->val.op=0; te->next=NULL; } else { te->next=e2; } return e1; } restype = type_of_expression(e1); /* e1 could result in a list of expressions. ** a combination would use the last element from that list */ for (i=0; restype[i]; i++); if (i) i--; /* else restype[0]==0 */ t[0] = restype[i]; if (e2) { restype = type_of_expression(e2); t[1]=restype[0]; t[2]=0; } else t[1]=0; os=get_operator(t[0], op, t[1]); if (!os) { /* no operator for that type combination */ fprintf(stderr, "Operator not defined for combination (%s %s %s)\n", lookup_typename(t[0]), op_name[op], lookup_typename(t[1])); return NULL; } /* automatic type conversion should be added to both expressions */ /* or operator functions have to be defined for all possible combinations */ te = (Expression*) malloc(sizeof(Expression)); te->type=OpType; te->delta=(t[1]>0)?-2:-1; te->val.ifunc=os->ifunc; te->restype=os->restype; tf=e1; while (tf->next) tf=tf->next; tf->next=e2; while (tf->next) tf=tf->next; tf->next=te; te->next=NULL; return e1; }
static struct value * evaluate_subexp_c (struct type *expect_type, struct expression *exp, int *pos, enum noside noside) { enum exp_opcode op = exp->elts[*pos].opcode; switch (op) { case OP_STRING: { int oplen, limit; struct type *type; struct obstack output; struct cleanup *cleanup; struct value *result; enum c_string_type dest_type; const char *dest_charset; obstack_init (&output); cleanup = make_cleanup_obstack_free (&output); ++*pos; oplen = longest_to_int (exp->elts[*pos].longconst); ++*pos; limit = *pos + BYTES_TO_EXP_ELEM (oplen + 1); dest_type = (enum c_string_type) longest_to_int (exp->elts[*pos].longconst); switch (dest_type & ~C_CHAR) { case C_STRING: type = language_string_char_type (exp->language_defn, exp->gdbarch); break; case C_WIDE_STRING: type = lookup_typename (exp->language_defn, exp->gdbarch, "wchar_t", NULL, 0); break; case C_STRING_16: type = lookup_typename (exp->language_defn, exp->gdbarch, "char16_t", NULL, 0); break; case C_STRING_32: type = lookup_typename (exp->language_defn, exp->gdbarch, "char32_t", NULL, 0); break; default: internal_error (__FILE__, __LINE__, "unhandled c_string_type"); } /* Ensure TYPE_LENGTH is valid for TYPE. */ check_typedef (type); dest_charset = charset_for_string_type (dest_type, exp->gdbarch); ++*pos; while (*pos < limit) { int len; len = longest_to_int (exp->elts[*pos].longconst); ++*pos; if (noside != EVAL_SKIP) parse_one_string (&output, &exp->elts[*pos].string, len, dest_charset, type); *pos += BYTES_TO_EXP_ELEM (len); } /* Skip the trailing length and opcode. */ *pos += 2; if (noside == EVAL_SKIP) { /* Return a dummy value of the appropriate type. */ if ((dest_type & C_CHAR) != 0) result = allocate_value (type); else result = value_cstring ("", 0, type); do_cleanups (cleanup); return result; } if ((dest_type & C_CHAR) != 0) { LONGEST value; if (obstack_object_size (&output) != TYPE_LENGTH (type)) error (_("Could not convert character constant to target character set")); value = unpack_long (type, obstack_base (&output)); result = value_from_longest (type, value); } else { int i; /* Write the terminating character. */ for (i = 0; i < TYPE_LENGTH (type); ++i) obstack_1grow (&output, 0); result = value_cstring (obstack_base (&output), obstack_object_size (&output), type); } do_cleanups (cleanup); return result; } break; default: break; } return evaluate_subexp_standard (expect_type, exp, pos, noside); }
static struct type * hpacc_value_rtti_type (struct value *v, int *full, int *top, int *using_enc) { struct type *known_type; struct type *rtti_type; CORE_ADDR coreptr; struct value *vp; int using_enclosing = 0; long top_offset = 0; char rtti_type_name[256]; if (full) *full = 0; if (top) *top = -1; if (using_enc) *using_enc = 0; /* Get declared type */ known_type = value_type (v); CHECK_TYPEDEF (known_type); /* RTTI works only or class objects */ if (TYPE_CODE (known_type) != TYPE_CODE_CLASS) return NULL; /* If neither the declared type nor the enclosing type of the * value structure has a HP ANSI C++ style virtual table, * we can't do anything. */ if (!TYPE_HAS_VTABLE (known_type)) { known_type = value_enclosing_type (v); CHECK_TYPEDEF (known_type); if ((TYPE_CODE (known_type) != TYPE_CODE_CLASS) || !TYPE_HAS_VTABLE (known_type)) return NULL; /* No RTTI, or not HP-compiled types */ CHECK_TYPEDEF (known_type); using_enclosing = 1; } if (using_enclosing && using_enc) *using_enc = 1; /* First get the virtual table address */ coreptr = *(CORE_ADDR *) ((value_contents_all (v)) + value_offset (v) + (using_enclosing ? 0 : value_embedded_offset (v))); if (coreptr == 0) /* return silently -- maybe called on gdb-generated value */ return NULL; /* Fetch the top offset of the object */ /* FIXME possible 32x64 problem with pointer size & arithmetic */ vp = value_at (builtin_type_int, coreptr + 4 * HP_ACC_TOP_OFFSET_OFFSET); top_offset = value_as_long (vp); if (top) *top = top_offset; /* Fetch the typeinfo pointer */ /* FIXME possible 32x64 problem with pointer size & arithmetic */ vp = value_at (builtin_type_int, coreptr + 4 * HP_ACC_TYPEINFO_OFFSET); /* Indirect through the typeinfo pointer and retrieve the pointer * to the string name */ coreptr = *(CORE_ADDR *) (value_contents (vp)); if (!coreptr) error (_("Retrieved null typeinfo pointer in trying to determine " "run-time type")); /* 4 -> offset of name field */ vp = value_at (builtin_type_int, coreptr + 4); /* FIXME possible 32x64 problem */ coreptr = *(CORE_ADDR *) (value_contents (vp)); read_memory_string (coreptr, rtti_type_name, 256); if (strlen (rtti_type_name) == 0) error (_("Retrieved null type name from typeinfo")); /* search for type */ rtti_type = lookup_typename (rtti_type_name, (struct block *) 0, 1); if (!rtti_type) error (_("Could not find run-time type: invalid type name %s in typeinfo??"), rtti_type_name); CHECK_TYPEDEF (rtti_type); #if 0 printf ("RTTI type name %s, tag %s, full? %d\n", TYPE_NAME (rtti_type), TYPE_TAG_NAME (rtti_type), full ? *full : -1); #endif /* Check whether we have the entire object */ if (full /* Non-null pointer passed */ && /* Either we checked on the whole object in hand and found the top offset to be zero */ (((top_offset == 0) && using_enclosing && TYPE_LENGTH (known_type) == TYPE_LENGTH (rtti_type)) || /* Or we checked on the embedded object and top offset was the same as the embedded offset */ ((top_offset == value_embedded_offset (v)) && !using_enclosing && TYPE_LENGTH (value_enclosing_type (v)) == TYPE_LENGTH (rtti_type)))) *full = 1; return rtti_type; }