[lfs-patches] r3432 - trunk/gcc

bdubbs at higgs.linuxfromscratch.org bdubbs at higgs.linuxfromscratch.org
Fri Aug 5 17:43:45 PDT 2016


Author: bdubbs
Date: Fri Aug  5 17:43:45 2016
New Revision: 3432

Log:
Add gcc patch that is needed for the latest glibc changes

Added:
   trunk/gcc/gcc-6.1.0-asan-1.patch

Added: trunk/gcc/gcc-6.1.0-asan-1.patch
==============================================================================
--- /dev/null	00:00:00 1970	(empty, because file is newly added)
+++ trunk/gcc/gcc-6.1.0-asan-1.patch	Fri Aug  5 17:43:45 2016	(r3432)
@@ -0,0 +1,84 @@
+Submitted By:            Bruce Dubbs <bdubbs at liinuxfromscratch.org>
+Date:                    2016-08-06
+Initial Package Version: 6/1/-
+Upstream Status:         Committed
+Origin:                  Upstream
+Description:             Fix ASAN breakage
+
+
+
+--- gcc-6-branch/libsanitizer/asan/asan_malloc_linux.cc	2016/05/18 21:24:16	236431
++++ gcc-6-branch/libsanitizer/asan/asan_malloc_linux.cc	2016/05/18 21:26:54	236432
+@@ -24,39 +24,62 @@
+ // ---------------------- Replacement functions ---------------- {{{1
+ using namespace __asan;  // NOLINT
+ 
++static uptr allocated_for_dlsym;
++static const uptr kDlsymAllocPoolSize = 1024;
++static uptr alloc_memory_for_dlsym[kDlsymAllocPoolSize];
++
++static bool IsInDlsymAllocPool(const void *ptr) {
++  uptr off = (uptr)ptr - (uptr)alloc_memory_for_dlsym;
++  return off < sizeof(alloc_memory_for_dlsym);
++}
++
++static void *AllocateFromLocalPool(uptr size_in_bytes) {
++  uptr size_in_words = RoundUpTo(size_in_bytes, kWordSize) / kWordSize;
++  void *mem = (void*)&alloc_memory_for_dlsym[allocated_for_dlsym];
++  allocated_for_dlsym += size_in_words;
++  CHECK_LT(allocated_for_dlsym, kDlsymAllocPoolSize);
++  return mem;
++}
++
+ INTERCEPTOR(void, free, void *ptr) {
+   GET_STACK_TRACE_FREE;
++  if (UNLIKELY(IsInDlsymAllocPool(ptr)))
++    return;
+   asan_free(ptr, &stack, FROM_MALLOC);
+ }
+ 
+ INTERCEPTOR(void, cfree, void *ptr) {
+   GET_STACK_TRACE_FREE;
++  if (UNLIKELY(IsInDlsymAllocPool(ptr)))
++    return;
+   asan_free(ptr, &stack, FROM_MALLOC);
+ }
+ 
+ INTERCEPTOR(void*, malloc, uptr size) {
++  if (UNLIKELY(!asan_inited))
++    // Hack: dlsym calls malloc before REAL(malloc) is retrieved from dlsym.
++    return AllocateFromLocalPool(size);
+   GET_STACK_TRACE_MALLOC;
+   return asan_malloc(size, &stack);
+ }
+ 
+ INTERCEPTOR(void*, calloc, uptr nmemb, uptr size) {
+-  if (UNLIKELY(!asan_inited)) {
++  if (UNLIKELY(!asan_inited))
+     // Hack: dlsym calls calloc before REAL(calloc) is retrieved from dlsym.
+-    const uptr kCallocPoolSize = 1024;
+-    static uptr calloc_memory_for_dlsym[kCallocPoolSize];
+-    static uptr allocated;
+-    uptr size_in_words = ((nmemb * size) + kWordSize - 1) / kWordSize;
+-    void *mem = (void*)&calloc_memory_for_dlsym[allocated];
+-    allocated += size_in_words;
+-    CHECK(allocated < kCallocPoolSize);
+-    return mem;
+-  }
++    return AllocateFromLocalPool(nmemb * size);
+   GET_STACK_TRACE_MALLOC;
+   return asan_calloc(nmemb, size, &stack);
+ }
+ 
+ INTERCEPTOR(void*, realloc, void *ptr, uptr size) {
+   GET_STACK_TRACE_MALLOC;
++  if (UNLIKELY(IsInDlsymAllocPool(ptr))) {
++    uptr offset = (uptr)ptr - (uptr)alloc_memory_for_dlsym;
++    uptr copy_size = Min(size, kDlsymAllocPoolSize - offset);
++    void *new_ptr = asan_malloc(size, &stack);
++    internal_memcpy(new_ptr, ptr, copy_size);
++    return new_ptr;
++  }
+   return asan_realloc(ptr, size, &stack);
+ }
+ 


More information about the patches mailing list