1//===-- ubsan_offload_checks.inc --------------------------------*- C++ -*-===//
2//
3// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
4// See https://llvm.org/LICENSE.txt for license information.
5// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
6//
7//===----------------------------------------------------------------------===//
8//
9// Supported UBSan check kinds on the target device. Defines the channel ABI.
10//
11//===----------------------------------------------------------------------===//
12
13#ifndef UBSAN_OFFLOAD_HANDLER
14#error "ubsan_offload_checks.inc requires UBSAN_OFFLOAD_HANDLER"
15#endif
16#ifndef UBSAN_OFFLOAD_HANDLER_NORETURN
17#define UBSAN_OFFLOAD_HANDLER_NORETURN UBSAN_OFFLOAD_HANDLER
18#endif
19
20UBSAN_OFFLOAD_HANDLER(type_mismatch, type_mismatch_v1, "type mismatch",
21 sizeof(TypeMismatchData), 0, 1, 1, KL_None,
22 (TypeMismatchData * D, ValueHandle P), D, P)
23UBSAN_OFFLOAD_HANDLER(alignment_assumption, alignment_assumption,
24 "alignment assumption", sizeof(AlignmentAssumptionData),
25 0, 2, 1, KL_None,
26 (AlignmentAssumptionData * D, ValueHandle P,
27 ValueHandle A, ValueHandle O),
28 D, P, A, O)
29UBSAN_OFFLOAD_HANDLER(add_overflow, add_overflow, "integer overflow",
30 sizeof(OverflowData), 0, 1, 1, KL_None,
31 (OverflowData * D, ValueHandle L, ValueHandle R), D, L, R)
32UBSAN_OFFLOAD_HANDLER(sub_overflow, sub_overflow, "integer overflow",
33 sizeof(OverflowData), 0, 1, 1, KL_None,
34 (OverflowData * D, ValueHandle L, ValueHandle R), D, L, R)
35UBSAN_OFFLOAD_HANDLER(mul_overflow, mul_overflow, "integer overflow",
36 sizeof(OverflowData), 0, 1, 1, KL_None,
37 (OverflowData * D, ValueHandle L, ValueHandle R), D, L, R)
38UBSAN_OFFLOAD_HANDLER(negate_overflow, negate_overflow, "negation overflow",
39 sizeof(OverflowData), 0, 1, 1, KL_None,
40 (OverflowData * D, ValueHandle V), D, V)
41UBSAN_OFFLOAD_HANDLER(divrem_overflow, divrem_overflow, "division overflow",
42 sizeof(OverflowData), 0, 1, 1, KL_None,
43 (OverflowData * D, ValueHandle L, ValueHandle R), D, L, R)
44UBSAN_OFFLOAD_HANDLER(shift_out_of_bounds, shift_out_of_bounds,
45 "shift out of bounds", sizeof(ShiftOutOfBoundsData), 0, 1,
46 2, KL_None,
47 (ShiftOutOfBoundsData * D, ValueHandle L, ValueHandle R),
48 D, L, R)
49UBSAN_OFFLOAD_HANDLER(out_of_bounds, out_of_bounds, "array index out of bounds",
50 sizeof(OutOfBoundsData), 0, 1, 2, KL_None,
51 (OutOfBoundsData * D, ValueHandle I), D, I)
52UBSAN_OFFLOAD_HANDLER(local_out_of_bounds, local_out_of_bounds,
53 "local array index out of bounds", 0, 0, 0, 0, KL_NoData,
54 (void), nullptr)
55UBSAN_OFFLOAD_HANDLER(vla_bound_not_positive, vla_bound_not_positive,
56 "non-positive VLA bound", sizeof(VLABoundData), 0, 1, 1,
57 KL_None, (VLABoundData * D, ValueHandle B), D, B)
58UBSAN_OFFLOAD_HANDLER(float_cast_overflow, float_cast_overflow,
59 "float cast overflow", sizeof(FloatCastOverflowDataV2), 0,
60 1, 2, KL_FloatCast, (void *D, ValueHandle F), D, F)
61UBSAN_OFFLOAD_HANDLER(load_invalid_value, load_invalid_value,
62 "invalid value load", sizeof(InvalidValueData), 0, 1, 1,
63 KL_None, (InvalidValueData * D, ValueHandle V), D, V)
64UBSAN_OFFLOAD_HANDLER(
65 implicit_conversion, implicit_conversion, "implicit conversion",
66 sizeof(ImplicitConversionData), 0, 1, 2, KL_None,
67 (ImplicitConversionData * D, ValueHandle S, ValueHandle T), D, S, T)
68UBSAN_OFFLOAD_HANDLER(invalid_builtin, invalid_builtin, "invalid builtin",
69 sizeof(InvalidBuiltinData), 0, 1, 0, KL_None,
70 (InvalidBuiltinData * D), D)
71UBSAN_OFFLOAD_HANDLER(invalid_objc_cast, invalid_objc_cast, "invalid ObjC cast",
72 sizeof(InvalidObjCCast), 0, 1, 1, KL_None,
73 (InvalidObjCCast * D, ValueHandle P), D, P)
74UBSAN_OFFLOAD_HANDLER(nonnull_arg, nonnull_arg, "null argument",
75 sizeof(NonNullArgData), 0, 2, 0, KL_None,
76 (NonNullArgData * D), D)
77UBSAN_OFFLOAD_HANDLER(nullability_arg, nullability_arg, "null argument",
78 sizeof(NonNullArgData), 0, 2, 0, KL_None,
79 (NonNullArgData * D), D)
80UBSAN_OFFLOAD_HANDLER(nonnull_return, nonnull_return_v1, "null return",
81 sizeof(NonNullReturnData), 0, 1, 0, KL_ExtraLoc,
82 (NonNullReturnData * D, SourceLocation *L), D,
83 reinterpret_cast<ValueHandle>(L))
84UBSAN_OFFLOAD_HANDLER(nullability_return, nullability_return_v1, "null return",
85 sizeof(NonNullReturnData), 0, 1, 0, KL_ExtraLoc,
86 (NonNullReturnData * D, SourceLocation *L), D,
87 reinterpret_cast<ValueHandle>(L))
88UBSAN_OFFLOAD_HANDLER(pointer_overflow, pointer_overflow, "pointer overflow",
89 sizeof(PointerOverflowData), 0, 1, 0, KL_None,
90 (PointerOverflowData * D, ValueHandle B, ValueHandle R),
91 D, B, R)
92UBSAN_OFFLOAD_HANDLER(function_type_mismatch, function_type_mismatch,
93 "function type mismatch",
94 sizeof(FunctionTypeMismatchData), 0, 1, 1, KL_None,
95 (FunctionTypeMismatchData * D, ValueHandle V), D, V)
96UBSAN_OFFLOAD_HANDLER(cfi_check_fail, cfi_check_fail,
97 "control flow integrity failure",
98 sizeof(CFICheckFailData), kCFILocOff, 1, 1, KL_None,
99 (CFICheckFailData * D, ValueHandle F, uptr V), D, F, V)
100UBSAN_OFFLOAD_HANDLER_NORETURN(builtin_unreachable, builtin_unreachable,
101 "unreachable code reached",
102 sizeof(UnreachableData), 0, 1, 0, KL_None,
103 (UnreachableData * D), D)
104UBSAN_OFFLOAD_HANDLER_NORETURN(missing_return, missing_return, "missing return",
105 sizeof(UnreachableData), 0, 1, 0, KL_None,
106 (UnreachableData * D), D)
107
108#undef UBSAN_OFFLOAD_HANDLER
109#undef UBSAN_OFFLOAD_HANDLER_NORETURN
110