return build_int_cst_wide (type, low, high);
}
-/* Constructs tree in type TYPE from with value given by CST. Signedness
- of CST is assumed to be the same as the signedness of TYPE. */
-
-tree
-double_int_to_tree (tree type, double_int cst)
-{
- cst = double_int_ext (cst, TYPE_PRECISION (type), TYPE_UNSIGNED (type));
-
- return build_int_cst_wide (type, cst.low, cst.high);
-}
-
-/* Returns true if CST fits into range of TYPE. Signedness of CST is assumed
- to be the same as the signedness of TYPE. */
-
-bool
-double_int_fits_to_tree_p (const_tree type, double_int cst)
-{
- double_int ext = double_int_ext (cst,
- TYPE_PRECISION (type),
- TYPE_UNSIGNED (type));
-
- return double_int_equal_p (cst, ext);
-}
-
/* These are the hash table functions for the hash table of INTEGER_CST
nodes of a sizetype. */
}
-/* Reset the expression *EXPR_P, a size or position.
-
- ??? We could reset all non-constant sizes or positions. But it's cheap
- enough to not do so and refrain from adding workarounds to dwarf2out.c.
-
- We need to reset self-referential sizes or positions because they cannot
- be gimplified and thus can contain a CALL_EXPR after the gimplification
- is finished, which will run afoul of LTO streaming. And they need to be
- reset to something essentially dummy but not constant, so as to preserve
- the properties of the object they are attached to. */
-
-static inline void
-free_lang_data_in_one_sizepos (tree *expr_p)
-{
- tree expr = *expr_p;
- if (CONTAINS_PLACEHOLDER_P (expr))
- *expr_p = build0 (PLACEHOLDER_EXPR, TREE_TYPE (expr));
-}
-
-
/* Reset all the fields in a binfo node BINFO. We only keep
BINFO_VIRTUALS, which is used by gimple_fold_obj_type_ref. */
/* For non-aggregate types, clear out the language slot (which
overloads TYPE_BINFO). */
TYPE_LANG_SLOT_1 (type) = NULL_TREE;
-
- if (INTEGRAL_TYPE_P (type)
- || SCALAR_FLOAT_TYPE_P (type)
- || FIXED_POINT_TYPE_P (type))
- {
- free_lang_data_in_one_sizepos (&TYPE_MIN_VALUE (type));
- free_lang_data_in_one_sizepos (&TYPE_MAX_VALUE (type));
- }
}
- free_lang_data_in_one_sizepos (&TYPE_SIZE (type));
- free_lang_data_in_one_sizepos (&TYPE_SIZE_UNIT (type));
-
if (debug_info_level < DINFO_LEVEL_TERSE
|| (TYPE_CONTEXT (type)
&& TREE_CODE (TYPE_CONTEXT (type)) != FUNCTION_DECL
}
}
- free_lang_data_in_one_sizepos (&DECL_SIZE (decl));
- free_lang_data_in_one_sizepos (&DECL_SIZE_UNIT (decl));
- if (TREE_CODE (decl) == FIELD_DECL)
- free_lang_data_in_one_sizepos (&DECL_FIELD_OFFSET (decl));
+ /* ??? We could free non-constant DECL_SIZE, DECL_SIZE_UNIT
+ and DECL_FIELD_OFFSET. But it's cheap enough to not do
+ that and refrain from adding workarounds to dwarf2out.c */
/* DECL_FCONTEXT is only used for debug info generation. */
if (TREE_CODE (decl) == FIELD_DECL
fld_worklist_push (DECL_COMDAT_GROUP (t), fld);
}
- if ((TREE_CODE (t) == VAR_DECL || TREE_CODE (t) == PARM_DECL)
- && DECL_HAS_VALUE_EXPR_P (t))
- fld_worklist_push (DECL_VALUE_EXPR (t), fld);
-
if (TREE_CODE (t) != FIELD_DECL)
fld_worklist_push (TREE_CHAIN (t), fld);
*ws = 0;
return iterative_hash_expr (TREE_IMAGPART (t), val);
case VECTOR_CST:
return iterative_hash_expr (TREE_VECTOR_CST_ELTS (t), val);
+
case SSA_NAME:
- /* We can just compare by pointer. */
+ /* we can just compare by pointer. */
return iterative_hash_host_wide_int (SSA_NAME_VERSION (t), val);
- case PLACEHOLDER_EXPR:
- /* The node itself doesn't matter. */
- return val;
+
case TREE_LIST:
/* A list of expressions, for a CALL_EXPR or as the elements of a
VECTOR_CST. */
return true;
}
- case STRING_CST:
- {
- int i;
-
- /* We need to loop through all elements to handle cases like
- "\0" and "\0foobar". */
- for (i = 0; i < TREE_STRING_LENGTH (init); ++i)
- if (TREE_STRING_POINTER (init)[i] != '\0')
- return false;
-
- return true;
- }
-
default:
return false;
}