/* Check whether the given decl, generally a VAR_DECL or PARM_DECL, is eligible for instrumentation. For the mudflap1 pass, this implies that it should be registered with the libmudflap runtime. For the mudflap2 pass this means instrumenting an indirection operation with respect to the object. */ static int mf_decl_eligible_p (tree decl) { return ((TREE_CODE (decl) == VAR_DECL || TREE_CODE (decl) == PARM_DECL) /* The decl must have its address taken. In the case of arrays, this flag is also set if the indexes are not compile-time known valid constants. */ && TREE_ADDRESSABLE (decl) /* XXX: not sufficient: return-by-value structs! */ /* The type of the variable must be complete. */ && COMPLETE_OR_VOID_TYPE_P (TREE_TYPE (decl)) /* The decl hasn't been decomposed somehow. */ && !DECL_HAS_VALUE_EXPR_P (decl)); }
static bool target_incomplete_p (tree type) { while (true) if (TYPE_PTRMEM_P (type)) { if (!COMPLETE_TYPE_P (TYPE_PTRMEM_CLASS_TYPE (type))) return true; type = TYPE_PTRMEM_POINTED_TO_TYPE (type); } else if (TREE_CODE (type) == POINTER_TYPE) type = TREE_TYPE (type); else return !COMPLETE_OR_VOID_TYPE_P (type); }