/* gcc_p unused */ static int mn10300_use_struct_convention (int gcc_p, struct type *type) { /* Structures bigger than a pair of words can't be returned in registers. */ if (TYPE_LENGTH (type) > 8) return 1; switch (TYPE_CODE (type)) { case TYPE_CODE_STRUCT: case TYPE_CODE_UNION: /* Structures with a single field are handled as the field itself. */ if (TYPE_NFIELDS (type) == 1) return mn10300_use_struct_convention (gcc_p, TYPE_FIELD_TYPE (type, 0)); /* Structures with word or double-word size are passed in memory, as long as they require at least word alignment. */ if (mn10300_type_align (type) >= 4) return 0; return 1; /* Arrays are addressable, so they're never returned in registers. This condition can only hold when the array is the only field of a struct or union. */ case TYPE_CODE_ARRAY: return 1; case TYPE_CODE_TYPEDEF: return mn10300_use_struct_convention (gcc_p, check_typedef (type)); default: return 0; } }
static enum return_value_convention mn10300_return_value (struct gdbarch *gdbarch, struct type *type, struct regcache *regcache, gdb_byte *readbuf, const gdb_byte *writebuf) { if (mn10300_use_struct_convention (type)) return RETURN_VALUE_STRUCT_CONVENTION; if (readbuf) mn10300_extract_return_value (gdbarch, type, regcache, readbuf); if (writebuf) mn10300_store_return_value (gdbarch, type, regcache, writebuf); return RETURN_VALUE_REGISTER_CONVENTION; }