GCC Wikia
Advertisement

このページを編集する際は,編集に関する方針に従ってください.[]

概要[]

引数[]

実装[]

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 }


リンク元

Advertisement