void ubsan_maybe_instrument_reference (tree stmt) { tree op = TREE_OPERAND (stmt, 0); op = ubsan_maybe_instrument_reference_or_call (EXPR_LOCATION (stmt), op, TREE_TYPE (stmt), UBSAN_REF_BINDING); if (op) TREE_OPERAND (stmt, 0) = op; }
void ubsan_maybe_instrument_member_call (tree stmt, bool is_ctor) { if (call_expr_nargs (stmt) == 0) return; tree op = CALL_EXPR_ARG (stmt, 0); if (op == error_mark_node || !POINTER_TYPE_P (TREE_TYPE (op))) return; op = ubsan_maybe_instrument_reference_or_call (EXPR_LOCATION (stmt), op, TREE_TYPE (op), is_ctor ? UBSAN_CTOR_CALL : UBSAN_MEMBER_CALL); if (op) CALL_EXPR_ARG (stmt, 0) = op; }
void ubsan_maybe_instrument_reference (tree *stmt_p) { tree stmt = *stmt_p; tree op = stmt; if (TREE_CODE (stmt) == NOP_EXPR) op = TREE_OPERAND (stmt, 0); op = ubsan_maybe_instrument_reference_or_call (EXPR_LOCATION (stmt), op, TREE_TYPE (stmt), UBSAN_REF_BINDING); if (op) { if (TREE_CODE (stmt) == NOP_EXPR) TREE_OPERAND (stmt, 0) = op; else *stmt_p = op; } }