ubsan_handlers.cc revision 5f1164955fb28a9bcb826abc195aa2119feb0f97
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", 25eda8bd0fc07df35c9ad7de5b698bb717b063e7afRichard Smith "member call on", "constructor call on" 266ebe45146a2d93eb010b9bb5ea34cb94c6900f83Richard Smith }; 27eda8bd0fc07df35c9ad7de5b698bb717b063e7afRichard Smith} 28eda8bd0fc07df35c9ad7de5b698bb717b063e7afRichard Smith 295f1164955fb28a9bcb826abc195aa2119feb0f97Richard Smithstatic void handleTypeMismatchImpl(TypeMismatchData *Data, ValueHandle Pointer, 305f1164955fb28a9bcb826abc195aa2119feb0f97Richard Smith Location FallbackLoc) { 315f1164955fb28a9bcb826abc195aa2119feb0f97Richard Smith Location Loc = Data->Loc; 325f1164955fb28a9bcb826abc195aa2119feb0f97Richard Smith if (Data->Loc.isInvalid()) 335f1164955fb28a9bcb826abc195aa2119feb0f97Richard Smith Loc = FallbackLoc; 345f1164955fb28a9bcb826abc195aa2119feb0f97Richard Smith 356ebe45146a2d93eb010b9bb5ea34cb94c6900f83Richard Smith if (!Pointer) 365f1164955fb28a9bcb826abc195aa2119feb0f97Richard Smith Diag(Loc, "%0 null pointer of type %1") 376ebe45146a2d93eb010b9bb5ea34cb94c6900f83Richard Smith << TypeCheckKinds[Data->TypeCheckKind] << Data->Type; 386ebe45146a2d93eb010b9bb5ea34cb94c6900f83Richard Smith else if (Data->Alignment && (Pointer & (Data->Alignment - 1))) 395f1164955fb28a9bcb826abc195aa2119feb0f97Richard Smith Diag(Loc, "%0 misaligned address %1 for type %3, " 405f1164955fb28a9bcb826abc195aa2119feb0f97Richard Smith "which requires %2 byte alignment") 416ebe45146a2d93eb010b9bb5ea34cb94c6900f83Richard Smith << TypeCheckKinds[Data->TypeCheckKind] << (void*)Pointer 426ebe45146a2d93eb010b9bb5ea34cb94c6900f83Richard Smith << Data->Alignment << Data->Type; 436ebe45146a2d93eb010b9bb5ea34cb94c6900f83Richard Smith else 445f1164955fb28a9bcb826abc195aa2119feb0f97Richard Smith Diag(Loc, "%0 address %1 with insufficient space " 455f1164955fb28a9bcb826abc195aa2119feb0f97Richard Smith "for an object of type %2") 466ebe45146a2d93eb010b9bb5ea34cb94c6900f83Richard Smith << TypeCheckKinds[Data->TypeCheckKind] << (void*)Pointer << Data->Type; 47a82a5d360b19080f2b1beae374c12d4f26146450Will Dietz} 485f1164955fb28a9bcb826abc195aa2119feb0f97Richard Smithvoid __ubsan::__ubsan_handle_type_mismatch(TypeMismatchData *Data, 495f1164955fb28a9bcb826abc195aa2119feb0f97Richard Smith ValueHandle Pointer) { 505f1164955fb28a9bcb826abc195aa2119feb0f97Richard Smith handleTypeMismatchImpl(Data, Pointer, getCallerLocation()); 515f1164955fb28a9bcb826abc195aa2119feb0f97Richard Smith} 52a82a5d360b19080f2b1beae374c12d4f26146450Will Dietzvoid __ubsan::__ubsan_handle_type_mismatch_abort(TypeMismatchData *Data, 535f1164955fb28a9bcb826abc195aa2119feb0f97Richard Smith ValueHandle Pointer) { 545f1164955fb28a9bcb826abc195aa2119feb0f97Richard Smith handleTypeMismatchImpl(Data, Pointer, getCallerLocation()); 556ebe45146a2d93eb010b9bb5ea34cb94c6900f83Richard Smith Die(); 566ebe45146a2d93eb010b9bb5ea34cb94c6900f83Richard Smith} 576ebe45146a2d93eb010b9bb5ea34cb94c6900f83Richard Smith 5880af605afd0e92a2a128c81898f647207f384e08Will Dietz/// \brief Common diagnostic emission for various forms of integer overflow. 5980af605afd0e92a2a128c81898f647207f384e08Will Dietztemplate<typename T> static void HandleIntegerOverflow(OverflowData *Data, 606ebe45146a2d93eb010b9bb5ea34cb94c6900f83Richard Smith ValueHandle LHS, 616ebe45146a2d93eb010b9bb5ea34cb94c6900f83Richard Smith const char *Operator, 626ebe45146a2d93eb010b9bb5ea34cb94c6900f83Richard Smith T RHS) { 6380af605afd0e92a2a128c81898f647207f384e08Will Dietz Diag(Data->Loc, "%0 integer overflow: " 6480af605afd0e92a2a128c81898f647207f384e08Will Dietz "%1 %2 %3 cannot be represented in type %4") 6580af605afd0e92a2a128c81898f647207f384e08Will Dietz << (Data->Type.isSignedIntegerTy() ? "signed" : "unsigned") 666ebe45146a2d93eb010b9bb5ea34cb94c6900f83Richard Smith << Value(Data->Type, LHS) << Operator << RHS << Data->Type; 676ebe45146a2d93eb010b9bb5ea34cb94c6900f83Richard Smith} 686ebe45146a2d93eb010b9bb5ea34cb94c6900f83Richard Smith 696ebe45146a2d93eb010b9bb5ea34cb94c6900f83Richard Smithvoid __ubsan::__ubsan_handle_add_overflow(OverflowData *Data, 706ebe45146a2d93eb010b9bb5ea34cb94c6900f83Richard Smith ValueHandle LHS, ValueHandle RHS) { 7180af605afd0e92a2a128c81898f647207f384e08Will Dietz HandleIntegerOverflow(Data, LHS, "+", Value(Data->Type, RHS)); 726ebe45146a2d93eb010b9bb5ea34cb94c6900f83Richard Smith} 73a82a5d360b19080f2b1beae374c12d4f26146450Will Dietzvoid __ubsan::__ubsan_handle_add_overflow_abort(OverflowData *Data, 74a82a5d360b19080f2b1beae374c12d4f26146450Will Dietz ValueHandle LHS, 75a82a5d360b19080f2b1beae374c12d4f26146450Will Dietz ValueHandle RHS) { 76a82a5d360b19080f2b1beae374c12d4f26146450Will Dietz __ubsan_handle_add_overflow(Data, LHS, RHS); 77a82a5d360b19080f2b1beae374c12d4f26146450Will Dietz Die(); 78a82a5d360b19080f2b1beae374c12d4f26146450Will Dietz} 796ebe45146a2d93eb010b9bb5ea34cb94c6900f83Richard Smith 806ebe45146a2d93eb010b9bb5ea34cb94c6900f83Richard Smithvoid __ubsan::__ubsan_handle_sub_overflow(OverflowData *Data, 816ebe45146a2d93eb010b9bb5ea34cb94c6900f83Richard Smith ValueHandle LHS, ValueHandle RHS) { 8280af605afd0e92a2a128c81898f647207f384e08Will Dietz HandleIntegerOverflow(Data, LHS, "-", Value(Data->Type, RHS)); 836ebe45146a2d93eb010b9bb5ea34cb94c6900f83Richard Smith} 84a82a5d360b19080f2b1beae374c12d4f26146450Will Dietzvoid __ubsan::__ubsan_handle_sub_overflow_abort(OverflowData *Data, 85a82a5d360b19080f2b1beae374c12d4f26146450Will Dietz ValueHandle LHS, 86a82a5d360b19080f2b1beae374c12d4f26146450Will Dietz ValueHandle RHS) { 87a82a5d360b19080f2b1beae374c12d4f26146450Will Dietz __ubsan_handle_sub_overflow(Data, LHS, RHS); 88a82a5d360b19080f2b1beae374c12d4f26146450Will Dietz Die(); 89a82a5d360b19080f2b1beae374c12d4f26146450Will Dietz} 906ebe45146a2d93eb010b9bb5ea34cb94c6900f83Richard Smith 916ebe45146a2d93eb010b9bb5ea34cb94c6900f83Richard Smithvoid __ubsan::__ubsan_handle_mul_overflow(OverflowData *Data, 926ebe45146a2d93eb010b9bb5ea34cb94c6900f83Richard Smith ValueHandle LHS, ValueHandle RHS) { 9380af605afd0e92a2a128c81898f647207f384e08Will Dietz HandleIntegerOverflow(Data, LHS, "*", Value(Data->Type, RHS)); 946ebe45146a2d93eb010b9bb5ea34cb94c6900f83Richard Smith} 95a82a5d360b19080f2b1beae374c12d4f26146450Will Dietzvoid __ubsan::__ubsan_handle_mul_overflow_abort(OverflowData *Data, 96a82a5d360b19080f2b1beae374c12d4f26146450Will Dietz ValueHandle LHS, 97a82a5d360b19080f2b1beae374c12d4f26146450Will Dietz ValueHandle RHS) { 98a82a5d360b19080f2b1beae374c12d4f26146450Will Dietz __ubsan_handle_mul_overflow(Data, LHS, RHS); 99a82a5d360b19080f2b1beae374c12d4f26146450Will Dietz Die(); 100a82a5d360b19080f2b1beae374c12d4f26146450Will Dietz} 1016ebe45146a2d93eb010b9bb5ea34cb94c6900f83Richard Smith 1026ebe45146a2d93eb010b9bb5ea34cb94c6900f83Richard Smithvoid __ubsan::__ubsan_handle_negate_overflow(OverflowData *Data, 1036ebe45146a2d93eb010b9bb5ea34cb94c6900f83Richard Smith ValueHandle OldVal) { 1046ebe45146a2d93eb010b9bb5ea34cb94c6900f83Richard Smith Diag(Data->Loc, "negation of %0 cannot be represented in type %1; " 1056ebe45146a2d93eb010b9bb5ea34cb94c6900f83Richard Smith "cast to an unsigned type to negate this value to itself") 1066ebe45146a2d93eb010b9bb5ea34cb94c6900f83Richard Smith << Value(Data->Type, OldVal) << Data->Type; 107a82a5d360b19080f2b1beae374c12d4f26146450Will Dietz} 108a82a5d360b19080f2b1beae374c12d4f26146450Will Dietzvoid __ubsan::__ubsan_handle_negate_overflow_abort(OverflowData *Data, 109a82a5d360b19080f2b1beae374c12d4f26146450Will Dietz ValueHandle OldVal) { 110a82a5d360b19080f2b1beae374c12d4f26146450Will Dietz __ubsan_handle_negate_overflow(Data, OldVal); 1116ebe45146a2d93eb010b9bb5ea34cb94c6900f83Richard Smith Die(); 1126ebe45146a2d93eb010b9bb5ea34cb94c6900f83Richard Smith} 1136ebe45146a2d93eb010b9bb5ea34cb94c6900f83Richard Smith 1146ebe45146a2d93eb010b9bb5ea34cb94c6900f83Richard Smithvoid __ubsan::__ubsan_handle_divrem_overflow(OverflowData *Data, 1156ebe45146a2d93eb010b9bb5ea34cb94c6900f83Richard Smith ValueHandle LHS, ValueHandle RHS) { 1166ebe45146a2d93eb010b9bb5ea34cb94c6900f83Richard Smith Value LHSVal(Data->Type, LHS); 1176ebe45146a2d93eb010b9bb5ea34cb94c6900f83Richard Smith Value RHSVal(Data->Type, RHS); 1186ebe45146a2d93eb010b9bb5ea34cb94c6900f83Richard Smith if (RHSVal.isMinusOne()) 1196ebe45146a2d93eb010b9bb5ea34cb94c6900f83Richard Smith Diag(Data->Loc, "division of %0 by -1 cannot be represented in type %1") 1206ebe45146a2d93eb010b9bb5ea34cb94c6900f83Richard Smith << LHSVal << Data->Type; 1216ebe45146a2d93eb010b9bb5ea34cb94c6900f83Richard Smith else 1226ebe45146a2d93eb010b9bb5ea34cb94c6900f83Richard Smith Diag(Data->Loc, "division by zero"); 123a82a5d360b19080f2b1beae374c12d4f26146450Will Dietz} 124a82a5d360b19080f2b1beae374c12d4f26146450Will Dietzvoid __ubsan::__ubsan_handle_divrem_overflow_abort(OverflowData *Data, 125a82a5d360b19080f2b1beae374c12d4f26146450Will Dietz ValueHandle LHS, 126a82a5d360b19080f2b1beae374c12d4f26146450Will Dietz ValueHandle RHS) { 127a82a5d360b19080f2b1beae374c12d4f26146450Will Dietz __ubsan_handle_divrem_overflow(Data, LHS, RHS); 1286ebe45146a2d93eb010b9bb5ea34cb94c6900f83Richard Smith Die(); 1296ebe45146a2d93eb010b9bb5ea34cb94c6900f83Richard Smith} 1306ebe45146a2d93eb010b9bb5ea34cb94c6900f83Richard Smith 1316ebe45146a2d93eb010b9bb5ea34cb94c6900f83Richard Smithvoid __ubsan::__ubsan_handle_shift_out_of_bounds(ShiftOutOfBoundsData *Data, 1326ebe45146a2d93eb010b9bb5ea34cb94c6900f83Richard Smith ValueHandle LHS, 1336ebe45146a2d93eb010b9bb5ea34cb94c6900f83Richard Smith ValueHandle RHS) { 1346ebe45146a2d93eb010b9bb5ea34cb94c6900f83Richard Smith Value LHSVal(Data->LHSType, LHS); 1356ebe45146a2d93eb010b9bb5ea34cb94c6900f83Richard Smith Value RHSVal(Data->RHSType, RHS); 1366ebe45146a2d93eb010b9bb5ea34cb94c6900f83Richard Smith if (RHSVal.isNegative()) 1376ebe45146a2d93eb010b9bb5ea34cb94c6900f83Richard Smith Diag(Data->Loc, "shift exponent %0 is negative") << RHSVal; 1386ebe45146a2d93eb010b9bb5ea34cb94c6900f83Richard Smith else if (RHSVal.getPositiveIntValue() >= Data->LHSType.getIntegerBitWidth()) 1396ebe45146a2d93eb010b9bb5ea34cb94c6900f83Richard Smith Diag(Data->Loc, "shift exponent %0 is too large for %1-bit type %2") 1406ebe45146a2d93eb010b9bb5ea34cb94c6900f83Richard Smith << RHSVal << Data->LHSType.getIntegerBitWidth() << Data->LHSType; 1416ebe45146a2d93eb010b9bb5ea34cb94c6900f83Richard Smith else if (LHSVal.isNegative()) 1426ebe45146a2d93eb010b9bb5ea34cb94c6900f83Richard Smith Diag(Data->Loc, "left shift of negative value %0") << LHSVal; 1436ebe45146a2d93eb010b9bb5ea34cb94c6900f83Richard Smith else 1446ebe45146a2d93eb010b9bb5ea34cb94c6900f83Richard Smith Diag(Data->Loc, "left shift of %0 by %1 places cannot be represented " 1456ebe45146a2d93eb010b9bb5ea34cb94c6900f83Richard Smith "in type %2") << LHSVal << RHSVal << Data->LHSType; 146a82a5d360b19080f2b1beae374c12d4f26146450Will Dietz} 147a82a5d360b19080f2b1beae374c12d4f26146450Will Dietzvoid __ubsan::__ubsan_handle_shift_out_of_bounds_abort( 148a82a5d360b19080f2b1beae374c12d4f26146450Will Dietz ShiftOutOfBoundsData *Data, 149a82a5d360b19080f2b1beae374c12d4f26146450Will Dietz ValueHandle LHS, 150a82a5d360b19080f2b1beae374c12d4f26146450Will Dietz ValueHandle RHS) { 151a82a5d360b19080f2b1beae374c12d4f26146450Will Dietz __ubsan_handle_shift_out_of_bounds(Data, LHS, RHS); 1526ebe45146a2d93eb010b9bb5ea34cb94c6900f83Richard Smith Die(); 1536ebe45146a2d93eb010b9bb5ea34cb94c6900f83Richard Smith} 1546ebe45146a2d93eb010b9bb5ea34cb94c6900f83Richard Smith 1556ebe45146a2d93eb010b9bb5ea34cb94c6900f83Richard Smithvoid __ubsan::__ubsan_handle_builtin_unreachable(UnreachableData *Data) { 1566ebe45146a2d93eb010b9bb5ea34cb94c6900f83Richard Smith Diag(Data->Loc, "execution reached a __builtin_unreachable() call"); 1576ebe45146a2d93eb010b9bb5ea34cb94c6900f83Richard Smith Die(); 1586ebe45146a2d93eb010b9bb5ea34cb94c6900f83Richard Smith} 1596ebe45146a2d93eb010b9bb5ea34cb94c6900f83Richard Smith 1606ebe45146a2d93eb010b9bb5ea34cb94c6900f83Richard Smithvoid __ubsan::__ubsan_handle_missing_return(UnreachableData *Data) { 1616ebe45146a2d93eb010b9bb5ea34cb94c6900f83Richard Smith Diag(Data->Loc, "execution reached the end of a value-returning function " 1626ebe45146a2d93eb010b9bb5ea34cb94c6900f83Richard Smith "without returning a value"); 1636ebe45146a2d93eb010b9bb5ea34cb94c6900f83Richard Smith Die(); 1646ebe45146a2d93eb010b9bb5ea34cb94c6900f83Richard Smith} 165b04caf1385a4279a7b95d41c3ccefc61842c3633Richard Smith 166b04caf1385a4279a7b95d41c3ccefc61842c3633Richard Smithvoid __ubsan::__ubsan_handle_vla_bound_not_positive(VLABoundData *Data, 167b04caf1385a4279a7b95d41c3ccefc61842c3633Richard Smith ValueHandle Bound) { 168b04caf1385a4279a7b95d41c3ccefc61842c3633Richard Smith Diag(Data->Loc, "variable length array bound evaluates to " 169b04caf1385a4279a7b95d41c3ccefc61842c3633Richard Smith "non-positive value %0") 170b04caf1385a4279a7b95d41c3ccefc61842c3633Richard Smith << Value(Data->Type, Bound); 171a82a5d360b19080f2b1beae374c12d4f26146450Will Dietz} 172a82a5d360b19080f2b1beae374c12d4f26146450Will Dietzvoid __ubsan::__ubsan_handle_vla_bound_not_positive_abort(VLABoundData *Data, 173a82a5d360b19080f2b1beae374c12d4f26146450Will Dietz ValueHandle Bound) { 174a82a5d360b19080f2b1beae374c12d4f26146450Will Dietz __ubsan_handle_vla_bound_not_positive(Data, Bound); 175b04caf1385a4279a7b95d41c3ccefc61842c3633Richard Smith Die(); 176b04caf1385a4279a7b95d41c3ccefc61842c3633Richard Smith} 17758561700a4abad310911a24a867da49a14fae91eRichard Smith 1785f1164955fb28a9bcb826abc195aa2119feb0f97Richard Smith 17958561700a4abad310911a24a867da49a14fae91eRichard Smithvoid __ubsan::__ubsan_handle_float_cast_overflow(FloatCastOverflowData *Data, 18058561700a4abad310911a24a867da49a14fae91eRichard Smith ValueHandle From) { 1815f1164955fb28a9bcb826abc195aa2119feb0f97Richard Smith Diag(getCallerLocation(), "value %0 is outside the range of representable " 1825f1164955fb28a9bcb826abc195aa2119feb0f97Richard Smith "values of type %2") 18358561700a4abad310911a24a867da49a14fae91eRichard Smith << Value(Data->FromType, From) << Data->FromType << Data->ToType; 184a82a5d360b19080f2b1beae374c12d4f26146450Will Dietz} 185a82a5d360b19080f2b1beae374c12d4f26146450Will Dietzvoid __ubsan::__ubsan_handle_float_cast_overflow_abort( 186a82a5d360b19080f2b1beae374c12d4f26146450Will Dietz FloatCastOverflowData *Data, 187a82a5d360b19080f2b1beae374c12d4f26146450Will Dietz ValueHandle From) { 1885f1164955fb28a9bcb826abc195aa2119feb0f97Richard Smith Diag(getCallerLocation(), "value %0 is outside the range of representable " 1895f1164955fb28a9bcb826abc195aa2119feb0f97Richard Smith "values of type %2") 1905f1164955fb28a9bcb826abc195aa2119feb0f97Richard Smith << Value(Data->FromType, From) << Data->FromType << Data->ToType; 19158561700a4abad310911a24a867da49a14fae91eRichard Smith Die(); 19258561700a4abad310911a24a867da49a14fae91eRichard Smith} 193f2d77d03b75733139c9f0896162bbc7a6fc38385Richard Smith 194f2d77d03b75733139c9f0896162bbc7a6fc38385Richard Smithvoid __ubsan::__ubsan_handle_load_invalid_value(InvalidValueData *Data, 195f2d77d03b75733139c9f0896162bbc7a6fc38385Richard Smith ValueHandle Val) { 1965f1164955fb28a9bcb826abc195aa2119feb0f97Richard Smith Diag(getCallerLocation(), "load of value %0, which is not a valid value for " 1975f1164955fb28a9bcb826abc195aa2119feb0f97Richard Smith "type %1") 198f2d77d03b75733139c9f0896162bbc7a6fc38385Richard Smith << Value(Data->Type, Val) << Data->Type; 199f2d77d03b75733139c9f0896162bbc7a6fc38385Richard Smith} 200f2d77d03b75733139c9f0896162bbc7a6fc38385Richard Smithvoid __ubsan::__ubsan_handle_load_invalid_value_abort(InvalidValueData *Data, 201f2d77d03b75733139c9f0896162bbc7a6fc38385Richard Smith ValueHandle Val) { 2025f1164955fb28a9bcb826abc195aa2119feb0f97Richard Smith Diag(getCallerLocation(), "load of value %0, which is not a valid value for " 2035f1164955fb28a9bcb826abc195aa2119feb0f97Richard Smith "type %1") 2045f1164955fb28a9bcb826abc195aa2119feb0f97Richard Smith << Value(Data->Type, Val) << Data->Type; 205f2d77d03b75733139c9f0896162bbc7a6fc38385Richard Smith Die(); 206f2d77d03b75733139c9f0896162bbc7a6fc38385Richard Smith} 207