GCC Middle and Back End API Reference
|
Data Fields | |
struct case_node * | left |
struct case_node * | right |
struct case_node * | parent |
tree | low |
tree | high |
tree | code_label |
int | prob |
int | subtree_prob |
@verbatim Expands front end tree to back end RTL for GCC
Copyright (C) 1987-2013 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 handles the generation of rtl code from tree structure above the level of expressions, using subroutines in exp*.c and emit-rtl.c. The functions whose names start with `expand_' are called by the expander to generate RTL instructions for various kinds of constructs.
Functions and data structures for expanding case statements.
Case label structure, used to hold info on labels within case statements. We handle "range" labels; for a single-value label as in C, the high and low limits are the same. We start with a vector of case nodes sorted in ascending order, and the default label as the last element in the vector. Before expanding to RTL, we transform this vector into a list linked via the RIGHT fields in the case_node struct. Nodes with higher case values are later in the list. Switch statements can be output in three forms. A branch table is used if there are more than a few labels and the labels are dense within the range between the smallest and largest case value. If a branch table is used, no further manipulations are done with the case node chain. The alternative to the use of a branch table is to generate a series of compare and jump insns. When that is done, we use the LEFT, RIGHT, and PARENT fields to hold a binary tree. Initially the tree is totally unbalanced, with everything on the right. We balance the tree with nodes on the left having lower case values than the parent and nodes on the right having higher values. We then output the tree in order. For very small, suitable switch statements, we can generate a series of simple bit test and branches instead.
tree case_node::code_label |
Referenced by add_case_node(), emit_case_dispatch_table(), and emit_case_nodes().
tree case_node::high |
struct case_node* case_node::left |
Referenced by add_case_node(), balance_case_nodes(), dump_case_nodes(), emit_case_nodes(), and node_has_low_bound().
tree case_node::low |
struct case_node* case_node::parent |
Referenced by add_case_node(), balance_case_nodes(), node_has_high_bound(), and node_has_low_bound().
int case_node::prob |
Referenced by add_case_node(), balance_case_nodes(), and emit_case_nodes().
struct case_node* case_node::right |
Referenced by add_case_node(), balance_case_nodes(), dump_case_nodes(), emit_case_dispatch_table(), emit_case_nodes(), and node_has_high_bound().
int case_node::subtree_prob |
Referenced by add_case_node(), balance_case_nodes(), and emit_case_nodes().