static CORE_ADDR vax_store_arguments (struct regcache *regcache, int nargs, struct value **args, CORE_ADDR sp) { struct gdbarch *gdbarch = get_regcache_arch (regcache); enum bfd_endian byte_order = gdbarch_byte_order (gdbarch); gdb_byte buf[4]; int count = 0; int i; /* We create an argument list on the stack, and make the argument pointer to it. */ /* Push arguments in reverse order. */ for (i = nargs - 1; i >= 0; i--) { int len = TYPE_LENGTH (value_enclosing_type (args[i])); sp -= (len + 3) & ~3; count += (len + 3) / 4; write_memory (sp, value_contents_all (args[i]), len); } /* Push argument count. */ sp -= 4; store_unsigned_integer (buf, 4, byte_order, count); write_memory (sp, buf, 4); /* Update the argument pointer. */ store_unsigned_integer (buf, 4, byte_order, sp); regcache_cooked_write (regcache, VAX_AP_REGNUM, buf); return sp; }
static CORE_ADDR m68k_push_dummy_call (struct gdbarch *gdbarch, struct value *function, struct regcache *regcache, CORE_ADDR bp_addr, int nargs, struct value **args, CORE_ADDR sp, int struct_return, CORE_ADDR struct_addr) { struct gdbarch_tdep *tdep = gdbarch_tdep (gdbarch); enum bfd_endian byte_order = gdbarch_byte_order (gdbarch); gdb_byte buf[4]; int i; /* Push arguments in reverse order. */ for (i = nargs - 1; i >= 0; i--) { struct type *value_type = value_enclosing_type (args[i]); int len = TYPE_LENGTH (value_type); int container_len = (len + 3) & ~3; int offset; /* Non-scalars bigger than 4 bytes are left aligned, others are right aligned. */ if ((TYPE_CODE (value_type) == TYPE_CODE_STRUCT || TYPE_CODE (value_type) == TYPE_CODE_UNION || TYPE_CODE (value_type) == TYPE_CODE_ARRAY) && len > 4) offset = 0; else offset = container_len - len; sp -= container_len; write_memory (sp + offset, value_contents_all (args[i]), len); } /* Store struct value address. */ if (struct_return) { store_unsigned_integer (buf, 4, byte_order, struct_addr); regcache_cooked_write (regcache, tdep->struct_value_regnum, buf); } /* Store return address. */ sp -= 4; store_unsigned_integer (buf, 4, byte_order, bp_addr); write_memory (sp, buf, 4); /* Finally, update the stack pointer... */ store_unsigned_integer (buf, 4, byte_order, sp); regcache_cooked_write (regcache, M68K_SP_REGNUM, buf); /* ...and fake a frame pointer. */ regcache_cooked_write (regcache, M68K_FP_REGNUM, buf); /* DWARF2/GCC uses the stack address *before* the function call as a frame's CFA. */ return sp + 8; }
int c_value_print (struct value *val, struct ui_file *stream, int format, enum val_prettyprint pretty) { struct type *type, *real_type; int full, top, using_enc; /* If it is a pointer, indicate what it points to. Print type also if it is a reference. C++: if it is a member pointer, we will take care of that when we print it. */ type = check_typedef (value_type (val)); if (TYPE_CODE (type) == TYPE_CODE_PTR || TYPE_CODE (type) == TYPE_CODE_REF) { /* Hack: remove (char *) for char strings. Their type is indicated by the quoted string anyway. */ if (TYPE_CODE (type) == TYPE_CODE_PTR && TYPE_NAME (type) == NULL && TYPE_NAME (TYPE_TARGET_TYPE (type)) != NULL && strcmp (TYPE_NAME (TYPE_TARGET_TYPE (type)), "char") == 0) { /* Print nothing */ } else if (objectprint && (TYPE_CODE (TYPE_TARGET_TYPE (type)) == TYPE_CODE_CLASS)) { if (TYPE_CODE(type) == TYPE_CODE_REF) { /* Copy value, change to pointer, so we don't get an * error about a non-pointer type in value_rtti_target_type */ struct value *temparg; temparg=value_copy(val); deprecated_set_value_type (temparg, lookup_pointer_type (TYPE_TARGET_TYPE(type))); val=temparg; } /* Pointer to class, check real type of object */ fprintf_filtered (stream, "("); real_type = value_rtti_target_type (val, &full, &top, &using_enc); if (real_type) { /* RTTI entry found */ if (TYPE_CODE (type) == TYPE_CODE_PTR) { /* create a pointer type pointing to the real type */ type = lookup_pointer_type (real_type); } else { /* create a reference type referencing the real type */ type = lookup_reference_type (real_type); } /* JYG: Need to adjust pointer value. */ /* NOTE: cagney/2005-01-02: THIS IS BOGUS. */ value_contents_writeable (val)[0] -= top; /* Note: When we look up RTTI entries, we don't get any information on const or volatile attributes */ } type_print (type, "", stream, -1); fprintf_filtered (stream, ") "); } else { /* normal case */ fprintf_filtered (stream, "("); type_print (value_type (val), "", stream, -1); fprintf_filtered (stream, ") "); } } /* APPLE LOCAL begin variable initialized status. */ if (value_var_status (val) == 0) fprintf_filtered (stream, " [uninitialized] "); /* APPLE LOCAL end variable initialized status. */ if (objectprint && (TYPE_CODE (type) == TYPE_CODE_CLASS)) { /* Attempt to determine real type of object */ real_type = value_rtti_type (val, &full, &top, &using_enc); if (real_type) { /* We have RTTI information, so use it */ val = value_full_object (val, real_type, full, top, using_enc); fprintf_filtered (stream, "(%s%s) ", TYPE_NAME (real_type), full ? "" : _(" [incomplete object]")); /* Print out object: enclosing type is same as real_type if full */ return val_print (value_enclosing_type (val), value_contents_all (val), 0, VALUE_ADDRESS (val), stream, format, 1, 0, pretty); /* Note: When we look up RTTI entries, we don't get any information on const or volatile attributes */ } else if (type != check_typedef (value_enclosing_type (val))) { /* No RTTI information, so let's do our best */ fprintf_filtered (stream, "(%s ?) ", TYPE_NAME (value_enclosing_type (val))); return val_print (value_enclosing_type (val), value_contents_all (val), 0, VALUE_ADDRESS (val), stream, format, 1, 0, pretty); } /* Otherwise, we end up at the return outside this "if" */ } real_type = get_closure_dynamic_type (val); if (real_type) type = real_type; return val_print (type, value_contents_all (val), value_embedded_offset (val), VALUE_ADDRESS (val) + value_offset (val), stream, format, 1, 0, pretty); }
static CORE_ADDR i386_darwin_push_dummy_call (struct gdbarch *gdbarch, struct value *function, struct regcache *regcache, CORE_ADDR bp_addr, int nargs, struct value **args, CORE_ADDR sp, int struct_return, CORE_ADDR struct_addr) { struct gdbarch_tdep *tdep = gdbarch_tdep (gdbarch); enum bfd_endian byte_order = gdbarch_byte_order (gdbarch); gdb_byte buf[4]; int i; int write_pass; /* Determine the total space required for arguments and struct return address in a first pass, then push arguments in a second pass. */ for (write_pass = 0; write_pass < 2; write_pass++) { int args_space = 0; int num_m128 = 0; if (struct_return) { if (write_pass) { /* Push value address. */ store_unsigned_integer (buf, 4, byte_order, struct_addr); write_memory (sp, buf, 4); } args_space += 4; } for (i = 0; i < nargs; i++) { struct type *arg_type = value_enclosing_type (args[i]); if (i386_m128_p (arg_type) && num_m128 < 4) { if (write_pass) { const gdb_byte *val = value_contents_all (args[i]); regcache_raw_write (regcache, I387_MM0_REGNUM(tdep) + num_m128, val); } num_m128++; } else { args_space = align_up (args_space, i386_darwin_arg_type_alignment (arg_type)); if (write_pass) write_memory (sp + args_space, value_contents_all (args[i]), TYPE_LENGTH (arg_type)); /* The System V ABI says that: "An argument's size is increased, if necessary, to make it a multiple of [32-bit] words. This may require tail padding, depending on the size of the argument." This makes sure the stack stays word-aligned. */ args_space += align_up (TYPE_LENGTH (arg_type), 4); } } /* Darwin i386 ABI: 1. The caller ensures that the stack is 16-byte aligned at the point of the function call. */ if (!write_pass) sp = align_down (sp - args_space, 16); } /* Store return address. */ sp -= 4; store_unsigned_integer (buf, 4, byte_order, bp_addr); write_memory (sp, buf, 4); /* Finally, update the stack pointer... */ store_unsigned_integer (buf, 4, byte_order, sp); regcache_cooked_write (regcache, I386_ESP_REGNUM, buf); /* ...and fake a frame pointer. */ regcache_cooked_write (regcache, I386_EBP_REGNUM, buf); /* MarkK wrote: This "+ 8" is all over the place: (i386_frame_this_id, i386_sigtramp_frame_this_id, i386_dummy_id). It's there, since all frame unwinders for a given target have to agree (within a certain margin) on the definition of the stack address of a frame. Otherwise frame id comparison might not work correctly. Since DWARF2/GCC uses the stack address *before* the function call as a frame's CFA. On the i386, when %ebp is used as a frame pointer, the offset between the contents %ebp and the CFA as defined by GCC. */ return sp + 8; }
int c_value_print (struct value *val, struct ui_file *stream, const struct value_print_options *options) { struct type *type, *real_type, *val_type; int full, top, using_enc; struct value_print_options opts = *options; opts.deref_ref = 1; /* If it is a pointer, indicate what it points to. Print type also if it is a reference. C++: if it is a member pointer, we will take care of that when we print it. */ /* Preserve the original type before stripping typedefs. We prefer to pass down the original type when possible, but for local checks it is better to look past the typedefs. */ val_type = value_type (val); type = check_typedef (val_type); if (TYPE_CODE (type) == TYPE_CODE_PTR || TYPE_CODE (type) == TYPE_CODE_REF) { /* Hack: remove (char *) for char strings. Their type is indicated by the quoted string anyway. (Don't use c_textual_element_type here; quoted strings are always exactly (char *), (wchar_t *), or the like. */ if (TYPE_CODE (val_type) == TYPE_CODE_PTR && TYPE_NAME (val_type) == NULL && TYPE_NAME (TYPE_TARGET_TYPE (val_type)) != NULL && (strcmp (TYPE_NAME (TYPE_TARGET_TYPE (val_type)), "char") == 0 || textual_name (TYPE_NAME (TYPE_TARGET_TYPE (val_type))))) { /* Print nothing */ } else if (options->objectprint && (TYPE_CODE (TYPE_TARGET_TYPE (type)) == TYPE_CODE_CLASS)) { if (TYPE_CODE(type) == TYPE_CODE_REF) { /* Copy value, change to pointer, so we don't get an * error about a non-pointer type in value_rtti_target_type */ struct value *temparg; temparg=value_copy(val); deprecated_set_value_type (temparg, lookup_pointer_type (TYPE_TARGET_TYPE(type))); val=temparg; } /* Pointer to class, check real type of object */ fprintf_filtered (stream, "("); real_type = value_rtti_target_type (val, &full, &top, &using_enc); if (real_type) { /* RTTI entry found */ if (TYPE_CODE (type) == TYPE_CODE_PTR) { /* create a pointer type pointing to the real type */ type = lookup_pointer_type (real_type); } else { /* create a reference type referencing the real type */ type = lookup_reference_type (real_type); } /* JYG: Need to adjust pointer value. */ /* NOTE: cagney/2005-01-02: THIS IS BOGUS. */ value_contents_writeable (val)[0] -= top; /* Note: When we look up RTTI entries, we don't get any information on const or volatile attributes */ } type_print (type, "", stream, -1); fprintf_filtered (stream, ") "); val_type = type; } else { /* normal case */ fprintf_filtered (stream, "("); type_print (value_type (val), "", stream, -1); fprintf_filtered (stream, ") "); } } if (!value_initialized (val)) fprintf_filtered (stream, " [uninitialized] "); if (options->objectprint && (TYPE_CODE (type) == TYPE_CODE_CLASS)) { /* Attempt to determine real type of object */ real_type = value_rtti_type (val, &full, &top, &using_enc); if (real_type) { /* We have RTTI information, so use it */ val = value_full_object (val, real_type, full, top, using_enc); fprintf_filtered (stream, "(%s%s) ", TYPE_NAME (real_type), full ? "" : _(" [incomplete object]")); /* Print out object: enclosing type is same as real_type if full */ return val_print (value_enclosing_type (val), value_contents_all (val), 0, value_address (val), stream, 0, &opts, current_language); /* Note: When we look up RTTI entries, we don't get any information on const or volatile attributes */ } else if (type != check_typedef (value_enclosing_type (val))) { /* No RTTI information, so let's do our best */ fprintf_filtered (stream, "(%s ?) ", TYPE_NAME (value_enclosing_type (val))); return val_print (value_enclosing_type (val), value_contents_all (val), 0, value_address (val), stream, 0, &opts, current_language); } /* Otherwise, we end up at the return outside this "if" */ } return val_print (val_type, value_contents_all (val), value_embedded_offset (val), value_address (val), stream, 0, &opts, current_language); }
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; }