- tree dom = TYPE_DOMAIN (TREE_TYPE (op0));
-
- /* Test for index in range. Break if not. */
- if (!dom
- || (! TYPE_MIN_VALUE (dom)
- || ! really_constant_p (TYPE_MIN_VALUE (dom)))
- || (! TYPE_MAX_VALUE (dom)
- || ! really_constant_p (TYPE_MAX_VALUE (dom)))
- || (tree_int_cst_lt (op1, TYPE_MIN_VALUE (dom))
- || tree_int_cst_lt (TYPE_MAX_VALUE (dom), op1)))
- break;
+ if (bitfield_ref_p && elt == NULL_TREE
+ && (TREE_CODE (var) == ARRAY_REF
+ || TREE_CODE (var) == COMPONENT_REF))
+ elt = var;
+
+ if (TREE_CODE (var) == ARRAY_REF)
+ {
+ component_ref_only = 0;
+ var = TREE_OPERAND (var, 0);
+ }
+ else if (TREE_CODE (var) == COMPONENT_REF)
+ var = TREE_OPERAND (var, 0);
+ else if (INDIRECT_REF_P (var))
+ {
+ base = TREE_OPERAND (var, 0);
+ break;
+ }
+ else if (TREE_CODE (var) == VIEW_CONVERT_EXPR)
+ {
+ var = TREE_OPERAND (var, 0);
+ if (CONSTANT_CLASS_P (var)
+ && TREE_CODE (var) != STRING_CST)
+ return;
+ }
+ else
+ {
+ gcc_assert (TREE_CODE (var) == VAR_DECL
+ || TREE_CODE (var) == PARM_DECL
+ || TREE_CODE (var) == RESULT_DECL
+ || TREE_CODE (var) == STRING_CST);
+ /* Don't instrument this access if the underlying
+ variable is not "eligible". This test matches
+ those arrays that have only known-valid indexes,
+ and thus are not labeled TREE_ADDRESSABLE. */
+ if (! mf_decl_eligible_p (var) || component_ref_only)
+ return;
+ else
+ {
+ base = build1 (ADDR_EXPR,
+ build_pointer_type (TREE_TYPE (var)), var);
+ break;
+ }
+ }
+ }