117 lines
4.3 KiB
C
117 lines
4.3 KiB
C
/* Manipulation of formal and actual parameters of functions and function
|
|
calls.
|
|
Copyright (C) 2017-2019 Free Software Foundation, Inc.
|
|
|
|
This file is part of GCC.
|
|
|
|
GCC is free software; you can redistribute it and/or modify it under
|
|
the terms of the GNU General Public License as published by the Free
|
|
Software Foundation; either version 3, or (at your option) any later
|
|
version.
|
|
|
|
GCC is distributed in the hope that it will be useful, but WITHOUT ANY
|
|
WARRANTY; without even the implied warranty of MERCHANTABILITY or
|
|
FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
|
|
for more details.
|
|
|
|
You should have received a copy of the GNU General Public License
|
|
along with GCC; see the file COPYING3. If not see
|
|
<http://www.gnu.org/licenses/>. */
|
|
|
|
#ifndef IPA_PARAM_MANIPULATION_H
|
|
#define IPA_PARAM_MANIPULATION_H
|
|
|
|
/* Operation to be performed for the parameter in ipa_parm_adjustment
|
|
below. */
|
|
enum ipa_parm_op {
|
|
IPA_PARM_OP_NONE,
|
|
|
|
/* This describes a brand new parameter.
|
|
|
|
The field `type' should be set to the new type, `arg_prefix'
|
|
should be set to the string prefix for the new DECL_NAME, and
|
|
`new_decl' will ultimately hold the newly created argument. */
|
|
IPA_PARM_OP_NEW,
|
|
|
|
/* This new parameter is an unmodified parameter at index base_index. */
|
|
IPA_PARM_OP_COPY,
|
|
|
|
/* This adjustment describes a parameter that is about to be removed
|
|
completely. Most users will probably need to book keep those so that they
|
|
don't leave behinfd any non default def ssa names belonging to them. */
|
|
IPA_PARM_OP_REMOVE
|
|
};
|
|
|
|
/* Structure to describe transformations of formal parameters and actual
|
|
arguments. Each instance describes one new parameter and they are meant to
|
|
be stored in a vector. Additionally, most users will probably want to store
|
|
adjustments about parameters that are being removed altogether so that SSA
|
|
names belonging to them can be replaced by SSA names of an artificial
|
|
variable. */
|
|
struct ipa_parm_adjustment
|
|
{
|
|
/* The original PARM_DECL itself, helpful for processing of the body of the
|
|
function itself. Intended for traversing function bodies.
|
|
ipa_modify_formal_parameters, ipa_modify_call_arguments and
|
|
ipa_combine_adjustments ignore this and use base_index.
|
|
ipa_modify_formal_parameters actually sets this. */
|
|
tree base;
|
|
|
|
/* Type of the new parameter. However, if by_ref is true, the real type will
|
|
be a pointer to this type. */
|
|
tree type;
|
|
|
|
/* Alias refrerence type to be used in MEM_REFs when adjusting caller
|
|
arguments. */
|
|
tree alias_ptr_type;
|
|
|
|
/* The new declaration when creating/replacing a parameter. Created
|
|
by ipa_modify_formal_parameters, useful for functions modifying
|
|
the body accordingly. For brand new arguments, this is the newly
|
|
created argument. */
|
|
tree new_decl;
|
|
|
|
/* New declaration of a substitute variable that we may use to replace all
|
|
non-default-def ssa names when a parm decl is going away. */
|
|
tree new_ssa_base;
|
|
|
|
/* This holds the prefix to be used for the new DECL_NAME. */
|
|
const char *arg_prefix;
|
|
|
|
/* Offset into the original parameter (for the cases when the new parameter
|
|
is a component of an original one). */
|
|
poly_int64_pod offset;
|
|
|
|
/* Zero based index of the original parameter this one is based on. */
|
|
int base_index;
|
|
|
|
/* Whether this parameter is a new parameter, a copy of an old one,
|
|
or one about to be removed. */
|
|
enum ipa_parm_op op;
|
|
|
|
/* Storage order of the original parameter (for the cases when the new
|
|
parameter is a component of an original one). */
|
|
unsigned reverse : 1;
|
|
|
|
/* The parameter is to be passed by reference. */
|
|
unsigned by_ref : 1;
|
|
};
|
|
|
|
typedef vec<ipa_parm_adjustment> ipa_parm_adjustment_vec;
|
|
|
|
vec<tree> ipa_get_vector_of_formal_parms (tree fndecl);
|
|
vec<tree> ipa_get_vector_of_formal_parm_types (tree fntype);
|
|
void ipa_modify_formal_parameters (tree fndecl, ipa_parm_adjustment_vec);
|
|
void ipa_modify_call_arguments (struct cgraph_edge *, gcall *,
|
|
ipa_parm_adjustment_vec);
|
|
ipa_parm_adjustment_vec ipa_combine_adjustments (ipa_parm_adjustment_vec,
|
|
ipa_parm_adjustment_vec);
|
|
void ipa_dump_param_adjustments (FILE *, ipa_parm_adjustment_vec, tree);
|
|
|
|
bool ipa_modify_expr (tree *, bool, ipa_parm_adjustment_vec);
|
|
ipa_parm_adjustment *ipa_get_adjustment_candidate (tree **, bool *,
|
|
ipa_parm_adjustment_vec,
|
|
bool);
|
|
|
|
#endif /* IPA_PARAM_MANIPULATION_H */
|