root/scripts/gcc-plugins/gcc-common.h

/* [<][>][^][v][top][bottom][index][help] */

INCLUDED FROM


DEFINITIONS

This source file includes following definitions.
  1. build_const_char_string
  2. gimple_call_builtin_p
  3. is_simple_builtin
  4. add_local_decl
  5. gimple_clobber_p
  6. gimple_asm_clobbers_memory_p
  7. builtin_decl_implicit
  8. ipa_reverse_postorder
  9. cgraph_create_node
  10. cgraph_get_create_node
  11. cgraph_function_with_gimple_body_p
  12. cgraph_first_function_with_gimple_body
  13. cgraph_next_function_with_gimple_body
  14. cgraph_for_node_and_aliases
  15. varpool_add_new_variable
  16. bb_loop_depth
  17. gimple_store_p
  18. gimple_init_singleton
  19. cgraph_alias_target
  20. tree_fits_shwi_p
  21. tree_fits_uhwi_p
  22. tree_to_shwi
  23. tree_to_uhwi
  24. get_tree_code_name
  25. as_a_gasm
  26. as_a_const_gasm
  27. as_a_gassign
  28. as_a_const_gassign
  29. as_a_gcall
  30. as_a_const_gcall
  31. as_a_gcond
  32. as_a_const_gcond
  33. as_a_gdebug
  34. as_a_const_gdebug
  35. as_a_ggoto
  36. as_a_const_ggoto
  37. as_a_gphi
  38. as_a_const_gphi
  39. as_a_greturn
  40. as_a_const_greturn
  41. get_decl_section_name
  42. set_decl_section_name
  43. as_a_gasm
  44. as_a_const_gasm
  45. as_a_gassign
  46. as_a_const_gassign
  47. as_a_gcall
  48. as_a_const_gcall
  49. as_a_gcond
  50. as_a_const_gcond
  51. as_a_gdebug
  52. as_a_const_gdebug
  53. as_a_ggoto
  54. as_a_const_ggoto
  55. as_a_gphi
  56. as_a_const_gphi
  57. as_a_greturn
  58. as_a_const_greturn
  59. get_pass_for_id
  60. test
  61. get_decl_section_name
  62. change_decl_assembler_name
  63. varpool_finalize_decl
  64. varpool_add_new_variable
  65. rebuild_cgraph_edges
  66. cgraph_function_node
  67. cgraph_function_or_thunk_node
  68. cgraph_only_called_directly_p
  69. cgraph_function_body_availability
  70. cgraph_alias_target
  71. cgraph_for_node_and_aliases
  72. cgraph_add_function_insertion_hook
  73. cgraph_remove_function_insertion_hook
  74. cgraph_add_node_removal_hook
  75. cgraph_remove_node_removal_hook
  76. cgraph_add_node_duplication_hook
  77. cgraph_remove_node_duplication_hook
  78. cgraph_call_node_duplication_hooks
  79. cgraph_call_edge_duplication_hooks
  80. gimple_build_assign_with_ops
  81. test
  82. test
  83. as_a_gasm
  84. as_a_const_gasm
  85. as_a_gassign
  86. as_a_const_gassign
  87. as_a_gcall
  88. as_a_const_gcall
  89. as_a_ggoto
  90. as_a_const_ggoto
  91. as_a_gphi
  92. as_a_const_gphi
  93. as_a_greturn
  94. as_a_const_greturn
  95. ipa_ref_referring_node
  96. ipa_remove_stmt_references
  97. debug_tree
  98. debug_gimple_stmt

   1 /* SPDX-License-Identifier: GPL-2.0 */
   2 #ifndef GCC_COMMON_H_INCLUDED
   3 #define GCC_COMMON_H_INCLUDED
   4 
   5 #include "bversion.h"
   6 #if BUILDING_GCC_VERSION >= 6000
   7 #include "gcc-plugin.h"
   8 #else
   9 #include "plugin.h"
  10 #endif
  11 #include "plugin-version.h"
  12 #include "config.h"
  13 #include "system.h"
  14 #include "coretypes.h"
  15 #include "tm.h"
  16 #include "line-map.h"
  17 #include "input.h"
  18 #include "tree.h"
  19 
  20 #include "tree-inline.h"
  21 #include "version.h"
  22 #include "rtl.h"
  23 #include "tm_p.h"
  24 #include "flags.h"
  25 #include "hard-reg-set.h"
  26 #include "output.h"
  27 #include "except.h"
  28 #include "function.h"
  29 #include "toplev.h"
  30 #if BUILDING_GCC_VERSION >= 5000
  31 #include "expr.h"
  32 #endif
  33 #include "basic-block.h"
  34 #include "intl.h"
  35 #include "ggc.h"
  36 #include "timevar.h"
  37 
  38 #if BUILDING_GCC_VERSION < 10000
  39 #include "params.h"
  40 #endif
  41 
  42 #if BUILDING_GCC_VERSION <= 4009
  43 #include "pointer-set.h"
  44 #else
  45 #include "hash-map.h"
  46 #endif
  47 
  48 #if BUILDING_GCC_VERSION >= 7000
  49 #include "memmodel.h"
  50 #endif
  51 #include "emit-rtl.h"
  52 #include "debug.h"
  53 #include "target.h"
  54 #include "langhooks.h"
  55 #include "cfgloop.h"
  56 #include "cgraph.h"
  57 #include "opts.h"
  58 
  59 #if BUILDING_GCC_VERSION == 4005
  60 #include <sys/mman.h>
  61 #endif
  62 
  63 #if BUILDING_GCC_VERSION >= 4007
  64 #include "tree-pretty-print.h"
  65 #include "gimple-pretty-print.h"
  66 #endif
  67 
  68 #if BUILDING_GCC_VERSION >= 4006
  69 /*
  70  * The c-family headers were moved into a subdirectory in GCC version
  71  * 4.7, but most plugin-building users of GCC 4.6 are using the Debian
  72  * or Ubuntu package, which has an out-of-tree patch to move this to the
  73  * same location as found in 4.7 and later:
  74  * https://sources.debian.net/src/gcc-4.6/4.6.3-14/debian/patches/pr45078.diff/
  75  */
  76 #include "c-family/c-common.h"
  77 #else
  78 #include "c-common.h"
  79 #endif
  80 
  81 #if BUILDING_GCC_VERSION <= 4008
  82 #include "tree-flow.h"
  83 #else
  84 #include "tree-cfgcleanup.h"
  85 #include "tree-ssa-operands.h"
  86 #include "tree-into-ssa.h"
  87 #endif
  88 
  89 #if BUILDING_GCC_VERSION >= 4008
  90 #include "is-a.h"
  91 #endif
  92 
  93 #include "diagnostic.h"
  94 #include "tree-dump.h"
  95 #include "tree-pass.h"
  96 #if BUILDING_GCC_VERSION >= 4009
  97 #include "pass_manager.h"
  98 #endif
  99 #include "predict.h"
 100 #include "ipa-utils.h"
 101 
 102 #if BUILDING_GCC_VERSION >= 8000
 103 #include "stringpool.h"
 104 #endif
 105 
 106 #if BUILDING_GCC_VERSION >= 4009
 107 #include "attribs.h"
 108 #include "varasm.h"
 109 #include "stor-layout.h"
 110 #include "internal-fn.h"
 111 #include "gimple-expr.h"
 112 #include "gimple-fold.h"
 113 #include "context.h"
 114 #include "tree-ssa-alias.h"
 115 #include "tree-ssa.h"
 116 #include "stringpool.h"
 117 #if BUILDING_GCC_VERSION >= 7000
 118 #include "tree-vrp.h"
 119 #endif
 120 #include "tree-ssanames.h"
 121 #include "print-tree.h"
 122 #include "tree-eh.h"
 123 #include "stmt.h"
 124 #include "gimplify.h"
 125 #endif
 126 
 127 #include "gimple.h"
 128 
 129 #if BUILDING_GCC_VERSION >= 4009
 130 #include "tree-ssa-operands.h"
 131 #include "tree-phinodes.h"
 132 #include "tree-cfg.h"
 133 #include "gimple-iterator.h"
 134 #include "gimple-ssa.h"
 135 #include "ssa-iterators.h"
 136 #endif
 137 
 138 #if BUILDING_GCC_VERSION >= 5000
 139 #include "builtins.h"
 140 #endif
 141 
 142 /* missing from basic_block.h... */
 143 void debug_dominance_info(enum cdi_direction dir);
 144 void debug_dominance_tree(enum cdi_direction dir, basic_block root);
 145 
 146 #if BUILDING_GCC_VERSION == 4006
 147 void debug_gimple_stmt(gimple);
 148 void debug_gimple_seq(gimple_seq);
 149 void print_gimple_seq(FILE *, gimple_seq, int, int);
 150 void print_gimple_stmt(FILE *, gimple, int, int);
 151 void print_gimple_expr(FILE *, gimple, int, int);
 152 void dump_gimple_stmt(pretty_printer *, gimple, int, int);
 153 #endif
 154 
 155 #ifndef __unused
 156 #define __unused __attribute__((__unused__))
 157 #endif
 158 #ifndef __visible
 159 #define __visible __attribute__((visibility("default")))
 160 #endif
 161 
 162 #define DECL_NAME_POINTER(node) IDENTIFIER_POINTER(DECL_NAME(node))
 163 #define DECL_NAME_LENGTH(node) IDENTIFIER_LENGTH(DECL_NAME(node))
 164 #define TYPE_NAME_POINTER(node) IDENTIFIER_POINTER(TYPE_NAME(node))
 165 #define TYPE_NAME_LENGTH(node) IDENTIFIER_LENGTH(TYPE_NAME(node))
 166 
 167 /* should come from c-tree.h if only it were installed for gcc 4.5... */
 168 #define C_TYPE_FIELDS_READONLY(TYPE) TREE_LANG_FLAG_1(TYPE)
 169 
 170 static inline tree build_const_char_string(int len, const char *str)
 171 {
 172         tree cstr, elem, index, type;
 173 
 174         cstr = build_string(len, str);
 175         elem = build_type_variant(char_type_node, 1, 0);
 176         index = build_index_type(size_int(len - 1));
 177         type = build_array_type(elem, index);
 178         TREE_TYPE(cstr) = type;
 179         TREE_CONSTANT(cstr) = 1;
 180         TREE_READONLY(cstr) = 1;
 181         TREE_STATIC(cstr) = 1;
 182         return cstr;
 183 }
 184 
 185 #define PASS_INFO(NAME, REF, ID, POS)           \
 186 struct register_pass_info NAME##_pass_info = {  \
 187         .pass = make_##NAME##_pass(),           \
 188         .reference_pass_name = REF,             \
 189         .ref_pass_instance_number = ID,         \
 190         .pos_op = POS,                          \
 191 }
 192 
 193 #if BUILDING_GCC_VERSION == 4005
 194 #define FOR_EACH_LOCAL_DECL(FUN, I, D)                  \
 195         for (tree vars = (FUN)->local_decls, (I) = 0;   \
 196                 vars && ((D) = TREE_VALUE(vars));       \
 197                 vars = TREE_CHAIN(vars), (I)++)
 198 #define DECL_CHAIN(NODE) (TREE_CHAIN(DECL_MINIMAL_CHECK(NODE)))
 199 #define FOR_EACH_VEC_ELT(T, V, I, P) \
 200         for (I = 0; VEC_iterate(T, (V), (I), (P)); ++(I))
 201 #define TODO_rebuild_cgraph_edges 0
 202 #define SCOPE_FILE_SCOPE_P(EXP) (!(EXP))
 203 
 204 #ifndef O_BINARY
 205 #define O_BINARY 0
 206 #endif
 207 
 208 typedef struct varpool_node *varpool_node_ptr;
 209 
 210 static inline bool gimple_call_builtin_p(gimple stmt, enum built_in_function code)
 211 {
 212         tree fndecl;
 213 
 214         if (!is_gimple_call(stmt))
 215                 return false;
 216         fndecl = gimple_call_fndecl(stmt);
 217         if (!fndecl || DECL_BUILT_IN_CLASS(fndecl) != BUILT_IN_NORMAL)
 218                 return false;
 219         return DECL_FUNCTION_CODE(fndecl) == code;
 220 }
 221 
 222 static inline bool is_simple_builtin(tree decl)
 223 {
 224         if (decl && DECL_BUILT_IN_CLASS(decl) != BUILT_IN_NORMAL)
 225                 return false;
 226 
 227         switch (DECL_FUNCTION_CODE(decl)) {
 228         /* Builtins that expand to constants. */
 229         case BUILT_IN_CONSTANT_P:
 230         case BUILT_IN_EXPECT:
 231         case BUILT_IN_OBJECT_SIZE:
 232         case BUILT_IN_UNREACHABLE:
 233         /* Simple register moves or loads from stack. */
 234         case BUILT_IN_RETURN_ADDRESS:
 235         case BUILT_IN_EXTRACT_RETURN_ADDR:
 236         case BUILT_IN_FROB_RETURN_ADDR:
 237         case BUILT_IN_RETURN:
 238         case BUILT_IN_AGGREGATE_INCOMING_ADDRESS:
 239         case BUILT_IN_FRAME_ADDRESS:
 240         case BUILT_IN_VA_END:
 241         case BUILT_IN_STACK_SAVE:
 242         case BUILT_IN_STACK_RESTORE:
 243         /* Exception state returns or moves registers around. */
 244         case BUILT_IN_EH_FILTER:
 245         case BUILT_IN_EH_POINTER:
 246         case BUILT_IN_EH_COPY_VALUES:
 247         return true;
 248 
 249         default:
 250         return false;
 251         }
 252 }
 253 
 254 static inline void add_local_decl(struct function *fun, tree d)
 255 {
 256         gcc_assert(TREE_CODE(d) == VAR_DECL);
 257         fun->local_decls = tree_cons(NULL_TREE, d, fun->local_decls);
 258 }
 259 #endif
 260 
 261 #if BUILDING_GCC_VERSION <= 4006
 262 #define ANY_RETURN_P(rtx) (GET_CODE(rtx) == RETURN)
 263 #define C_DECL_REGISTER(EXP) DECL_LANG_FLAG_4(EXP)
 264 #define EDGE_PRESERVE 0ULL
 265 #define HOST_WIDE_INT_PRINT_HEX_PURE "%" HOST_WIDE_INT_PRINT "x"
 266 #define flag_fat_lto_objects true
 267 
 268 #define get_random_seed(noinit) ({                                              \
 269         unsigned HOST_WIDE_INT seed;                                            \
 270         sscanf(get_random_seed(noinit), "%" HOST_WIDE_INT_PRINT "x", &seed);    \
 271         seed * seed; })
 272 
 273 #define int_const_binop(code, arg1, arg2)       \
 274         int_const_binop((code), (arg1), (arg2), 0)
 275 
 276 static inline bool gimple_clobber_p(gimple s __unused)
 277 {
 278         return false;
 279 }
 280 
 281 static inline bool gimple_asm_clobbers_memory_p(const_gimple stmt)
 282 {
 283         unsigned i;
 284 
 285         for (i = 0; i < gimple_asm_nclobbers(stmt); i++) {
 286                 tree op = gimple_asm_clobber_op(stmt, i);
 287 
 288                 if (!strcmp(TREE_STRING_POINTER(TREE_VALUE(op)), "memory"))
 289                         return true;
 290         }
 291 
 292         return false;
 293 }
 294 
 295 static inline tree builtin_decl_implicit(enum built_in_function fncode)
 296 {
 297         return implicit_built_in_decls[fncode];
 298 }
 299 
 300 static inline int ipa_reverse_postorder(struct cgraph_node **order)
 301 {
 302         return cgraph_postorder(order);
 303 }
 304 
 305 static inline struct cgraph_node *cgraph_create_node(tree decl)
 306 {
 307         return cgraph_node(decl);
 308 }
 309 
 310 static inline struct cgraph_node *cgraph_get_create_node(tree decl)
 311 {
 312         struct cgraph_node *node = cgraph_get_node(decl);
 313 
 314         return node ? node : cgraph_node(decl);
 315 }
 316 
 317 static inline bool cgraph_function_with_gimple_body_p(struct cgraph_node *node)
 318 {
 319         return node->analyzed && !node->thunk.thunk_p && !node->alias;
 320 }
 321 
 322 static inline struct cgraph_node *cgraph_first_function_with_gimple_body(void)
 323 {
 324         struct cgraph_node *node;
 325 
 326         for (node = cgraph_nodes; node; node = node->next)
 327                 if (cgraph_function_with_gimple_body_p(node))
 328                         return node;
 329         return NULL;
 330 }
 331 
 332 static inline struct cgraph_node *cgraph_next_function_with_gimple_body(struct cgraph_node *node)
 333 {
 334         for (node = node->next; node; node = node->next)
 335                 if (cgraph_function_with_gimple_body_p(node))
 336                         return node;
 337         return NULL;
 338 }
 339 
 340 static inline bool cgraph_for_node_and_aliases(cgraph_node_ptr node, bool (*callback)(cgraph_node_ptr, void *), void *data, bool include_overwritable)
 341 {
 342         cgraph_node_ptr alias;
 343 
 344         if (callback(node, data))
 345                 return true;
 346 
 347         for (alias = node->same_body; alias; alias = alias->next) {
 348                 if (include_overwritable || cgraph_function_body_availability(alias) > AVAIL_OVERWRITABLE)
 349                         if (cgraph_for_node_and_aliases(alias, callback, data, include_overwritable))
 350                                 return true;
 351         }
 352 
 353         return false;
 354 }
 355 
 356 #define FOR_EACH_FUNCTION_WITH_GIMPLE_BODY(node) \
 357         for ((node) = cgraph_first_function_with_gimple_body(); (node); \
 358                 (node) = cgraph_next_function_with_gimple_body(node))
 359 
 360 static inline void varpool_add_new_variable(tree decl)
 361 {
 362         varpool_finalize_decl(decl);
 363 }
 364 #endif
 365 
 366 #if BUILDING_GCC_VERSION <= 4007
 367 #define FOR_EACH_FUNCTION(node) \
 368         for (node = cgraph_nodes; node; node = node->next)
 369 #define FOR_EACH_VARIABLE(node) \
 370         for (node = varpool_nodes; node; node = node->next)
 371 #define PROP_loops 0
 372 #define NODE_SYMBOL(node) (node)
 373 #define NODE_DECL(node) (node)->decl
 374 #define INSN_LOCATION(INSN) RTL_LOCATION(INSN)
 375 #define vNULL NULL
 376 
 377 static inline int bb_loop_depth(const_basic_block bb)
 378 {
 379         return bb->loop_father ? loop_depth(bb->loop_father) : 0;
 380 }
 381 
 382 static inline bool gimple_store_p(gimple gs)
 383 {
 384         tree lhs = gimple_get_lhs(gs);
 385 
 386         return lhs && !is_gimple_reg(lhs);
 387 }
 388 
 389 static inline void gimple_init_singleton(gimple g __unused)
 390 {
 391 }
 392 #endif
 393 
 394 #if BUILDING_GCC_VERSION == 4007 || BUILDING_GCC_VERSION == 4008
 395 static inline struct cgraph_node *cgraph_alias_target(struct cgraph_node *n)
 396 {
 397         return cgraph_alias_aliased_node(n);
 398 }
 399 #endif
 400 
 401 #if BUILDING_GCC_VERSION <= 4008
 402 #define ENTRY_BLOCK_PTR_FOR_FN(FN)      ENTRY_BLOCK_PTR_FOR_FUNCTION(FN)
 403 #define EXIT_BLOCK_PTR_FOR_FN(FN)       EXIT_BLOCK_PTR_FOR_FUNCTION(FN)
 404 #define basic_block_info_for_fn(FN)     ((FN)->cfg->x_basic_block_info)
 405 #define n_basic_blocks_for_fn(FN)       ((FN)->cfg->x_n_basic_blocks)
 406 #define n_edges_for_fn(FN)              ((FN)->cfg->x_n_edges)
 407 #define last_basic_block_for_fn(FN)     ((FN)->cfg->x_last_basic_block)
 408 #define label_to_block_map_for_fn(FN)   ((FN)->cfg->x_label_to_block_map)
 409 #define profile_status_for_fn(FN)       ((FN)->cfg->x_profile_status)
 410 #define BASIC_BLOCK_FOR_FN(FN, N)       BASIC_BLOCK_FOR_FUNCTION((FN), (N))
 411 #define NODE_IMPLICIT_ALIAS(node)       (node)->same_body_alias
 412 #define VAR_P(NODE)                     (TREE_CODE(NODE) == VAR_DECL)
 413 
 414 static inline bool tree_fits_shwi_p(const_tree t)
 415 {
 416         if (t == NULL_TREE || TREE_CODE(t) != INTEGER_CST)
 417                 return false;
 418 
 419         if (TREE_INT_CST_HIGH(t) == 0 && (HOST_WIDE_INT)TREE_INT_CST_LOW(t) >= 0)
 420                 return true;
 421 
 422         if (TREE_INT_CST_HIGH(t) == -1 && (HOST_WIDE_INT)TREE_INT_CST_LOW(t) < 0 && !TYPE_UNSIGNED(TREE_TYPE(t)))
 423                 return true;
 424 
 425         return false;
 426 }
 427 
 428 static inline bool tree_fits_uhwi_p(const_tree t)
 429 {
 430         if (t == NULL_TREE || TREE_CODE(t) != INTEGER_CST)
 431                 return false;
 432 
 433         return TREE_INT_CST_HIGH(t) == 0;
 434 }
 435 
 436 static inline HOST_WIDE_INT tree_to_shwi(const_tree t)
 437 {
 438         gcc_assert(tree_fits_shwi_p(t));
 439         return TREE_INT_CST_LOW(t);
 440 }
 441 
 442 static inline unsigned HOST_WIDE_INT tree_to_uhwi(const_tree t)
 443 {
 444         gcc_assert(tree_fits_uhwi_p(t));
 445         return TREE_INT_CST_LOW(t);
 446 }
 447 
 448 static inline const char *get_tree_code_name(enum tree_code code)
 449 {
 450         gcc_assert(code < MAX_TREE_CODES);
 451         return tree_code_name[code];
 452 }
 453 
 454 #define ipa_remove_stmt_references(cnode, stmt)
 455 
 456 typedef union gimple_statement_d gasm;
 457 typedef union gimple_statement_d gassign;
 458 typedef union gimple_statement_d gcall;
 459 typedef union gimple_statement_d gcond;
 460 typedef union gimple_statement_d gdebug;
 461 typedef union gimple_statement_d ggoto;
 462 typedef union gimple_statement_d gphi;
 463 typedef union gimple_statement_d greturn;
 464 
 465 static inline gasm *as_a_gasm(gimple stmt)
 466 {
 467         return stmt;
 468 }
 469 
 470 static inline const gasm *as_a_const_gasm(const_gimple stmt)
 471 {
 472         return stmt;
 473 }
 474 
 475 static inline gassign *as_a_gassign(gimple stmt)
 476 {
 477         return stmt;
 478 }
 479 
 480 static inline const gassign *as_a_const_gassign(const_gimple stmt)
 481 {
 482         return stmt;
 483 }
 484 
 485 static inline gcall *as_a_gcall(gimple stmt)
 486 {
 487         return stmt;
 488 }
 489 
 490 static inline const gcall *as_a_const_gcall(const_gimple stmt)
 491 {
 492         return stmt;
 493 }
 494 
 495 static inline gcond *as_a_gcond(gimple stmt)
 496 {
 497         return stmt;
 498 }
 499 
 500 static inline const gcond *as_a_const_gcond(const_gimple stmt)
 501 {
 502         return stmt;
 503 }
 504 
 505 static inline gdebug *as_a_gdebug(gimple stmt)
 506 {
 507         return stmt;
 508 }
 509 
 510 static inline const gdebug *as_a_const_gdebug(const_gimple stmt)
 511 {
 512         return stmt;
 513 }
 514 
 515 static inline ggoto *as_a_ggoto(gimple stmt)
 516 {
 517         return stmt;
 518 }
 519 
 520 static inline const ggoto *as_a_const_ggoto(const_gimple stmt)
 521 {
 522         return stmt;
 523 }
 524 
 525 static inline gphi *as_a_gphi(gimple stmt)
 526 {
 527         return stmt;
 528 }
 529 
 530 static inline const gphi *as_a_const_gphi(const_gimple stmt)
 531 {
 532         return stmt;
 533 }
 534 
 535 static inline greturn *as_a_greturn(gimple stmt)
 536 {
 537         return stmt;
 538 }
 539 
 540 static inline const greturn *as_a_const_greturn(const_gimple stmt)
 541 {
 542         return stmt;
 543 }
 544 #endif
 545 
 546 #if BUILDING_GCC_VERSION == 4008
 547 #define NODE_SYMBOL(node) (&(node)->symbol)
 548 #define NODE_DECL(node) (node)->symbol.decl
 549 #endif
 550 
 551 #if BUILDING_GCC_VERSION >= 4008
 552 #define add_referenced_var(var)
 553 #define mark_sym_for_renaming(var)
 554 #define varpool_mark_needed_node(node)
 555 #define create_var_ann(var)
 556 #define TODO_dump_func 0
 557 #define TODO_dump_cgraph 0
 558 #endif
 559 
 560 #if BUILDING_GCC_VERSION <= 4009
 561 #define TODO_verify_il 0
 562 #define AVAIL_INTERPOSABLE AVAIL_OVERWRITABLE
 563 
 564 #define section_name_prefix LTO_SECTION_NAME_PREFIX
 565 #define fatal_error(loc, gmsgid, ...) fatal_error((gmsgid), __VA_ARGS__)
 566 
 567 rtx emit_move_insn(rtx x, rtx y);
 568 
 569 typedef struct rtx_def rtx_insn;
 570 
 571 static inline const char *get_decl_section_name(const_tree decl)
 572 {
 573         if (DECL_SECTION_NAME(decl) == NULL_TREE)
 574                 return NULL;
 575 
 576         return TREE_STRING_POINTER(DECL_SECTION_NAME(decl));
 577 }
 578 
 579 static inline void set_decl_section_name(tree node, const char *value)
 580 {
 581         if (value)
 582                 DECL_SECTION_NAME(node) = build_string(strlen(value) + 1, value);
 583         else
 584                 DECL_SECTION_NAME(node) = NULL;
 585 }
 586 #endif
 587 
 588 #if BUILDING_GCC_VERSION == 4009
 589 typedef struct gimple_statement_asm gasm;
 590 typedef struct gimple_statement_base gassign;
 591 typedef struct gimple_statement_call gcall;
 592 typedef struct gimple_statement_base gcond;
 593 typedef struct gimple_statement_base gdebug;
 594 typedef struct gimple_statement_base ggoto;
 595 typedef struct gimple_statement_phi gphi;
 596 typedef struct gimple_statement_base greturn;
 597 
 598 static inline gasm *as_a_gasm(gimple stmt)
 599 {
 600         return as_a<gasm>(stmt);
 601 }
 602 
 603 static inline const gasm *as_a_const_gasm(const_gimple stmt)
 604 {
 605         return as_a<const gasm>(stmt);
 606 }
 607 
 608 static inline gassign *as_a_gassign(gimple stmt)
 609 {
 610         return stmt;
 611 }
 612 
 613 static inline const gassign *as_a_const_gassign(const_gimple stmt)
 614 {
 615         return stmt;
 616 }
 617 
 618 static inline gcall *as_a_gcall(gimple stmt)
 619 {
 620         return as_a<gcall>(stmt);
 621 }
 622 
 623 static inline const gcall *as_a_const_gcall(const_gimple stmt)
 624 {
 625         return as_a<const gcall>(stmt);
 626 }
 627 
 628 static inline gcond *as_a_gcond(gimple stmt)
 629 {
 630         return stmt;
 631 }
 632 
 633 static inline const gcond *as_a_const_gcond(const_gimple stmt)
 634 {
 635         return stmt;
 636 }
 637 
 638 static inline gdebug *as_a_gdebug(gimple stmt)
 639 {
 640         return stmt;
 641 }
 642 
 643 static inline const gdebug *as_a_const_gdebug(const_gimple stmt)
 644 {
 645         return stmt;
 646 }
 647 
 648 static inline ggoto *as_a_ggoto(gimple stmt)
 649 {
 650         return stmt;
 651 }
 652 
 653 static inline const ggoto *as_a_const_ggoto(const_gimple stmt)
 654 {
 655         return stmt;
 656 }
 657 
 658 static inline gphi *as_a_gphi(gimple stmt)
 659 {
 660         return as_a<gphi>(stmt);
 661 }
 662 
 663 static inline const gphi *as_a_const_gphi(const_gimple stmt)
 664 {
 665         return as_a<const gphi>(stmt);
 666 }
 667 
 668 static inline greturn *as_a_greturn(gimple stmt)
 669 {
 670         return stmt;
 671 }
 672 
 673 static inline const greturn *as_a_const_greturn(const_gimple stmt)
 674 {
 675         return stmt;
 676 }
 677 #endif
 678 
 679 #if BUILDING_GCC_VERSION >= 4009
 680 #define TODO_ggc_collect 0
 681 #define NODE_SYMBOL(node) (node)
 682 #define NODE_DECL(node) (node)->decl
 683 #define cgraph_node_name(node) (node)->name()
 684 #define NODE_IMPLICIT_ALIAS(node) (node)->cpp_implicit_alias
 685 
 686 static inline opt_pass *get_pass_for_id(int id)
 687 {
 688         return g->get_passes()->get_pass_for_id(id);
 689 }
 690 #endif
 691 
 692 #if BUILDING_GCC_VERSION >= 5000 && BUILDING_GCC_VERSION < 6000
 693 /* gimple related */
 694 template <>
 695 template <>
 696 inline bool is_a_helper<const gassign *>::test(const_gimple gs)
 697 {
 698         return gs->code == GIMPLE_ASSIGN;
 699 }
 700 #endif
 701 
 702 #if BUILDING_GCC_VERSION >= 5000
 703 #define TODO_verify_ssa TODO_verify_il
 704 #define TODO_verify_flow TODO_verify_il
 705 #define TODO_verify_stmts TODO_verify_il
 706 #define TODO_verify_rtl_sharing TODO_verify_il
 707 
 708 #define INSN_DELETED_P(insn) (insn)->deleted()
 709 
 710 static inline const char *get_decl_section_name(const_tree decl)
 711 {
 712         return DECL_SECTION_NAME(decl);
 713 }
 714 
 715 /* symtab/cgraph related */
 716 #define debug_cgraph_node(node) (node)->debug()
 717 #define cgraph_get_node(decl) cgraph_node::get(decl)
 718 #define cgraph_get_create_node(decl) cgraph_node::get_create(decl)
 719 #define cgraph_create_node(decl) cgraph_node::create(decl)
 720 #define cgraph_n_nodes symtab->cgraph_count
 721 #define cgraph_max_uid symtab->cgraph_max_uid
 722 #define varpool_get_node(decl) varpool_node::get(decl)
 723 #define dump_varpool_node(file, node) (node)->dump(file)
 724 
 725 #if BUILDING_GCC_VERSION >= 8000
 726 #define cgraph_create_edge(caller, callee, call_stmt, count, freq) \
 727         (caller)->create_edge((callee), (call_stmt), (count))
 728 
 729 #define cgraph_create_edge_including_clones(caller, callee,     \
 730                 old_call_stmt, call_stmt, count, freq, reason)  \
 731         (caller)->create_edge_including_clones((callee),        \
 732                 (old_call_stmt), (call_stmt), (count), (reason))
 733 #else
 734 #define cgraph_create_edge(caller, callee, call_stmt, count, freq) \
 735         (caller)->create_edge((callee), (call_stmt), (count), (freq))
 736 
 737 #define cgraph_create_edge_including_clones(caller, callee,     \
 738                 old_call_stmt, call_stmt, count, freq, reason)  \
 739         (caller)->create_edge_including_clones((callee),        \
 740                 (old_call_stmt), (call_stmt), (count), (freq), (reason))
 741 #endif
 742 
 743 typedef struct cgraph_node *cgraph_node_ptr;
 744 typedef struct cgraph_edge *cgraph_edge_p;
 745 typedef struct varpool_node *varpool_node_ptr;
 746 
 747 static inline void change_decl_assembler_name(tree decl, tree name)
 748 {
 749         symtab->change_decl_assembler_name(decl, name);
 750 }
 751 
 752 static inline void varpool_finalize_decl(tree decl)
 753 {
 754         varpool_node::finalize_decl(decl);
 755 }
 756 
 757 static inline void varpool_add_new_variable(tree decl)
 758 {
 759         varpool_node::add(decl);
 760 }
 761 
 762 static inline unsigned int rebuild_cgraph_edges(void)
 763 {
 764         return cgraph_edge::rebuild_edges();
 765 }
 766 
 767 static inline cgraph_node_ptr cgraph_function_node(cgraph_node_ptr node, enum availability *availability)
 768 {
 769         return node->function_symbol(availability);
 770 }
 771 
 772 static inline cgraph_node_ptr cgraph_function_or_thunk_node(cgraph_node_ptr node, enum availability *availability = NULL)
 773 {
 774         return node->ultimate_alias_target(availability);
 775 }
 776 
 777 static inline bool cgraph_only_called_directly_p(cgraph_node_ptr node)
 778 {
 779         return node->only_called_directly_p();
 780 }
 781 
 782 static inline enum availability cgraph_function_body_availability(cgraph_node_ptr node)
 783 {
 784         return node->get_availability();
 785 }
 786 
 787 static inline cgraph_node_ptr cgraph_alias_target(cgraph_node_ptr node)
 788 {
 789         return node->get_alias_target();
 790 }
 791 
 792 static inline bool cgraph_for_node_and_aliases(cgraph_node_ptr node, bool (*callback)(cgraph_node_ptr, void *), void *data, bool include_overwritable)
 793 {
 794         return node->call_for_symbol_thunks_and_aliases(callback, data, include_overwritable);
 795 }
 796 
 797 static inline struct cgraph_node_hook_list *cgraph_add_function_insertion_hook(cgraph_node_hook hook, void *data)
 798 {
 799         return symtab->add_cgraph_insertion_hook(hook, data);
 800 }
 801 
 802 static inline void cgraph_remove_function_insertion_hook(struct cgraph_node_hook_list *entry)
 803 {
 804         symtab->remove_cgraph_insertion_hook(entry);
 805 }
 806 
 807 static inline struct cgraph_node_hook_list *cgraph_add_node_removal_hook(cgraph_node_hook hook, void *data)
 808 {
 809         return symtab->add_cgraph_removal_hook(hook, data);
 810 }
 811 
 812 static inline void cgraph_remove_node_removal_hook(struct cgraph_node_hook_list *entry)
 813 {
 814         symtab->remove_cgraph_removal_hook(entry);
 815 }
 816 
 817 static inline struct cgraph_2node_hook_list *cgraph_add_node_duplication_hook(cgraph_2node_hook hook, void *data)
 818 {
 819         return symtab->add_cgraph_duplication_hook(hook, data);
 820 }
 821 
 822 static inline void cgraph_remove_node_duplication_hook(struct cgraph_2node_hook_list *entry)
 823 {
 824         symtab->remove_cgraph_duplication_hook(entry);
 825 }
 826 
 827 static inline void cgraph_call_node_duplication_hooks(cgraph_node_ptr node, cgraph_node_ptr node2)
 828 {
 829         symtab->call_cgraph_duplication_hooks(node, node2);
 830 }
 831 
 832 static inline void cgraph_call_edge_duplication_hooks(cgraph_edge *cs1, cgraph_edge *cs2)
 833 {
 834         symtab->call_edge_duplication_hooks(cs1, cs2);
 835 }
 836 
 837 #if BUILDING_GCC_VERSION >= 6000
 838 typedef gimple *gimple_ptr;
 839 typedef const gimple *const_gimple_ptr;
 840 #define gimple gimple_ptr
 841 #define const_gimple const_gimple_ptr
 842 #undef CONST_CAST_GIMPLE
 843 #define CONST_CAST_GIMPLE(X) CONST_CAST(gimple, (X))
 844 #endif
 845 
 846 /* gimple related */
 847 static inline gimple gimple_build_assign_with_ops(enum tree_code subcode, tree lhs, tree op1, tree op2 MEM_STAT_DECL)
 848 {
 849         return gimple_build_assign(lhs, subcode, op1, op2 PASS_MEM_STAT);
 850 }
 851 
 852 #if BUILDING_GCC_VERSION < 10000
 853 template <>
 854 template <>
 855 inline bool is_a_helper<const ggoto *>::test(const_gimple gs)
 856 {
 857         return gs->code == GIMPLE_GOTO;
 858 }
 859 
 860 template <>
 861 template <>
 862 inline bool is_a_helper<const greturn *>::test(const_gimple gs)
 863 {
 864         return gs->code == GIMPLE_RETURN;
 865 }
 866 #endif
 867 
 868 static inline gasm *as_a_gasm(gimple stmt)
 869 {
 870         return as_a<gasm *>(stmt);
 871 }
 872 
 873 static inline const gasm *as_a_const_gasm(const_gimple stmt)
 874 {
 875         return as_a<const gasm *>(stmt);
 876 }
 877 
 878 static inline gassign *as_a_gassign(gimple stmt)
 879 {
 880         return as_a<gassign *>(stmt);
 881 }
 882 
 883 static inline const gassign *as_a_const_gassign(const_gimple stmt)
 884 {
 885         return as_a<const gassign *>(stmt);
 886 }
 887 
 888 static inline gcall *as_a_gcall(gimple stmt)
 889 {
 890         return as_a<gcall *>(stmt);
 891 }
 892 
 893 static inline const gcall *as_a_const_gcall(const_gimple stmt)
 894 {
 895         return as_a<const gcall *>(stmt);
 896 }
 897 
 898 static inline ggoto *as_a_ggoto(gimple stmt)
 899 {
 900         return as_a<ggoto *>(stmt);
 901 }
 902 
 903 static inline const ggoto *as_a_const_ggoto(const_gimple stmt)
 904 {
 905         return as_a<const ggoto *>(stmt);
 906 }
 907 
 908 static inline gphi *as_a_gphi(gimple stmt)
 909 {
 910         return as_a<gphi *>(stmt);
 911 }
 912 
 913 static inline const gphi *as_a_const_gphi(const_gimple stmt)
 914 {
 915         return as_a<const gphi *>(stmt);
 916 }
 917 
 918 static inline greturn *as_a_greturn(gimple stmt)
 919 {
 920         return as_a<greturn *>(stmt);
 921 }
 922 
 923 static inline const greturn *as_a_const_greturn(const_gimple stmt)
 924 {
 925         return as_a<const greturn *>(stmt);
 926 }
 927 
 928 /* IPA/LTO related */
 929 #define ipa_ref_list_referring_iterate(L, I, P) \
 930         (L)->referring.iterate((I), &(P))
 931 #define ipa_ref_list_reference_iterate(L, I, P) \
 932         (L)->reference.iterate((I), &(P))
 933 
 934 static inline cgraph_node_ptr ipa_ref_referring_node(struct ipa_ref *ref)
 935 {
 936         return dyn_cast<cgraph_node_ptr>(ref->referring);
 937 }
 938 
 939 static inline void ipa_remove_stmt_references(symtab_node *referring_node, gimple stmt)
 940 {
 941         referring_node->remove_stmt_references(stmt);
 942 }
 943 #endif
 944 
 945 #if BUILDING_GCC_VERSION < 6000
 946 #define get_inner_reference(exp, pbitsize, pbitpos, poffset, pmode, punsignedp, preversep, pvolatilep, keep_aligning)   \
 947         get_inner_reference(exp, pbitsize, pbitpos, poffset, pmode, punsignedp, pvolatilep, keep_aligning)
 948 #define gen_rtx_set(ARG0, ARG1) gen_rtx_SET(VOIDmode, (ARG0), (ARG1))
 949 #endif
 950 
 951 #if BUILDING_GCC_VERSION >= 6000
 952 #define gen_rtx_set(ARG0, ARG1) gen_rtx_SET((ARG0), (ARG1))
 953 #endif
 954 
 955 #ifdef __cplusplus
 956 static inline void debug_tree(const_tree t)
 957 {
 958         debug_tree(CONST_CAST_TREE(t));
 959 }
 960 
 961 static inline void debug_gimple_stmt(const_gimple s)
 962 {
 963         debug_gimple_stmt(CONST_CAST_GIMPLE(s));
 964 }
 965 #else
 966 #define debug_tree(t) debug_tree(CONST_CAST_TREE(t))
 967 #define debug_gimple_stmt(s) debug_gimple_stmt(CONST_CAST_GIMPLE(s))
 968 #endif
 969 
 970 #if BUILDING_GCC_VERSION >= 7000
 971 #define get_inner_reference(exp, pbitsize, pbitpos, poffset, pmode, punsignedp, preversep, pvolatilep, keep_aligning)   \
 972         get_inner_reference(exp, pbitsize, pbitpos, poffset, pmode, punsignedp, preversep, pvolatilep)
 973 #endif
 974 
 975 #if BUILDING_GCC_VERSION < 7000
 976 #define SET_DECL_ALIGN(decl, align)     DECL_ALIGN(decl) = (align)
 977 #define SET_DECL_MODE(decl, mode)       DECL_MODE(decl) = (mode)
 978 #endif
 979 
 980 #endif

/* [<][>][^][v][top][bottom][index][help] */