1/* Fold a constant sub-tree into a single node for C-compiler 2 Copyright (C) 1987-2015 Free Software Foundation, Inc. 3 4This file is part of GCC. 5 6GCC is free software; you can redistribute it and/or modify it under 7the terms of the GNU General Public License as published by the Free 8Software Foundation; either version 3, or (at your option) any later 9version. 10 11GCC is distributed in the hope that it will be useful, but WITHOUT ANY 12WARRANTY; without even the implied warranty of MERCHANTABILITY or 13FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License 14for more details. 15 16You should have received a copy of the GNU General Public License 17along with GCC; see the file COPYING3. If not see 18<http://www.gnu.org/licenses/>. */ 19 20#ifndef GCC_FOLD_CONST_H 21#define GCC_FOLD_CONST_H 22 23/* Non-zero if we are folding constants inside an initializer; zero 24 otherwise. */ 25extern int folding_initializer; 26 27/* Convert between trees and native memory representation. */ 28extern int native_encode_expr (const_tree, unsigned char *, int, int off = -1); 29extern tree native_interpret_expr (tree, const unsigned char *, int); 30 31/* Fold constants as much as possible in an expression. 32 Returns the simplified expression. 33 Acts only on the top level of the expression; 34 if the argument itself cannot be simplified, its 35 subexpressions are not changed. */ 36 37extern tree fold (tree); 38#define fold_unary(CODE,T1,T2)\ 39 fold_unary_loc (UNKNOWN_LOCATION, CODE, T1, T2) 40extern tree fold_unary_loc (location_t, enum tree_code, tree, tree); 41#define fold_unary_ignore_overflow(CODE,T1,T2)\ 42 fold_unary_ignore_overflow_loc (UNKNOWN_LOCATION, CODE, T1, T2) 43extern tree fold_unary_ignore_overflow_loc (location_t, enum tree_code, tree, tree); 44#define fold_binary(CODE,T1,T2,T3)\ 45 fold_binary_loc (UNKNOWN_LOCATION, CODE, T1, T2, T3) 46extern tree fold_binary_loc (location_t, enum tree_code, tree, tree, tree); 47#define fold_ternary(CODE,T1,T2,T3,T4)\ 48 fold_ternary_loc (UNKNOWN_LOCATION, CODE, T1, T2, T3, T4) 49extern tree fold_ternary_loc (location_t, enum tree_code, tree, tree, tree, tree); 50#define fold_build1(c,t1,t2)\ 51 fold_build1_stat_loc (UNKNOWN_LOCATION, c, t1, t2 MEM_STAT_INFO) 52#define fold_build1_loc(l,c,t1,t2)\ 53 fold_build1_stat_loc (l, c, t1, t2 MEM_STAT_INFO) 54extern tree fold_build1_stat_loc (location_t, enum tree_code, tree, 55 tree MEM_STAT_DECL); 56#define fold_build2(c,t1,t2,t3)\ 57 fold_build2_stat_loc (UNKNOWN_LOCATION, c, t1, t2, t3 MEM_STAT_INFO) 58#define fold_build2_loc(l,c,t1,t2,t3)\ 59 fold_build2_stat_loc (l, c, t1, t2, t3 MEM_STAT_INFO) 60extern tree fold_build2_stat_loc (location_t, enum tree_code, tree, tree, 61 tree MEM_STAT_DECL); 62#define fold_build3(c,t1,t2,t3,t4)\ 63 fold_build3_stat_loc (UNKNOWN_LOCATION, c, t1, t2, t3, t4 MEM_STAT_INFO) 64#define fold_build3_loc(l,c,t1,t2,t3,t4)\ 65 fold_build3_stat_loc (l, c, t1, t2, t3, t4 MEM_STAT_INFO) 66extern tree fold_build3_stat_loc (location_t, enum tree_code, tree, tree, tree, 67 tree MEM_STAT_DECL); 68extern tree fold_build1_initializer_loc (location_t, enum tree_code, tree, tree); 69extern tree fold_build2_initializer_loc (location_t, enum tree_code, tree, tree, tree); 70#define fold_build_call_array(T1,T2,N,T4)\ 71 fold_build_call_array_loc (UNKNOWN_LOCATION, T1, T2, N, T4) 72extern tree fold_build_call_array_loc (location_t, tree, tree, int, tree *); 73#define fold_build_call_array_initializer(T1,T2,N,T4)\ 74 fold_build_call_array_initializer_loc (UNKNOWN_LOCATION, T1, T2, N, T4) 75extern tree fold_build_call_array_initializer_loc (location_t, tree, tree, int, tree *); 76extern bool fold_convertible_p (const_tree, const_tree); 77#define fold_convert(T1,T2)\ 78 fold_convert_loc (UNKNOWN_LOCATION, T1, T2) 79extern tree fold_convert_loc (location_t, tree, tree); 80extern tree fold_single_bit_test (location_t, enum tree_code, tree, tree, tree); 81extern tree fold_ignored_result (tree); 82extern tree fold_abs_const (tree, tree); 83extern tree fold_indirect_ref_1 (location_t, tree, tree); 84extern void fold_defer_overflow_warnings (void); 85extern void fold_undefer_overflow_warnings (bool, const_gimple, int); 86extern void fold_undefer_and_ignore_overflow_warnings (void); 87extern bool fold_deferring_overflow_warnings_p (void); 88extern int operand_equal_p (const_tree, const_tree, unsigned int); 89extern int multiple_of_p (tree, const_tree, const_tree); 90#define omit_one_operand(T1,T2,T3)\ 91 omit_one_operand_loc (UNKNOWN_LOCATION, T1, T2, T3) 92extern tree omit_one_operand_loc (location_t, tree, tree, tree); 93#define omit_two_operands(T1,T2,T3,T4)\ 94 omit_two_operands_loc (UNKNOWN_LOCATION, T1, T2, T3, T4) 95extern tree omit_two_operands_loc (location_t, tree, tree, tree, tree); 96#define invert_truthvalue(T)\ 97 invert_truthvalue_loc (UNKNOWN_LOCATION, T) 98extern tree invert_truthvalue_loc (location_t, tree); 99extern tree fold_unary_to_constant (enum tree_code, tree, tree); 100extern tree fold_binary_to_constant (enum tree_code, tree, tree, tree); 101extern tree fold_read_from_constant_string (tree); 102extern tree int_const_binop (enum tree_code, const_tree, const_tree); 103#define build_fold_addr_expr(T)\ 104 build_fold_addr_expr_loc (UNKNOWN_LOCATION, (T)) 105extern tree build_fold_addr_expr_loc (location_t, tree); 106#define build_fold_addr_expr_with_type(T,TYPE)\ 107 build_fold_addr_expr_with_type_loc (UNKNOWN_LOCATION, (T), TYPE) 108extern tree build_fold_addr_expr_with_type_loc (location_t, tree, tree); 109extern tree fold_build_cleanup_point_expr (tree type, tree expr); 110extern tree fold_strip_sign_ops (tree); 111#define build_fold_indirect_ref(T)\ 112 build_fold_indirect_ref_loc (UNKNOWN_LOCATION, T) 113extern tree build_fold_indirect_ref_loc (location_t, tree); 114#define fold_indirect_ref(T)\ 115 fold_indirect_ref_loc (UNKNOWN_LOCATION, T) 116extern tree fold_indirect_ref_loc (location_t, tree); 117extern tree build_simple_mem_ref_loc (location_t, tree); 118#define build_simple_mem_ref(T)\ 119 build_simple_mem_ref_loc (UNKNOWN_LOCATION, T) 120extern offset_int mem_ref_offset (const_tree); 121extern tree build_invariant_address (tree, tree, HOST_WIDE_INT); 122extern tree constant_boolean_node (bool, tree); 123extern tree div_if_zero_remainder (const_tree, const_tree); 124 125extern bool tree_swap_operands_p (const_tree, const_tree, bool); 126extern enum tree_code swap_tree_comparison (enum tree_code); 127 128extern bool ptr_difference_const (tree, tree, HOST_WIDE_INT *); 129extern enum tree_code invert_tree_comparison (enum tree_code, bool); 130 131extern bool tree_unary_nonzero_warnv_p (enum tree_code, tree, tree, bool *); 132extern bool tree_binary_nonzero_warnv_p (enum tree_code, tree, tree, tree op1, 133 bool *); 134extern bool tree_single_nonzero_warnv_p (tree, bool *); 135extern bool tree_unary_nonnegative_warnv_p (enum tree_code, tree, tree, bool *); 136extern bool tree_binary_nonnegative_warnv_p (enum tree_code, tree, tree, tree, 137 bool *); 138extern bool tree_single_nonnegative_warnv_p (tree t, bool *strict_overflow_p); 139extern bool tree_call_nonnegative_warnv_p (tree, tree, tree, tree, bool *); 140 141extern bool fold_real_zero_addition_p (const_tree, const_tree, int); 142extern tree combine_comparisons (location_t, enum tree_code, enum tree_code, 143 enum tree_code, tree, tree, tree); 144extern void debug_fold_checksum (const_tree); 145extern bool may_negate_without_overflow_p (const_tree); 146#define round_up(T,N) round_up_loc (UNKNOWN_LOCATION, T, N) 147extern tree round_up_loc (location_t, tree, unsigned int); 148#define round_down(T,N) round_down_loc (UNKNOWN_LOCATION, T, N) 149extern tree round_down_loc (location_t, tree, int); 150extern tree size_int_kind (HOST_WIDE_INT, enum size_type_kind); 151#define size_binop(CODE,T1,T2)\ 152 size_binop_loc (UNKNOWN_LOCATION, CODE, T1, T2) 153extern tree size_binop_loc (location_t, enum tree_code, tree, tree); 154#define size_diffop(T1,T2)\ 155 size_diffop_loc (UNKNOWN_LOCATION, T1, T2) 156extern tree size_diffop_loc (location_t, tree, tree); 157 158/* Return an expr equal to X but certainly not valid as an lvalue. */ 159#define non_lvalue(T) non_lvalue_loc (UNKNOWN_LOCATION, T) 160extern tree non_lvalue_loc (location_t, tree); 161 162extern bool tree_expr_nonnegative_p (tree); 163extern bool tree_expr_nonnegative_warnv_p (tree, bool *); 164extern tree make_range (tree, int *, tree *, tree *, bool *); 165extern tree make_range_step (location_t, enum tree_code, tree, tree, tree, 166 tree *, tree *, int *, bool *); 167extern tree build_range_check (location_t, tree, tree, int, tree, tree); 168extern bool merge_ranges (int *, tree *, tree *, int, tree, tree, int, 169 tree, tree); 170extern tree sign_bit_p (tree, const_tree); 171extern tree exact_inverse (tree, tree); 172extern tree const_unop (enum tree_code, tree, tree); 173extern tree const_binop (enum tree_code, tree, tree, tree); 174 175/* Return OFF converted to a pointer offset type suitable as offset for 176 POINTER_PLUS_EXPR. Use location LOC for this conversion. */ 177extern tree convert_to_ptrofftype_loc (location_t loc, tree off); 178 179#define convert_to_ptrofftype(t) convert_to_ptrofftype_loc (UNKNOWN_LOCATION, t) 180 181/* Build and fold a POINTER_PLUS_EXPR at LOC offsetting PTR by OFF. */ 182extern tree fold_build_pointer_plus_loc (location_t loc, tree ptr, tree off); 183 184#define fold_build_pointer_plus(p,o) \ 185 fold_build_pointer_plus_loc (UNKNOWN_LOCATION, p, o) 186 187/* Build and fold a POINTER_PLUS_EXPR at LOC offsetting PTR by OFF. */ 188extern tree fold_build_pointer_plus_hwi_loc (location_t loc, tree ptr, HOST_WIDE_INT off); 189 190#define fold_build_pointer_plus_hwi(p,o) \ 191 fold_build_pointer_plus_hwi_loc (UNKNOWN_LOCATION, p, o) 192#endif // GCC_FOLD_CONST_H 193