ubsan_handlers.cc revision a0b1e21d72429c3672115b3ddc85240e3b7ac88b
15821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)//===-- ubsan_handlers.cc -------------------------------------------------===//
25821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)//
35821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)//                     The LLVM Compiler Infrastructure
45821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)//
55821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// This file is distributed under the University of Illinois Open Source
65821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// License. See LICENSE.TXT for details.
75821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)//
85821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)//===----------------------------------------------------------------------===//
95821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)//
105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Error logging entry points for the UBSan runtime.
115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)//
125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)//===----------------------------------------------------------------------===//
13868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)
14f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)#include "ubsan_handlers.h"
155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ubsan_diag.h"
16cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
17868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)#include "sanitizer_common/sanitizer_common.h"
185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
195d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)using namespace __sanitizer;
202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)using namespace __ubsan;
215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace __ubsan {
235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const char *TypeCheckKinds[] = {
245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    "load of", "store to", "reference binding to", "member access within",
255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    "member call on", "constructor call on", "downcast of", "downcast of"
265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  };
275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static void handleTypeMismatchImpl(TypeMismatchData *Data, ValueHandle Pointer,
305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                   Location FallbackLoc) {
315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  Location Loc = Data->Loc.acquire();
32c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Use the SourceLocation from Data to track deduplication, even if 'invalid'
345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (Loc.getSourceLocation().isDisabled())
355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return;
362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  if (Data->Loc.isInvalid())
375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    Loc = FallbackLoc;
385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (!Pointer)
405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    Diag(Loc, DL_Error, "%0 null pointer of type %1")
415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      << TypeCheckKinds[Data->TypeCheckKind] << Data->Type;
425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  else if (Data->Alignment && (Pointer & (Data->Alignment - 1)))
435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    Diag(Loc, DL_Error, "%0 misaligned address %1 for type %3, "
442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                        "which requires %2 byte alignment")
455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      << TypeCheckKinds[Data->TypeCheckKind] << (void*)Pointer
465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      << Data->Alignment << Data->Type;
475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  else
480529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch    Diag(Loc, DL_Error, "%0 address %1 with insufficient space "
490529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch                        "for an object of type %2")
500529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch      << TypeCheckKinds[Data->TypeCheckKind] << (void*)Pointer << Data->Type;
510529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch  if (Pointer)
525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    Diag(Pointer, DL_Note, "pointer points here");
532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
54cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)void __ubsan::__ubsan_handle_type_mismatch(TypeMismatchData *Data,
555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                           ValueHandle Pointer) {
565f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  handleTypeMismatchImpl(Data, Pointer, getCallerLocation());
575f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)}
585f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)void __ubsan::__ubsan_handle_type_mismatch_abort(TypeMismatchData *Data,
595f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)                                                 ValueHandle Pointer) {
605f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  handleTypeMismatchImpl(Data, Pointer, getCallerLocation());
615f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  Die();
625f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)}
635f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
645f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)/// \brief Common diagnostic emission for various forms of integer overflow.
655d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)template<typename T> static void HandleIntegerOverflow(OverflowData *Data,
665d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)                                                       ValueHandle LHS,
675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                                       const char *Operator,
685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                                       T RHS) {
695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  SourceLocation Loc = Data->Loc.acquire();
705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (Loc.isDisabled())
715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return;
725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  Diag(Loc, DL_Error, "%0 integer overflow: "
745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                      "%1 %2 %3 cannot be represented in type %4")
752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    << (Data->Type.isSignedIntegerTy() ? "signed" : "unsigned")
761e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)    << Value(Data->Type, LHS) << Operator << RHS << Data->Type;
77cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)}
781320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void __ubsan::__ubsan_handle_add_overflow(OverflowData *Data,
805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                          ValueHandle LHS, ValueHandle RHS) {
815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  HandleIntegerOverflow(Data, LHS, "+", Value(Data->Type, RHS));
821320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci}
83424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)void __ubsan::__ubsan_handle_add_overflow_abort(OverflowData *Data,
84424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)                                                 ValueHandle LHS,
851320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci                                                 ValueHandle RHS) {
86424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)  __ubsan_handle_add_overflow(Data, LHS, RHS);
87424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)  Die();
88424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)}
891320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
901320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tuccivoid __ubsan::__ubsan_handle_sub_overflow(OverflowData *Data,
911320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci                                          ValueHandle LHS, ValueHandle RHS) {
921320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  HandleIntegerOverflow(Data, LHS, "-", Value(Data->Type, RHS));
931320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci}
941320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tuccivoid __ubsan::__ubsan_handle_sub_overflow_abort(OverflowData *Data,
951320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci                                                 ValueHandle LHS,
961320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci                                                 ValueHandle RHS) {
976e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  __ubsan_handle_sub_overflow(Data, LHS, RHS);
986e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  Die();
995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void __ubsan::__ubsan_handle_mul_overflow(OverflowData *Data,
1025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                          ValueHandle LHS, ValueHandle RHS) {
103f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  HandleIntegerOverflow(Data, LHS, "*", Value(Data->Type, RHS));
104f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)}
105f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)void __ubsan::__ubsan_handle_mul_overflow_abort(OverflowData *Data,
1065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                                 ValueHandle LHS,
1072a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                                                 ValueHandle RHS) {
1085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  __ubsan_handle_mul_overflow(Data, LHS, RHS);
1097dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  Die();
1101320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci}
1111320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
1127dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdochvoid __ubsan::__ubsan_handle_negate_overflow(OverflowData *Data,
1131320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci                                             ValueHandle OldVal) {
1141320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  SourceLocation Loc = Data->Loc.acquire();
115424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)  if (Loc.isDisabled())
116424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)    return;
117424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)
1185d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  if (Data->Type.isSignedIntegerTy())
1195d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    Diag(Loc, DL_Error,
1205d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)         "negation of %0 cannot be represented in type %1; "
1215d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)         "cast to an unsigned type to negate this value to itself")
1222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      << Value(Data->Type, OldVal) << Data->Type;
1235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  else
1245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    Diag(Loc, DL_Error,
1255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         "negation of %0 cannot be represented in type %1")
1265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      << Value(Data->Type, OldVal) << Data->Type;
1275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
128a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)void __ubsan::__ubsan_handle_negate_overflow_abort(OverflowData *Data,
129a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)                                                    ValueHandle OldVal) {
1302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  __ubsan_handle_negate_overflow(Data, OldVal);
1312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  Die();
132a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)}
1335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
134a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)void __ubsan::__ubsan_handle_divrem_overflow(OverflowData *Data,
1351320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci                                             ValueHandle LHS, ValueHandle RHS) {
1361320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  SourceLocation Loc = Data->Loc.acquire();
137a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  if (Loc.isDisabled())
1387dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch    return;
1397d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)
1405d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  Value LHSVal(Data->Type, LHS);
1415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  Value RHSVal(Data->Type, RHS);
1425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (RHSVal.isMinusOne())
1435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    Diag(Loc, DL_Error,
1445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         "division of %0 by -1 cannot be represented in type %1")
1455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      << LHSVal << Data->Type;
1465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  else
1475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    Diag(Loc, DL_Error, "division by zero");
1485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void __ubsan::__ubsan_handle_divrem_overflow_abort(OverflowData *Data,
1505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                                    ValueHandle LHS,
151a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)                                                    ValueHandle RHS) {
152a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  __ubsan_handle_divrem_overflow(Data, LHS, RHS);
1531320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  Die();
1541320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci}
1551320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
1561320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tuccivoid __ubsan::__ubsan_handle_shift_out_of_bounds(ShiftOutOfBoundsData *Data,
1571320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci                                                 ValueHandle LHS,
1581320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci                                                 ValueHandle RHS) {
1591320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  SourceLocation Loc = Data->Loc.acquire();
160424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)  if (Loc.isDisabled())
161868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)    return;
162a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)
1635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  Value LHSVal(Data->LHSType, LHS);
1645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  Value RHSVal(Data->RHSType, RHS);
1655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (RHSVal.isNegative())
1665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    Diag(Loc, DL_Error, "shift exponent %0 is negative") << RHSVal;
1675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  else if (RHSVal.getPositiveIntValue() >= Data->LHSType.getIntegerBitWidth())
1685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    Diag(Loc, DL_Error,
1695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         "shift exponent %0 is too large for %1-bit type %2")
1705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      << RHSVal << Data->LHSType.getIntegerBitWidth() << Data->LHSType;
1715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  else if (LHSVal.isNegative())
1725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    Diag(Loc, DL_Error, "left shift of negative value %0") << LHSVal;
1735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  else
1745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    Diag(Loc, DL_Error,
1755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         "left shift of %0 by %1 places cannot be represented in type %2")
176868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)      << LHSVal << RHSVal << Data->LHSType;
177868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)}
178868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)void __ubsan::__ubsan_handle_shift_out_of_bounds_abort(
179868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)                                                     ShiftOutOfBoundsData *Data,
180868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)                                                     ValueHandle LHS,
1815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                                     ValueHandle RHS) {
1825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  __ubsan_handle_shift_out_of_bounds(Data, LHS, RHS);
1835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  Die();
1845d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)}
1855d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
1865d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)void __ubsan::__ubsan_handle_out_of_bounds(OutOfBoundsData *Data,
1871320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci                                           ValueHandle Index) {
1885d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  SourceLocation Loc = Data->Loc.acquire();
1895d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  if (Loc.isDisabled())
1905d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    return;
1915d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
1925d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  Value IndexVal(Data->IndexType, Index);
1935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  Diag(Loc, DL_Error, "index %0 out of bounds for type %1")
194f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)    << IndexVal << Data->ArrayType;
195f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)}
1961320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tuccivoid __ubsan::__ubsan_handle_out_of_bounds_abort(OutOfBoundsData *Data,
1971320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci                                                 ValueHandle Index) {
1981320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  __ubsan_handle_out_of_bounds(Data, Index);
1991320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  Die();
2001320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci}
2011320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
2021320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tuccivoid __ubsan::__ubsan_handle_builtin_unreachable(UnreachableData *Data) {
2031320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  Diag(Data->Loc, DL_Error, "execution reached a __builtin_unreachable() call");
2041320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  Die();
205f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)}
206f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)
2071320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tuccivoid __ubsan::__ubsan_handle_missing_return(UnreachableData *Data) {
2081320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  Diag(Data->Loc, DL_Error,
2091320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci       "execution reached the end of a value-returning function "
2101320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci       "without returning a value");
2111320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  Die();
2121320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci}
2131320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
214868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)void __ubsan::__ubsan_handle_vla_bound_not_positive(VLABoundData *Data,
215868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)                                                    ValueHandle Bound) {
2165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  SourceLocation Loc = Data->Loc.acquire();
2172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  if (Loc.isDisabled())
2185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return;
2195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2201320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  Diag(Loc, DL_Error, "variable length array bound evaluates to "
2211320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci                      "non-positive value %0")
2221320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    << Value(Data->Type, Bound);
2231320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci}
224424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)void __ubsan::__ubsan_handle_vla_bound_not_positive_abort(VLABoundData *Data,
2255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                                           ValueHandle Bound) {
2265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  __ubsan_handle_vla_bound_not_positive(Data, Bound);
2275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  Die();
2285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
2295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void __ubsan::__ubsan_handle_float_cast_overflow(FloatCastOverflowData *Data,
2325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                                 ValueHandle From) {
2335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // TODO: Add deduplication once a SourceLocation is generated for this check.
2345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  Diag(getCallerLocation(), DL_Error,
2355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)       "value %0 is outside the range of representable values of type %2")
2365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    << Value(Data->FromType, From) << Data->FromType << Data->ToType;
2375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
2385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void __ubsan::__ubsan_handle_float_cast_overflow_abort(
2395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                                    FloatCastOverflowData *Data,
240868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)                                                    ValueHandle From) {
241a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  Diag(getCallerLocation(), DL_Error,
242a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)       "value %0 is outside the range of representable values of type %2")
243a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)    << Value(Data->FromType, From) << Data->FromType << Data->ToType;
244a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  Die();
2455d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)}
2465d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
2475d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)void __ubsan::__ubsan_handle_load_invalid_value(InvalidValueData *Data,
2485d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)                                                ValueHandle Val) {
249868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  // TODO: Add deduplication once a SourceLocation is generated for this check.
2505d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  Diag(getCallerLocation(), DL_Error,
2515d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)       "load of value %0, which is not a valid value for type %1")
252f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)    << Value(Data->Type, Val) << Data->Type;
253f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)}
2545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void __ubsan::__ubsan_handle_load_invalid_value_abort(InvalidValueData *Data,
2555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                                      ValueHandle Val) {
2565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  Diag(getCallerLocation(), DL_Error,
2575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)       "load of value %0, which is not a valid value for type %1")
2585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    << Value(Data->Type, Val) << Data->Type;
2595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  Die();
2605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
2615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)