gimple-expr.h 5.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178
  1. /* Header file for gimple decl, type and expressions.
  2. Copyright (C) 2013-2019 Free Software Foundation, Inc.
  3. This file is part of GCC.
  4. GCC is free software; you can redistribute it and/or modify it under
  5. the terms of the GNU General Public License as published by the Free
  6. Software Foundation; either version 3, or (at your option) any later
  7. version.
  8. GCC is distributed in the hope that it will be useful, but WITHOUT ANY
  9. WARRANTY; without even the implied warranty of MERCHANTABILITY or
  10. FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
  11. for more details.
  12. You should have received a copy of the GNU General Public License
  13. along with GCC; see the file COPYING3. If not see
  14. <http://www.gnu.org/licenses/>. */
  15. #ifndef GCC_GIMPLE_EXPR_H
  16. #define GCC_GIMPLE_EXPR_H
  17. extern bool useless_type_conversion_p (tree, tree);
  18. extern void gimple_set_body (tree, gimple_seq);
  19. extern gimple_seq gimple_body (tree);
  20. extern bool gimple_has_body_p (tree);
  21. extern const char *gimple_decl_printable_name (tree, int);
  22. extern tree copy_var_decl (tree, tree, tree);
  23. extern tree create_tmp_var_name (const char *);
  24. extern tree create_tmp_var_raw (tree, const char * = NULL);
  25. extern tree create_tmp_var (tree, const char * = NULL);
  26. extern tree create_tmp_reg (tree, const char * = NULL);
  27. extern tree create_tmp_reg_fn (struct function *, tree, const char *);
  28. extern void extract_ops_from_tree (tree, enum tree_code *, tree *, tree *,
  29. tree *);
  30. extern void gimple_cond_get_ops_from_tree (tree, enum tree_code *, tree *,
  31. tree *);
  32. extern bool is_gimple_lvalue (tree);
  33. extern bool is_gimple_condexpr (tree);
  34. extern bool is_gimple_address (const_tree);
  35. extern bool is_gimple_invariant_address (const_tree);
  36. extern bool is_gimple_ip_invariant_address (const_tree);
  37. extern bool is_gimple_min_invariant (const_tree);
  38. extern bool is_gimple_ip_invariant (const_tree);
  39. extern bool is_gimple_reg (tree);
  40. extern bool is_gimple_val (tree);
  41. extern bool is_gimple_asm_val (tree);
  42. extern bool is_gimple_min_lval (tree);
  43. extern bool is_gimple_call_addr (tree);
  44. extern bool is_gimple_mem_ref_addr (tree);
  45. extern void flush_mark_addressable_queue (void);
  46. extern void mark_addressable (tree);
  47. extern bool is_gimple_reg_rhs (tree);
  48. /* Return true if a conversion from either type of TYPE1 and TYPE2
  49. to the other is not required. Otherwise return false. */
  50. static inline bool
  51. types_compatible_p (tree type1, tree type2)
  52. {
  53. return (type1 == type2
  54. || (useless_type_conversion_p (type1, type2)
  55. && useless_type_conversion_p (type2, type1)));
  56. }
  57. /* Return true if TYPE is a suitable type for a scalar register variable. */
  58. static inline bool
  59. is_gimple_reg_type (tree type)
  60. {
  61. return !AGGREGATE_TYPE_P (type);
  62. }
  63. /* Return true if T is a variable. */
  64. static inline bool
  65. is_gimple_variable (tree t)
  66. {
  67. return (TREE_CODE (t) == VAR_DECL
  68. || TREE_CODE (t) == PARM_DECL
  69. || TREE_CODE (t) == RESULT_DECL
  70. || TREE_CODE (t) == SSA_NAME);
  71. }
  72. /* Return true if T is a GIMPLE identifier (something with an address). */
  73. static inline bool
  74. is_gimple_id (tree t)
  75. {
  76. return (is_gimple_variable (t)
  77. || TREE_CODE (t) == FUNCTION_DECL
  78. || TREE_CODE (t) == LABEL_DECL
  79. || TREE_CODE (t) == CONST_DECL
  80. /* Allow string constants, since they are addressable. */
  81. || TREE_CODE (t) == STRING_CST);
  82. }
  83. /* Return true if OP, an SSA name or a DECL is a virtual operand. */
  84. static inline bool
  85. virtual_operand_p (tree op)
  86. {
  87. if (TREE_CODE (op) == SSA_NAME)
  88. return SSA_NAME_IS_VIRTUAL_OPERAND (op);
  89. if (TREE_CODE (op) == VAR_DECL)
  90. return VAR_DECL_IS_VIRTUAL_OPERAND (op);
  91. return false;
  92. }
  93. /* Return true if T is something whose address can be taken. */
  94. static inline bool
  95. is_gimple_addressable (tree t)
  96. {
  97. return (is_gimple_id (t) || handled_component_p (t)
  98. || TREE_CODE (t) == TARGET_MEM_REF
  99. || TREE_CODE (t) == MEM_REF);
  100. }
  101. /* Return true if T is a valid gimple constant. */
  102. static inline bool
  103. is_gimple_constant (const_tree t)
  104. {
  105. switch (TREE_CODE (t))
  106. {
  107. case INTEGER_CST:
  108. case POLY_INT_CST:
  109. case REAL_CST:
  110. case FIXED_CST:
  111. case COMPLEX_CST:
  112. case VECTOR_CST:
  113. case STRING_CST:
  114. return true;
  115. default:
  116. return false;
  117. }
  118. }
  119. /* A wrapper around extract_ops_from_tree with 3 ops, for callers which
  120. expect to see only a maximum of two operands. */
  121. static inline void
  122. extract_ops_from_tree (tree expr, enum tree_code *code, tree *op0,
  123. tree *op1)
  124. {
  125. tree op2;
  126. extract_ops_from_tree (expr, code, op0, op1, &op2);
  127. gcc_assert (op2 == NULL_TREE);
  128. }
  129. /* Given a valid GIMPLE_CALL function address return the FUNCTION_DECL
  130. associated with the callee if known. Otherwise return NULL_TREE. */
  131. static inline tree
  132. gimple_call_addr_fndecl (const_tree fn)
  133. {
  134. if (fn && TREE_CODE (fn) == ADDR_EXPR)
  135. {
  136. tree fndecl = TREE_OPERAND (fn, 0);
  137. if (TREE_CODE (fndecl) == MEM_REF
  138. && TREE_CODE (TREE_OPERAND (fndecl, 0)) == ADDR_EXPR
  139. && integer_zerop (TREE_OPERAND (fndecl, 1)))
  140. fndecl = TREE_OPERAND (TREE_OPERAND (fndecl, 0), 0);
  141. if (TREE_CODE (fndecl) == FUNCTION_DECL)
  142. return fndecl;
  143. }
  144. return NULL_TREE;
  145. }
  146. #endif /* GCC_GIMPLE_EXPR_H */