I am looking at PR target/30826 (an IA64 ABI bug) and have come up with a patch that basically involves turning off the CALL_EXPR_RETURN_SLOT_OPT optimization in some instances and forcing GCC to create a temporary for the (large aggragete) return value of a function and then copying that temporary value to the desired target.
The problem I am running into is with C++ code in store_expr. I get to this if statement: if ((! rtx_equal_p (temp, target) || (temp != target && (side_effects_p (temp) || side_effects_p (target)))) && TREE_CODE (exp) != ERROR_MARK /* If store_expr stores a DECL whose DECL_RTL(exp) == TARGET, but TARGET is not valid memory reference, TEMP will differ from TARGET although it is really the same location. */ && !(alt_rtl && rtx_equal_p (alt_rtl, target)) /* If there's nothing to copy, don't bother. Don't call expr_size unless necessary, because some front-ends (C++) expr_size-hook must not be given objects that are not supposed to be bit-copied or bit-initialized. */ && expr_size (exp) != const0_rtx) and I hit a gcc_assert when calling expr_size(). Even if I avoided this somehow I would hit it later when calling: emit_block_move (target, temp, expr_size (exp), (call_param_p ? BLOCK_OP_CALL_PARM : BLOCK_OP_NORMAL)); So my question is: is there a way to handle this copy/assignment in C++ without depending on expr_size. I noticed PR middle-end/30017 (turning memcpys into assignments) which seems to have some of the same issues of getting expr_size for C++ expressions but that defect is still open so it doesn't look like there is an answer yet. Anyone have some ideas on this problem? Steve Ellcey [EMAIL PROTECTED]