00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024 #include "config.h"
00025 #include "system.h"
00026 #include "coretypes.h"
00027 #include "tm.h"
00028 #include "tree.h"
00029 #include "function.h"
00030 #include "splay-tree.h"
00031 #include "varray.h"
00032 #include "c-common.h"
00033 #include "except.h"
00034
00035
00036
00037 #define GCC_DIAG_STYLE __gcc_cdiag__
00038 #include "toplev.h"
00039 #include "flags.h"
00040 #include "ggc.h"
00041 #include "rtl.h"
00042 #include "output.h"
00043 #include "timevar.h"
00044 #include "predict.h"
00045 #include "tree-inline.h"
00046 #include "tree-gimple.h"
00047 #include "langhooks.h"
00048
00049
00050
00051 tree
00052 push_stmt_list (void)
00053 {
00054 tree t;
00055 t = alloc_stmt_list ();
00056 TREE_CHAIN (t) = cur_stmt_list;
00057 cur_stmt_list = t;
00058 return t;
00059 }
00060
00061
00062
00063 tree
00064 pop_stmt_list (tree t)
00065 {
00066 tree u = cur_stmt_list, chain;
00067
00068
00069
00070 while (1)
00071 {
00072 chain = TREE_CHAIN (u);
00073 TREE_CHAIN (u) = NULL_TREE;
00074 if (t == u)
00075 break;
00076 u = chain;
00077 }
00078 cur_stmt_list = chain;
00079
00080
00081
00082
00083
00084
00085 if (TREE_SIDE_EFFECTS (t))
00086 {
00087 tree_stmt_iterator i = tsi_start (t);
00088
00089
00090
00091 if (tsi_one_before_end_p (i))
00092 {
00093 u = tsi_stmt (i);
00094 tsi_delink (&i);
00095 free_stmt_list (t);
00096 t = u;
00097 }
00098 }
00099
00100 return t;
00101 }
00102
00103
00104
00105 tree
00106 add_stmt (tree t)
00107 {
00108 enum tree_code code = TREE_CODE (t);
00109
00110 if ((EXPR_P (t) || STATEMENT_CODE_P (code)) && code != LABEL_EXPR)
00111 {
00112 if (!EXPR_HAS_LOCATION (t))
00113 SET_EXPR_LOCATION (t, input_location);
00114
00115
00116
00117 STMT_IS_FULL_EXPR_P (t) = stmts_are_full_exprs_p ();
00118 }
00119
00120 if (code == LABEL_EXPR || code == CASE_LABEL_EXPR)
00121 STATEMENT_LIST_HAS_LABEL (cur_stmt_list) = 1;
00122
00123
00124
00125 append_to_statement_list_force (t, &cur_stmt_list);
00126
00127 return t;
00128 }
00129
00130
00131
00132
00133
00134
00135
00136 tree
00137 build_stmt (enum tree_code code, ...)
00138 {
00139 tree ret;
00140 int length, i;
00141 va_list p;
00142 bool side_effects;
00143
00144 va_start (p, code);
00145
00146 ret = make_node (code);
00147 TREE_TYPE (ret) = void_type_node;
00148 length = TREE_CODE_LENGTH (code);
00149 SET_EXPR_LOCATION (ret, input_location);
00150
00151
00152
00153
00154 switch (code)
00155 {
00156 case EXPR_STMT:
00157 side_effects = false;
00158 break;
00159 default:
00160 side_effects = true;
00161 break;
00162 }
00163
00164 for (i = 0; i < length; i++)
00165 {
00166 tree t = va_arg (p, tree);
00167 if (t && IS_NON_TYPE_CODE_CLASS (TREE_CODE_CLASS (TREE_CODE (t))))
00168 side_effects |= TREE_SIDE_EFFECTS (t);
00169 TREE_OPERAND (ret, i) = t;
00170 }
00171
00172 TREE_SIDE_EFFECTS (ret) = side_effects;
00173
00174 va_end (p);
00175 return ret;
00176 }
00177
00178
00179
00180 void
00181 emit_local_var (tree decl)
00182 {
00183
00184 if (!DECL_RTL_SET_P (decl))
00185 {
00186 if (DECL_HARD_REGISTER (decl))
00187
00188
00189 rest_of_decl_compilation (decl, 0, 0);
00190 else
00191 expand_decl (decl);
00192 }
00193 }
00194
00195
00196
00197 tree
00198 build_break_stmt (void)
00199 {
00200 return (build_stmt (BREAK_STMT));
00201 }
00202
00203
00204
00205 tree
00206 build_continue_stmt (void)
00207 {
00208 return (build_stmt (CONTINUE_STMT));
00209 }
00210
00211
00212
00213 tree
00214 build_case_label (tree low_value, tree high_value, tree label_decl)
00215 {
00216 return build_stmt (CASE_LABEL_EXPR, low_value, high_value, label_decl);
00217 }