Skip to content

Commit 2792d1a

Browse files
committed
[𝘀𝗽𝗿] initial version
Created using spr 1.3.7
2 parents 88e9a78 + 47f0408 commit 2792d1a

File tree

4 files changed

+105
-37
lines changed

4 files changed

+105
-37
lines changed
Lines changed: 50 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,50 @@
1+
/*===-- UbsanMinimalHandlers.inc - ubsan minimum handlers ------*- C++ -*-=== *\
2+
|*
3+
|* Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
4+
|* See https://llvm.org/LICENSE.txt for license information.
5+
|* SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
6+
|*
7+
\*===----------------------------------------------------------------------===*/
8+
9+
// There are two copies of this file, one in LLVM and one in compiler-rt.
10+
// These two MUST BE KEPT IN SYNC.
11+
// * llvm/include/llvm/Transforms/Instrumentation/UbsanMinimalHandlers.inc
12+
// * compiler-rt/lib/ubsan_minimal/UbsanMinimalHandlers.inc
13+
14+
#ifndef UBSAN_HANDLER_PTR
15+
#define UBSAN_HANDLER_PTR(Enum, String)
16+
#endif
17+
18+
#ifndef UBSAN_HANDLER
19+
#define UBSAN_HANDLER(Enum, String)
20+
#endif
21+
22+
#ifndef UBSAN_HANDLER_RECOVER
23+
#define UBSAN_HANDLER_RECOVER(Enum, String)
24+
#endif
25+
26+
UBSAN_HANDLER_PTR(type_mismatch, "type-mismatch")
27+
UBSAN_HANDLER(alignment_assumption, "alignment-assumption")
28+
UBSAN_HANDLER(add_overflow, "add-overflow")
29+
UBSAN_HANDLER(sub_overflow, "sub-overflow")
30+
UBSAN_HANDLER(mul_overflow, "mul-overflow")
31+
UBSAN_HANDLER(negate_overflow, "negate-overflow")
32+
UBSAN_HANDLER(divrem_overflow, "divrem-overflow")
33+
UBSAN_HANDLER(shift_out_of_bounds, "shift-out-of-bounds")
34+
UBSAN_HANDLER(out_of_bounds, "out-of-bounds")
35+
UBSAN_HANDLER(local_out_of_bounds, "local-out-of-bounds")
36+
UBSAN_HANDLER_RECOVER(builtin_unreachable, "builtin-unreachable")
37+
UBSAN_HANDLER_RECOVER(missing_return, "missing-return")
38+
UBSAN_HANDLER(vla_bound_not_positive, "vla-bound-not-positive")
39+
UBSAN_HANDLER(float_cast_overflow, "float-cast-overflow")
40+
UBSAN_HANDLER(load_invalid_value, "load-invalid-value")
41+
UBSAN_HANDLER(invalid_builtin, "invalid-builtin")
42+
UBSAN_HANDLER(invalid_objc_cast, "invalid-objc-cast")
43+
UBSAN_HANDLER(function_type_mismatch, "function-type-mismatch")
44+
UBSAN_HANDLER(implicit_conversion, "implicit-conversion")
45+
UBSAN_HANDLER(nonnull_arg, "nonnull-arg")
46+
UBSAN_HANDLER(nonnull_return, "nonnull-return")
47+
UBSAN_HANDLER(nullability_arg, "nullability-arg")
48+
UBSAN_HANDLER(nullability_return, "nullability-return")
49+
UBSAN_HANDLER(pointer_overflow, "pointer-overflow")
50+
UBSAN_HANDLER(cfi_check_fail, "cfi-check-fail")

compiler-rt/lib/ubsan_minimal/ubsan_minimal_handlers.cpp

Lines changed: 21 additions & 37 deletions
Original file line numberDiff line numberDiff line change
@@ -127,62 +127,46 @@ void NORETURN CheckFailed(const char *file, int, const char *cond, u64, u64) {
127127

128128
#define INTERFACE extern "C" __attribute__((visibility("default")))
129129

130-
#define HANDLER_RECOVER(name, kind) \
130+
#define UBSAN_HANDLER_RECOVER(name, kind) \
131131
INTERFACE void __ubsan_handle_##name##_minimal() { \
132132
__ubsan_report_error(kind, GET_CALLER_PC(), nullptr); \
133+
} \
134+
INTERFACE void __ubsan_handle_##name##_minimal_preserve() \
135+
[[clang::preserve_all]] { \
136+
__ubsan_report_error(kind, GET_CALLER_PC(), nullptr); \
133137
}
134138

135-
#define HANDLER_NORECOVER(name, kind) \
139+
#define UBSAN_HANDLER_NORECOVER(name, kind) \
136140
INTERFACE void __ubsan_handle_##name##_minimal_abort() { \
137141
uintptr_t caller = GET_CALLER_PC(); \
138142
__ubsan_report_error_fatal(kind, caller, nullptr); \
139143
abort_with_message(kind, caller, nullptr); \
140144
}
141145

142-
#define HANDLER(name, kind) \
143-
HANDLER_RECOVER(name, kind) \
144-
HANDLER_NORECOVER(name, kind)
146+
#define UBSAN_HANDLER(name, kind) \
147+
UBSAN_HANDLER_RECOVER(name, kind) \
148+
UBSAN_HANDLER_NORECOVER(name, kind)
145149

146-
#define HANDLER_RECOVER_PTR(name, kind) \
150+
#define UBSAN_HANDLER_RECOVER_PTR(name, kind) \
147151
INTERFACE void __ubsan_handle_##name##_minimal(const uintptr_t address) { \
148152
__ubsan_report_error(kind, GET_CALLER_PC(), &address); \
153+
} \
154+
INTERFACE void __ubsan_handle_##name##_minimal_preserve( \
155+
const uintptr_t address) [[clang::preserve_all]] { \
156+
__ubsan_report_error(kind, GET_CALLER_PC(), &address); \
149157
}
150158

151-
#define HANDLER_NORECOVER_PTR(name, kind) \
159+
#define UBSAN_HANDLER_NORECOVER_PTR(name, kind) \
152160
INTERFACE void __ubsan_handle_##name##_minimal_abort( \
153161
const uintptr_t address) { \
154162
uintptr_t caller = GET_CALLER_PC(); \
155163
__ubsan_report_error_fatal(kind, caller, &address); \
156164
abort_with_message(kind, caller, &address); \
157165
}
158166

159-
// A version of a handler that takes a pointer to a value.
160-
#define HANDLER_PTR(name, kind) \
161-
HANDLER_RECOVER_PTR(name, kind) \
162-
HANDLER_NORECOVER_PTR(name, kind)
163-
164-
HANDLER_PTR(type_mismatch, "type-mismatch")
165-
HANDLER(alignment_assumption, "alignment-assumption")
166-
HANDLER(add_overflow, "add-overflow")
167-
HANDLER(sub_overflow, "sub-overflow")
168-
HANDLER(mul_overflow, "mul-overflow")
169-
HANDLER(negate_overflow, "negate-overflow")
170-
HANDLER(divrem_overflow, "divrem-overflow")
171-
HANDLER(shift_out_of_bounds, "shift-out-of-bounds")
172-
HANDLER(out_of_bounds, "out-of-bounds")
173-
HANDLER(local_out_of_bounds, "local-out-of-bounds")
174-
HANDLER_RECOVER(builtin_unreachable, "builtin-unreachable")
175-
HANDLER_RECOVER(missing_return, "missing-return")
176-
HANDLER(vla_bound_not_positive, "vla-bound-not-positive")
177-
HANDLER(float_cast_overflow, "float-cast-overflow")
178-
HANDLER(load_invalid_value, "load-invalid-value")
179-
HANDLER(invalid_builtin, "invalid-builtin")
180-
HANDLER(invalid_objc_cast, "invalid-objc-cast")
181-
HANDLER(function_type_mismatch, "function-type-mismatch")
182-
HANDLER(implicit_conversion, "implicit-conversion")
183-
HANDLER(nonnull_arg, "nonnull-arg")
184-
HANDLER(nonnull_return, "nonnull-return")
185-
HANDLER(nullability_arg, "nullability-arg")
186-
HANDLER(nullability_return, "nullability-return")
187-
HANDLER(pointer_overflow, "pointer-overflow")
188-
HANDLER(cfi_check_fail, "cfi-check-fail")
167+
// A version of a UBSAN_HANDLER that takes a pointer to a value.
168+
#define UBSAN_HANDLER_PTR(name, kind) \
169+
UBSAN_HANDLER_RECOVER_PTR(name, kind) \
170+
UBSAN_HANDLER_NORECOVER_PTR(name, kind)
171+
172+
#include "UbsanMinimalHandlers.inc"

llvm/include/llvm/Analysis/TargetLibraryInfo.def

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2718,6 +2718,24 @@ TLI_DEFINE_ENUM_INTERNAL(write)
27182718
TLI_DEFINE_STRING_INTERNAL("write")
27192719
TLI_DEFINE_SIG_INTERNAL(SSizeT, Int, Ptr, SizeT)
27202720

2721+
#define UBSAN_HANDLER(Name, String) \
2722+
TLI_DEFINE_ENUM_INTERNAL(__ubsan_handle_##Name##_minimal_preserve) \
2723+
TLI_DEFINE_STRING_INTERNAL("__ubsan_handle_" #Name "_minimal_preserve") \
2724+
TLI_DEFINE_SIG_INTERNAL(Void)
2725+
2726+
#define UBSAN_HANDLER_RECOVER(Name, String) UBSAN_HANDLER(Name, String)
2727+
2728+
#define UBSAN_HANDLER_PTR(Name, String) \
2729+
TLI_DEFINE_ENUM_INTERNAL(__ubsan_handle_##Name##_minimal_preserve) \
2730+
TLI_DEFINE_STRING_INTERNAL("__ubsan_handle_" #Name "_minimal_preserve") \
2731+
TLI_DEFINE_SIG_INTERNAL(Void, IntX)
2732+
2733+
#include "llvm/Transforms/Instrumentation/UbsanMinimalHandlers.inc"
2734+
2735+
#undef UBSAN_HANDLER
2736+
#undef UBSAN_HANDLER_RECOVER
2737+
#undef UBSAN_HANDLER_PTR
2738+
27212739
#undef TLI_DEFINE_ENUM_INTERNAL
27222740
#undef TLI_DEFINE_STRING_INTERNAL
27232741
#undef TLI_DEFINE_SIG_INTERNAL

llvm/lib/Transforms/Utils/BuildLibCalls.cpp

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -303,6 +303,11 @@ static bool setAllocKind(Function &F, AllocFnKind K) {
303303
return true;
304304
}
305305

306+
static bool setPreserveAllCC(Function &F) {
307+
F.setCallingConv(CallingConv::PreserveAll);
308+
return true;
309+
}
310+
306311
bool llvm::inferNonMandatoryLibFuncAttrs(Module *M, StringRef Name,
307312
const TargetLibraryInfo &TLI) {
308313
Function *F = M->getFunction(Name);
@@ -1391,6 +1396,17 @@ bool llvm::inferNonMandatoryLibFuncAttrs(Function &F,
13911396
Changed |= setWillReturn(F);
13921397
Changed |= setOnlyWritesArgMemOrErrnoMem(F);
13931398
break;
1399+
1400+
#define UBSAN_HANDLER(Name, String) \
1401+
case LibFunc___ubsan_handle_##Name##_minimal_preserve:
1402+
1403+
#define UBSAN_HANDLER_RECOVER(Name, String) UBSAN_HANDLER(Name, String)
1404+
1405+
#define UBSAN_HANDLER_PTR(Name, String) \
1406+
case LibFunc___ubsan_handle_##Name##_minimal_preserve:
1407+
#include "llvm/Transforms/Instrumentation/UbsanMinimalHandlers.inc"
1408+
Changed |= setPreserveAllCC(F);
1409+
break;
13941410
default:
13951411
// FIXME: It'd be really nice to cover all the library functions we're
13961412
// aware of here.

0 commit comments

Comments
 (0)