@@ -127,62 +127,46 @@ void NORETURN CheckFailed(const char *file, int, const char *cond, u64, u64) {
127127
128128#define INTERFACE extern " C" __attribute__((visibility(" default" )))
129129
130- #define HANDLER_RECOVER (name, kind ) \
130+ #define UBSAN_HANDLER_RECOVER (name, kind ) \
131131 INTERFACE void __ubsan_handle_##name##_minimal() { \
132132 __ubsan_report_error (kind, GET_CALLER_PC (), nullptr ); \
133+ } \
134+ INTERFACE void __ubsan_handle_##name##_minimal_preserve() \
135+ [[clang::preserve_all]] { \
136+ __ubsan_report_error (kind, GET_CALLER_PC (), nullptr ); \
133137 }
134138
135- #define HANDLER_NORECOVER (name, kind ) \
139+ #define UBSAN_HANDLER_NORECOVER (name, kind ) \
136140 INTERFACE void __ubsan_handle_##name##_minimal_abort() { \
137141 uintptr_t caller = GET_CALLER_PC (); \
138142 __ubsan_report_error_fatal (kind, caller, nullptr ); \
139143 abort_with_message (kind, caller, nullptr ); \
140144 }
141145
142- #define HANDLER (name, kind ) \
143- HANDLER_RECOVER (name, kind) \
144- HANDLER_NORECOVER (name, kind)
146+ #define UBSAN_HANDLER (name, kind ) \
147+ UBSAN_HANDLER_RECOVER (name, kind) \
148+ UBSAN_HANDLER_NORECOVER (name, kind)
145149
146- #define HANDLER_RECOVER_PTR (name, kind ) \
150+ #define UBSAN_HANDLER_RECOVER_PTR (name, kind ) \
147151 INTERFACE void __ubsan_handle_##name##_minimal(const uintptr_t address) { \
148152 __ubsan_report_error (kind, GET_CALLER_PC (), &address); \
153+ } \
154+ INTERFACE void __ubsan_handle_##name##_minimal_preserve( \
155+ const uintptr_t address) [[clang::preserve_all]] { \
156+ __ubsan_report_error (kind, GET_CALLER_PC (), &address); \
149157 }
150158
151- #define HANDLER_NORECOVER_PTR (name, kind ) \
159+ #define UBSAN_HANDLER_NORECOVER_PTR (name, kind ) \
152160 INTERFACE void __ubsan_handle_##name##_minimal_abort( \
153161 const uintptr_t address) { \
154162 uintptr_t caller = GET_CALLER_PC (); \
155163 __ubsan_report_error_fatal (kind, caller, &address); \
156164 abort_with_message (kind, caller, &address); \
157165 }
158166
159- // A version of a handler that takes a pointer to a value.
160- #define HANDLER_PTR (name, kind ) \
161- HANDLER_RECOVER_PTR (name, kind) \
162- HANDLER_NORECOVER_PTR(name, kind)
163-
164- HANDLER_PTR(type_mismatch, " type-mismatch" )
165- HANDLER(alignment_assumption, " alignment-assumption" )
166- HANDLER(add_overflow, " add-overflow" )
167- HANDLER(sub_overflow, " sub-overflow" )
168- HANDLER(mul_overflow, " mul-overflow" )
169- HANDLER(negate_overflow, " negate-overflow" )
170- HANDLER(divrem_overflow, " divrem-overflow" )
171- HANDLER(shift_out_of_bounds, " shift-out-of-bounds" )
172- HANDLER(out_of_bounds, " out-of-bounds" )
173- HANDLER(local_out_of_bounds, " local-out-of-bounds" )
174- HANDLER_RECOVER(builtin_unreachable, " builtin-unreachable" )
175- HANDLER_RECOVER(missing_return, " missing-return" )
176- HANDLER(vla_bound_not_positive, " vla-bound-not-positive" )
177- HANDLER(float_cast_overflow, " float-cast-overflow" )
178- HANDLER(load_invalid_value, " load-invalid-value" )
179- HANDLER(invalid_builtin, " invalid-builtin" )
180- HANDLER(invalid_objc_cast, " invalid-objc-cast" )
181- HANDLER(function_type_mismatch, " function-type-mismatch" )
182- HANDLER(implicit_conversion, " implicit-conversion" )
183- HANDLER(nonnull_arg, " nonnull-arg" )
184- HANDLER(nonnull_return, " nonnull-return" )
185- HANDLER(nullability_arg, " nullability-arg" )
186- HANDLER(nullability_return, " nullability-return" )
187- HANDLER(pointer_overflow, " pointer-overflow" )
188- HANDLER(cfi_check_fail, " cfi-check-fail" )
167+ // A version of a UBSAN_HANDLER that takes a pointer to a value.
168+ #define UBSAN_HANDLER_PTR (name, kind ) \
169+ UBSAN_HANDLER_RECOVER_PTR (name, kind) \
170+ UBSAN_HANDLER_NORECOVER_PTR(name, kind)
171+
172+ #include " UbsanMinimalHandlers.inc"
0 commit comments