16ebe45146a2d93eb010b9bb5ea34cb94c6900f83Richard Smith//===-- ubsan_handlers.h ----------------------------------------*- C++ -*-===//
26ebe45146a2d93eb010b9bb5ea34cb94c6900f83Richard Smith//
36ebe45146a2d93eb010b9bb5ea34cb94c6900f83Richard Smith//                     The LLVM Compiler Infrastructure
46ebe45146a2d93eb010b9bb5ea34cb94c6900f83Richard Smith//
56ebe45146a2d93eb010b9bb5ea34cb94c6900f83Richard Smith// This file is distributed under the University of Illinois Open Source
66ebe45146a2d93eb010b9bb5ea34cb94c6900f83Richard Smith// License. See LICENSE.TXT for details.
76ebe45146a2d93eb010b9bb5ea34cb94c6900f83Richard Smith//
86ebe45146a2d93eb010b9bb5ea34cb94c6900f83Richard Smith//===----------------------------------------------------------------------===//
96ebe45146a2d93eb010b9bb5ea34cb94c6900f83Richard Smith//
106ebe45146a2d93eb010b9bb5ea34cb94c6900f83Richard Smith// Entry points to the runtime library for Clang's undefined behavior sanitizer.
116ebe45146a2d93eb010b9bb5ea34cb94c6900f83Richard Smith//
126ebe45146a2d93eb010b9bb5ea34cb94c6900f83Richard Smith//===----------------------------------------------------------------------===//
136ebe45146a2d93eb010b9bb5ea34cb94c6900f83Richard Smith#ifndef UBSAN_HANDLERS_H
146ebe45146a2d93eb010b9bb5ea34cb94c6900f83Richard Smith#define UBSAN_HANDLERS_H
156ebe45146a2d93eb010b9bb5ea34cb94c6900f83Richard Smith
166ebe45146a2d93eb010b9bb5ea34cb94c6900f83Richard Smith#include "ubsan_value.h"
176ebe45146a2d93eb010b9bb5ea34cb94c6900f83Richard Smith
186ebe45146a2d93eb010b9bb5ea34cb94c6900f83Richard Smithnamespace __ubsan {
196ebe45146a2d93eb010b9bb5ea34cb94c6900f83Richard Smith
206ebe45146a2d93eb010b9bb5ea34cb94c6900f83Richard Smithstruct TypeMismatchData {
216ebe45146a2d93eb010b9bb5ea34cb94c6900f83Richard Smith  SourceLocation Loc;
226ebe45146a2d93eb010b9bb5ea34cb94c6900f83Richard Smith  const TypeDescriptor &Type;
236ebe45146a2d93eb010b9bb5ea34cb94c6900f83Richard Smith  uptr Alignment;
246ebe45146a2d93eb010b9bb5ea34cb94c6900f83Richard Smith  unsigned char TypeCheckKind;
256ebe45146a2d93eb010b9bb5ea34cb94c6900f83Richard Smith};
266ebe45146a2d93eb010b9bb5ea34cb94c6900f83Richard Smith
27a82a5d360b19080f2b1beae374c12d4f26146450Will Dietz#define RECOVERABLE(checkname, ...) \
28a44110995241d30a886d711cbc33f65269b170eaWill Dietz  extern "C" SANITIZER_INTERFACE_ATTRIBUTE \
29a44110995241d30a886d711cbc33f65269b170eaWill Dietz    void __ubsan_handle_ ## checkname( __VA_ARGS__ ); \
30a44110995241d30a886d711cbc33f65269b170eaWill Dietz  extern "C" SANITIZER_INTERFACE_ATTRIBUTE \
31a44110995241d30a886d711cbc33f65269b170eaWill Dietz    void __ubsan_handle_ ## checkname ## _abort( __VA_ARGS__ );
32a82a5d360b19080f2b1beae374c12d4f26146450Will Dietz
336ebe45146a2d93eb010b9bb5ea34cb94c6900f83Richard Smith/// \brief Handle a runtime type check failure, caused by either a misaligned
346ebe45146a2d93eb010b9bb5ea34cb94c6900f83Richard Smith/// pointer, a null pointer, or a pointer to insufficient storage for the
356ebe45146a2d93eb010b9bb5ea34cb94c6900f83Richard Smith/// type.
36a82a5d360b19080f2b1beae374c12d4f26146450Will DietzRECOVERABLE(type_mismatch, TypeMismatchData *Data, ValueHandle Pointer)
376ebe45146a2d93eb010b9bb5ea34cb94c6900f83Richard Smith
386ebe45146a2d93eb010b9bb5ea34cb94c6900f83Richard Smithstruct OverflowData {
396ebe45146a2d93eb010b9bb5ea34cb94c6900f83Richard Smith  SourceLocation Loc;
406ebe45146a2d93eb010b9bb5ea34cb94c6900f83Richard Smith  const TypeDescriptor &Type;
416ebe45146a2d93eb010b9bb5ea34cb94c6900f83Richard Smith};
426ebe45146a2d93eb010b9bb5ea34cb94c6900f83Richard Smith
4380af605afd0e92a2a128c81898f647207f384e08Will Dietz/// \brief Handle an integer addition overflow.
44a82a5d360b19080f2b1beae374c12d4f26146450Will DietzRECOVERABLE(add_overflow, OverflowData *Data, ValueHandle LHS, ValueHandle RHS)
45a82a5d360b19080f2b1beae374c12d4f26146450Will Dietz
4680af605afd0e92a2a128c81898f647207f384e08Will Dietz/// \brief Handle an integer subtraction overflow.
47a82a5d360b19080f2b1beae374c12d4f26146450Will DietzRECOVERABLE(sub_overflow, OverflowData *Data, ValueHandle LHS, ValueHandle RHS)
48a82a5d360b19080f2b1beae374c12d4f26146450Will Dietz
4980af605afd0e92a2a128c81898f647207f384e08Will Dietz/// \brief Handle an integer multiplication overflow.
50a82a5d360b19080f2b1beae374c12d4f26146450Will DietzRECOVERABLE(mul_overflow, OverflowData *Data, ValueHandle LHS, ValueHandle RHS)
51a82a5d360b19080f2b1beae374c12d4f26146450Will Dietz
526ebe45146a2d93eb010b9bb5ea34cb94c6900f83Richard Smith/// \brief Handle a signed integer overflow for a unary negate operator.
53a82a5d360b19080f2b1beae374c12d4f26146450Will DietzRECOVERABLE(negate_overflow, OverflowData *Data, ValueHandle OldVal)
54a82a5d360b19080f2b1beae374c12d4f26146450Will Dietz
556ebe45146a2d93eb010b9bb5ea34cb94c6900f83Richard Smith/// \brief Handle an INT_MIN/-1 overflow or division by zero.
56a82a5d360b19080f2b1beae374c12d4f26146450Will DietzRECOVERABLE(divrem_overflow, OverflowData *Data,
57a82a5d360b19080f2b1beae374c12d4f26146450Will Dietz            ValueHandle LHS, ValueHandle RHS)
586ebe45146a2d93eb010b9bb5ea34cb94c6900f83Richard Smith
596ebe45146a2d93eb010b9bb5ea34cb94c6900f83Richard Smithstruct ShiftOutOfBoundsData {
606ebe45146a2d93eb010b9bb5ea34cb94c6900f83Richard Smith  SourceLocation Loc;
616ebe45146a2d93eb010b9bb5ea34cb94c6900f83Richard Smith  const TypeDescriptor &LHSType;
626ebe45146a2d93eb010b9bb5ea34cb94c6900f83Richard Smith  const TypeDescriptor &RHSType;
636ebe45146a2d93eb010b9bb5ea34cb94c6900f83Richard Smith};
646ebe45146a2d93eb010b9bb5ea34cb94c6900f83Richard Smith
656ebe45146a2d93eb010b9bb5ea34cb94c6900f83Richard Smith/// \brief Handle a shift where the RHS is out of bounds or a left shift where
666ebe45146a2d93eb010b9bb5ea34cb94c6900f83Richard Smith/// the LHS is negative or overflows.
67a82a5d360b19080f2b1beae374c12d4f26146450Will DietzRECOVERABLE(shift_out_of_bounds, ShiftOutOfBoundsData *Data,
68a82a5d360b19080f2b1beae374c12d4f26146450Will Dietz            ValueHandle LHS, ValueHandle RHS)
696ebe45146a2d93eb010b9bb5ea34cb94c6900f83Richard Smith
70a0b1e21d72429c3672115b3ddc85240e3b7ac88bRichard Smithstruct OutOfBoundsData {
71a0b1e21d72429c3672115b3ddc85240e3b7ac88bRichard Smith  SourceLocation Loc;
72a0b1e21d72429c3672115b3ddc85240e3b7ac88bRichard Smith  const TypeDescriptor &ArrayType;
73a0b1e21d72429c3672115b3ddc85240e3b7ac88bRichard Smith  const TypeDescriptor &IndexType;
74a0b1e21d72429c3672115b3ddc85240e3b7ac88bRichard Smith};
75a0b1e21d72429c3672115b3ddc85240e3b7ac88bRichard Smith
76a0b1e21d72429c3672115b3ddc85240e3b7ac88bRichard Smith/// \brief Handle an array index out of bounds error.
77a0b1e21d72429c3672115b3ddc85240e3b7ac88bRichard SmithRECOVERABLE(out_of_bounds, OutOfBoundsData *Data, ValueHandle Index)
78a0b1e21d72429c3672115b3ddc85240e3b7ac88bRichard Smith
796ebe45146a2d93eb010b9bb5ea34cb94c6900f83Richard Smithstruct UnreachableData {
806ebe45146a2d93eb010b9bb5ea34cb94c6900f83Richard Smith  SourceLocation Loc;
816ebe45146a2d93eb010b9bb5ea34cb94c6900f83Richard Smith};
826ebe45146a2d93eb010b9bb5ea34cb94c6900f83Richard Smith
836ebe45146a2d93eb010b9bb5ea34cb94c6900f83Richard Smith/// \brief Handle a __builtin_unreachable which is reached.
84a44110995241d30a886d711cbc33f65269b170eaWill Dietzextern "C" SANITIZER_INTERFACE_ATTRIBUTE
85a44110995241d30a886d711cbc33f65269b170eaWill Dietzvoid __ubsan_handle_builtin_unreachable(UnreachableData *Data);
866ebe45146a2d93eb010b9bb5ea34cb94c6900f83Richard Smith/// \brief Handle reaching the end of a value-returning function.
87a44110995241d30a886d711cbc33f65269b170eaWill Dietzextern "C" SANITIZER_INTERFACE_ATTRIBUTE
88a44110995241d30a886d711cbc33f65269b170eaWill Dietzvoid __ubsan_handle_missing_return(UnreachableData *Data);
896ebe45146a2d93eb010b9bb5ea34cb94c6900f83Richard Smith
90b04caf1385a4279a7b95d41c3ccefc61842c3633Richard Smithstruct VLABoundData {
91b04caf1385a4279a7b95d41c3ccefc61842c3633Richard Smith  SourceLocation Loc;
92b04caf1385a4279a7b95d41c3ccefc61842c3633Richard Smith  const TypeDescriptor &Type;
93b04caf1385a4279a7b95d41c3ccefc61842c3633Richard Smith};
94b04caf1385a4279a7b95d41c3ccefc61842c3633Richard Smith
95b04caf1385a4279a7b95d41c3ccefc61842c3633Richard Smith/// \brief Handle a VLA with a non-positive bound.
96a82a5d360b19080f2b1beae374c12d4f26146450Will DietzRECOVERABLE(vla_bound_not_positive, VLABoundData *Data, ValueHandle Bound)
97b04caf1385a4279a7b95d41c3ccefc61842c3633Richard Smith
9858561700a4abad310911a24a867da49a14fae91eRichard Smithstruct FloatCastOverflowData {
9958561700a4abad310911a24a867da49a14fae91eRichard Smith  // FIXME: SourceLocation Loc;
10058561700a4abad310911a24a867da49a14fae91eRichard Smith  const TypeDescriptor &FromType;
10158561700a4abad310911a24a867da49a14fae91eRichard Smith  const TypeDescriptor &ToType;
10258561700a4abad310911a24a867da49a14fae91eRichard Smith};
10358561700a4abad310911a24a867da49a14fae91eRichard Smith
10458561700a4abad310911a24a867da49a14fae91eRichard Smith/// \brief Handle overflow in a conversion to or from a floating-point type.
105a82a5d360b19080f2b1beae374c12d4f26146450Will DietzRECOVERABLE(float_cast_overflow, FloatCastOverflowData *Data, ValueHandle From)
10658561700a4abad310911a24a867da49a14fae91eRichard Smith
107f2d77d03b75733139c9f0896162bbc7a6fc38385Richard Smithstruct InvalidValueData {
108f2d77d03b75733139c9f0896162bbc7a6fc38385Richard Smith  // FIXME: SourceLocation Loc;
109f2d77d03b75733139c9f0896162bbc7a6fc38385Richard Smith  const TypeDescriptor &Type;
110f2d77d03b75733139c9f0896162bbc7a6fc38385Richard Smith};
111f2d77d03b75733139c9f0896162bbc7a6fc38385Richard Smith
112f2d77d03b75733139c9f0896162bbc7a6fc38385Richard Smith/// \brief Handle a load of an invalid value for the type.
113f2d77d03b75733139c9f0896162bbc7a6fc38385Richard SmithRECOVERABLE(load_invalid_value, InvalidValueData *Data, ValueHandle Val)
114f2d77d03b75733139c9f0896162bbc7a6fc38385Richard Smith
1156ebe45146a2d93eb010b9bb5ea34cb94c6900f83Richard Smith}
1166ebe45146a2d93eb010b9bb5ea34cb94c6900f83Richard Smith
1176ebe45146a2d93eb010b9bb5ea34cb94c6900f83Richard Smith#endif // UBSAN_HANDLERS_H
118