diff options
| author | Dan Liew <dan@su-root.co.uk> | 2018-02-24 13:14:44 +0000 | 
|---|---|---|
| committer | Dan Liew <dan@su-root.co.uk> | 2018-02-24 13:14:44 +0000 | 
| commit | 17ad62be94de44f04475e47f1d8a783a59a591c5 (patch) | |
| tree | dedcc35f267339c858396a62f320ade7849fc0fd | |
| parent | 744f008a7561cdaf320f24d5488480dd1e46dd50 (diff) | |
| download | bcm5719-llvm-17ad62be94de44f04475e47f1d8a783a59a591c5.tar.gz bcm5719-llvm-17ad62be94de44f04475e47f1d8a783a59a591c5.zip  | |
[ubsan-minimal] Fix the ubsan_minimal debug build (COMPILER_RT_DEBUG=1) on macOS.
`ubsan_minimal` makes use of the `_sanitizer::atomic_load` function.
This function uses the `DCHECK` macro which in debug builds will use
the `_sanitizer::CheckFailed` function.
This function is part of `sanitizer_common` but `ubsan_minimal` doesn't
use this so the implementation is missing which leads to link failures
on macOS when trying to link `libclang_rt.ubsan_minimal_osx_dynamic.dylib`.
This is in contrast to the BFD linker on Linux which doesn't seem to care
about the missing symbol.
A basic implementation of `_sanitizer::CheckFailed` has been added to
the `ubsan_minimal` debug build to avoid the link error. The
implementation could definitely be improved but I don't know which
functions can be used in this context so I decided to restrict myself to
functions only being used in `ubsan_minimal` already.
llvm-svn: 326032
| -rw-r--r-- | compiler-rt/lib/ubsan_minimal/ubsan_minimal_handlers.cc | 13 | 
1 files changed, 13 insertions, 0 deletions
diff --git a/compiler-rt/lib/ubsan_minimal/ubsan_minimal_handlers.cc b/compiler-rt/lib/ubsan_minimal/ubsan_minimal_handlers.cc index 5a5675c983f..f25a75a863c 100644 --- a/compiler-rt/lib/ubsan_minimal/ubsan_minimal_handlers.cc +++ b/compiler-rt/lib/ubsan_minimal/ubsan_minimal_handlers.cc @@ -61,6 +61,19 @@ static void abort_with_message(const char *msg) {  static void abort_with_message(const char *) { abort(); }  #endif +#if SANITIZER_DEBUG +namespace __sanitizer { +// The DCHECK macro needs this symbol to be defined. +void NORETURN CheckFailed(const char *file, int, const char *cond, u64, u64) { +  message("Sanitizer CHECK failed: "); +  message(file); +  message(":?? : "); // FIXME: Show line number. +  message(cond); +  abort(); +} +} // namespace __sanitizer +#endif +  #define INTERFACE extern "C" __attribute__((visibility("default")))  // FIXME: add caller pc to the error message (possibly as "ubsan: error-type  | 

