00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026
00027 #include <string.h>
00028 #include <stdio.h>
00029 #include <stdlib.h>
00030
00031 #include "gspin-tree.h"
00032 #include "gspin-list.h"
00033 #include "gspin-tel.h"
00034 #include "gspin-mempool.h"
00035
00036 #define OMIT *omit = 1
00037
00038
00039 extern struct tree_code_property {
00040 gs_code_t tree_code;
00041 signed char arity;
00042 gs_tree_code_class_t tcc;
00043 char *name;
00044 } tree_code_table[256];
00045
00046 gs_char_t operand_number[256];
00047
00048 gs_t gs_program = NULL;
00049
00050 gs_tree_code_class_t gs_tree_code_class(gs_t t) {
00051 GS_ASSERT (t != (gs_t) NULL, "Got null node");
00052 gs_tree_code_class_t tcc = (gs_tree_code_class_t) gs_b(gs_operand (t, GS_TREE_CODE_CLASS));
00053 GS_ASSERT(tcc == tree_code_table[gs_code(t)].tcc,
00054 "Incorrect tree code class in tree_code_table");
00055 #ifdef Is_True_On
00056 if (tcc != tree_code_table[gs_code(t)].tcc) {
00057 printf("%s should have tcc %s\n", gs_code_name(gs_code(t)),
00058 gs_tree_code_class_name(tcc));
00059 abort();
00060 }
00061 #endif
00062 return tcc;
00063 }
00064
00065
00066 gs_string_t
00067 gs_attribute_name (gs_int_t attribute, gs_tree_code_class_t tree_code_class,
00068 gs_code_t constructor, gs_int_t * omit) {
00069
00070 if (constructor == GS_PROGRAM) {
00071 switch (attribute) {
00072 case GS_CC1_COMMAND_LINE_ARGS: return "GS_CC1_COMMAND_LINE_ARGS";
00073 case GS_PROGRAM_DECLARATIONS: return "GS_PROGRAM_DECLARATIONS";
00074 case GS_GLOBAL_TREES_LIST: return "GS_GLOBAL_TREES_LIST";
00075 case GS_INTEGER_TYPES_LIST: return "GS_INTEGER_TYPES_LIST";
00076 case GS_GXX_EMITTED_DECLS: return "GS_GXX_EMITTED_DECLS";
00077 case GS_GXX_EMITTED_ASMS: return "GS_GXX_EMITTED_ASMS";
00078 case GS_PROGRAM_FLAGS: return "GS_PROGRAM_FLAGS";
00079 case GS_WEAK_DECLS: return "GS_WEAK_DECLS";
00080 default:
00081 GS_ASSERT(gs_false,("gs_attribute_name: unkown GS_PROGRAM attribute"));
00082 return (gs_string_t) "UNKNOWN!";
00083 }
00084 }
00085
00086 switch (attribute) {
00087 case GS_TREE_CODE_CLASS: OMIT; return "GS_TREE_CODE_CLASS";
00088 case GS_TREE_TYPE: OMIT; return "GS_TREE_TYPE";
00089 case GS_FLAGS: return "GS_FLAGS";
00090 }
00091
00092 if (tree_code_class == GS_TCC_DECLARATION) {
00093 switch (attribute) {
00094 case GS_LABEL_DECL_UID: OMIT; return "GS_LABEL_DECL_UID";
00095 case GS_DECL_UID: OMIT; return "GS_DECL_UID";
00096 case GS_DECL_NAME: return "GS_DECL_NAME";
00097 case GS_TREE_CHAIN: return "GS_TREE_CHAIN";
00098 case GS_DECL_MODE: OMIT; return "GS_DECL_MODE";
00099 case GS_DECL_SOURCE_FILE: OMIT; return "GS_DECL_SOURCE_FILE";
00100 case GS_DECL_SOURCE_LINE: OMIT; return "GS_DECL_SOURCE_LINE";
00101 case GS_DECL_SIZE: return "GS_DECL_SIZE";
00102 case GS_DECL_SIZE_UNIT: OMIT; return "GS_DECL_SIZE_UNIT";
00103 case GS_DECL_BUILT_IN_CLASS: OMIT; return "GS_DECL_BUILT_IN_CLASS";
00104 case GS_DECL_FUNCTION_CODE: OMIT; return "GS_DECL_FUNCTION_CODE";
00105 case GS_DECL_FIELD_OFFSET: return "GS_DECL_FIELD_OFFSET";
00106 case GS_DECL_FIELD_BIT_OFFSET: OMIT; return "GS_DECL_FIELD_BIT_OFFSET";
00107 case GS_DECL_CONTEXT: return "GS_DECL_CONTEXT";
00108 case GS_DECL_ATTRIBUTES: return "GS_DECL_ATTRIBUTES";
00109 case GS_DECL_ABSTRACT_ORIGIN: return "GS_DECL_ABSTRACT_ORIGIN";
00110 case GS_DECL_ARGUMENTS:
00111 return (constructor == GS_VAR_DECL) ?
00112 "GS_DECL_ANON_UNION_ELEMS" : "GS_DECL_ARGUMENTS";
00113 case GS_DECL_INITIAL: OMIT; return "GS_DECL_INITIAL";
00114 case GS_DECL_ARG_TYPE: return "GS_DECL_ARG_TYPE";
00115 case GS_DECL_ARG_TYPE_AS_WRITTEN: OMIT; return "GS_DECL_ARG_TYPE_AS_WRITTEN";
00116 case GS_DECL_SAVED_TREE:
00117 return (constructor == GS_FUNCTION_DECL) ?
00118 "GS_DECL_SAVED_TREE" : "GS_DECL_VALUE_EXPR";
00119 case GS_DECL_RESULT:
00120 return (constructor == GS_TYPE_DECL) ?
00121 "GS_DECL_ORIGINAL_TYPE" : "GS_DECL_RESULT";
00122 case GS_CP_DECL_FLAGS: return "GS_CP_DECL_FLAGS";
00123 case GS_DECL_ALIGN_UNIT: OMIT; return "GS_DECL_ALIGN_UNIT";
00124 case GS_DECL_ASSEMBLER_NAME: return "GS_DECL_ASSEMBLER_NAME";
00125 case GS_DECL_TEMPLATE_INFO: OMIT; return "GS_DECL_TEMPLATE_INFO";
00126 case GS_DECL_SECTION_NAME: OMIT; return "GS_DECL_SECTION_NAME";
00127 case GS_CP_DECL_CONTEXT: OMIT; return "GS_CP_DECL_CONTEXT";
00128 case GS_DECL_VINDEX: OMIT; return "GS_DECL_VINDEX";
00129 case GS_MOST_GENERAL_TEMPLATE: OMIT; return "GS_MOST_GENERAL_TEMPLATE";
00130 case GS_DECL_ALIAS_TARGET: OMIT; return "GS_DECL_ALIAS_TARGET";
00131 case GS_DECL_ASMREG: OMIT; return "GS_DECL_ASMREG";
00132 case GS_DECL_NAMESPACE_ALIAS: OMIT; return "GS_DECL_NAMESPACE_ALIAS";
00133 case GS_THUNK_TARGET: return "GS_THUNK_TARGET";
00134 case GS_DECL_TI_TEMPLATE: OMIT; return "GS_DECL_TI_TEMPLATE";
00135 case GS_THUNK_FIXED_OFFSET: OMIT; return "GS_THUNK_FIXED_OFFSET";
00136 case GS_THUNK_VIRTUAL_OFFSET: OMIT; return "GS_THUNK_VIRTUAL_OFFSET";
00137 case GS_DECL_NAMED_RETURN_OBJECT: OMIT; return "GS_DECL_NAME_RETURN_OBJECT";
00138 }
00139
00140 if (attribute == GS_DECL_MAYBE_IN_CHARGE_CONSTRUCTOR_P &&
00141 constructor == GS_FUNCTION_DECL)
00142 return "GS_DECL_MAYBE_IN_CHARGE_CONSTRUCTOR_P";
00143
00144 if (attribute == GS_DECL_MAYBE_IN_CHARGE_DESTRUCTOR_P &&
00145 constructor == GS_FUNCTION_DECL)
00146 return "GS_DECL_MAYBE_IN_CHARGE_DESTRUCTOR_P";
00147
00148 if (attribute == GS_CP_NAMESPACE_DECLS &&
00149 constructor == GS_NAMESPACE_DECL)
00150 return "GS_CP_NAMESPACE_DECLS";
00151
00152 } else if (tree_code_class == GS_TCC_TYPE) {
00153
00154 if (constructor == GS_ENUMERAL_TYPE &&
00155 attribute == GS_TYPE_VALUES)
00156 return "GS_TYPE_VALUES";
00157
00158 if (constructor == GS_ARRAY_TYPE &&
00159 attribute == GS_TYPE_DOMAIN)
00160 return "GS_TYPE_DOMAIN";
00161
00162 if (constructor == GS_VECTOR_TYPE) {
00163 if (attribute == GS_TYPE_VECTOR_SUBPARTS)
00164 return "GS_TYPE_VECTOR_SUBPARTS";
00165 else if (attribute == GS_TYPE_DEBUG_REPRESENTATION_TYPE)
00166 return "GS_TYPE_DEBUG_REPRESENTATION_TYPE";
00167 }
00168
00169 if ((constructor == GS_RECORD_TYPE ||
00170 constructor == GS_UNION_TYPE ||
00171 constructor == GS_QUAL_UNION_TYPE) &&
00172 attribute == GS_TYPE_FIELDS)
00173 return "GS_TYPE_FIELDS";
00174
00175 if ((constructor == GS_FUNCTION_TYPE ||
00176 constructor == GS_METHOD_TYPE) &&
00177 attribute == GS_TYPE_METHOD_BASETYPE)
00178 return "GS_TYPE_METHOD_BASETYPE";
00179
00180 if (constructor == GS_OFFSET_TYPE &&
00181 attribute == GS_TYPE_OFFSET_BASETYPE)
00182 return "GS_TYPE_OFFSET_BASETYPE";
00183
00184 switch (attribute) {
00185 case GS_TYPE_NAME: return "GS_TYPE_NAME";
00186 case GS_TREE_CHAIN: return "GS_TREE_CHAIN";
00187 case GS_TYPE_MODE: OMIT; return "GS_TYPE_MODE";
00188 case GS_TYPE_SIZE: return "GS_TYPE_SIZE";
00189 case GS_TYPE_SIZE_UNIT: OMIT; return "GS_TYPE_SIZE_UNIT";
00190 case GS_TYPE_USER_ALIGN: OMIT; return "GS_TYPE_USER_ALIGN";
00191 case GS_TYPE_ALIGN: return "GS_TYPE_ALIGN";
00192 case GS_TYPE_ALIAS_SET: OMIT; return "GS_TYPE_ALIAS_SET";
00193 case GS_TYPE_ATTRIBUTES: return "GS_TYPE_ATTRIBUTES";
00194 case GS_TYPE_PRECISION: OMIT; return "GS_TYPE_PRECISION";
00195 case GS_TYPE_MIN_VALUE:
00196 OMIT;
00197 return (constructor == GS_RECORD_TYPE || constructor == GS_UNION_TYPE) ?
00198 "GS_TYPE_VFIELD" :
00199 (constructor == GS_POINTER_TYPE) ? "GS_TYPE_NEXT_PTR_TO" :
00200 "GS_TYPE_MIN_VALUE";
00201 case GS_TYPE_MAX_VALUE:
00202 OMIT;
00203 return (constructor == GS_RECORD_TYPE || constructor == GS_UNION_TYPE) ?
00204 "GS_TYPE_METHODS" : "GS_TYPE_MAX_VALUE";
00205 case GS_TYPE_ARG_TYPES: OMIT; return "GS_TYPE_ARG_TYPES";
00206 case GS_TYPE_CONTEXT: return "GS_TYPE_CONTEXT";
00207 case GS_TYPE_POINTER_TO: OMIT; return "GS_TYPE_POINTER_TO";
00208 case GS_TYPE_REFERENCE_TO: return "GS_TYPE_REFERENCE_TO";
00209 case GS_CP_TYPE_FLAGS: return "GS_CP_TYPE_FLAGS";
00210 case GS_TYPE_BINFO: return "GS_TYPE_BINFO";
00211 case GS_TYPE_MAIN_VARIANT: OMIT; return "GS_TYPE_MAIN_VARIANT";
00212 case GS_CLASSTYPE_AS_BASE: return "GS_CLASSTYPE_AS_BASE";
00213 case GS_CLASSTYPE_TYPEINFO_VAR: OMIT; return "GS_CLASSTYPE_TYPEINFO_VAR";
00214 case GS_TYPEINFO_DECL: OMIT; return "GS_TYPEINFO_DECL";
00215 case GS_CLASSTYPE_COPY_CONSTRUCTOR: OMIT; return "GS_CLASSTYPE_COPY_CONSTRUCTOR";
00216 }
00217 } else if (tree_code_class == GS_TCC_EXPRESSION ||
00218 tree_code_class == GS_TCC_COMPARISON ||
00219 tree_code_class == GS_TCC_UNARY ||
00220 tree_code_class == GS_TCC_BINARY ||
00221 tree_code_class == GS_TCC_REFERENCE ||
00222 tree_code_class == GS_TCC_STATEMENT) {
00223 switch (attribute) {
00224 case GS_ARITY: OMIT; return "GS_ARITY";
00225 case GS_TREE_CHAIN: return "GS_TREE_CHAIN";
00226 case GS_EXPR_FILENAME: OMIT; return "GS_EXPR_FILENAME";
00227 case GS_EXPR_LINENO: OMIT; return "GS_EXPR_LINENO";
00228 case GS_CP_EXPR_FLAGS: return "GS_CP_EXPR_FLAGS";
00229 }
00230
00231 switch (constructor) {
00232 case GS_ASM_EXPR:
00233 switch (attribute) {
00234 case GS_ASM_STRING: return "GS_ASM_STRING";
00235 case GS_ASM_OUTPUTS: return "GS_ASM_OUTPUTS";
00236 case GS_ASM_INPUTS: return "GS_ASM_INPUTS";
00237 case GS_ASM_CLOBBERS: return "GS_ASM_CLOBBERS";
00238 }
00239 return (gs_string_t) NULL;
00240
00241 case GS_BIND_EXPR:
00242 switch (attribute) {
00243 case GS_BIND_EXPR_VARS: OMIT; return "GS_BIND_EXPR_VARS";
00244 case GS_BIND_EXPR_BODY: return "GS_BIND_EXPR_BODY";
00245 case GS_BIND_EXPR_BLOCK: OMIT; return "GS_BIND_EXPR_BLOCK";
00246 }
00247 return (gs_string_t) NULL;
00248
00249 case GS_CASE_LABEL_EXPR:
00250 switch (attribute) {
00251 case GS_CASE_LOW: return "GS_CASE_LOW";
00252 case GS_CASE_HIGH: return "GS_CASE_HIGH";
00253 case GS_CASE_LABEL: return "GS_CASE_LABEL";
00254 }
00255 return (gs_string_t) NULL;
00256
00257 case GS_CLEANUP_STMT:
00258 switch (attribute) {
00259 case GS_CLEANUP_EXPR: OMIT; return "GS_CLEANUP_EXPR";
00260 case GS_CLEANUP_BODY: OMIT; return "GS_CLEANUP_BODY";
00261 }
00262 return (gs_string_t) NULL;
00263
00264 #ifndef FE_GNU_4_2_0
00265 case GS_CONSTRUCTOR:
00266 if (attribute == GS_CONSTRUCTOR_ELTS)
00267 return "GS_CONSTRUCTOR_ELTS";
00268 #endif
00269 return (gs_string_t) "NONAME";
00270
00271 case GS_DECL_EXPR:
00272 if (attribute == GS_DECL_EXPR_DECL)
00273 return "GS_DECL_EXPR_DECL";
00274 return (gs_string_t) "NONAME";
00275
00276 case GS_DO_STMT:
00277 switch (attribute) {
00278 case GS_DO_COND: return "GS_DO_COND";
00279 case GS_DO_BODY: return "GS_DO_BODY";
00280 }
00281 return (gs_string_t) NULL;
00282
00283 case GS_EH_SPEC_BLOCK:
00284 switch (attribute) {
00285 case GS_EH_SPEC_STMTS: return "GS_EH_SPEC_STMTS";
00286 case GS_EH_SPEC_RAISES: return "GS_EH_SPEC_RAISES";
00287 }
00288 return (gs_string_t) NULL;
00289
00290 case GS_EXPR_STMT:
00291 if (attribute == GS_EXPR_STMT_EXPR)
00292 return "GS_EXPR_STMT_EXPR";
00293 return (gs_string_t) NULL;
00294
00295 case GS_FOR_STMT:
00296 switch (attribute) {
00297 case GS_FOR_INIT_STMT: return "GS_FOR_INIT_STMT";
00298 case GS_FOR_COND: return "GS_FOR_COND";
00299 case GS_FOR_EXPR: return "GS_FOR_EXPR";
00300 case GS_FOR_BODY: return "GS_FOR_BODY";
00301 }
00302 return (gs_string_t) NULL;
00303
00304 case GS_HANDLER:
00305 switch (attribute) {
00306 case GS_HANDLER_PARMS: return "GS_HANDLER_PARMS";
00307 case GS_HANDLER_BODY: return "GS_HANDLER_BODY";
00308 }
00309 return (gs_string_t) NULL;
00310
00311 case GS_IF_STMT:
00312 switch (attribute) {
00313 case GS_IF_COND: return "GS_IF_COND";
00314 case GS_THEN_CLAUSE: return "GS_THEN_CLAUSE";
00315 case GS_ELSE_CLAUSE: return "GS_ELSE_CLAUSE";
00316 }
00317 return (gs_string_t) NULL;
00318
00319 case GS_LABEL_EXPR_LABEL:
00320 if (attribute == GS_LABEL_EXPR_LABEL)
00321 return "GS_LABEL_EXPR_LABEL";
00322 return (gs_string_t) NULL;
00323
00324 case GS_LOOP_EXPR:
00325 if (attribute == GS_LOOP_EXPR_BODY)
00326 return "GS_LOOP_EXPR_BODY";
00327 return (gs_string_t) NULL;
00328
00329 case GS_STMT_EXPR:
00330 if (attribute == GS_STMT_EXPR_STMT)
00331 return "GS_STMT_EXPR_STMT";
00332 return (gs_string_t) NULL;
00333
00334 case GS_TRY_BLOCK:
00335 switch (attribute) {
00336 case GS_TRY_STMTS: return "GS_TRY_STMTS";
00337 case GS_TRY_HANDLERS: return "GS_TRY_HANDLERS";
00338 }
00339 return (gs_string_t) NULL;
00340
00341 case GS_WHILE_STMT:
00342 switch (attribute) {
00343 case GS_WHILE_COND: return "GS_WHILE_COND";
00344 case GS_WHILE_BODY: return "GS_WHILE_BODY";
00345 }
00346 return (gs_string_t) NULL;
00347
00348 default:
00349 if (attribute >= GS_TREE_OPERAND_ZERO) {
00350 sprintf(operand_number, "Operand %d",
00351 attribute - GS_TREE_OPERAND_ZERO);
00352 return operand_number;
00353 }
00354 return (gs_string_t) NULL;
00355 }
00356
00357 } else if (tree_code_class == GS_TCC_CONSTANT ||
00358 tree_code_class == GS_TCC_EXCEPTIONAL) {
00359
00360 if (attribute == GS_TREE_CHAIN) {
00361 return "GS_TREE_CHAIN";
00362 }
00363
00364 switch (constructor) {
00365 case GS_BASELINK:
00366 switch (attribute) {
00367 case GS_BASELINK_BINFO: return "GS_BASELINK_BINFO";
00368 case GS_BASELINK_FUNCTIONS: return "GS_BASELINK_FUNCTIONS";
00369 case GS_BASELINK_ACCESS_BINFO: return "GS_BASELINK_ACCESS_BINFO";
00370 case GS_BASELINK_OPTYPE: return "GS_BASELINK_OPTYPE";
00371 }
00372 return (gs_string_t) NULL;
00373
00374 case GS_BLOCK:
00375 switch (attribute) {
00376 case GS_BLOCK_VARS: OMIT; return "GS_BLOCK_VARS";
00377 case GS_BLOCK_SUPERCONTEXT: OMIT; return "GS_BLOCK_SUPERCONTEXT";
00378 case GS_BLOCK_SUBBLOCKS: OMIT; return "GS_BLOCK_SUBBLOCKS";
00379 case GS_BLOCK_CHAIN: OMIT; return "GS_BLOCK_CHAIN";
00380 case GS_BLOCK_ABSTRACT_ORIGIN: OMIT; return "GS_BLOCK_ABSTRACT_ORIGIN";
00381 }
00382 return (gs_string_t) NULL;
00383
00384 case GS_COMPLEX_CST:
00385 switch (attribute) {
00386 case GS_TREE_REALPART: return "GS_TREE_REALPART";
00387 case GS_TREE_IMAGPART: return "GS_TREE_IMAGPART";
00388 }
00389 return (gs_string_t) NULL;
00390
00391 case GS_IDENTIFIER_NODE:
00392 if (attribute == GS_IDENTIFIER_POINTER)
00393 return "GS_IDENTIFIER_POINTER";
00394 return (gs_string_t) NULL;
00395
00396 case GS_INTEGER_CST:
00397 switch (attribute) {
00398 case GS_TREE_INT_CST_LOW: return "GS_TREE_INT_CST_LOW";
00399 case GS_TREE_INT_CST_HIGH: return "GS_TREE_INT_CST_HIGH";
00400 }
00401 return (gs_string_t) NULL;
00402
00403 case GS_PTRMEM_CST:
00404 switch (attribute) {
00405 case GS_EXPANDED_PTRMEM_CST: return "GS_EXPANDED_PTRMEM_CST";
00406 }
00407 return (gs_string_t) NULL;
00408
00409 case GS_REAL_CST:
00410 switch (attribute) {
00411 case GS_TREE_REAL_CST_F: return "GS_TREE_REAL_CST_F";
00412 case GS_TREE_REAL_CST_D: return "GS_TREE_REAL_CST_D";
00413 case GS_TREE_REAL_CST_LD: return "GS_TREE_REAL_CST_LD";
00414 }
00415 return (gs_string_t) NULL;
00416
00417 case GS_STATEMENT_LIST:
00418 if (attribute == GS_STATEMENT_LIST_ELTS)
00419 return "GS_STATEMENT_LIST_ELTS";
00420 return (gs_string_t) NULL;
00421
00422 case GS_STRING_CST:
00423 switch (attribute) {
00424 case GS_TREE_STRING_POINTER: return "GS_TREE_STRING_POINTER";
00425 case GS_TREE_STRING_LENGTH: return "GS_TREE_STRING_LENGTH";
00426 }
00427 return (gs_string_t) NULL;
00428
00429 case GS_TEMPLATE_PARM_INDEX:
00430 switch (attribute) {
00431 case GS_TEMPLATE_PARM_IDX: OMIT; return "GS_TEMPLATE_PARM_IDX";
00432 case GS_TEMPLATE_PARM_LEVEL: OMIT; return "GS_TEMPLATE_PARM_LEVEL";
00433 case GS_TEMPLATE_PARM_DESCENDANTS: OMIT; return "GS_TEMPLATE_PARM_DESCENDANTS";
00434 case GS_TEMPLATE_PARM_ORIG_LEVEL: OMIT; return "GS_TEMPLATE_PARM_ORIG_LEVEL";
00435 case GS_TEMPLATE_PARM_DECL: OMIT; return "GS_TEMPLATE_PARM_DECL";
00436 }
00437 return (gs_string_t) NULL;
00438
00439 case GS_TREE_BINFO:
00440 switch (attribute) {
00441 case GS_BINFO_TYPE: return "GS_BINFO_TYPE";
00442 case GS_BINFO_BASE_BINFOS: OMIT; return "GS_BINFO_BASE_BINFOS";
00443 case GS_BINFO_VPTR_FIELD: return "GS_BINFO_VPTR_FIELD";
00444 }
00445 return (gs_string_t) NULL;
00446
00447 case GS_TREE_LIST:
00448 switch (attribute) {
00449 case GS_TREE_PURPOSE: return "GS_TREE_PURPOSE";
00450 case GS_TREE_VALUE: return "GS_TREE_VALUE";
00451 }
00452 return (gs_string_t) NULL;
00453
00454 case GS_TREE_VEC:
00455 switch (attribute) {
00456 case GS_TREE_VEC_LENGTH: return "GS_TREE_VEC_LENGTH";
00457 case GS_TREE_VEC_ELT: return "GS_TREE_VEC_ELT";
00458 }
00459 return (gs_string_t) NULL;
00460
00461 case GS_VECTOR_CST:
00462 if (attribute == GS_TREE_VECTOR_CST_ELTS)
00463 return "GS_TREE_VECTOR_CST_ELTS";
00464 return (gs_string_t) NULL;
00465
00466 case GS_OVERLOAD:
00467 switch (attribute) {
00468 case GS_OVL_FUNCTION: OMIT; return "GS_OVL_FUNCTION";
00469 case GS_OVL_CHAIN: OMIT; return "GS_OVL_CHAIN";
00470 case GS_OVL_CURRENT: OMIT; return "GS_OVL_CURRENT";
00471 case GS_OVL_NEXT: OMIT; return "GS_OVL_NEXT";
00472 }
00473 return (gs_string_t) NULL;
00474
00475 #ifdef FE_GNU_4_2_0
00476 case GS_CONSTRUCTOR:
00477 switch (attribute) {
00478 case GS_CONSTRUCTOR_LENGTH: return "GS_CONSTRUCTOR_LENGTH";
00479 case GS_CONSTRUCTOR_ELTS_INDEX: return "GS_CONSTRUCTOR_ELTS_INDEX";
00480 case GS_CONSTRUCTOR_ELTS_VALUE: return "GS_CONSTRUCTOR_ELTS_VALUE";
00481 }
00482 return (gs_string_t) NULL;
00483
00484 case GS_OMP_CLAUSE:
00485 if (attribute == GS_OMP_CLAUSE_DECL)
00486 return "GS_OMP_CLAUSE_DECL";
00487 return (gs_string_t) NULL;
00488 #endif
00489 default:
00490 break;
00491 }
00492 }
00493 return (gs_string_t) "NONAME";
00494 }
00495
00496 gs_string_t
00497 gs_flag_name (gs_code_t constructor, gs_int_t attribute, gs_count_t flag,
00498 gs_tree_code_class_t tree_code_class) {
00499
00500 if (attribute == GS_FLAGS) {
00501
00502 if (flag == GS_TYPE_READONLY ||
00503 flag == GS_TREE_READONLY) {
00504 return (tree_code_class == GS_TCC_TYPE) ?
00505 "GS_TYPE_READONLY" : "GS_TREE_READONLY";
00506 }
00507
00508 if (flag == GS_TREE_CONSTANT ||
00509 flag == GS_TYPE_SIZES_GIMPLIFIED) {
00510 return (tree_code_class == GS_TCC_TYPE) ?
00511 "GS_TYPE_SIZES_GIMPLIFIED" : "GS_TREE_CONSTANT";
00512 }
00513
00514 switch (flag) {
00515
00516 case GS_TREE_SIDE_EFFECTS: return "GS_TREE_SIDE_EFFECTS";
00517 case GS_TREE_INVARIANT: return "GS_TREE_INVARIANT";
00518 case GS_TREE_ADDRESSABLE: return "GS_TREE_ADDRESSABLE";
00519 case GS_TREE_THIS_VOLATILE: return "GS_TREE_THIS_VOLATILE";
00520 case GS_TREE_ASM_WRITTEN: return "GS_TREE_ASM_WRITTEN";
00521 case GS_TREE_USED: return constructor == GS_OVERLOAD ? "GS_OVL_USED" : "GS_TREE_USED";
00522 case GS_TREE_NOTHROW: return "GS_TREE_NOTHROW";
00523 case GS_TREE_PUBLIC: return "GS_TREE_PUBLIC";
00524 case GS_TREE_PRIVATE: return "GS_TREE_PRIVATE";
00525 case GS_TREE_PROTECTED: return "GS_TREE_PROTECTED";
00526 case GS_TREE_STATIC:
00527 return (constructor == GS_IDENTIFIER_NODE)? "GS_TREE_SYMBOL_REFERENCED":
00528 (constructor == GS_POINTER_TYPE ||
00529 constructor == GS_REFERENCE_TYPE) ? "GS_TYPE_REF_CAN_ALIAS_ALL":
00530 "GS_TREE_STATIC";
00531 case GS_TREE_LANG_FLAG_0: return "GS_TREE_LANG_FLAG_0";
00532 case GS_TREE_LANG_FLAG_1: return "GS_TREE_LANG_FLAG_1";
00533 case GS_TREE_LANG_FLAG_2: return "GS_TREE_LANG_FLAG_2";
00534 case GS_TREE_LANG_FLAG_3: return "GS_TREE_LANG_FLAG_3";
00535 case GS_TREE_LANG_FLAG_4: return "GS_TREE_LANG_FLAG_4";
00536 case GS_TREE_LANG_FLAG_5: return "GS_TREE_LANG_FLAG_5";
00537 case GS_TREE_LANG_FLAG_6: return "GS_TREE_LANG_FLAG_6";
00538 case GS_TREE_NOT_EMITTED_BY_GXX: return "GS_TREE_NOT_EMITTED_BY_GXX";
00539 case GS_DWARF_ACCESS_FLAG_0: return "GS_DWARF_ACCESS_FLAG_0";
00540 case GS_DWARF_ACCESS_FLAG_1: return "GS_DWARF_ACCESS_FLAG_1";
00541 default:
00542
00543 break;
00544 }
00545
00546 if (tree_code_class == GS_TCC_DECLARATION) {
00547 switch (flag) {
00548 case GS_DECL_UNSIGNED: return "GS_DECL_UNSIGNED";
00549 case GS_DECL_IGNORED_P: return "GS_DECL_IGNORED_P";
00550 case GS_DECL_ABSTRACT: return "GS_DECL_ABSTRACT";
00551 case GS_DECL_IN_SYSTEM_HEADER: return "GS_DECL_IN_SYSTEM_HEADER";
00552 case GS_DECL_COMMON: return "GS_DECL_COMMON";
00553 case GS_DECL_EXTERNAL: return "GS_DECL_EXTERNAL";
00554 case GS_DECL_WEAK: return "GS_DECL_WEAK";
00555 case GS_DECL_REGISTER: return "GS_DECL_REGISTER";
00556 case GS_DECL_NONLOCAL: return "GS_DECL_NONLOCAL";
00557 case GS_TYPE_DECL_SUPPRESS_DEBUG: return constructor == GS_FUNCTION_DECL ? "GS_DECL_NEEDED" : "GS_TYPE_DECL_SUPPRESS_DEBUG";
00558 case GS_DECL_INLINE: return "GS_DECL_INLINE";
00559 case GS_DECL_DECLARED_INLINE_P: return "GS_DECL_DECLARED_INLINE_P";
00560 case GS_DECL_BUILT_IN: return "GS_DECL_BUILT_IN";
00561 case GS_DECL_NO_STATIC_CHAIN: return "GS_DECL_NO_STATIC_CHAIN";
00562 case GS_DECL_PACKED: return constructor == GS_FUNCTION_DECL ? "GS_DECL_REACHABLE" : "GS_DECL_PACKED";
00563 case GS_DECL_BIT_FIELD: return "GS_DECL_BIT_FIELD";
00564 case GS_DECL_NONADDRESSABLE_P: return "GS_DECL_NONADDRESSABLE_P";
00565 case GS_DECL_EMITTED_BY_GXX: return "GS_DECL_EMITTED_BY_GXX";
00566 case GS_DECL_IN_TEXT_SECTION: return "GS_DECL_IN_TEXT_SECTION";
00567 case GS_DECL_THREAD_LOCAL: return "GS_DECL_THREAD_LOCAL";
00568 case GS_DECL_TRANSPARENT_UNION: return "GS_DECL_TRANSPARENT_UNION";
00569 case GS_DECL_VIRTUAL_P: return "GS_DECL_VIRTUAL_P";
00570 case GS_DECL_DEFER_OUTPUT: return "GS_DECL_DEFER_OUTPUT";
00571 case GS_DECL_PRESERVE_P: return "GS_DECL_PRESERVE_P";
00572 case GS_DECL_LANG_FLAG_0: return "GS_DECL_LANG_FLAG_0";
00573 case GS_DECL_LANG_FLAG_1: return "GS_DECL_LANG_FLAG_1";
00574 case GS_DECL_LANG_FLAG_2: return "GS_DECL_LANG_FLAG_2";
00575 case GS_DECL_LANG_FLAG_3: return "GS_DECL_LANG_FLAG_3";
00576 case GS_DECL_LANG_FLAG_4: return "GS_DECL_LANG_FLAG_4";
00577 case GS_DECL_LANG_FLAG_5: return "GS_DECL_LANG_FLAG_5";
00578 case GS_DECL_LANG_FLAG_6: return "GS_DECL_LANG_FLAG_6";
00579 case GS_DECL_LANG_FLAG_7: return "GS_DECL_LANG_FLAG_7";
00580 case GS_DECL_USER_ALIGN: return "GS_DECL_USER_ALIGN";
00581 case GS_DECL_OFFSET_ALIGN: return "GS_DECL_OFFSET_ALIGN";
00582 case GS_DECL_POINTER_ALIAS_SET: return "GS_DECL_POINTER_ALIAS_SET";
00583 case GS_DECL_THUNK_P: return "GS_DECL_THUNK_P";
00584 case GS_DECL_ASSEMBLER_NAME_SET_P: return "GS_DECL_ASSEMBLER_NAME_SET_P";
00585 case GS_DECL_ARTIFICIAL: return "GS_DECL_ARTIFICIAL";
00586 case GS_DECL_LANG_SPECIFIC: return "GS_DECL_LANG_SPECIFIC";
00587 case GS_DECL_THREADPRIVATE: return "GS_DECL_THREADPRIVATE";
00588 default: GS_ASSERT(gs_false, ("gs_flag_name: missing flag name"));
00589 }
00590 }
00591
00592 if (tree_code_class == GS_TCC_TYPE) {
00593 switch (flag) {
00594 case GS_TYPE_UNSIGNED: return "GS_TYPE_UNSIGNED";
00595 case GS_TYPE_STRING_FLAG: return "GS_TYPE_STRING_FLAG";
00596 case GS_TYPE_NEEDS_CONSTRUCTING: return "GS_TYPE_NEEDS_CONSTRUCTING";
00597 case GS_TYPE_PACKED: return "GS_TYPE_PACKED";
00598 case GS_TYPE_RESTRICT: return "GS_TYPE_RESTRICT";
00599 case GS_TYPE_LANG_FLAG_0: return "GS_TYPE_LANG_FLAG_0";
00600 case GS_TYPE_LANG_FLAG_1: return "GS_TYPE_LANG_FLAG_1";
00601 case GS_TYPE_LANG_FLAG_2: return "GS_TYPE_LANG_FLAG_2";
00602 case GS_TYPE_LANG_FLAG_3: return "GS_TYPE_LANG_FLAG_3";
00603 case GS_TYPE_LANG_FLAG_4: return "GS_TYPE_LANG_FLAG_4";
00604 case GS_TYPE_LANG_FLAG_5: return "GS_TYPE_LANG_FLAG_5";
00605 case GS_TYPE_LANG_FLAG_6: return "GS_TYPE_LANG_FLAG_6";
00606 case GS_TYPE_VOLATILE: return "GS_TYPE_VOLATILE";
00607 case GS_TYPE_LANG_SPECIFIC: return "GS_TYPE_LANG_SPECIFIC";
00608 case GS_POINTER_TYPE_P: return "GS_POINTER_TYPE_P";
00609 case GS_AGGREGATE_VALUE_P: return "GS_AGGREGATE_VALUE_P";
00610 case GS_TYPE_BIG_ENDIAN: return "GS_TYPE_BIG_ENDIAN";
00611 case GS_TYPE_LITTLE_ENDIAN: return "GS_TYPE_LITTLE_ENDIAN";
00612 case GS_TYPE_EXPLICIT_ENDIAN: return "GS_TYPE_EXPLICIT_ENDIAN";
00613 }
00614
00615
00616
00617 if (flag == GS_TYPE_NO_FORCE_BLK) {
00618 switch (constructor) {
00619 case GS_RECORD_TYPE:
00620 case GS_UNION_TYPE:
00621 case GS_QUAL_UNION_TYPE:
00622 return "GS_TYPE_NO_FORCE_BLK";
00623 case GS_INTEGER_TYPE:
00624 return "GS_TYPE_IS_SIZETYPE";
00625 case GS_FUNCTION_TYPE:
00626 return "GS_TYPE_RETURNS_STACK_DEPRESSED";
00627 default:
00628 GS_ASSERT(gs_false,
00629 ("gs_flag_name: bad constructor for GS_TYPE_NO_FORCE_BLK"));
00630 break;
00631 }
00632 }
00633
00634 if (flag == GS_TYPE_TRANSPARENT_UNION) {
00635 if (constructor == GS_UNION_TYPE)
00636 return "GS_TYPE_TRANSPARENT_UNION";
00637 else if (constructor == GS_ARRAY_TYPE)
00638 return "GS_TYPE_NONALIASED_COMPONENT";
00639 else
00640 GS_ASSERT(gs_false,
00641 ("gs_flag_name: bad constructor for GS_TYPE_TRANSPARENT_UNION"));
00642 }
00643
00644 GS_ASSERT(gs_false, ("gs_flag_name: missing flag name"));
00645 }
00646
00647 if (tree_code_class == GS_TCC_EXPRESSION ||
00648 tree_code_class == GS_TCC_COMPARISON ||
00649 tree_code_class == GS_TCC_UNARY ||
00650 tree_code_class == GS_TCC_BINARY ||
00651 tree_code_class == GS_TCC_REFERENCE ||
00652 tree_code_class == GS_TCC_STATEMENT) {
00653 switch (flag) {
00654 case GS_BIT_FIELD_REF_UNSIGNED: return "GS_BIT_FIELD_REF_UNSIGNED";
00655 case GS_EXPR_HAS_LOCATION: return "GS_EXPR_HAS_LOCATION";
00656 case GS_EMIT_TARGET_EXPR_CLEANUP:
00657 GS_ASSERT(constructor == GS_TARGET_EXPR,
00658 ("gs_flag_name: unexpected flag GS_EMIT_TARGET_EXPR_CLEANUP"));
00659 return "GS_EMIT_TARGET_EXPR_CLEANUP";
00660 default: GS_ASSERT(gs_false, ("gs_flag_name: missing flag name"));
00661 }
00662 }
00663
00664 if (tree_code_class == GS_TCC_CONSTANT ||
00665 tree_code_class == GS_TCC_EXCEPTIONAL) {
00666
00667 if (constructor == GS_INTEGER_CST &&
00668 flag == GS_TREE_CONSTANT_OVERFLOW)
00669 return "GS_TREE_CONSTANT_OVERFLOW";
00670
00671 if (constructor == GS_REAL_CST &&
00672 flag == GS_TREE_OVERFLOW)
00673 return "GS_TREE_OVERFLOW";
00674
00675 switch (flag) {
00676 case GS_TREE_CONSTANT_OVERFLOW:
00677 if (constructor == GS_INTEGER_CST) return "GS_TREE_CONSTANT_OVERFLOW";
00678 if (constructor == GS_TREE_BINFO) return "GS_BINFO_VIRTUAL_P";
00679 GS_ASSERT(gs_false, ("gs_flag_name: missing flag name"));
00680 return "NONAME";
00681 case GS_REAL_VALUE_ISINF: return "GS_REAL_VALUE_ISINF";
00682 case GS_REAL_VALUE_ISNAN: return "GS_REAL_VALUE_ISNAN";
00683 default: GS_ASSERT(gs_false, ("gs_flag_name: missing flag name"));
00684 }
00685 }
00686
00687 } else if (attribute == GS_CP_DECL_FLAGS) {
00688 switch (flag) {
00689 case GS_DECL_COMDAT: return "GS_DECL_COMDAT";
00690 case GS_DECL_GLOBAL_CTOR_P: return "GS_DECL_GLOBAL_CTOR_P";
00691 case GS_DECL_GLOBAL_DTOR_P: return "GS_DECL_GLOBAL_DTOR_P";
00692 case GS_DECL_ONE_ONLY: return "GS_DECL_ONE_ONLY";
00693 case GS_DECL_MAYBE_IN_CHARGE_CONSTRUCTOR_P:
00694 return "GS_DECL_MAYBE_IN_CHARGE_CONSTRUCTOR_P";
00695 case GS_DECL_MAYBE_IN_CHARGE_DESTRUCTOR_P:
00696 return "GS_DECL_MAYBE_IN_CHARGE_DESTRUCTOR_P";
00697 case GS_DECL_FUNCTION_MEMBER_P: return "GS_DECL_FUNCTION_MEMBER_P";
00698 case GS_DECL_USES_TEMPLATE_PARMS: return "GS_DECL_USES_TEMPLATE_PARMS";
00699 case GS_DECL_COPY_CONSTRUCTOR_P: return "GS_DECL_COPY_CONSTRUCTOR_P";
00700 case GS_DECL_IMPLICIT_INSTANTIATION: return "GS_DECL_IMPLICIT_INSTANTIATION";
00701 case GS_DECL_NAMESPACE_SCOPE_P: return "GS_DECL_NAMESPACE_SCOPE_P";
00702 #ifdef FE_GNU_4_2_0
00703 case GS_CP_DECL_THREADPRIVATE_P:
00704 return constructor == GS_FUNCTION_DECL ? "GS_DECL_CONSTRUCTOR_P" :
00705 "GS_CP_DECL_THREADPRIVATE_P";
00706 case GS_DECL_COMPLETE_DESTRUCTOR_P: return "GS_DECL_COMPLETE_DESTRUCTOR_P";
00707 case GS_DECL_HAS_IN_CHARGE_PARM_P: return "GS_DECL_HAS_IN_CHARGE_PARM_P";
00708 case GS_DECL_HAS_VTT_PARM_P: return "GS_DECL_HAS_VTT_PARM_P";
00709 case GS_DECL_ASSIGNMENT_OPERATOR_P: return "GS_DECL_ASSIGNMENT_OPERATOR_P";
00710 #endif
00711 case GS_DECL_COMPLETE_CONSTRUCTOR_P: return "GS_DECL_COMPLETE_CONSTRUCTOR_P";
00712 case GS_DECL_REALLY_EXTERN: return "GS_DECL_REALLY_EXTERN";
00713 case GS_DECL_USE_TEMPLATE: return "GS_DECL_USE_TEMPLATE";
00714 case GS_DECL_TEMPLATE_INSTANTIATED: return "GS_DECL_TEMPLATE_INSTANTIATED";
00715 case GS_DECL_TEMPLATE_SPECIALIZATION: return "GS_DECL_TEMPLATE_SPECIALIZATION";
00716 case GS_DECL_PURE_VIRTUAL_P: return "GS_DECL_PURE_VIRTUAL_P";
00717 case GS_DECL_THIS_THUNK_P: return "GS_DECL_THIS_THUNK_P";
00718 case GS_DECL_EXTERN_C_P: return "GS_DECL_EXTERN_C_P";
00719 default: GS_ASSERT(gs_false, ("gs_flag_name: missing flag name"));
00720 }
00721
00722 } else if (attribute == GS_CP_TYPE_FLAGS) {
00723 switch (flag) {
00724 case GS_TYPE_PTRMEMFUNC_P: return "GS_TYPE_PTRMEMFUNC_P";
00725 case GS_TYPE_PTRMEM_P: return "GS_TYPE_PTRMEM_P";
00726 case GS_CLASSTYPE_INTERFACE_ONLY: return "GS_CLASSTYPE_INTERFACE_ONLY";
00727 case GS_TYPE_USES_TEMPLATE_PARMS: return "GS_TYPE_USES_TEMPLATE_PARMS";
00728 case GS_IS_EMPTY_CLASS: return "GS_IS_EMPTY_CLASS";
00729 case GS_CLASS_TYPE_P: return "GS_CLASS_TYPE_P";
00730 case GS_ANON_UNION_TYPE_P: return "GS_ANON_UNION_TYPE_P";
00731 case GS_CLASSTYPE_TEMPLATE_SPECIALIZATION:
00732 return "GS_CLASSTYPE_TEMPLATE_SPECIALIZATION";
00733 #ifdef FE_GNU_4_2_0
00734 case GS_CLASSTYPE_NON_POD_P: return "GS_CLASSTYPE_NON_POD_P";
00735 case GS_TYPE_HAS_DEFAULT_CONSTRUCTOR:
00736 return "GS_TYPE_HAS_DEFAULT_CONSTRUCTOR";
00737 case GS_TYPE_HAS_IMPLICIT_COPY_CONSTRUCTOR:
00738 return "GS_TYPE_HAS_IMPLICIT_COPY_CONSTRUCTOR";
00739 #endif
00740 default: GS_ASSERT(gs_false, ("gs_flag_name: missing flag name"));
00741 }
00742
00743 } else if (attribute == GS_CP_EXPR_FLAGS) {
00744 switch (flag) {
00745 case GS_STMT_IS_FULL_EXPR_P: return "GS_STMT_IS_FULL_EXPR_P";
00746 case GS_AGGR_INIT_VIA_CTOR_P: return "GS_AGGR_INIT_VIA_CTOR_P";
00747 case GS_CLEANUP_EH_ONLY: return "GS_CLEANUP_EH_ONLY";
00748 default: GS_ASSERT(gs_false, ("gs_flag_name: missing flag name"));
00749 }
00750 } else if (attribute == GS_PROGRAM_FLAGS) {
00751 switch (flag) {
00752 case GS_FLAG_ERRNO_MATH: return "GS_FLAG_ERRNO_MATH";
00753 case GS_PRAGMA_IMPLEMENTATION: return "GS_PRAGMA_IMPLEMENTATION";
00754 case GS_PRAGMA_INTERFACE: return "GS_PRAGMA_INTERFACE";
00755 default: GS_ASSERT(gs_false, ("gs_flag_name: missing flag name"));
00756 }
00757 }
00758
00759 return (gs_string_t) "FLAG_NONAME";
00760 }
00761
00762 static inline gs_t
00763 gs_build_0(gs_tree_code_class_t code_class, gs_code_t code)
00764 {
00765 gs_t root = __gs(code);
00766 gs_t code_class_node = __gs(GS_TCC);
00767 _gs_b(code_class_node, code_class);
00768 gs_set_operand(root, 0, code_class_node);
00769 gs_set_operand(root, GS_FLAGS, __gs(IB_BIT_VECTOR));
00770 return root;
00771 }
00772
00773 gs_t
00774 gs_build_type(gs_code_t code)
00775 {
00776 gs_t root = gs_build_0(GS_TCC_TYPE, code);
00777 return root;
00778 }
00779
00780 gs_t
00781 gs_build_if_stmt(gs_t k0, gs_t k1, gs_t k2)
00782 {
00783 gs_t root = __gs(GS_IF_STMT);
00784
00785
00786 gs_t code_class_node = __gs(GS_TCC);
00787 _gs_b(code_class_node, GS_TCC_STATEMENT);
00788 gs_set_operand(root, 0, code_class_node);
00789
00790 gs_set_operand(root, GS_TREE_OPERAND_ZERO, k0);
00791 gs_set_operand(root, GS_TREE_OPERAND_ZERO+1, k1);
00792 gs_set_operand(root, GS_TREE_OPERAND_ZERO+2, k2);
00793 return root;
00794 }
00795
00796 gs_t
00797 gs_build_target_expr(gs_t k0, gs_t k1, gs_t k2, gs_t k3)
00798 {
00799 gs_t res = __gs(GS_TARGET_EXPR);
00800
00801
00802 gs_t code_class_node = __gs(GS_TCC);
00803 _gs_b(code_class_node, GS_TCC_EXPRESSION);
00804 gs_set_operand(res, 0, code_class_node);
00805
00806 gs_set_operand(res, GS_FLAGS, __gs(IB_BIT_VECTOR));
00807
00808 gs_set_operand(res, GS_TREE_OPERAND_ZERO, k0);
00809 gs_set_operand(res, GS_TREE_OPERAND_ZERO+1, k1);
00810 gs_set_operand(res, GS_TREE_OPERAND_ZERO+2, k2);
00811 gs_set_operand(res, GS_TREE_OPERAND_ZERO+3, k3);
00812 return res;
00813 }
00814
00815 gs_t
00816 gs_build_int_cst(gs_long_long_t n)
00817 {
00818 gs_t cst = __gs(GS_INTEGER_CST);
00819
00820
00821 gs_t code_class_node = __gs(GS_TCC);
00822 _gs_b(code_class_node, GS_TCC_CONSTANT);
00823 gs_set_operand(cst, 0, code_class_node);
00824
00825
00826 gs_t gs_integer_type = gs_integer_type_node();
00827 gs_set_operand(cst, GS_TREE_TYPE, gs_integer_type);
00828
00829 gs_t low = __gs(IB_UNSIGNED_LONG_LONG);
00830 gs_t high = __gs(IB_LONG_LONG);
00831 _gs_ull(low, n);
00832 _gs_ll(high, n < 0 ? -1 : 0);
00833
00834 gs_set_operand(cst, GS_TREE_INT_CST_LOW, low);
00835 gs_set_operand(cst, GS_TREE_INT_CST_HIGH, high);
00836 gs_set_operand(cst, GS_FLAGS, __gs(IB_BIT_VECTOR));
00837 return cst;
00838 }
00839
00840 gs_t
00841 gs_build_decl(gs_code_t code, gs_t node2)
00842 {
00843 gs_t res = __gs (code);
00844
00845
00846 gs_t code_class = __gs (GS_TCC);
00847 _gs_b (code_class, GS_TCC_DECLARATION);
00848 gs_set_operand(res, 0, code_class);
00849
00850
00851 gs_set_operand(res, GS_TREE_TYPE, node2);
00852
00853
00854 gs_set_operand(res, GS_DECL_NAME, NULL);
00855 gs_set_operand(res, GS_FLAGS, __gs (IB_BIT_VECTOR));
00856 return res;
00857 }
00858
00859 #ifndef FE_GNU_4_2_0
00860 static inline
00861 #endif
00862 gs_t
00863 gs_build_2(gs_tree_code_class_t code_class, gs_code_t code, gs_t k0, gs_t k1)
00864 {
00865 gs_t root = gs_build_0(code_class, code);
00866 gs_set_operand(root, GS_TREE_OPERAND_ZERO, k0);
00867 gs_set_operand(root, GS_TREE_OPERAND_ZERO + 1, k1);
00868 return root;
00869 }
00870
00871 static inline gs_t
00872 gs_build_comparison(gs_code_t code, gs_t k0, gs_t k1)
00873 {
00874 gs_t gs_integer_type = gs_integer_type_node();
00875 gs_t expr = gs_build_2(GS_TCC_COMPARISON, GS_NE_EXPR, k0, k1);
00876 gs_set_operand(expr, GS_TREE_TYPE, gs_integer_type);
00877 return expr;
00878 }
00879
00880 gs_t
00881 gs_c_common_truthvalue_conversion(gs_t node)
00882 {
00883 gs_t zero = gs_build_int_cst(0);
00884 gs_t expr = gs_build_comparison(GS_NE_EXPR, node, zero);
00885 return expr;
00886 }
00887
00888 gs_t
00889 gs_strip_nops(gs_t node)
00890 {
00891 gs_t opnd0;
00892 gs_t error_mark_node = gs_error_mark_node();
00893 gs_code_t code = gs_tree_code(node);
00894
00895 while ((code == GS_NOP_EXPR ||
00896 code == GS_CONVERT_EXPR ||
00897 code == GS_NON_LVALUE_EXPR) &&
00898 (opnd0 = gs_tree_operand(node, 0)) != error_mark_node &&
00899 !strcmp(gs_type_mode(gs_tree_type(node)),
00900 gs_type_mode(gs_tree_type(opnd0)))) {
00901 node = opnd0;
00902 code = gs_tree_code(node);
00903 }
00904 return node;
00905 }
00906
00907
00908 gs_t gs_build_pointer_type(gs_t to_type)
00909 {
00910 gs_t t, type_pointer_to;
00911 gs_t error_mark_node = gs_error_mark_node();
00912 gs_t ptr_type = gs_ptr_type_node();
00913 gs_string_t ptr_type_mode = gs_type_mode(ptr_type);
00914
00915 if (to_type == error_mark_node)
00916 return error_mark_node;
00917
00918
00919
00920 type_pointer_to = gs_type_pointer_to(to_type);
00921 GS_ASSERT(!(type_pointer_to != NULL &&
00922 gs_tree_code(type_pointer_to) != GS_POINTER_TYPE),
00923 ("gs_build_pointer_type: TYPE_POINTER_TO is not POINTER_TYPE"));
00924
00925 for (t = type_pointer_to; t != NULL; t = gs_type_next_ptr_to(t)) {
00926 gs_string_t mode = gs_type_mode(t);
00927 if (!strcmp(mode, ptr_type_mode) &&
00928 gs_type_ref_can_alias_all(t) == 0) {
00929 return t;
00930 }
00931 }
00932
00933 t = gs_build_type(GS_POINTER_TYPE);
00934 gs_set_operand(t, GS_TREE_TYPE, to_type);
00935 {
00936 gs_t type_mode = __gs(IB_STRING);
00937 _gs_s (type_mode, ptr_type_mode, 1 + strlen((char *)ptr_type_mode));
00938 gs_set_operand(t, GS_TYPE_MODE, type_mode);
00939 }
00940 gs_set_type_ref_can_alias_all(t, 0);
00941 gs_set_operand(t, GS_TYPE_NEXT_PTR_TO, gs_type_pointer_to(to_type));
00942 gs_set_operand(to_type, GS_TYPE_POINTER_TO, t);
00943
00944
00945 {
00946 gs_t type_precision = __gs(IB_INT);
00947
00948 gs_set_operand(t, GS_TYPE_SIZE, gs_operand(ptr_type, GS_TYPE_SIZE));
00949 gs_set_operand(t, GS_TYPE_SIZE_UNIT, gs_operand(ptr_type, GS_TYPE_SIZE_UNIT));
00950 gs_set_operand(t, GS_TYPE_ALIGN, gs_operand(ptr_type, GS_TYPE_ALIGN));
00951 gs_set_type_unsigned(t, 1);
00952 _gs_n(type_precision, gs_type_type_precision(ptr_type));
00953 gs_set_operand(t, GS_TYPE_PRECISION, type_precision);
00954 }
00955 return t;
00956 }