このページを編集する際は,編集に関する方針に従ってください.[]
概要[]
- gcc-4.1.0/gcc/fold-const.cにて定義
- expr(tree)のチェックサムを求める
引数[]
- tree expr
- struct md5_ctx *ctx
- 求められたチェックサム
- htab_t ht
実装[]
10307 static void
10308 fold_checksum_tree (tree expr, struct md5_ctx *ctx, htab_t ht)
10309 {
10310 void **slot;
10311 enum tree_code code;
10312 struct tree_function_decl buf;
10313 int i, len;
10314
~
*ハッシュテーブルにデータを挿入している
10315 recursive_label:
10316
10317 gcc_assert ((sizeof (struct tree_exp) + 5 * sizeof (tree)
10318 <= sizeof (struct tree_function_decl))
10319 && sizeof (struct tree_type) <= sizeof (struct tree_function_decl));
10320 if (expr == NULL)
10321 return;
10322 slot = htab_find_slot (ht, expr, [[INSERT>enum insert_option]]);
10323 if (*slot != NULL)
10324 return;
10325 *slot = expr;
~
*exprの設定
10326 code = TREE_CODE (expr);
10327 if (TREE_CODE_CLASS (code) == [[tcc_declaration>enum tree_code_class]]
10328 && DECL_ASSEMBLER_NAME_SET_P (expr))
10329 {
10330 /* Allow DECL_ASSEMBLER_NAME to be modified. */
10331 memcpy ((char *) &buf, expr, tree_size (expr));
10332 expr = (tree) &buf;
10333 SET_DECL_ASSEMBLER_NAME (expr, NULL);
10334 }
10335 else if (TREE_CODE_CLASS (code) == [[tcc_type>enum tree_code_class]]
10336 && (TYPE_POINTER_TO (expr) || TYPE_REFERENCE_TO (expr)
10337 || TYPE_CACHED_VALUES_P (expr)
10338 || TYPE_CONTAINS_PLACEHOLDER_INTERNAL (expr)))
10339 {
10340 /* Allow these fields to be modified. */
10341 memcpy ((char *) &buf, expr, tree_size (expr));
10342 expr = (tree) &buf;
10343 TYPE_CONTAINS_PLACEHOLDER_INTERNAL (expr) = 0;
10344 TYPE_POINTER_TO (expr) = NULL;
10345 TYPE_REFERENCE_TO (expr) = NULL;
10346 if (TYPE_CACHED_VALUES_P (expr))
10347 {
10348 TYPE_CACHED_VALUES_P (expr) = 0;
10349 TYPE_CACHED_VALUES (expr) = NULL;
10350 }
10351 }
~
*チェックサムを求める
**exprの型のチェックサムも求める
10352 md5_process_bytes (expr, tree_size (expr), ctx);
10353 fold_checksum_tree (TREE_TYPE (expr), ctx, ht);
~
~
*ここから下はtreeの構造によって、fold_checksum_treeの再帰的呼び出しがほとんど
**太字のところは例外
10354 if (TREE_CODE_CLASS (code) != [[tcc_type>enum tree_code_class]]
10355 && TREE_CODE_CLASS (code) != [[tcc_declaration>enum tree_code_class]]
10356 && code != [[TREE_LIST>enum tree_code]])
10357 fold_checksum_tree (TREE_CHAIN (expr), ctx, ht);
10358 switch (TREE_CODE_CLASS (code))
10359 {
10360 case [[tcc_constant>enum tree_code_class]]:
10361 switch (code)
10362 {
10363 case [[STRING_CST>enum tree_code]]:
10364 md5_process_bytes (TREE_STRING_POINTER (expr),
10365 TREE_STRING_LENGTH (expr), ctx);
10366 break;
10367 case [[COMPLEX_CST>enum tree_code]]:
10368 fold_checksum_tree (TREE_REALPART (expr), ctx, ht);
10369 fold_checksum_tree (TREE_IMAGPART (expr), ctx, ht);
10370 break;
10371 case [[VECTOR_CST>enum tree_code]]:
10372 fold_checksum_tree (TREE_VECTOR_CST_ELTS (expr), ctx, ht);
10373 break;
10374 default:
10375 break;
10376 }
10377 break;
10378 case [[tcc_exceptional>enum tree_code_class]]:
10379 switch (code)
10380 {
10381 case [[TREE_LIST>enum tree_code]]:
10382 fold_checksum_tree (TREE_PURPOSE (expr), ctx, ht);
10383 fold_checksum_tree (TREE_VALUE (expr), ctx, ht);
10384 expr = TREE_CHAIN (expr);
10385 goto recursive_label;
10386 break;
10387 case [[TREE_VEC>enum tree_code]]:
10388 for (i = 0; i < TREE_VEC_LENGTH (expr); ++i)
10389 fold_checksum_tree (TREE_VEC_ELT (expr, i), ctx, ht);
10390 break;
10391 default:
10392 break;
10393 }
10394 break;
10395 case [[tcc_expression>enum tree_code_class]]:
10396 case [[tcc_reference>enum tree_code_class]]:
10397 case [[tcc_comparison>enum tree_code_class]]:
10398 case [[tcc_unary>enum tree_code_class]]:
10399 case [[tcc_binary>enum tree_code_class]]:
10400 case [[tcc_statement>enum tree_code_class]]:
10401 len = TREE_CODE_LENGTH (code);
10402 for (i = 0; i < len; ++i)
10403 fold_checksum_tree (TREE_OPERAND (expr, i), ctx, ht);
10404 break;
10405 case [[tcc_declaration>enum tree_code_class]]:
10406 fold_checksum_tree (DECL_SIZE (expr), ctx, ht);
10407 fold_checksum_tree (DECL_SIZE_UNIT (expr), ctx, ht);
10408 fold_checksum_tree (DECL_NAME (expr), ctx, ht);
10409 fold_checksum_tree (DECL_CONTEXT (expr), ctx, ht);
10410 fold_checksum_tree (DECL_INITIAL (expr), ctx, ht);
10411 fold_checksum_tree (DECL_ABSTRACT_ORIGIN (expr), ctx, ht);
10412 fold_checksum_tree (DECL_ATTRIBUTES (expr), ctx, ht);
10413 if (CODE_CONTAINS_STRUCT (TREE_CODE (expr), [[TS_DECL_WITH_VIS>TS_ENUM_NAME]]))
10414 fold_checksum_tree (DECL_SECTION_NAME (expr), ctx, ht);
10415
10416 if (CODE_CONTAINS_STRUCT (TREE_CODE (expr), [[TS_DECL_NON_COMMON>TS_ENUM_NAME]]))
10417 {
10418 fold_checksum_tree (DECL_VINDEX (expr), ctx, ht);
10419 fold_checksum_tree (DECL_RESULT_FLD (expr), ctx, ht);
10420 fold_checksum_tree (DECL_ARGUMENT_FLD (expr), ctx, ht);
10421 }
10422 break;
10423 case [[tcc_type>enum tree_code_class]]:
10424 if (TREE_CODE (expr) == [[ENUMERAL_TYPE>enum tree_code]])
10425 fold_checksum_tree (TYPE_VALUES (expr), ctx, ht);
10426 fold_checksum_tree (TYPE_SIZE (expr), ctx, ht);
10427 fold_checksum_tree (TYPE_SIZE_UNIT (expr), ctx, ht);
10428 fold_checksum_tree (TYPE_ATTRIBUTES (expr), ctx, ht);
10429 fold_checksum_tree (TYPE_NAME (expr), ctx, ht);
10430 if (INTEGRAL_TYPE_P (expr)
10431 || SCALAR_FLOAT_TYPE_P (expr))
10432 {
10433 fold_checksum_tree (TYPE_MIN_VALUE (expr), ctx, ht);
10434 fold_checksum_tree (TYPE_MAX_VALUE (expr), ctx, ht);
10435 }
10436 fold_checksum_tree (TYPE_MAIN_VARIANT (expr), ctx, ht);
10437 if (TREE_CODE (expr) == [[RECORD_TYPE>enum tree_code]]
10438 || TREE_CODE (expr) == [[UNION_TYPE>enum tree_code]]
10439 || TREE_CODE (expr) == [[QUAL_UNION_TYPE>enum tree_code]])
10440 fold_checksum_tree (TYPE_BINFO (expr), ctx, ht);
10441 fold_checksum_tree (TYPE_CONTEXT (expr), ctx, ht);
10442 break;
10443 default:
10444 break;
10445 }
10446 }