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)