On 10/19/20 9:39 AM, Tobias Burnus wrote:
Filled as https://bugs.llvm.org/show_bug.cgi?id=47896
That issue was fixed. What's the proper way to apply this patch? Simply committing the attached patch* or is there more required? Tobias *Namely, from LLVM: git diff 51ff04567b2f8d06b2062bd3ed72eab2e93e4466.. compiler-rt/lib/sanitizer_common/; I ignored the changes in compiler-rt/lib/{gwp_asan,memprof}. ----------------- Mentor Graphics (Deutschland) GmbH, Arnulfstraße 201, 80634 München / Germany Registergericht München HRB 106955, Geschäftsführer: Thomas Heurung, Alexander Walter
libsanitizer: merge from master libsanitizer/MERGE | 2 +- libsanitizer/sanitizer_common/sanitizer_allocator_report.cpp | 8 ++++++++ libsanitizer/sanitizer_common/sanitizer_allocator_report.h | 1 + libsanitizer/sanitizer_common/sanitizer_flags.inc | 5 +++-- libsanitizer/sanitizer_common/sanitizer_internal_defs.h | 3 +++ libsanitizer/sanitizer_common/sanitizer_linux_libcdep.cpp | 7 ++----- .../sanitizer_common/sanitizer_stoptheworld_linux_libcdep.cpp | 4 ++++ libsanitizer/sanitizer_common/sanitizer_tls_get_addr.cpp | 7 ++++++- 8 files changed, 28 insertions(+), 9 deletions(-) diff --git a/libsanitizer/MERGE b/libsanitizer/MERGE index d2a25927007..f9657fc6728 100644 --- a/libsanitizer/MERGE +++ b/libsanitizer/MERGE @@ -1,4 +1,4 @@ -51ff04567b2f8d06b2062bd3ed72eab2e93e4466 +f97ca48b1cbbf5da065e94271cb3af4f1c907dd4 The first line of this file holds the git revision number of the last merge done from the master library sources. diff --git a/libsanitizer/sanitizer_common/sanitizer_allocator_report.cpp b/libsanitizer/sanitizer_common/sanitizer_allocator_report.cpp index d74e08010d5..1c6520819ef 100644 --- a/libsanitizer/sanitizer_common/sanitizer_allocator_report.cpp +++ b/libsanitizer/sanitizer_common/sanitizer_allocator_report.cpp @@ -134,4 +134,12 @@ void NORETURN ReportOutOfMemory(uptr requested_size, const StackTrace *stack) { Die(); } +void NORETURN ReportRssLimitExceeded(const StackTrace *stack) { + { + ScopedAllocatorErrorReport report("rss-limit-exceeded", stack); + Report("ERROR: %s: allocator exceeded the RSS limit\n", SanitizerToolName); + } + Die(); +} + } // namespace __sanitizer diff --git a/libsanitizer/sanitizer_common/sanitizer_allocator_report.h b/libsanitizer/sanitizer_common/sanitizer_allocator_report.h index 0653c365c1c..6e4e6b13549 100644 --- a/libsanitizer/sanitizer_common/sanitizer_allocator_report.h +++ b/libsanitizer/sanitizer_common/sanitizer_allocator_report.h @@ -33,6 +33,7 @@ void NORETURN ReportInvalidPosixMemalignAlignment(uptr alignment, void NORETURN ReportAllocationSizeTooBig(uptr user_size, uptr max_size, const StackTrace *stack); void NORETURN ReportOutOfMemory(uptr requested_size, const StackTrace *stack); +void NORETURN ReportRssLimitExceeded(const StackTrace *stack); } // namespace __sanitizer diff --git a/libsanitizer/sanitizer_common/sanitizer_flags.inc b/libsanitizer/sanitizer_common/sanitizer_flags.inc index d1412478fd2..d8e809b0609 100644 --- a/libsanitizer/sanitizer_common/sanitizer_flags.inc +++ b/libsanitizer/sanitizer_common/sanitizer_flags.inc @@ -82,8 +82,9 @@ COMMON_FLAG(bool, print_summary, true, "If false, disable printing error summaries in addition to error " "reports.") COMMON_FLAG(int, print_module_map, 0, - "OS X only (0 - don't print, 1 - print only once before process " - "exits, 2 - print after each report).") + "Print the process module map where supported (0 - don't print, " + "1 - print only once before process exits, 2 - print after each " + "report).") COMMON_FLAG(bool, check_printf, true, "Check printf arguments.") #define COMMON_FLAG_HANDLE_SIGNAL_HELP(signal) \ "Controls custom tool's " #signal " handler (0 - do not registers the " \ diff --git a/libsanitizer/sanitizer_common/sanitizer_internal_defs.h b/libsanitizer/sanitizer_common/sanitizer_internal_defs.h index a6c55148705..8b34e54137d 100644 --- a/libsanitizer/sanitizer_common/sanitizer_internal_defs.h +++ b/libsanitizer/sanitizer_common/sanitizer_internal_defs.h @@ -448,5 +448,8 @@ using namespace __sanitizer; namespace __hwasan { using namespace __sanitizer; } +namespace __memprof { +using namespace __sanitizer; +} #endif // SANITIZER_DEFS_H diff --git a/libsanitizer/sanitizer_common/sanitizer_linux_libcdep.cpp b/libsanitizer/sanitizer_common/sanitizer_linux_libcdep.cpp index af077439478..2bd5564ae05 100644 --- a/libsanitizer/sanitizer_common/sanitizer_linux_libcdep.cpp +++ b/libsanitizer/sanitizer_common/sanitizer_linux_libcdep.cpp @@ -385,12 +385,9 @@ uptr ThreadSelf() { descr_addr = reinterpret_cast<uptr>(__builtin_thread_pointer()) - ThreadDescriptorSize(); #elif SANITIZER_RISCV64 - uptr tcb_end; - asm volatile("mv %0, tp;\n" : "=r"(tcb_end)); // https://github.com/riscv/riscv-elf-psabi-doc/issues/53 - const uptr kTlsTcbOffset = 0x800; - descr_addr = - reinterpret_cast<uptr>(tcb_end - kTlsTcbOffset - TlsPreTcbSize()); + uptr thread_pointer = reinterpret_cast<uptr>(__builtin_thread_pointer()); + descr_addr = thread_pointer - TlsPreTcbSize(); #elif defined(__s390__) descr_addr = reinterpret_cast<uptr>(__builtin_thread_pointer()); #elif defined(__powerpc64__) diff --git a/libsanitizer/sanitizer_common/sanitizer_stoptheworld_linux_libcdep.cpp b/libsanitizer/sanitizer_common/sanitizer_stoptheworld_linux_libcdep.cpp index 6a3c00458ef..eb89f1fddc5 100644 --- a/libsanitizer/sanitizer_common/sanitizer_stoptheworld_linux_libcdep.cpp +++ b/libsanitizer/sanitizer_common/sanitizer_stoptheworld_linux_libcdep.cpp @@ -486,6 +486,10 @@ typedef user_regs_struct regs_struct; #define REG_SP rsp #endif #define ARCH_IOVEC_FOR_GETREGSET +// Support ptrace extensions even when compiled without required kernel support +#ifndef NT_X86_XSTATE +#define NT_X86_XSTATE 0x202 +#endif // Compiler may use FP registers to store pointers. static constexpr uptr kExtraRegs[] = {NT_X86_XSTATE, NT_FPREGSET}; diff --git a/libsanitizer/sanitizer_common/sanitizer_tls_get_addr.cpp b/libsanitizer/sanitizer_common/sanitizer_tls_get_addr.cpp index 9ca898a306a..10748f96420 100644 --- a/libsanitizer/sanitizer_common/sanitizer_tls_get_addr.cpp +++ b/libsanitizer/sanitizer_common/sanitizer_tls_get_addr.cpp @@ -80,8 +80,13 @@ void DTLS_Destroy() { #if defined(__powerpc64__) || defined(__mips__) // This is glibc's TLS_DTV_OFFSET: // "Dynamic thread vector pointers point 0x8000 past the start of each -// TLS block." +// TLS block." (sysdeps/<arch>/dl-tls.h) static const uptr kDtvOffset = 0x8000; +#elif defined(__riscv) +// This is glibc's TLS_DTV_OFFSET: +// "Dynamic thread vector pointers point 0x800 past the start of each +// TLS block." (sysdeps/riscv/dl-tls.h) +static const uptr kDtvOffset = 0x800; #else static const uptr kDtvOffset = 0; #endif