18c2ecf20Sopenharmony_ci/* SPDX-License-Identifier: GPL-2.0 */ 28c2ecf20Sopenharmony_ci#ifndef GCC_COMMON_H_INCLUDED 38c2ecf20Sopenharmony_ci#define GCC_COMMON_H_INCLUDED 48c2ecf20Sopenharmony_ci 58c2ecf20Sopenharmony_ci#include "bversion.h" 68c2ecf20Sopenharmony_ci#if BUILDING_GCC_VERSION >= 6000 78c2ecf20Sopenharmony_ci#include "gcc-plugin.h" 88c2ecf20Sopenharmony_ci#else 98c2ecf20Sopenharmony_ci#include "plugin.h" 108c2ecf20Sopenharmony_ci#endif 118c2ecf20Sopenharmony_ci#include "plugin-version.h" 128c2ecf20Sopenharmony_ci#include "config.h" 138c2ecf20Sopenharmony_ci#include "system.h" 148c2ecf20Sopenharmony_ci#include "coretypes.h" 158c2ecf20Sopenharmony_ci#include "tm.h" 168c2ecf20Sopenharmony_ci#include "line-map.h" 178c2ecf20Sopenharmony_ci#include "input.h" 188c2ecf20Sopenharmony_ci#include "tree.h" 198c2ecf20Sopenharmony_ci 208c2ecf20Sopenharmony_ci#include "tree-inline.h" 218c2ecf20Sopenharmony_ci#include "version.h" 228c2ecf20Sopenharmony_ci#include "rtl.h" 238c2ecf20Sopenharmony_ci#include "tm_p.h" 248c2ecf20Sopenharmony_ci#include "flags.h" 258c2ecf20Sopenharmony_ci#include "hard-reg-set.h" 268c2ecf20Sopenharmony_ci#include "output.h" 278c2ecf20Sopenharmony_ci#include "except.h" 288c2ecf20Sopenharmony_ci#include "function.h" 298c2ecf20Sopenharmony_ci#include "toplev.h" 308c2ecf20Sopenharmony_ci#if BUILDING_GCC_VERSION >= 5000 318c2ecf20Sopenharmony_ci#include "expr.h" 328c2ecf20Sopenharmony_ci#endif 338c2ecf20Sopenharmony_ci#include "basic-block.h" 348c2ecf20Sopenharmony_ci#include "intl.h" 358c2ecf20Sopenharmony_ci#include "ggc.h" 368c2ecf20Sopenharmony_ci#include "timevar.h" 378c2ecf20Sopenharmony_ci 388c2ecf20Sopenharmony_ci#if BUILDING_GCC_VERSION < 10000 398c2ecf20Sopenharmony_ci#include "params.h" 408c2ecf20Sopenharmony_ci#endif 418c2ecf20Sopenharmony_ci 428c2ecf20Sopenharmony_ci#if BUILDING_GCC_VERSION <= 4009 438c2ecf20Sopenharmony_ci#include "pointer-set.h" 448c2ecf20Sopenharmony_ci#else 458c2ecf20Sopenharmony_ci#include "hash-map.h" 468c2ecf20Sopenharmony_ci#endif 478c2ecf20Sopenharmony_ci 488c2ecf20Sopenharmony_ci#if BUILDING_GCC_VERSION >= 7000 498c2ecf20Sopenharmony_ci#include "memmodel.h" 508c2ecf20Sopenharmony_ci#endif 518c2ecf20Sopenharmony_ci#include "emit-rtl.h" 528c2ecf20Sopenharmony_ci#include "debug.h" 538c2ecf20Sopenharmony_ci#include "target.h" 548c2ecf20Sopenharmony_ci#include "langhooks.h" 558c2ecf20Sopenharmony_ci#include "cfgloop.h" 568c2ecf20Sopenharmony_ci#include "cgraph.h" 578c2ecf20Sopenharmony_ci#include "opts.h" 588c2ecf20Sopenharmony_ci 598c2ecf20Sopenharmony_ci#if BUILDING_GCC_VERSION == 4005 608c2ecf20Sopenharmony_ci#include <sys/mman.h> 618c2ecf20Sopenharmony_ci#endif 628c2ecf20Sopenharmony_ci 638c2ecf20Sopenharmony_ci#if BUILDING_GCC_VERSION >= 4007 648c2ecf20Sopenharmony_ci#include "tree-pretty-print.h" 658c2ecf20Sopenharmony_ci#include "gimple-pretty-print.h" 668c2ecf20Sopenharmony_ci#endif 678c2ecf20Sopenharmony_ci 688c2ecf20Sopenharmony_ci#if BUILDING_GCC_VERSION >= 4006 698c2ecf20Sopenharmony_ci/* 708c2ecf20Sopenharmony_ci * The c-family headers were moved into a subdirectory in GCC version 718c2ecf20Sopenharmony_ci * 4.7, but most plugin-building users of GCC 4.6 are using the Debian 728c2ecf20Sopenharmony_ci * or Ubuntu package, which has an out-of-tree patch to move this to the 738c2ecf20Sopenharmony_ci * same location as found in 4.7 and later: 748c2ecf20Sopenharmony_ci * https://sources.debian.net/src/gcc-4.6/4.6.3-14/debian/patches/pr45078.diff/ 758c2ecf20Sopenharmony_ci */ 768c2ecf20Sopenharmony_ci#include "c-family/c-common.h" 778c2ecf20Sopenharmony_ci#else 788c2ecf20Sopenharmony_ci#include "c-common.h" 798c2ecf20Sopenharmony_ci#endif 808c2ecf20Sopenharmony_ci 818c2ecf20Sopenharmony_ci#if BUILDING_GCC_VERSION <= 4008 828c2ecf20Sopenharmony_ci#include "tree-flow.h" 838c2ecf20Sopenharmony_ci#else 848c2ecf20Sopenharmony_ci#include "tree-cfgcleanup.h" 858c2ecf20Sopenharmony_ci#include "tree-ssa-operands.h" 868c2ecf20Sopenharmony_ci#include "tree-into-ssa.h" 878c2ecf20Sopenharmony_ci#endif 888c2ecf20Sopenharmony_ci 898c2ecf20Sopenharmony_ci#if BUILDING_GCC_VERSION >= 4008 908c2ecf20Sopenharmony_ci#include "is-a.h" 918c2ecf20Sopenharmony_ci#endif 928c2ecf20Sopenharmony_ci 938c2ecf20Sopenharmony_ci#include "diagnostic.h" 948c2ecf20Sopenharmony_ci#include "tree-dump.h" 958c2ecf20Sopenharmony_ci#include "tree-pass.h" 968c2ecf20Sopenharmony_ci#if BUILDING_GCC_VERSION >= 4009 978c2ecf20Sopenharmony_ci#include "pass_manager.h" 988c2ecf20Sopenharmony_ci#endif 998c2ecf20Sopenharmony_ci#include "predict.h" 1008c2ecf20Sopenharmony_ci#include "ipa-utils.h" 1018c2ecf20Sopenharmony_ci 1028c2ecf20Sopenharmony_ci#if BUILDING_GCC_VERSION >= 8000 1038c2ecf20Sopenharmony_ci#include "stringpool.h" 1048c2ecf20Sopenharmony_ci#endif 1058c2ecf20Sopenharmony_ci 1068c2ecf20Sopenharmony_ci#if BUILDING_GCC_VERSION >= 4009 1078c2ecf20Sopenharmony_ci#include "attribs.h" 1088c2ecf20Sopenharmony_ci#include "varasm.h" 1098c2ecf20Sopenharmony_ci#include "stor-layout.h" 1108c2ecf20Sopenharmony_ci#include "internal-fn.h" 1118c2ecf20Sopenharmony_ci#endif 1128c2ecf20Sopenharmony_ci 1138c2ecf20Sopenharmony_ci#include "gimple.h" 1148c2ecf20Sopenharmony_ci 1158c2ecf20Sopenharmony_ci#if BUILDING_GCC_VERSION >= 4009 1168c2ecf20Sopenharmony_ci#include "gimple-expr.h" 1178c2ecf20Sopenharmony_ci#include "gimple-iterator.h" 1188c2ecf20Sopenharmony_ci#include "gimple-fold.h" 1198c2ecf20Sopenharmony_ci#include "context.h" 1208c2ecf20Sopenharmony_ci#include "tree-ssa-alias.h" 1218c2ecf20Sopenharmony_ci#include "tree-ssa.h" 1228c2ecf20Sopenharmony_ci#include "stringpool.h" 1238c2ecf20Sopenharmony_ci#if BUILDING_GCC_VERSION >= 7000 1248c2ecf20Sopenharmony_ci#include "tree-vrp.h" 1258c2ecf20Sopenharmony_ci#endif 1268c2ecf20Sopenharmony_ci#include "tree-ssanames.h" 1278c2ecf20Sopenharmony_ci#include "print-tree.h" 1288c2ecf20Sopenharmony_ci#include "tree-eh.h" 1298c2ecf20Sopenharmony_ci#include "stmt.h" 1308c2ecf20Sopenharmony_ci#include "gimplify.h" 1318c2ecf20Sopenharmony_ci#endif 1328c2ecf20Sopenharmony_ci 1338c2ecf20Sopenharmony_ci#if BUILDING_GCC_VERSION >= 4009 1348c2ecf20Sopenharmony_ci#include "tree-ssa-operands.h" 1358c2ecf20Sopenharmony_ci#include "tree-phinodes.h" 1368c2ecf20Sopenharmony_ci#include "tree-cfg.h" 1378c2ecf20Sopenharmony_ci#include "gimple-ssa.h" 1388c2ecf20Sopenharmony_ci#include "ssa-iterators.h" 1398c2ecf20Sopenharmony_ci#endif 1408c2ecf20Sopenharmony_ci 1418c2ecf20Sopenharmony_ci#if BUILDING_GCC_VERSION >= 5000 1428c2ecf20Sopenharmony_ci#include "builtins.h" 1438c2ecf20Sopenharmony_ci#endif 1448c2ecf20Sopenharmony_ci 1458c2ecf20Sopenharmony_ci/* missing from basic_block.h... */ 1468c2ecf20Sopenharmony_civoid debug_dominance_info(enum cdi_direction dir); 1478c2ecf20Sopenharmony_civoid debug_dominance_tree(enum cdi_direction dir, basic_block root); 1488c2ecf20Sopenharmony_ci 1498c2ecf20Sopenharmony_ci#if BUILDING_GCC_VERSION == 4006 1508c2ecf20Sopenharmony_civoid debug_gimple_stmt(gimple); 1518c2ecf20Sopenharmony_civoid debug_gimple_seq(gimple_seq); 1528c2ecf20Sopenharmony_civoid print_gimple_seq(FILE *, gimple_seq, int, int); 1538c2ecf20Sopenharmony_civoid print_gimple_stmt(FILE *, gimple, int, int); 1548c2ecf20Sopenharmony_civoid print_gimple_expr(FILE *, gimple, int, int); 1558c2ecf20Sopenharmony_civoid dump_gimple_stmt(pretty_printer *, gimple, int, int); 1568c2ecf20Sopenharmony_ci#endif 1578c2ecf20Sopenharmony_ci 1588c2ecf20Sopenharmony_ci#ifndef __unused 1598c2ecf20Sopenharmony_ci#define __unused __attribute__((__unused__)) 1608c2ecf20Sopenharmony_ci#endif 1618c2ecf20Sopenharmony_ci#ifndef __visible 1628c2ecf20Sopenharmony_ci#define __visible __attribute__((visibility("default"))) 1638c2ecf20Sopenharmony_ci#endif 1648c2ecf20Sopenharmony_ci 1658c2ecf20Sopenharmony_ci#define DECL_NAME_POINTER(node) IDENTIFIER_POINTER(DECL_NAME(node)) 1668c2ecf20Sopenharmony_ci#define DECL_NAME_LENGTH(node) IDENTIFIER_LENGTH(DECL_NAME(node)) 1678c2ecf20Sopenharmony_ci#define TYPE_NAME_POINTER(node) IDENTIFIER_POINTER(TYPE_NAME(node)) 1688c2ecf20Sopenharmony_ci#define TYPE_NAME_LENGTH(node) IDENTIFIER_LENGTH(TYPE_NAME(node)) 1698c2ecf20Sopenharmony_ci 1708c2ecf20Sopenharmony_ci/* should come from c-tree.h if only it were installed for gcc 4.5... */ 1718c2ecf20Sopenharmony_ci#define C_TYPE_FIELDS_READONLY(TYPE) TREE_LANG_FLAG_1(TYPE) 1728c2ecf20Sopenharmony_ci 1738c2ecf20Sopenharmony_cistatic inline tree build_const_char_string(int len, const char *str) 1748c2ecf20Sopenharmony_ci{ 1758c2ecf20Sopenharmony_ci tree cstr, elem, index, type; 1768c2ecf20Sopenharmony_ci 1778c2ecf20Sopenharmony_ci cstr = build_string(len, str); 1788c2ecf20Sopenharmony_ci elem = build_type_variant(char_type_node, 1, 0); 1798c2ecf20Sopenharmony_ci index = build_index_type(size_int(len - 1)); 1808c2ecf20Sopenharmony_ci type = build_array_type(elem, index); 1818c2ecf20Sopenharmony_ci TREE_TYPE(cstr) = type; 1828c2ecf20Sopenharmony_ci TREE_CONSTANT(cstr) = 1; 1838c2ecf20Sopenharmony_ci TREE_READONLY(cstr) = 1; 1848c2ecf20Sopenharmony_ci TREE_STATIC(cstr) = 1; 1858c2ecf20Sopenharmony_ci return cstr; 1868c2ecf20Sopenharmony_ci} 1878c2ecf20Sopenharmony_ci 1888c2ecf20Sopenharmony_ci#define PASS_INFO(NAME, REF, ID, POS) \ 1898c2ecf20Sopenharmony_cistruct register_pass_info NAME##_pass_info = { \ 1908c2ecf20Sopenharmony_ci .pass = make_##NAME##_pass(), \ 1918c2ecf20Sopenharmony_ci .reference_pass_name = REF, \ 1928c2ecf20Sopenharmony_ci .ref_pass_instance_number = ID, \ 1938c2ecf20Sopenharmony_ci .pos_op = POS, \ 1948c2ecf20Sopenharmony_ci} 1958c2ecf20Sopenharmony_ci 1968c2ecf20Sopenharmony_ci#if BUILDING_GCC_VERSION == 4005 1978c2ecf20Sopenharmony_ci#define FOR_EACH_LOCAL_DECL(FUN, I, D) \ 1988c2ecf20Sopenharmony_ci for (tree vars = (FUN)->local_decls, (I) = 0; \ 1998c2ecf20Sopenharmony_ci vars && ((D) = TREE_VALUE(vars)); \ 2008c2ecf20Sopenharmony_ci vars = TREE_CHAIN(vars), (I)++) 2018c2ecf20Sopenharmony_ci#define DECL_CHAIN(NODE) (TREE_CHAIN(DECL_MINIMAL_CHECK(NODE))) 2028c2ecf20Sopenharmony_ci#define FOR_EACH_VEC_ELT(T, V, I, P) \ 2038c2ecf20Sopenharmony_ci for (I = 0; VEC_iterate(T, (V), (I), (P)); ++(I)) 2048c2ecf20Sopenharmony_ci#define TODO_rebuild_cgraph_edges 0 2058c2ecf20Sopenharmony_ci#define SCOPE_FILE_SCOPE_P(EXP) (!(EXP)) 2068c2ecf20Sopenharmony_ci 2078c2ecf20Sopenharmony_ci#ifndef O_BINARY 2088c2ecf20Sopenharmony_ci#define O_BINARY 0 2098c2ecf20Sopenharmony_ci#endif 2108c2ecf20Sopenharmony_ci 2118c2ecf20Sopenharmony_citypedef struct varpool_node *varpool_node_ptr; 2128c2ecf20Sopenharmony_ci 2138c2ecf20Sopenharmony_cistatic inline bool gimple_call_builtin_p(gimple stmt, enum built_in_function code) 2148c2ecf20Sopenharmony_ci{ 2158c2ecf20Sopenharmony_ci tree fndecl; 2168c2ecf20Sopenharmony_ci 2178c2ecf20Sopenharmony_ci if (!is_gimple_call(stmt)) 2188c2ecf20Sopenharmony_ci return false; 2198c2ecf20Sopenharmony_ci fndecl = gimple_call_fndecl(stmt); 2208c2ecf20Sopenharmony_ci if (!fndecl || DECL_BUILT_IN_CLASS(fndecl) != BUILT_IN_NORMAL) 2218c2ecf20Sopenharmony_ci return false; 2228c2ecf20Sopenharmony_ci return DECL_FUNCTION_CODE(fndecl) == code; 2238c2ecf20Sopenharmony_ci} 2248c2ecf20Sopenharmony_ci 2258c2ecf20Sopenharmony_cistatic inline bool is_simple_builtin(tree decl) 2268c2ecf20Sopenharmony_ci{ 2278c2ecf20Sopenharmony_ci if (decl && DECL_BUILT_IN_CLASS(decl) != BUILT_IN_NORMAL) 2288c2ecf20Sopenharmony_ci return false; 2298c2ecf20Sopenharmony_ci 2308c2ecf20Sopenharmony_ci switch (DECL_FUNCTION_CODE(decl)) { 2318c2ecf20Sopenharmony_ci /* Builtins that expand to constants. */ 2328c2ecf20Sopenharmony_ci case BUILT_IN_CONSTANT_P: 2338c2ecf20Sopenharmony_ci case BUILT_IN_EXPECT: 2348c2ecf20Sopenharmony_ci case BUILT_IN_OBJECT_SIZE: 2358c2ecf20Sopenharmony_ci case BUILT_IN_UNREACHABLE: 2368c2ecf20Sopenharmony_ci /* Simple register moves or loads from stack. */ 2378c2ecf20Sopenharmony_ci case BUILT_IN_RETURN_ADDRESS: 2388c2ecf20Sopenharmony_ci case BUILT_IN_EXTRACT_RETURN_ADDR: 2398c2ecf20Sopenharmony_ci case BUILT_IN_FROB_RETURN_ADDR: 2408c2ecf20Sopenharmony_ci case BUILT_IN_RETURN: 2418c2ecf20Sopenharmony_ci case BUILT_IN_AGGREGATE_INCOMING_ADDRESS: 2428c2ecf20Sopenharmony_ci case BUILT_IN_FRAME_ADDRESS: 2438c2ecf20Sopenharmony_ci case BUILT_IN_VA_END: 2448c2ecf20Sopenharmony_ci case BUILT_IN_STACK_SAVE: 2458c2ecf20Sopenharmony_ci case BUILT_IN_STACK_RESTORE: 2468c2ecf20Sopenharmony_ci /* Exception state returns or moves registers around. */ 2478c2ecf20Sopenharmony_ci case BUILT_IN_EH_FILTER: 2488c2ecf20Sopenharmony_ci case BUILT_IN_EH_POINTER: 2498c2ecf20Sopenharmony_ci case BUILT_IN_EH_COPY_VALUES: 2508c2ecf20Sopenharmony_ci return true; 2518c2ecf20Sopenharmony_ci 2528c2ecf20Sopenharmony_ci default: 2538c2ecf20Sopenharmony_ci return false; 2548c2ecf20Sopenharmony_ci } 2558c2ecf20Sopenharmony_ci} 2568c2ecf20Sopenharmony_ci 2578c2ecf20Sopenharmony_cistatic inline void add_local_decl(struct function *fun, tree d) 2588c2ecf20Sopenharmony_ci{ 2598c2ecf20Sopenharmony_ci gcc_assert(TREE_CODE(d) == VAR_DECL); 2608c2ecf20Sopenharmony_ci fun->local_decls = tree_cons(NULL_TREE, d, fun->local_decls); 2618c2ecf20Sopenharmony_ci} 2628c2ecf20Sopenharmony_ci#endif 2638c2ecf20Sopenharmony_ci 2648c2ecf20Sopenharmony_ci#if BUILDING_GCC_VERSION <= 4006 2658c2ecf20Sopenharmony_ci#define ANY_RETURN_P(rtx) (GET_CODE(rtx) == RETURN) 2668c2ecf20Sopenharmony_ci#define C_DECL_REGISTER(EXP) DECL_LANG_FLAG_4(EXP) 2678c2ecf20Sopenharmony_ci#define EDGE_PRESERVE 0ULL 2688c2ecf20Sopenharmony_ci#define HOST_WIDE_INT_PRINT_HEX_PURE "%" HOST_WIDE_INT_PRINT "x" 2698c2ecf20Sopenharmony_ci#define flag_fat_lto_objects true 2708c2ecf20Sopenharmony_ci 2718c2ecf20Sopenharmony_ci#define get_random_seed(noinit) ({ \ 2728c2ecf20Sopenharmony_ci unsigned HOST_WIDE_INT seed; \ 2738c2ecf20Sopenharmony_ci sscanf(get_random_seed(noinit), "%" HOST_WIDE_INT_PRINT "x", &seed); \ 2748c2ecf20Sopenharmony_ci seed * seed; }) 2758c2ecf20Sopenharmony_ci 2768c2ecf20Sopenharmony_ci#define int_const_binop(code, arg1, arg2) \ 2778c2ecf20Sopenharmony_ci int_const_binop((code), (arg1), (arg2), 0) 2788c2ecf20Sopenharmony_ci 2798c2ecf20Sopenharmony_cistatic inline bool gimple_clobber_p(gimple s __unused) 2808c2ecf20Sopenharmony_ci{ 2818c2ecf20Sopenharmony_ci return false; 2828c2ecf20Sopenharmony_ci} 2838c2ecf20Sopenharmony_ci 2848c2ecf20Sopenharmony_cistatic inline bool gimple_asm_clobbers_memory_p(const_gimple stmt) 2858c2ecf20Sopenharmony_ci{ 2868c2ecf20Sopenharmony_ci unsigned i; 2878c2ecf20Sopenharmony_ci 2888c2ecf20Sopenharmony_ci for (i = 0; i < gimple_asm_nclobbers(stmt); i++) { 2898c2ecf20Sopenharmony_ci tree op = gimple_asm_clobber_op(stmt, i); 2908c2ecf20Sopenharmony_ci 2918c2ecf20Sopenharmony_ci if (!strcmp(TREE_STRING_POINTER(TREE_VALUE(op)), "memory")) 2928c2ecf20Sopenharmony_ci return true; 2938c2ecf20Sopenharmony_ci } 2948c2ecf20Sopenharmony_ci 2958c2ecf20Sopenharmony_ci return false; 2968c2ecf20Sopenharmony_ci} 2978c2ecf20Sopenharmony_ci 2988c2ecf20Sopenharmony_cistatic inline tree builtin_decl_implicit(enum built_in_function fncode) 2998c2ecf20Sopenharmony_ci{ 3008c2ecf20Sopenharmony_ci return implicit_built_in_decls[fncode]; 3018c2ecf20Sopenharmony_ci} 3028c2ecf20Sopenharmony_ci 3038c2ecf20Sopenharmony_cistatic inline int ipa_reverse_postorder(struct cgraph_node **order) 3048c2ecf20Sopenharmony_ci{ 3058c2ecf20Sopenharmony_ci return cgraph_postorder(order); 3068c2ecf20Sopenharmony_ci} 3078c2ecf20Sopenharmony_ci 3088c2ecf20Sopenharmony_cistatic inline struct cgraph_node *cgraph_create_node(tree decl) 3098c2ecf20Sopenharmony_ci{ 3108c2ecf20Sopenharmony_ci return cgraph_node(decl); 3118c2ecf20Sopenharmony_ci} 3128c2ecf20Sopenharmony_ci 3138c2ecf20Sopenharmony_cistatic inline struct cgraph_node *cgraph_get_create_node(tree decl) 3148c2ecf20Sopenharmony_ci{ 3158c2ecf20Sopenharmony_ci struct cgraph_node *node = cgraph_get_node(decl); 3168c2ecf20Sopenharmony_ci 3178c2ecf20Sopenharmony_ci return node ? node : cgraph_node(decl); 3188c2ecf20Sopenharmony_ci} 3198c2ecf20Sopenharmony_ci 3208c2ecf20Sopenharmony_cistatic inline bool cgraph_function_with_gimple_body_p(struct cgraph_node *node) 3218c2ecf20Sopenharmony_ci{ 3228c2ecf20Sopenharmony_ci return node->analyzed && !node->thunk.thunk_p && !node->alias; 3238c2ecf20Sopenharmony_ci} 3248c2ecf20Sopenharmony_ci 3258c2ecf20Sopenharmony_cistatic inline struct cgraph_node *cgraph_first_function_with_gimple_body(void) 3268c2ecf20Sopenharmony_ci{ 3278c2ecf20Sopenharmony_ci struct cgraph_node *node; 3288c2ecf20Sopenharmony_ci 3298c2ecf20Sopenharmony_ci for (node = cgraph_nodes; node; node = node->next) 3308c2ecf20Sopenharmony_ci if (cgraph_function_with_gimple_body_p(node)) 3318c2ecf20Sopenharmony_ci return node; 3328c2ecf20Sopenharmony_ci return NULL; 3338c2ecf20Sopenharmony_ci} 3348c2ecf20Sopenharmony_ci 3358c2ecf20Sopenharmony_cistatic inline struct cgraph_node *cgraph_next_function_with_gimple_body(struct cgraph_node *node) 3368c2ecf20Sopenharmony_ci{ 3378c2ecf20Sopenharmony_ci for (node = node->next; node; node = node->next) 3388c2ecf20Sopenharmony_ci if (cgraph_function_with_gimple_body_p(node)) 3398c2ecf20Sopenharmony_ci return node; 3408c2ecf20Sopenharmony_ci return NULL; 3418c2ecf20Sopenharmony_ci} 3428c2ecf20Sopenharmony_ci 3438c2ecf20Sopenharmony_cistatic inline bool cgraph_for_node_and_aliases(cgraph_node_ptr node, bool (*callback)(cgraph_node_ptr, void *), void *data, bool include_overwritable) 3448c2ecf20Sopenharmony_ci{ 3458c2ecf20Sopenharmony_ci cgraph_node_ptr alias; 3468c2ecf20Sopenharmony_ci 3478c2ecf20Sopenharmony_ci if (callback(node, data)) 3488c2ecf20Sopenharmony_ci return true; 3498c2ecf20Sopenharmony_ci 3508c2ecf20Sopenharmony_ci for (alias = node->same_body; alias; alias = alias->next) { 3518c2ecf20Sopenharmony_ci if (include_overwritable || cgraph_function_body_availability(alias) > AVAIL_OVERWRITABLE) 3528c2ecf20Sopenharmony_ci if (cgraph_for_node_and_aliases(alias, callback, data, include_overwritable)) 3538c2ecf20Sopenharmony_ci return true; 3548c2ecf20Sopenharmony_ci } 3558c2ecf20Sopenharmony_ci 3568c2ecf20Sopenharmony_ci return false; 3578c2ecf20Sopenharmony_ci} 3588c2ecf20Sopenharmony_ci 3598c2ecf20Sopenharmony_ci#define FOR_EACH_FUNCTION_WITH_GIMPLE_BODY(node) \ 3608c2ecf20Sopenharmony_ci for ((node) = cgraph_first_function_with_gimple_body(); (node); \ 3618c2ecf20Sopenharmony_ci (node) = cgraph_next_function_with_gimple_body(node)) 3628c2ecf20Sopenharmony_ci 3638c2ecf20Sopenharmony_cistatic inline void varpool_add_new_variable(tree decl) 3648c2ecf20Sopenharmony_ci{ 3658c2ecf20Sopenharmony_ci varpool_finalize_decl(decl); 3668c2ecf20Sopenharmony_ci} 3678c2ecf20Sopenharmony_ci#endif 3688c2ecf20Sopenharmony_ci 3698c2ecf20Sopenharmony_ci#if BUILDING_GCC_VERSION <= 4007 3708c2ecf20Sopenharmony_ci#define FOR_EACH_FUNCTION(node) \ 3718c2ecf20Sopenharmony_ci for (node = cgraph_nodes; node; node = node->next) 3728c2ecf20Sopenharmony_ci#define FOR_EACH_VARIABLE(node) \ 3738c2ecf20Sopenharmony_ci for (node = varpool_nodes; node; node = node->next) 3748c2ecf20Sopenharmony_ci#define PROP_loops 0 3758c2ecf20Sopenharmony_ci#define NODE_SYMBOL(node) (node) 3768c2ecf20Sopenharmony_ci#define NODE_DECL(node) (node)->decl 3778c2ecf20Sopenharmony_ci#define INSN_LOCATION(INSN) RTL_LOCATION(INSN) 3788c2ecf20Sopenharmony_ci#define vNULL NULL 3798c2ecf20Sopenharmony_ci 3808c2ecf20Sopenharmony_cistatic inline int bb_loop_depth(const_basic_block bb) 3818c2ecf20Sopenharmony_ci{ 3828c2ecf20Sopenharmony_ci return bb->loop_father ? loop_depth(bb->loop_father) : 0; 3838c2ecf20Sopenharmony_ci} 3848c2ecf20Sopenharmony_ci 3858c2ecf20Sopenharmony_cistatic inline bool gimple_store_p(gimple gs) 3868c2ecf20Sopenharmony_ci{ 3878c2ecf20Sopenharmony_ci tree lhs = gimple_get_lhs(gs); 3888c2ecf20Sopenharmony_ci 3898c2ecf20Sopenharmony_ci return lhs && !is_gimple_reg(lhs); 3908c2ecf20Sopenharmony_ci} 3918c2ecf20Sopenharmony_ci 3928c2ecf20Sopenharmony_cistatic inline void gimple_init_singleton(gimple g __unused) 3938c2ecf20Sopenharmony_ci{ 3948c2ecf20Sopenharmony_ci} 3958c2ecf20Sopenharmony_ci#endif 3968c2ecf20Sopenharmony_ci 3978c2ecf20Sopenharmony_ci#if BUILDING_GCC_VERSION == 4007 || BUILDING_GCC_VERSION == 4008 3988c2ecf20Sopenharmony_cistatic inline struct cgraph_node *cgraph_alias_target(struct cgraph_node *n) 3998c2ecf20Sopenharmony_ci{ 4008c2ecf20Sopenharmony_ci return cgraph_alias_aliased_node(n); 4018c2ecf20Sopenharmony_ci} 4028c2ecf20Sopenharmony_ci#endif 4038c2ecf20Sopenharmony_ci 4048c2ecf20Sopenharmony_ci#if BUILDING_GCC_VERSION <= 4008 4058c2ecf20Sopenharmony_ci#define ENTRY_BLOCK_PTR_FOR_FN(FN) ENTRY_BLOCK_PTR_FOR_FUNCTION(FN) 4068c2ecf20Sopenharmony_ci#define EXIT_BLOCK_PTR_FOR_FN(FN) EXIT_BLOCK_PTR_FOR_FUNCTION(FN) 4078c2ecf20Sopenharmony_ci#define basic_block_info_for_fn(FN) ((FN)->cfg->x_basic_block_info) 4088c2ecf20Sopenharmony_ci#define n_basic_blocks_for_fn(FN) ((FN)->cfg->x_n_basic_blocks) 4098c2ecf20Sopenharmony_ci#define n_edges_for_fn(FN) ((FN)->cfg->x_n_edges) 4108c2ecf20Sopenharmony_ci#define last_basic_block_for_fn(FN) ((FN)->cfg->x_last_basic_block) 4118c2ecf20Sopenharmony_ci#define label_to_block_map_for_fn(FN) ((FN)->cfg->x_label_to_block_map) 4128c2ecf20Sopenharmony_ci#define profile_status_for_fn(FN) ((FN)->cfg->x_profile_status) 4138c2ecf20Sopenharmony_ci#define BASIC_BLOCK_FOR_FN(FN, N) BASIC_BLOCK_FOR_FUNCTION((FN), (N)) 4148c2ecf20Sopenharmony_ci#define NODE_IMPLICIT_ALIAS(node) (node)->same_body_alias 4158c2ecf20Sopenharmony_ci#define VAR_P(NODE) (TREE_CODE(NODE) == VAR_DECL) 4168c2ecf20Sopenharmony_ci 4178c2ecf20Sopenharmony_cistatic inline bool tree_fits_shwi_p(const_tree t) 4188c2ecf20Sopenharmony_ci{ 4198c2ecf20Sopenharmony_ci if (t == NULL_TREE || TREE_CODE(t) != INTEGER_CST) 4208c2ecf20Sopenharmony_ci return false; 4218c2ecf20Sopenharmony_ci 4228c2ecf20Sopenharmony_ci if (TREE_INT_CST_HIGH(t) == 0 && (HOST_WIDE_INT)TREE_INT_CST_LOW(t) >= 0) 4238c2ecf20Sopenharmony_ci return true; 4248c2ecf20Sopenharmony_ci 4258c2ecf20Sopenharmony_ci if (TREE_INT_CST_HIGH(t) == -1 && (HOST_WIDE_INT)TREE_INT_CST_LOW(t) < 0 && !TYPE_UNSIGNED(TREE_TYPE(t))) 4268c2ecf20Sopenharmony_ci return true; 4278c2ecf20Sopenharmony_ci 4288c2ecf20Sopenharmony_ci return false; 4298c2ecf20Sopenharmony_ci} 4308c2ecf20Sopenharmony_ci 4318c2ecf20Sopenharmony_cistatic inline bool tree_fits_uhwi_p(const_tree t) 4328c2ecf20Sopenharmony_ci{ 4338c2ecf20Sopenharmony_ci if (t == NULL_TREE || TREE_CODE(t) != INTEGER_CST) 4348c2ecf20Sopenharmony_ci return false; 4358c2ecf20Sopenharmony_ci 4368c2ecf20Sopenharmony_ci return TREE_INT_CST_HIGH(t) == 0; 4378c2ecf20Sopenharmony_ci} 4388c2ecf20Sopenharmony_ci 4398c2ecf20Sopenharmony_cistatic inline HOST_WIDE_INT tree_to_shwi(const_tree t) 4408c2ecf20Sopenharmony_ci{ 4418c2ecf20Sopenharmony_ci gcc_assert(tree_fits_shwi_p(t)); 4428c2ecf20Sopenharmony_ci return TREE_INT_CST_LOW(t); 4438c2ecf20Sopenharmony_ci} 4448c2ecf20Sopenharmony_ci 4458c2ecf20Sopenharmony_cistatic inline unsigned HOST_WIDE_INT tree_to_uhwi(const_tree t) 4468c2ecf20Sopenharmony_ci{ 4478c2ecf20Sopenharmony_ci gcc_assert(tree_fits_uhwi_p(t)); 4488c2ecf20Sopenharmony_ci return TREE_INT_CST_LOW(t); 4498c2ecf20Sopenharmony_ci} 4508c2ecf20Sopenharmony_ci 4518c2ecf20Sopenharmony_cistatic inline const char *get_tree_code_name(enum tree_code code) 4528c2ecf20Sopenharmony_ci{ 4538c2ecf20Sopenharmony_ci gcc_assert(code < MAX_TREE_CODES); 4548c2ecf20Sopenharmony_ci return tree_code_name[code]; 4558c2ecf20Sopenharmony_ci} 4568c2ecf20Sopenharmony_ci 4578c2ecf20Sopenharmony_ci#define ipa_remove_stmt_references(cnode, stmt) 4588c2ecf20Sopenharmony_ci 4598c2ecf20Sopenharmony_citypedef union gimple_statement_d gasm; 4608c2ecf20Sopenharmony_citypedef union gimple_statement_d gassign; 4618c2ecf20Sopenharmony_citypedef union gimple_statement_d gcall; 4628c2ecf20Sopenharmony_citypedef union gimple_statement_d gcond; 4638c2ecf20Sopenharmony_citypedef union gimple_statement_d gdebug; 4648c2ecf20Sopenharmony_citypedef union gimple_statement_d ggoto; 4658c2ecf20Sopenharmony_citypedef union gimple_statement_d gphi; 4668c2ecf20Sopenharmony_citypedef union gimple_statement_d greturn; 4678c2ecf20Sopenharmony_ci 4688c2ecf20Sopenharmony_cistatic inline gasm *as_a_gasm(gimple stmt) 4698c2ecf20Sopenharmony_ci{ 4708c2ecf20Sopenharmony_ci return stmt; 4718c2ecf20Sopenharmony_ci} 4728c2ecf20Sopenharmony_ci 4738c2ecf20Sopenharmony_cistatic inline const gasm *as_a_const_gasm(const_gimple stmt) 4748c2ecf20Sopenharmony_ci{ 4758c2ecf20Sopenharmony_ci return stmt; 4768c2ecf20Sopenharmony_ci} 4778c2ecf20Sopenharmony_ci 4788c2ecf20Sopenharmony_cistatic inline gassign *as_a_gassign(gimple stmt) 4798c2ecf20Sopenharmony_ci{ 4808c2ecf20Sopenharmony_ci return stmt; 4818c2ecf20Sopenharmony_ci} 4828c2ecf20Sopenharmony_ci 4838c2ecf20Sopenharmony_cistatic inline const gassign *as_a_const_gassign(const_gimple stmt) 4848c2ecf20Sopenharmony_ci{ 4858c2ecf20Sopenharmony_ci return stmt; 4868c2ecf20Sopenharmony_ci} 4878c2ecf20Sopenharmony_ci 4888c2ecf20Sopenharmony_cistatic inline gcall *as_a_gcall(gimple stmt) 4898c2ecf20Sopenharmony_ci{ 4908c2ecf20Sopenharmony_ci return stmt; 4918c2ecf20Sopenharmony_ci} 4928c2ecf20Sopenharmony_ci 4938c2ecf20Sopenharmony_cistatic inline const gcall *as_a_const_gcall(const_gimple stmt) 4948c2ecf20Sopenharmony_ci{ 4958c2ecf20Sopenharmony_ci return stmt; 4968c2ecf20Sopenharmony_ci} 4978c2ecf20Sopenharmony_ci 4988c2ecf20Sopenharmony_cistatic inline gcond *as_a_gcond(gimple stmt) 4998c2ecf20Sopenharmony_ci{ 5008c2ecf20Sopenharmony_ci return stmt; 5018c2ecf20Sopenharmony_ci} 5028c2ecf20Sopenharmony_ci 5038c2ecf20Sopenharmony_cistatic inline const gcond *as_a_const_gcond(const_gimple stmt) 5048c2ecf20Sopenharmony_ci{ 5058c2ecf20Sopenharmony_ci return stmt; 5068c2ecf20Sopenharmony_ci} 5078c2ecf20Sopenharmony_ci 5088c2ecf20Sopenharmony_cistatic inline gdebug *as_a_gdebug(gimple stmt) 5098c2ecf20Sopenharmony_ci{ 5108c2ecf20Sopenharmony_ci return stmt; 5118c2ecf20Sopenharmony_ci} 5128c2ecf20Sopenharmony_ci 5138c2ecf20Sopenharmony_cistatic inline const gdebug *as_a_const_gdebug(const_gimple stmt) 5148c2ecf20Sopenharmony_ci{ 5158c2ecf20Sopenharmony_ci return stmt; 5168c2ecf20Sopenharmony_ci} 5178c2ecf20Sopenharmony_ci 5188c2ecf20Sopenharmony_cistatic inline ggoto *as_a_ggoto(gimple stmt) 5198c2ecf20Sopenharmony_ci{ 5208c2ecf20Sopenharmony_ci return stmt; 5218c2ecf20Sopenharmony_ci} 5228c2ecf20Sopenharmony_ci 5238c2ecf20Sopenharmony_cistatic inline const ggoto *as_a_const_ggoto(const_gimple stmt) 5248c2ecf20Sopenharmony_ci{ 5258c2ecf20Sopenharmony_ci return stmt; 5268c2ecf20Sopenharmony_ci} 5278c2ecf20Sopenharmony_ci 5288c2ecf20Sopenharmony_cistatic inline gphi *as_a_gphi(gimple stmt) 5298c2ecf20Sopenharmony_ci{ 5308c2ecf20Sopenharmony_ci return stmt; 5318c2ecf20Sopenharmony_ci} 5328c2ecf20Sopenharmony_ci 5338c2ecf20Sopenharmony_cistatic inline const gphi *as_a_const_gphi(const_gimple stmt) 5348c2ecf20Sopenharmony_ci{ 5358c2ecf20Sopenharmony_ci return stmt; 5368c2ecf20Sopenharmony_ci} 5378c2ecf20Sopenharmony_ci 5388c2ecf20Sopenharmony_cistatic inline greturn *as_a_greturn(gimple stmt) 5398c2ecf20Sopenharmony_ci{ 5408c2ecf20Sopenharmony_ci return stmt; 5418c2ecf20Sopenharmony_ci} 5428c2ecf20Sopenharmony_ci 5438c2ecf20Sopenharmony_cistatic inline const greturn *as_a_const_greturn(const_gimple stmt) 5448c2ecf20Sopenharmony_ci{ 5458c2ecf20Sopenharmony_ci return stmt; 5468c2ecf20Sopenharmony_ci} 5478c2ecf20Sopenharmony_ci#endif 5488c2ecf20Sopenharmony_ci 5498c2ecf20Sopenharmony_ci#if BUILDING_GCC_VERSION == 4008 5508c2ecf20Sopenharmony_ci#define NODE_SYMBOL(node) (&(node)->symbol) 5518c2ecf20Sopenharmony_ci#define NODE_DECL(node) (node)->symbol.decl 5528c2ecf20Sopenharmony_ci#endif 5538c2ecf20Sopenharmony_ci 5548c2ecf20Sopenharmony_ci#if BUILDING_GCC_VERSION >= 4008 5558c2ecf20Sopenharmony_ci#define add_referenced_var(var) 5568c2ecf20Sopenharmony_ci#define mark_sym_for_renaming(var) 5578c2ecf20Sopenharmony_ci#define varpool_mark_needed_node(node) 5588c2ecf20Sopenharmony_ci#define create_var_ann(var) 5598c2ecf20Sopenharmony_ci#define TODO_dump_func 0 5608c2ecf20Sopenharmony_ci#define TODO_dump_cgraph 0 5618c2ecf20Sopenharmony_ci#endif 5628c2ecf20Sopenharmony_ci 5638c2ecf20Sopenharmony_ci#if BUILDING_GCC_VERSION <= 4009 5648c2ecf20Sopenharmony_ci#define TODO_verify_il 0 5658c2ecf20Sopenharmony_ci#define AVAIL_INTERPOSABLE AVAIL_OVERWRITABLE 5668c2ecf20Sopenharmony_ci 5678c2ecf20Sopenharmony_ci#define section_name_prefix LTO_SECTION_NAME_PREFIX 5688c2ecf20Sopenharmony_ci#define fatal_error(loc, gmsgid, ...) fatal_error((gmsgid), __VA_ARGS__) 5698c2ecf20Sopenharmony_ci 5708c2ecf20Sopenharmony_cirtx emit_move_insn(rtx x, rtx y); 5718c2ecf20Sopenharmony_ci 5728c2ecf20Sopenharmony_citypedef struct rtx_def rtx_insn; 5738c2ecf20Sopenharmony_ci 5748c2ecf20Sopenharmony_cistatic inline const char *get_decl_section_name(const_tree decl) 5758c2ecf20Sopenharmony_ci{ 5768c2ecf20Sopenharmony_ci if (DECL_SECTION_NAME(decl) == NULL_TREE) 5778c2ecf20Sopenharmony_ci return NULL; 5788c2ecf20Sopenharmony_ci 5798c2ecf20Sopenharmony_ci return TREE_STRING_POINTER(DECL_SECTION_NAME(decl)); 5808c2ecf20Sopenharmony_ci} 5818c2ecf20Sopenharmony_ci 5828c2ecf20Sopenharmony_cistatic inline void set_decl_section_name(tree node, const char *value) 5838c2ecf20Sopenharmony_ci{ 5848c2ecf20Sopenharmony_ci if (value) 5858c2ecf20Sopenharmony_ci DECL_SECTION_NAME(node) = build_string(strlen(value) + 1, value); 5868c2ecf20Sopenharmony_ci else 5878c2ecf20Sopenharmony_ci DECL_SECTION_NAME(node) = NULL; 5888c2ecf20Sopenharmony_ci} 5898c2ecf20Sopenharmony_ci#endif 5908c2ecf20Sopenharmony_ci 5918c2ecf20Sopenharmony_ci#if BUILDING_GCC_VERSION == 4009 5928c2ecf20Sopenharmony_citypedef struct gimple_statement_asm gasm; 5938c2ecf20Sopenharmony_citypedef struct gimple_statement_base gassign; 5948c2ecf20Sopenharmony_citypedef struct gimple_statement_call gcall; 5958c2ecf20Sopenharmony_citypedef struct gimple_statement_base gcond; 5968c2ecf20Sopenharmony_citypedef struct gimple_statement_base gdebug; 5978c2ecf20Sopenharmony_citypedef struct gimple_statement_base ggoto; 5988c2ecf20Sopenharmony_citypedef struct gimple_statement_phi gphi; 5998c2ecf20Sopenharmony_citypedef struct gimple_statement_base greturn; 6008c2ecf20Sopenharmony_ci 6018c2ecf20Sopenharmony_cistatic inline gasm *as_a_gasm(gimple stmt) 6028c2ecf20Sopenharmony_ci{ 6038c2ecf20Sopenharmony_ci return as_a<gasm>(stmt); 6048c2ecf20Sopenharmony_ci} 6058c2ecf20Sopenharmony_ci 6068c2ecf20Sopenharmony_cistatic inline const gasm *as_a_const_gasm(const_gimple stmt) 6078c2ecf20Sopenharmony_ci{ 6088c2ecf20Sopenharmony_ci return as_a<const gasm>(stmt); 6098c2ecf20Sopenharmony_ci} 6108c2ecf20Sopenharmony_ci 6118c2ecf20Sopenharmony_cistatic inline gassign *as_a_gassign(gimple stmt) 6128c2ecf20Sopenharmony_ci{ 6138c2ecf20Sopenharmony_ci return stmt; 6148c2ecf20Sopenharmony_ci} 6158c2ecf20Sopenharmony_ci 6168c2ecf20Sopenharmony_cistatic inline const gassign *as_a_const_gassign(const_gimple stmt) 6178c2ecf20Sopenharmony_ci{ 6188c2ecf20Sopenharmony_ci return stmt; 6198c2ecf20Sopenharmony_ci} 6208c2ecf20Sopenharmony_ci 6218c2ecf20Sopenharmony_cistatic inline gcall *as_a_gcall(gimple stmt) 6228c2ecf20Sopenharmony_ci{ 6238c2ecf20Sopenharmony_ci return as_a<gcall>(stmt); 6248c2ecf20Sopenharmony_ci} 6258c2ecf20Sopenharmony_ci 6268c2ecf20Sopenharmony_cistatic inline const gcall *as_a_const_gcall(const_gimple stmt) 6278c2ecf20Sopenharmony_ci{ 6288c2ecf20Sopenharmony_ci return as_a<const gcall>(stmt); 6298c2ecf20Sopenharmony_ci} 6308c2ecf20Sopenharmony_ci 6318c2ecf20Sopenharmony_cistatic inline gcond *as_a_gcond(gimple stmt) 6328c2ecf20Sopenharmony_ci{ 6338c2ecf20Sopenharmony_ci return stmt; 6348c2ecf20Sopenharmony_ci} 6358c2ecf20Sopenharmony_ci 6368c2ecf20Sopenharmony_cistatic inline const gcond *as_a_const_gcond(const_gimple stmt) 6378c2ecf20Sopenharmony_ci{ 6388c2ecf20Sopenharmony_ci return stmt; 6398c2ecf20Sopenharmony_ci} 6408c2ecf20Sopenharmony_ci 6418c2ecf20Sopenharmony_cistatic inline gdebug *as_a_gdebug(gimple stmt) 6428c2ecf20Sopenharmony_ci{ 6438c2ecf20Sopenharmony_ci return stmt; 6448c2ecf20Sopenharmony_ci} 6458c2ecf20Sopenharmony_ci 6468c2ecf20Sopenharmony_cistatic inline const gdebug *as_a_const_gdebug(const_gimple stmt) 6478c2ecf20Sopenharmony_ci{ 6488c2ecf20Sopenharmony_ci return stmt; 6498c2ecf20Sopenharmony_ci} 6508c2ecf20Sopenharmony_ci 6518c2ecf20Sopenharmony_cistatic inline ggoto *as_a_ggoto(gimple stmt) 6528c2ecf20Sopenharmony_ci{ 6538c2ecf20Sopenharmony_ci return stmt; 6548c2ecf20Sopenharmony_ci} 6558c2ecf20Sopenharmony_ci 6568c2ecf20Sopenharmony_cistatic inline const ggoto *as_a_const_ggoto(const_gimple stmt) 6578c2ecf20Sopenharmony_ci{ 6588c2ecf20Sopenharmony_ci return stmt; 6598c2ecf20Sopenharmony_ci} 6608c2ecf20Sopenharmony_ci 6618c2ecf20Sopenharmony_cistatic inline gphi *as_a_gphi(gimple stmt) 6628c2ecf20Sopenharmony_ci{ 6638c2ecf20Sopenharmony_ci return as_a<gphi>(stmt); 6648c2ecf20Sopenharmony_ci} 6658c2ecf20Sopenharmony_ci 6668c2ecf20Sopenharmony_cistatic inline const gphi *as_a_const_gphi(const_gimple stmt) 6678c2ecf20Sopenharmony_ci{ 6688c2ecf20Sopenharmony_ci return as_a<const gphi>(stmt); 6698c2ecf20Sopenharmony_ci} 6708c2ecf20Sopenharmony_ci 6718c2ecf20Sopenharmony_cistatic inline greturn *as_a_greturn(gimple stmt) 6728c2ecf20Sopenharmony_ci{ 6738c2ecf20Sopenharmony_ci return stmt; 6748c2ecf20Sopenharmony_ci} 6758c2ecf20Sopenharmony_ci 6768c2ecf20Sopenharmony_cistatic inline const greturn *as_a_const_greturn(const_gimple stmt) 6778c2ecf20Sopenharmony_ci{ 6788c2ecf20Sopenharmony_ci return stmt; 6798c2ecf20Sopenharmony_ci} 6808c2ecf20Sopenharmony_ci#endif 6818c2ecf20Sopenharmony_ci 6828c2ecf20Sopenharmony_ci#if BUILDING_GCC_VERSION >= 4009 6838c2ecf20Sopenharmony_ci#define TODO_ggc_collect 0 6848c2ecf20Sopenharmony_ci#define NODE_SYMBOL(node) (node) 6858c2ecf20Sopenharmony_ci#define NODE_DECL(node) (node)->decl 6868c2ecf20Sopenharmony_ci#define cgraph_node_name(node) (node)->name() 6878c2ecf20Sopenharmony_ci#define NODE_IMPLICIT_ALIAS(node) (node)->cpp_implicit_alias 6888c2ecf20Sopenharmony_ci 6898c2ecf20Sopenharmony_cistatic inline opt_pass *get_pass_for_id(int id) 6908c2ecf20Sopenharmony_ci{ 6918c2ecf20Sopenharmony_ci return g->get_passes()->get_pass_for_id(id); 6928c2ecf20Sopenharmony_ci} 6938c2ecf20Sopenharmony_ci#endif 6948c2ecf20Sopenharmony_ci 6958c2ecf20Sopenharmony_ci#if BUILDING_GCC_VERSION >= 5000 && BUILDING_GCC_VERSION < 6000 6968c2ecf20Sopenharmony_ci/* gimple related */ 6978c2ecf20Sopenharmony_citemplate <> 6988c2ecf20Sopenharmony_citemplate <> 6998c2ecf20Sopenharmony_ciinline bool is_a_helper<const gassign *>::test(const_gimple gs) 7008c2ecf20Sopenharmony_ci{ 7018c2ecf20Sopenharmony_ci return gs->code == GIMPLE_ASSIGN; 7028c2ecf20Sopenharmony_ci} 7038c2ecf20Sopenharmony_ci#endif 7048c2ecf20Sopenharmony_ci 7058c2ecf20Sopenharmony_ci#if BUILDING_GCC_VERSION >= 5000 7068c2ecf20Sopenharmony_ci#define TODO_verify_ssa TODO_verify_il 7078c2ecf20Sopenharmony_ci#define TODO_verify_flow TODO_verify_il 7088c2ecf20Sopenharmony_ci#define TODO_verify_stmts TODO_verify_il 7098c2ecf20Sopenharmony_ci#define TODO_verify_rtl_sharing TODO_verify_il 7108c2ecf20Sopenharmony_ci 7118c2ecf20Sopenharmony_ci#define INSN_DELETED_P(insn) (insn)->deleted() 7128c2ecf20Sopenharmony_ci 7138c2ecf20Sopenharmony_cistatic inline const char *get_decl_section_name(const_tree decl) 7148c2ecf20Sopenharmony_ci{ 7158c2ecf20Sopenharmony_ci return DECL_SECTION_NAME(decl); 7168c2ecf20Sopenharmony_ci} 7178c2ecf20Sopenharmony_ci 7188c2ecf20Sopenharmony_ci/* symtab/cgraph related */ 7198c2ecf20Sopenharmony_ci#define debug_cgraph_node(node) (node)->debug() 7208c2ecf20Sopenharmony_ci#define cgraph_get_node(decl) cgraph_node::get(decl) 7218c2ecf20Sopenharmony_ci#define cgraph_get_create_node(decl) cgraph_node::get_create(decl) 7228c2ecf20Sopenharmony_ci#define cgraph_create_node(decl) cgraph_node::create(decl) 7238c2ecf20Sopenharmony_ci#define cgraph_n_nodes symtab->cgraph_count 7248c2ecf20Sopenharmony_ci#define cgraph_max_uid symtab->cgraph_max_uid 7258c2ecf20Sopenharmony_ci#define varpool_get_node(decl) varpool_node::get(decl) 7268c2ecf20Sopenharmony_ci#define dump_varpool_node(file, node) (node)->dump(file) 7278c2ecf20Sopenharmony_ci 7288c2ecf20Sopenharmony_ci#if BUILDING_GCC_VERSION >= 8000 7298c2ecf20Sopenharmony_ci#define cgraph_create_edge(caller, callee, call_stmt, count, freq) \ 7308c2ecf20Sopenharmony_ci (caller)->create_edge((callee), (call_stmt), (count)) 7318c2ecf20Sopenharmony_ci 7328c2ecf20Sopenharmony_ci#define cgraph_create_edge_including_clones(caller, callee, \ 7338c2ecf20Sopenharmony_ci old_call_stmt, call_stmt, count, freq, reason) \ 7348c2ecf20Sopenharmony_ci (caller)->create_edge_including_clones((callee), \ 7358c2ecf20Sopenharmony_ci (old_call_stmt), (call_stmt), (count), (reason)) 7368c2ecf20Sopenharmony_ci#else 7378c2ecf20Sopenharmony_ci#define cgraph_create_edge(caller, callee, call_stmt, count, freq) \ 7388c2ecf20Sopenharmony_ci (caller)->create_edge((callee), (call_stmt), (count), (freq)) 7398c2ecf20Sopenharmony_ci 7408c2ecf20Sopenharmony_ci#define cgraph_create_edge_including_clones(caller, callee, \ 7418c2ecf20Sopenharmony_ci old_call_stmt, call_stmt, count, freq, reason) \ 7428c2ecf20Sopenharmony_ci (caller)->create_edge_including_clones((callee), \ 7438c2ecf20Sopenharmony_ci (old_call_stmt), (call_stmt), (count), (freq), (reason)) 7448c2ecf20Sopenharmony_ci#endif 7458c2ecf20Sopenharmony_ci 7468c2ecf20Sopenharmony_citypedef struct cgraph_node *cgraph_node_ptr; 7478c2ecf20Sopenharmony_citypedef struct cgraph_edge *cgraph_edge_p; 7488c2ecf20Sopenharmony_citypedef struct varpool_node *varpool_node_ptr; 7498c2ecf20Sopenharmony_ci 7508c2ecf20Sopenharmony_cistatic inline void change_decl_assembler_name(tree decl, tree name) 7518c2ecf20Sopenharmony_ci{ 7528c2ecf20Sopenharmony_ci symtab->change_decl_assembler_name(decl, name); 7538c2ecf20Sopenharmony_ci} 7548c2ecf20Sopenharmony_ci 7558c2ecf20Sopenharmony_cistatic inline void varpool_finalize_decl(tree decl) 7568c2ecf20Sopenharmony_ci{ 7578c2ecf20Sopenharmony_ci varpool_node::finalize_decl(decl); 7588c2ecf20Sopenharmony_ci} 7598c2ecf20Sopenharmony_ci 7608c2ecf20Sopenharmony_cistatic inline void varpool_add_new_variable(tree decl) 7618c2ecf20Sopenharmony_ci{ 7628c2ecf20Sopenharmony_ci varpool_node::add(decl); 7638c2ecf20Sopenharmony_ci} 7648c2ecf20Sopenharmony_ci 7658c2ecf20Sopenharmony_cistatic inline unsigned int rebuild_cgraph_edges(void) 7668c2ecf20Sopenharmony_ci{ 7678c2ecf20Sopenharmony_ci return cgraph_edge::rebuild_edges(); 7688c2ecf20Sopenharmony_ci} 7698c2ecf20Sopenharmony_ci 7708c2ecf20Sopenharmony_cistatic inline cgraph_node_ptr cgraph_function_node(cgraph_node_ptr node, enum availability *availability) 7718c2ecf20Sopenharmony_ci{ 7728c2ecf20Sopenharmony_ci return node->function_symbol(availability); 7738c2ecf20Sopenharmony_ci} 7748c2ecf20Sopenharmony_ci 7758c2ecf20Sopenharmony_cistatic inline cgraph_node_ptr cgraph_function_or_thunk_node(cgraph_node_ptr node, enum availability *availability = NULL) 7768c2ecf20Sopenharmony_ci{ 7778c2ecf20Sopenharmony_ci return node->ultimate_alias_target(availability); 7788c2ecf20Sopenharmony_ci} 7798c2ecf20Sopenharmony_ci 7808c2ecf20Sopenharmony_cistatic inline bool cgraph_only_called_directly_p(cgraph_node_ptr node) 7818c2ecf20Sopenharmony_ci{ 7828c2ecf20Sopenharmony_ci return node->only_called_directly_p(); 7838c2ecf20Sopenharmony_ci} 7848c2ecf20Sopenharmony_ci 7858c2ecf20Sopenharmony_cistatic inline enum availability cgraph_function_body_availability(cgraph_node_ptr node) 7868c2ecf20Sopenharmony_ci{ 7878c2ecf20Sopenharmony_ci return node->get_availability(); 7888c2ecf20Sopenharmony_ci} 7898c2ecf20Sopenharmony_ci 7908c2ecf20Sopenharmony_cistatic inline cgraph_node_ptr cgraph_alias_target(cgraph_node_ptr node) 7918c2ecf20Sopenharmony_ci{ 7928c2ecf20Sopenharmony_ci return node->get_alias_target(); 7938c2ecf20Sopenharmony_ci} 7948c2ecf20Sopenharmony_ci 7958c2ecf20Sopenharmony_cistatic inline bool cgraph_for_node_and_aliases(cgraph_node_ptr node, bool (*callback)(cgraph_node_ptr, void *), void *data, bool include_overwritable) 7968c2ecf20Sopenharmony_ci{ 7978c2ecf20Sopenharmony_ci return node->call_for_symbol_thunks_and_aliases(callback, data, include_overwritable); 7988c2ecf20Sopenharmony_ci} 7998c2ecf20Sopenharmony_ci 8008c2ecf20Sopenharmony_cistatic inline struct cgraph_node_hook_list *cgraph_add_function_insertion_hook(cgraph_node_hook hook, void *data) 8018c2ecf20Sopenharmony_ci{ 8028c2ecf20Sopenharmony_ci return symtab->add_cgraph_insertion_hook(hook, data); 8038c2ecf20Sopenharmony_ci} 8048c2ecf20Sopenharmony_ci 8058c2ecf20Sopenharmony_cistatic inline void cgraph_remove_function_insertion_hook(struct cgraph_node_hook_list *entry) 8068c2ecf20Sopenharmony_ci{ 8078c2ecf20Sopenharmony_ci symtab->remove_cgraph_insertion_hook(entry); 8088c2ecf20Sopenharmony_ci} 8098c2ecf20Sopenharmony_ci 8108c2ecf20Sopenharmony_cistatic inline struct cgraph_node_hook_list *cgraph_add_node_removal_hook(cgraph_node_hook hook, void *data) 8118c2ecf20Sopenharmony_ci{ 8128c2ecf20Sopenharmony_ci return symtab->add_cgraph_removal_hook(hook, data); 8138c2ecf20Sopenharmony_ci} 8148c2ecf20Sopenharmony_ci 8158c2ecf20Sopenharmony_cistatic inline void cgraph_remove_node_removal_hook(struct cgraph_node_hook_list *entry) 8168c2ecf20Sopenharmony_ci{ 8178c2ecf20Sopenharmony_ci symtab->remove_cgraph_removal_hook(entry); 8188c2ecf20Sopenharmony_ci} 8198c2ecf20Sopenharmony_ci 8208c2ecf20Sopenharmony_cistatic inline struct cgraph_2node_hook_list *cgraph_add_node_duplication_hook(cgraph_2node_hook hook, void *data) 8218c2ecf20Sopenharmony_ci{ 8228c2ecf20Sopenharmony_ci return symtab->add_cgraph_duplication_hook(hook, data); 8238c2ecf20Sopenharmony_ci} 8248c2ecf20Sopenharmony_ci 8258c2ecf20Sopenharmony_cistatic inline void cgraph_remove_node_duplication_hook(struct cgraph_2node_hook_list *entry) 8268c2ecf20Sopenharmony_ci{ 8278c2ecf20Sopenharmony_ci symtab->remove_cgraph_duplication_hook(entry); 8288c2ecf20Sopenharmony_ci} 8298c2ecf20Sopenharmony_ci 8308c2ecf20Sopenharmony_cistatic inline void cgraph_call_node_duplication_hooks(cgraph_node_ptr node, cgraph_node_ptr node2) 8318c2ecf20Sopenharmony_ci{ 8328c2ecf20Sopenharmony_ci symtab->call_cgraph_duplication_hooks(node, node2); 8338c2ecf20Sopenharmony_ci} 8348c2ecf20Sopenharmony_ci 8358c2ecf20Sopenharmony_cistatic inline void cgraph_call_edge_duplication_hooks(cgraph_edge *cs1, cgraph_edge *cs2) 8368c2ecf20Sopenharmony_ci{ 8378c2ecf20Sopenharmony_ci symtab->call_edge_duplication_hooks(cs1, cs2); 8388c2ecf20Sopenharmony_ci} 8398c2ecf20Sopenharmony_ci 8408c2ecf20Sopenharmony_ci#if BUILDING_GCC_VERSION >= 6000 8418c2ecf20Sopenharmony_citypedef gimple *gimple_ptr; 8428c2ecf20Sopenharmony_citypedef const gimple *const_gimple_ptr; 8438c2ecf20Sopenharmony_ci#define gimple gimple_ptr 8448c2ecf20Sopenharmony_ci#define const_gimple const_gimple_ptr 8458c2ecf20Sopenharmony_ci#undef CONST_CAST_GIMPLE 8468c2ecf20Sopenharmony_ci#define CONST_CAST_GIMPLE(X) CONST_CAST(gimple, (X)) 8478c2ecf20Sopenharmony_ci#endif 8488c2ecf20Sopenharmony_ci 8498c2ecf20Sopenharmony_ci/* gimple related */ 8508c2ecf20Sopenharmony_cistatic inline gimple gimple_build_assign_with_ops(enum tree_code subcode, tree lhs, tree op1, tree op2 MEM_STAT_DECL) 8518c2ecf20Sopenharmony_ci{ 8528c2ecf20Sopenharmony_ci return gimple_build_assign(lhs, subcode, op1, op2 PASS_MEM_STAT); 8538c2ecf20Sopenharmony_ci} 8548c2ecf20Sopenharmony_ci 8558c2ecf20Sopenharmony_ci#if BUILDING_GCC_VERSION < 10000 8568c2ecf20Sopenharmony_citemplate <> 8578c2ecf20Sopenharmony_citemplate <> 8588c2ecf20Sopenharmony_ciinline bool is_a_helper<const ggoto *>::test(const_gimple gs) 8598c2ecf20Sopenharmony_ci{ 8608c2ecf20Sopenharmony_ci return gs->code == GIMPLE_GOTO; 8618c2ecf20Sopenharmony_ci} 8628c2ecf20Sopenharmony_ci 8638c2ecf20Sopenharmony_citemplate <> 8648c2ecf20Sopenharmony_citemplate <> 8658c2ecf20Sopenharmony_ciinline bool is_a_helper<const greturn *>::test(const_gimple gs) 8668c2ecf20Sopenharmony_ci{ 8678c2ecf20Sopenharmony_ci return gs->code == GIMPLE_RETURN; 8688c2ecf20Sopenharmony_ci} 8698c2ecf20Sopenharmony_ci#endif 8708c2ecf20Sopenharmony_ci 8718c2ecf20Sopenharmony_cistatic inline gasm *as_a_gasm(gimple stmt) 8728c2ecf20Sopenharmony_ci{ 8738c2ecf20Sopenharmony_ci return as_a<gasm *>(stmt); 8748c2ecf20Sopenharmony_ci} 8758c2ecf20Sopenharmony_ci 8768c2ecf20Sopenharmony_cistatic inline const gasm *as_a_const_gasm(const_gimple stmt) 8778c2ecf20Sopenharmony_ci{ 8788c2ecf20Sopenharmony_ci return as_a<const gasm *>(stmt); 8798c2ecf20Sopenharmony_ci} 8808c2ecf20Sopenharmony_ci 8818c2ecf20Sopenharmony_cistatic inline gassign *as_a_gassign(gimple stmt) 8828c2ecf20Sopenharmony_ci{ 8838c2ecf20Sopenharmony_ci return as_a<gassign *>(stmt); 8848c2ecf20Sopenharmony_ci} 8858c2ecf20Sopenharmony_ci 8868c2ecf20Sopenharmony_cistatic inline const gassign *as_a_const_gassign(const_gimple stmt) 8878c2ecf20Sopenharmony_ci{ 8888c2ecf20Sopenharmony_ci return as_a<const gassign *>(stmt); 8898c2ecf20Sopenharmony_ci} 8908c2ecf20Sopenharmony_ci 8918c2ecf20Sopenharmony_cistatic inline gcall *as_a_gcall(gimple stmt) 8928c2ecf20Sopenharmony_ci{ 8938c2ecf20Sopenharmony_ci return as_a<gcall *>(stmt); 8948c2ecf20Sopenharmony_ci} 8958c2ecf20Sopenharmony_ci 8968c2ecf20Sopenharmony_cistatic inline const gcall *as_a_const_gcall(const_gimple stmt) 8978c2ecf20Sopenharmony_ci{ 8988c2ecf20Sopenharmony_ci return as_a<const gcall *>(stmt); 8998c2ecf20Sopenharmony_ci} 9008c2ecf20Sopenharmony_ci 9018c2ecf20Sopenharmony_cistatic inline ggoto *as_a_ggoto(gimple stmt) 9028c2ecf20Sopenharmony_ci{ 9038c2ecf20Sopenharmony_ci return as_a<ggoto *>(stmt); 9048c2ecf20Sopenharmony_ci} 9058c2ecf20Sopenharmony_ci 9068c2ecf20Sopenharmony_cistatic inline const ggoto *as_a_const_ggoto(const_gimple stmt) 9078c2ecf20Sopenharmony_ci{ 9088c2ecf20Sopenharmony_ci return as_a<const ggoto *>(stmt); 9098c2ecf20Sopenharmony_ci} 9108c2ecf20Sopenharmony_ci 9118c2ecf20Sopenharmony_cistatic inline gphi *as_a_gphi(gimple stmt) 9128c2ecf20Sopenharmony_ci{ 9138c2ecf20Sopenharmony_ci return as_a<gphi *>(stmt); 9148c2ecf20Sopenharmony_ci} 9158c2ecf20Sopenharmony_ci 9168c2ecf20Sopenharmony_cistatic inline const gphi *as_a_const_gphi(const_gimple stmt) 9178c2ecf20Sopenharmony_ci{ 9188c2ecf20Sopenharmony_ci return as_a<const gphi *>(stmt); 9198c2ecf20Sopenharmony_ci} 9208c2ecf20Sopenharmony_ci 9218c2ecf20Sopenharmony_cistatic inline greturn *as_a_greturn(gimple stmt) 9228c2ecf20Sopenharmony_ci{ 9238c2ecf20Sopenharmony_ci return as_a<greturn *>(stmt); 9248c2ecf20Sopenharmony_ci} 9258c2ecf20Sopenharmony_ci 9268c2ecf20Sopenharmony_cistatic inline const greturn *as_a_const_greturn(const_gimple stmt) 9278c2ecf20Sopenharmony_ci{ 9288c2ecf20Sopenharmony_ci return as_a<const greturn *>(stmt); 9298c2ecf20Sopenharmony_ci} 9308c2ecf20Sopenharmony_ci 9318c2ecf20Sopenharmony_ci/* IPA/LTO related */ 9328c2ecf20Sopenharmony_ci#define ipa_ref_list_referring_iterate(L, I, P) \ 9338c2ecf20Sopenharmony_ci (L)->referring.iterate((I), &(P)) 9348c2ecf20Sopenharmony_ci#define ipa_ref_list_reference_iterate(L, I, P) \ 9358c2ecf20Sopenharmony_ci (L)->reference.iterate((I), &(P)) 9368c2ecf20Sopenharmony_ci 9378c2ecf20Sopenharmony_cistatic inline cgraph_node_ptr ipa_ref_referring_node(struct ipa_ref *ref) 9388c2ecf20Sopenharmony_ci{ 9398c2ecf20Sopenharmony_ci return dyn_cast<cgraph_node_ptr>(ref->referring); 9408c2ecf20Sopenharmony_ci} 9418c2ecf20Sopenharmony_ci 9428c2ecf20Sopenharmony_cistatic inline void ipa_remove_stmt_references(symtab_node *referring_node, gimple stmt) 9438c2ecf20Sopenharmony_ci{ 9448c2ecf20Sopenharmony_ci referring_node->remove_stmt_references(stmt); 9458c2ecf20Sopenharmony_ci} 9468c2ecf20Sopenharmony_ci#endif 9478c2ecf20Sopenharmony_ci 9488c2ecf20Sopenharmony_ci#if BUILDING_GCC_VERSION < 6000 9498c2ecf20Sopenharmony_ci#define get_inner_reference(exp, pbitsize, pbitpos, poffset, pmode, punsignedp, preversep, pvolatilep, keep_aligning) \ 9508c2ecf20Sopenharmony_ci get_inner_reference(exp, pbitsize, pbitpos, poffset, pmode, punsignedp, pvolatilep, keep_aligning) 9518c2ecf20Sopenharmony_ci#define gen_rtx_set(ARG0, ARG1) gen_rtx_SET(VOIDmode, (ARG0), (ARG1)) 9528c2ecf20Sopenharmony_ci#endif 9538c2ecf20Sopenharmony_ci 9548c2ecf20Sopenharmony_ci#if BUILDING_GCC_VERSION >= 6000 9558c2ecf20Sopenharmony_ci#define gen_rtx_set(ARG0, ARG1) gen_rtx_SET((ARG0), (ARG1)) 9568c2ecf20Sopenharmony_ci#endif 9578c2ecf20Sopenharmony_ci 9588c2ecf20Sopenharmony_ci#ifdef __cplusplus 9598c2ecf20Sopenharmony_cistatic inline void debug_tree(const_tree t) 9608c2ecf20Sopenharmony_ci{ 9618c2ecf20Sopenharmony_ci debug_tree(CONST_CAST_TREE(t)); 9628c2ecf20Sopenharmony_ci} 9638c2ecf20Sopenharmony_ci 9648c2ecf20Sopenharmony_cistatic inline void debug_gimple_stmt(const_gimple s) 9658c2ecf20Sopenharmony_ci{ 9668c2ecf20Sopenharmony_ci debug_gimple_stmt(CONST_CAST_GIMPLE(s)); 9678c2ecf20Sopenharmony_ci} 9688c2ecf20Sopenharmony_ci#else 9698c2ecf20Sopenharmony_ci#define debug_tree(t) debug_tree(CONST_CAST_TREE(t)) 9708c2ecf20Sopenharmony_ci#define debug_gimple_stmt(s) debug_gimple_stmt(CONST_CAST_GIMPLE(s)) 9718c2ecf20Sopenharmony_ci#endif 9728c2ecf20Sopenharmony_ci 9738c2ecf20Sopenharmony_ci#if BUILDING_GCC_VERSION >= 7000 9748c2ecf20Sopenharmony_ci#define get_inner_reference(exp, pbitsize, pbitpos, poffset, pmode, punsignedp, preversep, pvolatilep, keep_aligning) \ 9758c2ecf20Sopenharmony_ci get_inner_reference(exp, pbitsize, pbitpos, poffset, pmode, punsignedp, preversep, pvolatilep) 9768c2ecf20Sopenharmony_ci#endif 9778c2ecf20Sopenharmony_ci 9788c2ecf20Sopenharmony_ci#if BUILDING_GCC_VERSION < 7000 9798c2ecf20Sopenharmony_ci#define SET_DECL_ALIGN(decl, align) DECL_ALIGN(decl) = (align) 9808c2ecf20Sopenharmony_ci#define SET_DECL_MODE(decl, mode) DECL_MODE(decl) = (mode) 9818c2ecf20Sopenharmony_ci#endif 9828c2ecf20Sopenharmony_ci 9838c2ecf20Sopenharmony_ci#endif 984