GCC Middle and Back End API Reference
case_node Struct Reference
Collaboration diagram for case_node:

Data Fields

struct case_nodeleft
struct case_noderight
struct case_nodeparent
tree low
tree high
tree code_label
int prob
int subtree_prob

Detailed Description

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.


Field Documentation

tree case_node::code_label

Referenced by node_has_low_bound().

tree case_node::high

Referenced by node_has_low_bound().

struct case_node* case_node::left

Referenced by node_has_low_bound().

tree case_node::low
struct case_node* case_node::parent
int case_node::prob

Referenced by node_has_low_bound().

struct case_node* case_node::right

Referenced by node_has_low_bound().

int case_node::subtree_prob

Probability of reaching subtree rooted at this node

Referenced by node_has_low_bound().


The documentation for this struct was generated from the following file: