1 /* Header file for gimple decl, type and expressions.
2 Copyright (C) 2013-2019 Free Software Foundation, Inc.
4 This file is part of GCC.
6 GCC is free software; you can redistribute it and/or modify it under
7 the terms of the GNU General Public License as published by the Free
8 Software Foundation; either version 3, or (at your option) any later
11 GCC is distributed in the hope that it will be useful, but WITHOUT ANY
12 WARRANTY; without even the implied warranty of MERCHANTABILITY or
13 FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
16 You should have received a copy of the GNU General Public License
17 along with GCC; see the file COPYING3. If not see
18 <http://www.gnu.org/licenses/>. */
20 #ifndef GCC_GIMPLE_EXPR_H
21 #define GCC_GIMPLE_EXPR_H
23 extern bool useless_type_conversion_p (tree
, tree
);
26 extern void gimple_set_body (tree
, gimple_seq
);
27 extern gimple_seq
gimple_body (tree
);
28 extern bool gimple_has_body_p (tree
);
29 extern const char *gimple_decl_printable_name (tree
, int);
30 extern tree
copy_var_decl (tree
, tree
, tree
);
31 extern tree
create_tmp_var_name (const char *);
32 extern tree
create_tmp_var_raw (tree
, const char * = NULL
);
33 extern tree
create_tmp_var (tree
, const char * = NULL
);
34 extern tree
create_tmp_reg (tree
, const char * = NULL
);
35 extern tree
create_tmp_reg_fn (struct function
*, tree
, const char *);
38 extern void extract_ops_from_tree (tree
, enum tree_code
*, tree
*, tree
*,
40 extern void gimple_cond_get_ops_from_tree (tree
, enum tree_code
*, tree
*,
42 extern bool is_gimple_lvalue (tree
);
43 extern bool is_gimple_condexpr (tree
);
44 extern bool is_gimple_address (const_tree
);
45 extern bool is_gimple_invariant_address (const_tree
);
46 extern bool is_gimple_ip_invariant_address (const_tree
);
47 extern bool is_gimple_min_invariant (const_tree
);
48 extern bool is_gimple_ip_invariant (const_tree
);
49 extern bool is_gimple_reg (tree
);
50 extern bool is_gimple_val (tree
);
51 extern bool is_gimple_asm_val (tree
);
52 extern bool is_gimple_min_lval (tree
);
53 extern bool is_gimple_call_addr (tree
);
54 extern bool is_gimple_mem_ref_addr (tree
);
55 extern void flush_mark_addressable_queue (void);
56 extern void mark_addressable (tree
);
57 extern bool is_gimple_reg_rhs (tree
);
59 /* Return true if a conversion from either type of TYPE1 and TYPE2
60 to the other is not required. Otherwise return false. */
63 types_compatible_p (tree type1
, tree type2
)
65 return (type1
== type2
66 || (useless_type_conversion_p (type1
, type2
)
67 && useless_type_conversion_p (type2
, type1
)));
70 /* Return true if TYPE is a suitable type for a scalar register variable. */
73 is_gimple_reg_type (tree type
)
75 return !AGGREGATE_TYPE_P (type
);
78 /* Return true if T is a variable. */
81 is_gimple_variable (tree t
)
83 return (TREE_CODE (t
) == VAR_DECL
84 || TREE_CODE (t
) == PARM_DECL
85 || TREE_CODE (t
) == RESULT_DECL
86 || TREE_CODE (t
) == SSA_NAME
);
89 /* Return true if T is a GIMPLE identifier (something with an address). */
94 return (is_gimple_variable (t
)
95 || TREE_CODE (t
) == FUNCTION_DECL
96 || TREE_CODE (t
) == LABEL_DECL
97 || TREE_CODE (t
) == CONST_DECL
98 /* Allow string constants, since they are addressable. */
99 || TREE_CODE (t
) == STRING_CST
);
102 /* Return true if OP, an SSA name or a DECL is a virtual operand. */
105 virtual_operand_p (tree op
)
107 if (TREE_CODE (op
) == SSA_NAME
)
108 return SSA_NAME_IS_VIRTUAL_OPERAND (op
);
110 if (TREE_CODE (op
) == VAR_DECL
)
111 return VAR_DECL_IS_VIRTUAL_OPERAND (op
);
116 /* Return true if T is something whose address can be taken. */
119 is_gimple_addressable (tree t
)
121 return (is_gimple_id (t
) || handled_component_p (t
)
122 || TREE_CODE (t
) == TARGET_MEM_REF
123 || TREE_CODE (t
) == MEM_REF
);
126 /* Return true if T is a valid gimple constant. */
129 is_gimple_constant (const_tree t
)
131 switch (TREE_CODE (t
))
147 /* A wrapper around extract_ops_from_tree with 3 ops, for callers which
148 expect to see only a maximum of two operands. */
151 extract_ops_from_tree (tree expr
, enum tree_code
*code
, tree
*op0
,
155 extract_ops_from_tree (expr
, code
, op0
, op1
, &op2
);
156 gcc_assert (op2
== NULL_TREE
);
159 /* Given a valid GIMPLE_CALL function address return the FUNCTION_DECL
160 associated with the callee if known. Otherwise return NULL_TREE. */
163 gimple_call_addr_fndecl (const_tree fn
)
165 if (fn
&& TREE_CODE (fn
) == ADDR_EXPR
)
167 tree fndecl
= TREE_OPERAND (fn
, 0);
168 if (TREE_CODE (fndecl
) == MEM_REF
169 && TREE_CODE (TREE_OPERAND (fndecl
, 0)) == ADDR_EXPR
170 && integer_zerop (TREE_OPERAND (fndecl
, 1)))
171 fndecl
= TREE_OPERAND (TREE_OPERAND (fndecl
, 0), 0);
172 if (TREE_CODE (fndecl
) == FUNCTION_DECL
)
178 #endif /* GCC_GIMPLE_EXPR_H */