Skip to content

Commit

Permalink
Generic : More mega-hack for va / normal.
Browse files Browse the repository at this point in the history
  • Loading branch information
iains committed Sep 1, 2020
1 parent 7602af7 commit 91df520
Show file tree
Hide file tree
Showing 4 changed files with 51 additions and 14 deletions.
6 changes: 4 additions & 2 deletions gcc/calls.c
Original file line number Diff line number Diff line change
Expand Up @@ -2261,7 +2261,8 @@ initialize_argument_information (int num_actuals ATTRIBUTE_UNUSED,
with those made by function.c. */

/* See if this argument should be passed by invisible reference. */
function_arg_info arg (type, argpos < n_named_args);
function_arg_info arg (type, argpos < n_named_args,
argpos == n_named_args - 1);
if (pass_by_reference (args_so_far_pnt, arg))
{
bool callee_copies;
Expand Down Expand Up @@ -2439,7 +2440,8 @@ initialize_argument_information (int num_actuals ATTRIBUTE_UNUSED,
reg_parm_stack_space,
args[i].pass_on_stack ? 0 : args[i].partial,
fndecl, args_size, &args[i].locate,
argpos < n_named_args);
argpos < n_named_args,
argpos == n_named_args - 1);
#ifdef BLOCK_REG_PADDING
else
/* The argument is passed entirely in registers. See at which
Expand Down
30 changes: 26 additions & 4 deletions gcc/calls.h
Original file line number Diff line number Diff line change
Expand Up @@ -35,24 +35,43 @@ class function_arg_info
{
public:
function_arg_info ()
: type (NULL_TREE), mode (VOIDmode), named (false),
: type (NULL_TREE), mode (VOIDmode), named (false), last_named (false),
pass_by_reference (false)
{}

/* Initialize an argument of mode MODE, either before or after promotion. */
function_arg_info (machine_mode mode, bool named)
: type (NULL_TREE), mode (mode), named (named), pass_by_reference (false)
: type (NULL_TREE), mode (mode), named (named), last_named (false),
pass_by_reference (false)
{}

function_arg_info (machine_mode mode, bool named, bool last_named)
: type (NULL_TREE), mode (mode), named (named), last_named (last_named),
pass_by_reference (false)
{}

/* Initialize an unpromoted argument of type TYPE. */
function_arg_info (tree type, bool named)
: type (type), mode (TYPE_MODE (type)), named (named),
: type (type), mode (TYPE_MODE (type)), named (named), last_named (false),
pass_by_reference (false)
{}

/* Initialize an unpromoted argument of type TYPE. */
function_arg_info (tree type, bool named, bool last_named)
: type (type), mode (TYPE_MODE (type)), named (named),
last_named (last_named), pass_by_reference (false)
{}

/* Initialize an argument with explicit properties. */
function_arg_info (tree type, machine_mode mode, bool named)
: type (type), mode (mode), named (named), pass_by_reference (false)
: type (type), mode (mode), named (named), last_named (false),
pass_by_reference (false)
{}

/* Initialize an argument with explicit properties. */
function_arg_info (tree type, machine_mode mode, bool named, bool last_named)
: type (type), mode (mode), named (named), last_named (last_named),
pass_by_reference (false)
{}

/* Return true if the gimple-level type is an aggregate. */
Expand Down Expand Up @@ -105,6 +124,9 @@ class function_arg_info
"..."). See also TARGET_STRICT_ARGUMENT_NAMING. */
unsigned int named : 1;

/* True if this is the last named argument. */
unsigned int last_named : 1;

/* True if we have decided to pass the argument by reference, in which case
the function_arg_info describes a pointer to the original argument. */
unsigned int pass_by_reference : 1;
Expand Down
27 changes: 20 additions & 7 deletions gcc/function.c
Original file line number Diff line number Diff line change
Expand Up @@ -2430,7 +2430,10 @@ assign_parm_find_data_types (struct assign_parm_data_all *all, tree parm,
else if (DECL_CHAIN (parm))
data->arg.named = 1; /* Not the last non-variadic parm. */
else if (targetm.calls.strict_argument_naming (all->args_so_far))
data->arg.named = 1; /* Only variadic ones are unnamed. */
{
data->arg.named = 1; /* Only variadic ones are unnamed. */
data->arg.last_named = 1;
}
else
data->arg.named = 0; /* Treat as variadic. */

Expand Down Expand Up @@ -2487,6 +2490,7 @@ assign_parms_setup_varargs (struct assign_parm_data_all *all,

function_arg_info last_named_arg = data->arg;
last_named_arg.named = true;
last_named_arg.last_named = true;
targetm.calls.setup_incoming_varargs (all->args_so_far, last_named_arg,
&varargs_pretend_bytes, no_rtl);

Expand Down Expand Up @@ -2597,7 +2601,7 @@ assign_parm_find_entry_rtl (struct assign_parm_data_all *all,
all->reg_parm_stack_space,
entry_parm ? data->partial : 0, current_function_decl,
&all->stack_args_size, &data->locate,
data->arg.named);
data->arg.named, data->arg.last_named);

/* Update parm_stack_boundary if this parameter is passed in the
stack. */
Expand Down Expand Up @@ -3894,7 +3898,8 @@ gimplify_parameters (gimple_seq *cleanup)
if (data.arg.pass_by_reference)
{
tree type = TREE_TYPE (data.arg.type);
function_arg_info orig_arg (type, data.arg.named);
function_arg_info orig_arg (type, data.arg.named,
data.arg.last_named);
if (reference_callee_copied (&all.args_so_far_v, orig_arg))
{
tree local, t;
Expand Down Expand Up @@ -4000,7 +4005,7 @@ locate_and_pad_parm (machine_mode passed_mode, tree type, int in_regs,
tree fndecl ATTRIBUTE_UNUSED,
struct args_size *initial_offset_ptr,
struct locate_and_pad_arg_data *locate,
bool named_p)
bool named_p, bool last_named_p)
{
tree sizetree;
pad_direction where_pad;
Expand Down Expand Up @@ -4037,10 +4042,18 @@ locate_and_pad_parm (machine_mode passed_mode, tree type, int in_regs,
where_pad = targetm.calls.function_arg_padding (passed_mode, type);
boundary = targetm.calls.function_arg_boundary (passed_mode, type);
if (named_p)
round_boundary = targetm.calls.function_arg_round_boundary (passed_mode,
type);
{
round_boundary = targetm.calls.function_arg_round_boundary (passed_mode,
type);
if (last_named_p)
round_boundary = PARM_BOUNDARY;
}
else
round_boundary = PARM_BOUNDARY;
{
/* Force everything to be at least aligned to the parm boundary. */
boundary = MAX (boundary, PARM_BOUNDARY);
round_boundary = PARM_BOUNDARY;
}

locate->where_pad = where_pad;

Expand Down
2 changes: 1 addition & 1 deletion gcc/function.h
Original file line number Diff line number Diff line change
Expand Up @@ -649,7 +649,7 @@ extern gimple_seq gimplify_parameters (gimple_seq *);
extern void locate_and_pad_parm (machine_mode, tree, int, int, int,
tree, struct args_size *,
struct locate_and_pad_arg_data *,
bool named_p = true);
bool named_p = true, bool last_named = false);
extern void generate_setjmp_warnings (void);

/* Identify BLOCKs referenced by more than one NOTE_INSN_BLOCK_{BEG,END},
Expand Down

0 comments on commit 91df520

Please sign in to comment.