1eda8bd0fc07df35c9ad7de5b698bb717b063e7afRichard Smith//===-- ubsan_handlers.cc -------------------------------------------------===//
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// Error logging entry points for the UBSan runtime.
116ebe45146a2d93eb010b9bb5ea34cb94c6900f83Richard Smith//
126ebe45146a2d93eb010b9bb5ea34cb94c6900f83Richard Smith//===----------------------------------------------------------------------===//
136ebe45146a2d93eb010b9bb5ea34cb94c6900f83Richard Smith
146ebe45146a2d93eb010b9bb5ea34cb94c6900f83Richard Smith#include "ubsan_handlers.h"
156ebe45146a2d93eb010b9bb5ea34cb94c6900f83Richard Smith#include "ubsan_diag.h"
166ebe45146a2d93eb010b9bb5ea34cb94c6900f83Richard Smith
176ebe45146a2d93eb010b9bb5ea34cb94c6900f83Richard Smith#include "sanitizer_common/sanitizer_common.h"
186ebe45146a2d93eb010b9bb5ea34cb94c6900f83Richard Smith
196ebe45146a2d93eb010b9bb5ea34cb94c6900f83Richard Smithusing namespace __sanitizer;
206ebe45146a2d93eb010b9bb5ea34cb94c6900f83Richard Smithusing namespace __ubsan;
216ebe45146a2d93eb010b9bb5ea34cb94c6900f83Richard Smith
22eda8bd0fc07df35c9ad7de5b698bb717b063e7afRichard Smithnamespace __ubsan {
236ebe45146a2d93eb010b9bb5ea34cb94c6900f83Richard Smith  const char *TypeCheckKinds[] = {
246ebe45146a2d93eb010b9bb5ea34cb94c6900f83Richard Smith    "load of", "store to", "reference binding to", "member access within",
2545a8124a70fa720756c4c40d741b588172879bb7Richard Smith    "member call on", "constructor call on", "downcast of", "downcast of"
266ebe45146a2d93eb010b9bb5ea34cb94c6900f83Richard Smith  };
27eda8bd0fc07df35c9ad7de5b698bb717b063e7afRichard Smith}
28eda8bd0fc07df35c9ad7de5b698bb717b063e7afRichard Smith
295f1164955fb28a9bcb826abc195aa2119feb0f97Richard Smithstatic void handleTypeMismatchImpl(TypeMismatchData *Data, ValueHandle Pointer,
305f1164955fb28a9bcb826abc195aa2119feb0f97Richard Smith                                   Location FallbackLoc) {
312af552f98f980178db37eed28a609b6bf55f6df8Will Dietz  Location Loc = Data->Loc.acquire();
322af552f98f980178db37eed28a609b6bf55f6df8Will Dietz
332af552f98f980178db37eed28a609b6bf55f6df8Will Dietz  // Use the SourceLocation from Data to track deduplication, even if 'invalid'
342af552f98f980178db37eed28a609b6bf55f6df8Will Dietz  if (Loc.getSourceLocation().isDisabled())
352af552f98f980178db37eed28a609b6bf55f6df8Will Dietz    return;
365f1164955fb28a9bcb826abc195aa2119feb0f97Richard Smith  if (Data->Loc.isInvalid())
375f1164955fb28a9bcb826abc195aa2119feb0f97Richard Smith    Loc = FallbackLoc;
385f1164955fb28a9bcb826abc195aa2119feb0f97Richard Smith
396ebe45146a2d93eb010b9bb5ea34cb94c6900f83Richard Smith  if (!Pointer)
4025ee97fe8ada76755c8bd1087fac9cc3cd03b28cRichard Smith    Diag(Loc, DL_Error, "%0 null pointer of type %1")
416ebe45146a2d93eb010b9bb5ea34cb94c6900f83Richard Smith      << TypeCheckKinds[Data->TypeCheckKind] << Data->Type;
426ebe45146a2d93eb010b9bb5ea34cb94c6900f83Richard Smith  else if (Data->Alignment && (Pointer & (Data->Alignment - 1)))
4325ee97fe8ada76755c8bd1087fac9cc3cd03b28cRichard Smith    Diag(Loc, DL_Error, "%0 misaligned address %1 for type %3, "
4425ee97fe8ada76755c8bd1087fac9cc3cd03b28cRichard Smith                        "which requires %2 byte alignment")
456ebe45146a2d93eb010b9bb5ea34cb94c6900f83Richard Smith      << TypeCheckKinds[Data->TypeCheckKind] << (void*)Pointer
466ebe45146a2d93eb010b9bb5ea34cb94c6900f83Richard Smith      << Data->Alignment << Data->Type;
476ebe45146a2d93eb010b9bb5ea34cb94c6900f83Richard Smith  else
4825ee97fe8ada76755c8bd1087fac9cc3cd03b28cRichard Smith    Diag(Loc, DL_Error, "%0 address %1 with insufficient space "
4925ee97fe8ada76755c8bd1087fac9cc3cd03b28cRichard Smith                        "for an object of type %2")
506ebe45146a2d93eb010b9bb5ea34cb94c6900f83Richard Smith      << TypeCheckKinds[Data->TypeCheckKind] << (void*)Pointer << Data->Type;
5125ee97fe8ada76755c8bd1087fac9cc3cd03b28cRichard Smith  if (Pointer)
5225ee97fe8ada76755c8bd1087fac9cc3cd03b28cRichard Smith    Diag(Pointer, DL_Note, "pointer points here");
53a82a5d360b19080f2b1beae374c12d4f26146450Will Dietz}
545f1164955fb28a9bcb826abc195aa2119feb0f97Richard Smithvoid __ubsan::__ubsan_handle_type_mismatch(TypeMismatchData *Data,
555f1164955fb28a9bcb826abc195aa2119feb0f97Richard Smith                                           ValueHandle Pointer) {
565f1164955fb28a9bcb826abc195aa2119feb0f97Richard Smith  handleTypeMismatchImpl(Data, Pointer, getCallerLocation());
575f1164955fb28a9bcb826abc195aa2119feb0f97Richard Smith}
58a82a5d360b19080f2b1beae374c12d4f26146450Will Dietzvoid __ubsan::__ubsan_handle_type_mismatch_abort(TypeMismatchData *Data,
595f1164955fb28a9bcb826abc195aa2119feb0f97Richard Smith                                                 ValueHandle Pointer) {
605f1164955fb28a9bcb826abc195aa2119feb0f97Richard Smith  handleTypeMismatchImpl(Data, Pointer, getCallerLocation());
616ebe45146a2d93eb010b9bb5ea34cb94c6900f83Richard Smith  Die();
626ebe45146a2d93eb010b9bb5ea34cb94c6900f83Richard Smith}
636ebe45146a2d93eb010b9bb5ea34cb94c6900f83Richard Smith
6480af605afd0e92a2a128c81898f647207f384e08Will Dietz/// \brief Common diagnostic emission for various forms of integer overflow.
6580af605afd0e92a2a128c81898f647207f384e08Will Dietztemplate<typename T> static void HandleIntegerOverflow(OverflowData *Data,
6625ee97fe8ada76755c8bd1087fac9cc3cd03b28cRichard Smith                                                       ValueHandle LHS,
6725ee97fe8ada76755c8bd1087fac9cc3cd03b28cRichard Smith                                                       const char *Operator,
6825ee97fe8ada76755c8bd1087fac9cc3cd03b28cRichard Smith                                                       T RHS) {
692af552f98f980178db37eed28a609b6bf55f6df8Will Dietz  SourceLocation Loc = Data->Loc.acquire();
702af552f98f980178db37eed28a609b6bf55f6df8Will Dietz  if (Loc.isDisabled())
712af552f98f980178db37eed28a609b6bf55f6df8Will Dietz    return;
722af552f98f980178db37eed28a609b6bf55f6df8Will Dietz
732af552f98f980178db37eed28a609b6bf55f6df8Will Dietz  Diag(Loc, DL_Error, "%0 integer overflow: "
742af552f98f980178db37eed28a609b6bf55f6df8Will Dietz                      "%1 %2 %3 cannot be represented in type %4")
7580af605afd0e92a2a128c81898f647207f384e08Will Dietz    << (Data->Type.isSignedIntegerTy() ? "signed" : "unsigned")
766ebe45146a2d93eb010b9bb5ea34cb94c6900f83Richard Smith    << Value(Data->Type, LHS) << Operator << RHS << Data->Type;
776ebe45146a2d93eb010b9bb5ea34cb94c6900f83Richard Smith}
786ebe45146a2d93eb010b9bb5ea34cb94c6900f83Richard Smith
796ebe45146a2d93eb010b9bb5ea34cb94c6900f83Richard Smithvoid __ubsan::__ubsan_handle_add_overflow(OverflowData *Data,
806ebe45146a2d93eb010b9bb5ea34cb94c6900f83Richard Smith                                          ValueHandle LHS, ValueHandle RHS) {
8180af605afd0e92a2a128c81898f647207f384e08Will Dietz  HandleIntegerOverflow(Data, LHS, "+", Value(Data->Type, RHS));
826ebe45146a2d93eb010b9bb5ea34cb94c6900f83Richard Smith}
83a82a5d360b19080f2b1beae374c12d4f26146450Will Dietzvoid __ubsan::__ubsan_handle_add_overflow_abort(OverflowData *Data,
84a82a5d360b19080f2b1beae374c12d4f26146450Will Dietz                                                 ValueHandle LHS,
85a82a5d360b19080f2b1beae374c12d4f26146450Will Dietz                                                 ValueHandle RHS) {
86a82a5d360b19080f2b1beae374c12d4f26146450Will Dietz  __ubsan_handle_add_overflow(Data, LHS, RHS);
87a82a5d360b19080f2b1beae374c12d4f26146450Will Dietz  Die();
88a82a5d360b19080f2b1beae374c12d4f26146450Will Dietz}
896ebe45146a2d93eb010b9bb5ea34cb94c6900f83Richard Smith
906ebe45146a2d93eb010b9bb5ea34cb94c6900f83Richard Smithvoid __ubsan::__ubsan_handle_sub_overflow(OverflowData *Data,
916ebe45146a2d93eb010b9bb5ea34cb94c6900f83Richard Smith                                          ValueHandle LHS, ValueHandle RHS) {
9280af605afd0e92a2a128c81898f647207f384e08Will Dietz  HandleIntegerOverflow(Data, LHS, "-", Value(Data->Type, RHS));
936ebe45146a2d93eb010b9bb5ea34cb94c6900f83Richard Smith}
94a82a5d360b19080f2b1beae374c12d4f26146450Will Dietzvoid __ubsan::__ubsan_handle_sub_overflow_abort(OverflowData *Data,
95a82a5d360b19080f2b1beae374c12d4f26146450Will Dietz                                                 ValueHandle LHS,
96a82a5d360b19080f2b1beae374c12d4f26146450Will Dietz                                                 ValueHandle RHS) {
97a82a5d360b19080f2b1beae374c12d4f26146450Will Dietz  __ubsan_handle_sub_overflow(Data, LHS, RHS);
98a82a5d360b19080f2b1beae374c12d4f26146450Will Dietz  Die();
99a82a5d360b19080f2b1beae374c12d4f26146450Will Dietz}
1006ebe45146a2d93eb010b9bb5ea34cb94c6900f83Richard Smith
1016ebe45146a2d93eb010b9bb5ea34cb94c6900f83Richard Smithvoid __ubsan::__ubsan_handle_mul_overflow(OverflowData *Data,
1026ebe45146a2d93eb010b9bb5ea34cb94c6900f83Richard Smith                                          ValueHandle LHS, ValueHandle RHS) {
10380af605afd0e92a2a128c81898f647207f384e08Will Dietz  HandleIntegerOverflow(Data, LHS, "*", Value(Data->Type, RHS));
1046ebe45146a2d93eb010b9bb5ea34cb94c6900f83Richard Smith}
105a82a5d360b19080f2b1beae374c12d4f26146450Will Dietzvoid __ubsan::__ubsan_handle_mul_overflow_abort(OverflowData *Data,
106a82a5d360b19080f2b1beae374c12d4f26146450Will Dietz                                                 ValueHandle LHS,
107a82a5d360b19080f2b1beae374c12d4f26146450Will Dietz                                                 ValueHandle RHS) {
108a82a5d360b19080f2b1beae374c12d4f26146450Will Dietz  __ubsan_handle_mul_overflow(Data, LHS, RHS);
109a82a5d360b19080f2b1beae374c12d4f26146450Will Dietz  Die();
110a82a5d360b19080f2b1beae374c12d4f26146450Will Dietz}
1116ebe45146a2d93eb010b9bb5ea34cb94c6900f83Richard Smith
1126ebe45146a2d93eb010b9bb5ea34cb94c6900f83Richard Smithvoid __ubsan::__ubsan_handle_negate_overflow(OverflowData *Data,
1136ebe45146a2d93eb010b9bb5ea34cb94c6900f83Richard Smith                                             ValueHandle OldVal) {
1142af552f98f980178db37eed28a609b6bf55f6df8Will Dietz  SourceLocation Loc = Data->Loc.acquire();
1152af552f98f980178db37eed28a609b6bf55f6df8Will Dietz  if (Loc.isDisabled())
1162af552f98f980178db37eed28a609b6bf55f6df8Will Dietz    return;
1172af552f98f980178db37eed28a609b6bf55f6df8Will Dietz
118f359dea95de4a17287d11052e9b552100c152287Will Dietz  if (Data->Type.isSignedIntegerTy())
1192af552f98f980178db37eed28a609b6bf55f6df8Will Dietz    Diag(Loc, DL_Error,
120f359dea95de4a17287d11052e9b552100c152287Will Dietz         "negation of %0 cannot be represented in type %1; "
121f359dea95de4a17287d11052e9b552100c152287Will Dietz         "cast to an unsigned type to negate this value to itself")
122f359dea95de4a17287d11052e9b552100c152287Will Dietz      << Value(Data->Type, OldVal) << Data->Type;
123f359dea95de4a17287d11052e9b552100c152287Will Dietz  else
1242af552f98f980178db37eed28a609b6bf55f6df8Will Dietz    Diag(Loc, DL_Error,
125f359dea95de4a17287d11052e9b552100c152287Will Dietz         "negation of %0 cannot be represented in type %1")
126f359dea95de4a17287d11052e9b552100c152287Will Dietz      << Value(Data->Type, OldVal) << Data->Type;
127a82a5d360b19080f2b1beae374c12d4f26146450Will Dietz}
128a82a5d360b19080f2b1beae374c12d4f26146450Will Dietzvoid __ubsan::__ubsan_handle_negate_overflow_abort(OverflowData *Data,
129a82a5d360b19080f2b1beae374c12d4f26146450Will Dietz                                                    ValueHandle OldVal) {
130a82a5d360b19080f2b1beae374c12d4f26146450Will Dietz  __ubsan_handle_negate_overflow(Data, OldVal);
1316ebe45146a2d93eb010b9bb5ea34cb94c6900f83Richard Smith  Die();
1326ebe45146a2d93eb010b9bb5ea34cb94c6900f83Richard Smith}
1336ebe45146a2d93eb010b9bb5ea34cb94c6900f83Richard Smith
1346ebe45146a2d93eb010b9bb5ea34cb94c6900f83Richard Smithvoid __ubsan::__ubsan_handle_divrem_overflow(OverflowData *Data,
1356ebe45146a2d93eb010b9bb5ea34cb94c6900f83Richard Smith                                             ValueHandle LHS, ValueHandle RHS) {
1362af552f98f980178db37eed28a609b6bf55f6df8Will Dietz  SourceLocation Loc = Data->Loc.acquire();
1372af552f98f980178db37eed28a609b6bf55f6df8Will Dietz  if (Loc.isDisabled())
1382af552f98f980178db37eed28a609b6bf55f6df8Will Dietz    return;
1392af552f98f980178db37eed28a609b6bf55f6df8Will Dietz
1406ebe45146a2d93eb010b9bb5ea34cb94c6900f83Richard Smith  Value LHSVal(Data->Type, LHS);
1416ebe45146a2d93eb010b9bb5ea34cb94c6900f83Richard Smith  Value RHSVal(Data->Type, RHS);
1426ebe45146a2d93eb010b9bb5ea34cb94c6900f83Richard Smith  if (RHSVal.isMinusOne())
1432af552f98f980178db37eed28a609b6bf55f6df8Will Dietz    Diag(Loc, DL_Error,
14425ee97fe8ada76755c8bd1087fac9cc3cd03b28cRichard Smith         "division of %0 by -1 cannot be represented in type %1")
1456ebe45146a2d93eb010b9bb5ea34cb94c6900f83Richard Smith      << LHSVal << Data->Type;
1466ebe45146a2d93eb010b9bb5ea34cb94c6900f83Richard Smith  else
1472af552f98f980178db37eed28a609b6bf55f6df8Will Dietz    Diag(Loc, DL_Error, "division by zero");
148a82a5d360b19080f2b1beae374c12d4f26146450Will Dietz}
149a82a5d360b19080f2b1beae374c12d4f26146450Will Dietzvoid __ubsan::__ubsan_handle_divrem_overflow_abort(OverflowData *Data,
150a82a5d360b19080f2b1beae374c12d4f26146450Will Dietz                                                    ValueHandle LHS,
151a82a5d360b19080f2b1beae374c12d4f26146450Will Dietz                                                    ValueHandle RHS) {
152a82a5d360b19080f2b1beae374c12d4f26146450Will Dietz  __ubsan_handle_divrem_overflow(Data, LHS, RHS);
1536ebe45146a2d93eb010b9bb5ea34cb94c6900f83Richard Smith  Die();
1546ebe45146a2d93eb010b9bb5ea34cb94c6900f83Richard Smith}
1556ebe45146a2d93eb010b9bb5ea34cb94c6900f83Richard Smith
1566ebe45146a2d93eb010b9bb5ea34cb94c6900f83Richard Smithvoid __ubsan::__ubsan_handle_shift_out_of_bounds(ShiftOutOfBoundsData *Data,
1576ebe45146a2d93eb010b9bb5ea34cb94c6900f83Richard Smith                                                 ValueHandle LHS,
1586ebe45146a2d93eb010b9bb5ea34cb94c6900f83Richard Smith                                                 ValueHandle RHS) {
1592af552f98f980178db37eed28a609b6bf55f6df8Will Dietz  SourceLocation Loc = Data->Loc.acquire();
1602af552f98f980178db37eed28a609b6bf55f6df8Will Dietz  if (Loc.isDisabled())
1612af552f98f980178db37eed28a609b6bf55f6df8Will Dietz    return;
1622af552f98f980178db37eed28a609b6bf55f6df8Will Dietz
1636ebe45146a2d93eb010b9bb5ea34cb94c6900f83Richard Smith  Value LHSVal(Data->LHSType, LHS);
1646ebe45146a2d93eb010b9bb5ea34cb94c6900f83Richard Smith  Value RHSVal(Data->RHSType, RHS);
1656ebe45146a2d93eb010b9bb5ea34cb94c6900f83Richard Smith  if (RHSVal.isNegative())
1662af552f98f980178db37eed28a609b6bf55f6df8Will Dietz    Diag(Loc, DL_Error, "shift exponent %0 is negative") << RHSVal;
1676ebe45146a2d93eb010b9bb5ea34cb94c6900f83Richard Smith  else if (RHSVal.getPositiveIntValue() >= Data->LHSType.getIntegerBitWidth())
1682af552f98f980178db37eed28a609b6bf55f6df8Will Dietz    Diag(Loc, DL_Error,
16925ee97fe8ada76755c8bd1087fac9cc3cd03b28cRichard Smith         "shift exponent %0 is too large for %1-bit type %2")
1706ebe45146a2d93eb010b9bb5ea34cb94c6900f83Richard Smith      << RHSVal << Data->LHSType.getIntegerBitWidth() << Data->LHSType;
1716ebe45146a2d93eb010b9bb5ea34cb94c6900f83Richard Smith  else if (LHSVal.isNegative())
1722af552f98f980178db37eed28a609b6bf55f6df8Will Dietz    Diag(Loc, DL_Error, "left shift of negative value %0") << LHSVal;
1736ebe45146a2d93eb010b9bb5ea34cb94c6900f83Richard Smith  else
1742af552f98f980178db37eed28a609b6bf55f6df8Will Dietz    Diag(Loc, DL_Error,
17525ee97fe8ada76755c8bd1087fac9cc3cd03b28cRichard Smith         "left shift of %0 by %1 places cannot be represented in type %2")
17625ee97fe8ada76755c8bd1087fac9cc3cd03b28cRichard Smith      << LHSVal << RHSVal << Data->LHSType;
177a82a5d360b19080f2b1beae374c12d4f26146450Will Dietz}
178a82a5d360b19080f2b1beae374c12d4f26146450Will Dietzvoid __ubsan::__ubsan_handle_shift_out_of_bounds_abort(
179a82a5d360b19080f2b1beae374c12d4f26146450Will Dietz                                                     ShiftOutOfBoundsData *Data,
180a82a5d360b19080f2b1beae374c12d4f26146450Will Dietz                                                     ValueHandle LHS,
181a82a5d360b19080f2b1beae374c12d4f26146450Will Dietz                                                     ValueHandle RHS) {
182a82a5d360b19080f2b1beae374c12d4f26146450Will Dietz  __ubsan_handle_shift_out_of_bounds(Data, LHS, RHS);
1836ebe45146a2d93eb010b9bb5ea34cb94c6900f83Richard Smith  Die();
1846ebe45146a2d93eb010b9bb5ea34cb94c6900f83Richard Smith}
1856ebe45146a2d93eb010b9bb5ea34cb94c6900f83Richard Smith
186a0b1e21d72429c3672115b3ddc85240e3b7ac88bRichard Smithvoid __ubsan::__ubsan_handle_out_of_bounds(OutOfBoundsData *Data,
187a0b1e21d72429c3672115b3ddc85240e3b7ac88bRichard Smith                                           ValueHandle Index) {
188a0b1e21d72429c3672115b3ddc85240e3b7ac88bRichard Smith  SourceLocation Loc = Data->Loc.acquire();
189a0b1e21d72429c3672115b3ddc85240e3b7ac88bRichard Smith  if (Loc.isDisabled())
190a0b1e21d72429c3672115b3ddc85240e3b7ac88bRichard Smith    return;
191a0b1e21d72429c3672115b3ddc85240e3b7ac88bRichard Smith
192a0b1e21d72429c3672115b3ddc85240e3b7ac88bRichard Smith  Value IndexVal(Data->IndexType, Index);
193a0b1e21d72429c3672115b3ddc85240e3b7ac88bRichard Smith  Diag(Loc, DL_Error, "index %0 out of bounds for type %1")
194a0b1e21d72429c3672115b3ddc85240e3b7ac88bRichard Smith    << IndexVal << Data->ArrayType;
195a0b1e21d72429c3672115b3ddc85240e3b7ac88bRichard Smith}
196a0b1e21d72429c3672115b3ddc85240e3b7ac88bRichard Smithvoid __ubsan::__ubsan_handle_out_of_bounds_abort(OutOfBoundsData *Data,
197a0b1e21d72429c3672115b3ddc85240e3b7ac88bRichard Smith                                                 ValueHandle Index) {
198a0b1e21d72429c3672115b3ddc85240e3b7ac88bRichard Smith  __ubsan_handle_out_of_bounds(Data, Index);
199a0b1e21d72429c3672115b3ddc85240e3b7ac88bRichard Smith  Die();
200a0b1e21d72429c3672115b3ddc85240e3b7ac88bRichard Smith}
201a0b1e21d72429c3672115b3ddc85240e3b7ac88bRichard Smith
2026ebe45146a2d93eb010b9bb5ea34cb94c6900f83Richard Smithvoid __ubsan::__ubsan_handle_builtin_unreachable(UnreachableData *Data) {
20325ee97fe8ada76755c8bd1087fac9cc3cd03b28cRichard Smith  Diag(Data->Loc, DL_Error, "execution reached a __builtin_unreachable() call");
2046ebe45146a2d93eb010b9bb5ea34cb94c6900f83Richard Smith  Die();
2056ebe45146a2d93eb010b9bb5ea34cb94c6900f83Richard Smith}
2066ebe45146a2d93eb010b9bb5ea34cb94c6900f83Richard Smith
2076ebe45146a2d93eb010b9bb5ea34cb94c6900f83Richard Smithvoid __ubsan::__ubsan_handle_missing_return(UnreachableData *Data) {
20825ee97fe8ada76755c8bd1087fac9cc3cd03b28cRichard Smith  Diag(Data->Loc, DL_Error,
20925ee97fe8ada76755c8bd1087fac9cc3cd03b28cRichard Smith       "execution reached the end of a value-returning function "
21025ee97fe8ada76755c8bd1087fac9cc3cd03b28cRichard Smith       "without returning a value");
2116ebe45146a2d93eb010b9bb5ea34cb94c6900f83Richard Smith  Die();
2126ebe45146a2d93eb010b9bb5ea34cb94c6900f83Richard Smith}
213b04caf1385a4279a7b95d41c3ccefc61842c3633Richard Smith
214b04caf1385a4279a7b95d41c3ccefc61842c3633Richard Smithvoid __ubsan::__ubsan_handle_vla_bound_not_positive(VLABoundData *Data,
215b04caf1385a4279a7b95d41c3ccefc61842c3633Richard Smith                                                    ValueHandle Bound) {
2162af552f98f980178db37eed28a609b6bf55f6df8Will Dietz  SourceLocation Loc = Data->Loc.acquire();
2172af552f98f980178db37eed28a609b6bf55f6df8Will Dietz  if (Loc.isDisabled())
2182af552f98f980178db37eed28a609b6bf55f6df8Will Dietz    return;
2192af552f98f980178db37eed28a609b6bf55f6df8Will Dietz
2202af552f98f980178db37eed28a609b6bf55f6df8Will Dietz  Diag(Loc, DL_Error, "variable length array bound evaluates to "
2212af552f98f980178db37eed28a609b6bf55f6df8Will Dietz                      "non-positive value %0")
222b04caf1385a4279a7b95d41c3ccefc61842c3633Richard Smith    << Value(Data->Type, Bound);
223a82a5d360b19080f2b1beae374c12d4f26146450Will Dietz}
224a82a5d360b19080f2b1beae374c12d4f26146450Will Dietzvoid __ubsan::__ubsan_handle_vla_bound_not_positive_abort(VLABoundData *Data,
225a82a5d360b19080f2b1beae374c12d4f26146450Will Dietz                                                           ValueHandle Bound) {
226a82a5d360b19080f2b1beae374c12d4f26146450Will Dietz  __ubsan_handle_vla_bound_not_positive(Data, Bound);
227b04caf1385a4279a7b95d41c3ccefc61842c3633Richard Smith  Die();
228b04caf1385a4279a7b95d41c3ccefc61842c3633Richard Smith}
22958561700a4abad310911a24a867da49a14fae91eRichard Smith
2305f1164955fb28a9bcb826abc195aa2119feb0f97Richard Smith
23158561700a4abad310911a24a867da49a14fae91eRichard Smithvoid __ubsan::__ubsan_handle_float_cast_overflow(FloatCastOverflowData *Data,
23258561700a4abad310911a24a867da49a14fae91eRichard Smith                                                 ValueHandle From) {
2332af552f98f980178db37eed28a609b6bf55f6df8Will Dietz  // TODO: Add deduplication once a SourceLocation is generated for this check.
23425ee97fe8ada76755c8bd1087fac9cc3cd03b28cRichard Smith  Diag(getCallerLocation(), DL_Error,
23525ee97fe8ada76755c8bd1087fac9cc3cd03b28cRichard Smith       "value %0 is outside the range of representable values of type %2")
23658561700a4abad310911a24a867da49a14fae91eRichard Smith    << Value(Data->FromType, From) << Data->FromType << Data->ToType;
237a82a5d360b19080f2b1beae374c12d4f26146450Will Dietz}
238a82a5d360b19080f2b1beae374c12d4f26146450Will Dietzvoid __ubsan::__ubsan_handle_float_cast_overflow_abort(
239a82a5d360b19080f2b1beae374c12d4f26146450Will Dietz                                                    FloatCastOverflowData *Data,
240a82a5d360b19080f2b1beae374c12d4f26146450Will Dietz                                                    ValueHandle From) {
24125ee97fe8ada76755c8bd1087fac9cc3cd03b28cRichard Smith  Diag(getCallerLocation(), DL_Error,
24225ee97fe8ada76755c8bd1087fac9cc3cd03b28cRichard Smith       "value %0 is outside the range of representable values of type %2")
2435f1164955fb28a9bcb826abc195aa2119feb0f97Richard Smith    << Value(Data->FromType, From) << Data->FromType << Data->ToType;
24458561700a4abad310911a24a867da49a14fae91eRichard Smith  Die();
24558561700a4abad310911a24a867da49a14fae91eRichard Smith}
246f2d77d03b75733139c9f0896162bbc7a6fc38385Richard Smith
247f2d77d03b75733139c9f0896162bbc7a6fc38385Richard Smithvoid __ubsan::__ubsan_handle_load_invalid_value(InvalidValueData *Data,
248f2d77d03b75733139c9f0896162bbc7a6fc38385Richard Smith                                                ValueHandle Val) {
2492af552f98f980178db37eed28a609b6bf55f6df8Will Dietz  // TODO: Add deduplication once a SourceLocation is generated for this check.
25025ee97fe8ada76755c8bd1087fac9cc3cd03b28cRichard Smith  Diag(getCallerLocation(), DL_Error,
25125ee97fe8ada76755c8bd1087fac9cc3cd03b28cRichard Smith       "load of value %0, which is not a valid value for type %1")
252f2d77d03b75733139c9f0896162bbc7a6fc38385Richard Smith    << Value(Data->Type, Val) << Data->Type;
253f2d77d03b75733139c9f0896162bbc7a6fc38385Richard Smith}
254f2d77d03b75733139c9f0896162bbc7a6fc38385Richard Smithvoid __ubsan::__ubsan_handle_load_invalid_value_abort(InvalidValueData *Data,
255f2d77d03b75733139c9f0896162bbc7a6fc38385Richard Smith                                                      ValueHandle Val) {
25625ee97fe8ada76755c8bd1087fac9cc3cd03b28cRichard Smith  Diag(getCallerLocation(), DL_Error,
25725ee97fe8ada76755c8bd1087fac9cc3cd03b28cRichard Smith       "load of value %0, which is not a valid value for type %1")
2585f1164955fb28a9bcb826abc195aa2119feb0f97Richard Smith    << Value(Data->Type, Val) << Data->Type;
259f2d77d03b75733139c9f0896162bbc7a6fc38385Richard Smith  Die();
260f2d77d03b75733139c9f0896162bbc7a6fc38385Richard Smith}
261