| /* Flags on basic blocks and edges. |
| Copyright (C) 2012-2021 Free Software Foundation, Inc. |
| |
| This file is part of GCC. |
| |
| GCC is free software; you can redistribute it and/or modify it under |
| the terms of the GNU General Public License as published by the Free |
| Software Foundation; either version 3, or (at your option) any later |
| version. |
| |
| GCC is distributed in the hope that it will be useful, but WITHOUT ANY |
| WARRANTY; without even the implied warranty of MERCHANTABILITY or |
| FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License |
| for more details. |
| |
| You should have received a copy of the GNU General Public License |
| along with GCC; see the file COPYING3. If not see |
| <http://www.gnu.org/licenses/>. */ |
| |
| /* This file defines flags that may appear on basic blocks or on |
| edges. Source files define DEF_BASIC_BLOCK_FLAG or DEF_EDGE_FLAG |
| appropriately before including this file. */ |
| |
| #if !defined(DEF_BASIC_BLOCK_FLAG) && !defined(DEF_EDGE_FLAG) |
| #error "You must define DEF_BASIC_BLOCK_FLAG or DEF_EDGE_FLAG" |
| #endif |
| |
| #ifdef DEF_BASIC_BLOCK_FLAG |
| |
| /* Masks for basic_block.flags. |
| |
| The format of this file is: DEF_BASIC_BLOCK_FLAG(NAME, IDX). |
| NAME is the name of the basic block flag. A flag BB_#NAME will be |
| created and the name is used in dump_edge_info. |
| IDX is a sequence number that is used to determine the value |
| of the flag, which is 1 << IDX). |
| |
| BB_HOT_PARTITION and BB_COLD_PARTITION should be preserved throughout |
| the compilation, so they are never cleared. |
| |
| All other flags may be cleared by clear_bb_flags(). It is generally |
| a bad idea to rely on any flags being up-to-date. */ |
| |
| /* Only set on blocks that have just been created by create_bb. */ |
| DEF_BASIC_BLOCK_FLAG(NEW, 0) |
| |
| /* Set by find_unreachable_blocks. Do not rely on this being set in any |
| pass. */ |
| DEF_BASIC_BLOCK_FLAG(REACHABLE, 1) |
| |
| /* Set for blocks in an irreducible loop by loop analysis. */ |
| DEF_BASIC_BLOCK_FLAG(IRREDUCIBLE_LOOP, 2) |
| |
| /* Set on blocks that may actually not be single-entry single-exit block. */ |
| DEF_BASIC_BLOCK_FLAG(SUPERBLOCK, 3) |
| |
| /* Set on basic blocks that the scheduler should not touch. This is used |
| by SMS to prevent other schedulers from messing with the loop schedule. */ |
| DEF_BASIC_BLOCK_FLAG(DISABLE_SCHEDULE, 4) |
| |
| /* Set on blocks that should be put in a hot section. */ |
| DEF_BASIC_BLOCK_FLAG(HOT_PARTITION, 5) |
| |
| /* Set on blocks that should be put in a cold section. */ |
| DEF_BASIC_BLOCK_FLAG(COLD_PARTITION, 6) |
| |
| /* Set on block that was duplicated. */ |
| DEF_BASIC_BLOCK_FLAG(DUPLICATED, 7) |
| |
| /* Set if the label at the top of this block is the target of a non-local goto. */ |
| DEF_BASIC_BLOCK_FLAG(NON_LOCAL_GOTO_TARGET, 8) |
| |
| /* Set on blocks that are in RTL format. */ |
| DEF_BASIC_BLOCK_FLAG(RTL, 9) |
| |
| /* Set on blocks that are forwarder blocks. |
| Only used in cfgcleanup.c. */ |
| DEF_BASIC_BLOCK_FLAG(FORWARDER_BLOCK, 10) |
| |
| /* Set on blocks that cannot be threaded through. |
| Only used for jump threading. */ |
| DEF_BASIC_BLOCK_FLAG(NONTHREADABLE_BLOCK, 11) |
| |
| /* Set on blocks that were modified in some way. This bit is set in |
| df_set_bb_dirty, but not cleared by df_analyze, so it can be used |
| to test whether a block has been modified prior to a df_analyze call. */ |
| DEF_BASIC_BLOCK_FLAG(MODIFIED, 12) |
| |
| /* A general visited flag for passes to use. */ |
| DEF_BASIC_BLOCK_FLAG(VISITED, 13) |
| |
| /* Set on blocks that are in a transaction. This is calculated on |
| demand, and is available after calling compute_transaction_bits(). */ |
| DEF_BASIC_BLOCK_FLAG(IN_TRANSACTION, 14) |
| |
| #endif |
| |
| #ifdef DEF_EDGE_FLAG |
| |
| /* Masks for edge.flags. |
| |
| The format of this file is: DEF_EDGE_FLAG(NAME, IDX, STRING). |
| NAME is the name of the edge flag. A flag EDGE_#NAME will be |
| created and the name is used in dump_edge_info. |
| IDX is a sequence number that is used to determine the value |
| of the flag, which is 1 << IDX). */ |
| |
| /* 'Straight line' flow. In GIMPLE and in cfglayout mode, all normal |
| edges are fallthru edges. In cfgrtl mode, this flag really means |
| that control flow falls through to the next basic block in the line. */ |
| DEF_EDGE_FLAG(FALLTHRU, 0) |
| |
| /* Strange flow, like a computed jump or exception handling. Usually |
| this means that the edge cannot be split. */ |
| DEF_EDGE_FLAG(ABNORMAL, 1) |
| |
| /* Edge out of a basic block that ends with a CALL_INSN with abnormal |
| exit, like an exception or a non-local goto. |
| ABNORMAL_CALL edges also have ABNORMAL set. |
| This flag is only used for the RTL CFG. */ |
| DEF_EDGE_FLAG(ABNORMAL_CALL, 2) |
| |
| /* Exception edge. Exception handling edges represent possible control |
| transfers from a trapping instruction to an exception handler. |
| EH edges also have ABNORMAL set for the RTL CFG. */ |
| DEF_EDGE_FLAG(EH, 3) |
| |
| /* Never merge blocks via this edge. This is used for exception handling, |
| to prevent merging away edges to the post-landing-pad basic block. |
| This flag is only used for the RTL CFG. */ |
| DEF_EDGE_FLAG(PRESERVE, 4) |
| |
| /* Not a real edge. This is used to connect parts of the CFG that do |
| not halt, such as infinite loops and noreturn functions, to the |
| EXIT_BLOCK, so that traversing of the reverse CFG is possible. */ |
| DEF_EDGE_FLAG(FAKE, 5) |
| |
| /* A back edge, marked in a depth-first search of the CFG. Back edges |
| are hints that this edge may be part of a loop in the CFG. */ |
| DEF_EDGE_FLAG(DFS_BACK, 6) |
| |
| /* Edge in a part of the CFG that is an irreducible loop. */ |
| DEF_EDGE_FLAG(IRREDUCIBLE_LOOP, 7) |
| |
| /* Edge taken when controlling predicate is nonzero. |
| This is only used for the GIMPLE CFG. */ |
| DEF_EDGE_FLAG(TRUE_VALUE, 8) |
| |
| /* Edge taken when controlling predicate is zero. |
| This is only used for the GIMPLE CFG. */ |
| DEF_EDGE_FLAG(FALSE_VALUE, 9) |
| |
| /* Edge is executable. This is only used in GIMPLE SSA-CCP and VRP. |
| This is only used for the GIMPLE CFG. */ |
| DEF_EDGE_FLAG(EXECUTABLE, 10) |
| |
| /* Edge crosses between hot and cold sections, when we do partitioning. |
| This flag is only used for the RTL CFG. */ |
| DEF_EDGE_FLAG(CROSSING, 11) |
| |
| /* Edge from a sibcall CALL_INSN to exit. |
| SIBCALL edges also have ABNORMAL set. |
| This flag is only used for the RTL CFG. */ |
| DEF_EDGE_FLAG(SIBCALL, 12) |
| |
| /* Candidate for straight line flow. Only used in bb-reorder.c. |
| This flag is only used for the RTL CFG. */ |
| DEF_EDGE_FLAG(CAN_FALLTHRU, 13) |
| |
| /* Exit of a loop. This is only used in ifcvt.c. |
| This flag is only used for the RTL CFG. */ |
| DEF_EDGE_FLAG(LOOP_EXIT, 14) |
| |
| /* Uninstrumented edge out of a GIMPLE_TRANSACTION statement. */ |
| DEF_EDGE_FLAG(TM_UNINSTRUMENTED, 15) |
| |
| /* Abort (over) edge out of a GIMPLE_TRANSACTION statement. */ |
| DEF_EDGE_FLAG(TM_ABORT, 16) |
| |
| /* An edge we should ignore. It should be entirely local to |
| passes. ie, it is never set on any edge upon the completion |
| of any pass. */ |
| DEF_EDGE_FLAG(IGNORE, 17) |
| |
| #endif |
| |
| /* |
| Local variables: |
| mode:c |
| End: |
| */ |