Hi, The HP-UX port on the IA-64 architecture defines the MEMBER_TYPE_FORCES_BLK macro with this comment:
/* This needs to be set to force structure arguments with a single integer field to be treated as structures and not as the type of their field. Without this a structure with a single char will be returned just like a char variable, instead of being returned at the top of the register as specified for big-endian IA64. */ #define MEMBER_TYPE_FORCES_BLK(FIELD, MODE) \ (!FLOAT_MODE_P (MODE) || (MODE) == TFmode) That's problematic for Ada because record types with BLKmode are far less easy to manipulate (in particular to pack in containing records) than record types with integer modes. It seems to me that it's an implementation bias that can be eliminated. Firstly, SPARC64 has the same set of constraints and doesn't define MEMBER_TYPE_FORCES_BLK. Secondly, ia64_function_value reads: else { if (BYTES_BIG_ENDIAN && (mode == BLKmode || (valtype && AGGREGATE_TYPE_P (')))) { rtx loc[8]; int offset; int bytesize; int i; offset = 0; bytesize = int_size_in_bytes (valtype); for (i = 0; offset < bytesize; i++) { loc[i] = gen_rtx_EXPR_LIST (VOIDmode, gen_rtx_REG (DImode, GR_RET_FIRST + i), GEN_INT (offset)); offset += UNITS_PER_WORD; } return gen_rtx_PARALLEL (mode, gen_rtvec_v (i, loc)); } else return gen_rtx_REG (mode, GR_RET_FIRST); } Note that we already test the type 'valtype'. Moreover, int_size_in_bytes is invoked unconditionally on 'valtype' and would segfault if it was 0, so valtype is set every time mode == BLKmode. So I think having a non-BLKmode on records with a single integer field would not change anything as far as the return value is concerned. What do you think? Thanks in advance. -- Eric Botcazou