From ea2d8780e9c78628fe5e3312ca4c17c054156c83 Mon Sep 17 00:00:00 2001 From: Evgeniy Stepanov Date: Thu, 31 Jan 2013 09:58:59 +0000 Subject: [PATCH] Annotate BumpPtrAllocator for MemorySanitizer. This change adds MemorySanitizer annotations to BumpPtrAllocator to improve report quality. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@174051 91177308-0d34-0410-b5e6-96231b3b80d8 --- cmake/config-ix.cmake | 1 + include/llvm/Config/config.h.cmake | 3 +++ include/llvm/Support/Compiler.h | 18 ++++++++++++++++++ lib/Support/Allocator.cpp | 7 +++++++ 4 files changed, 29 insertions(+) diff --git a/cmake/config-ix.cmake b/cmake/config-ix.cmake index c625b871e4c..a313e9cbb03 100755 --- a/cmake/config-ix.cmake +++ b/cmake/config-ix.cmake @@ -54,6 +54,7 @@ check_include_file(ndir.h HAVE_NDIR_H) if( NOT PURE_WINDOWS ) check_include_file(pthread.h HAVE_PTHREAD_H) endif() +check_include_file(sanitizer/msan_interface.h HAVE_SANITIZER_MSAN_INTERFACE_H) check_include_file(setjmp.h HAVE_SETJMP_H) check_include_file(signal.h HAVE_SIGNAL_H) check_include_file(stdint.h HAVE_STDINT_H) diff --git a/include/llvm/Config/config.h.cmake b/include/llvm/Config/config.h.cmake index 94870834313..b0b81042051 100644 --- a/include/llvm/Config/config.h.cmake +++ b/include/llvm/Config/config.h.cmake @@ -468,6 +468,9 @@ /* Define to 1 if the system has the type `u_int64_t'. */ #cmakedefine HAVE_U_INT64_T ${HAVE_U_INT64_T} +/* Define to 1 if you have the header file. */ +#cmakedefine HAVE_SANITIZER_MSAN_INTERFACE_H ${HAVE_SANITIZER_MSAN_INTERFACE_H} + /* Define to 1 if you have the header file. */ #cmakedefine HAVE_VALGRIND_VALGRIND_H ${HAVE_VALGRIND_VALGRIND_H} diff --git a/include/llvm/Support/Compiler.h b/include/llvm/Support/Compiler.h index 96af756dde3..36539f6d346 100644 --- a/include/llvm/Support/Compiler.h +++ b/include/llvm/Support/Compiler.h @@ -15,6 +15,8 @@ #ifndef LLVM_SUPPORT_COMPILER_H #define LLVM_SUPPORT_COMPILER_H +#include "llvm/Config/config.h" + #ifndef __has_feature # define __has_feature(x) 0 #endif @@ -293,4 +295,20 @@ # define LLVM_FUNCTION_NAME __func__ #endif +/// \macro LLVM_ENABLE_MSAN_ANNOTATIONS +/// \brief Are MemorySanitizer annotations available. +#if defined(HAVE_SANITIZER_MSAN_INTERFACE_H) +# include +#else +# define __msan_allocated_memory(p, size) +#endif + +/// \macro LLVM_MEMORY_SANITIZER_BUILD +/// \brief Whether LLVM itself is built with MemorySanitizer instrumentation. +#if __has_feature(memory_sanitizer) +# define LLVM_MEMORY_SANITIZER_BUILD 1 +#else +# define LLVM_MEMORY_SANITIZER_BUILD 0 +#endif + #endif diff --git a/lib/Support/Allocator.cpp b/lib/Support/Allocator.cpp index 28f4e64ac77..b4fdc1e1bc1 100644 --- a/lib/Support/Allocator.cpp +++ b/lib/Support/Allocator.cpp @@ -12,6 +12,7 @@ //===----------------------------------------------------------------------===// #include "llvm/Support/Allocator.h" +#include "llvm/Support/Compiler.h" #include "llvm/Support/DataTypes.h" #include "llvm/Support/Memory.h" #include "llvm/Support/Recycler.h" @@ -102,6 +103,10 @@ void *BumpPtrAllocator::Allocate(size_t Size, size_t Alignment) { // Check if we can hold it. if (Ptr + Size <= End) { CurPtr = Ptr + Size; + // Update the allocation point of this memory block in MemorySanitizer. + // Without this, MemorySanitizer reports for values originating from it will + // point to the allocation point of the entire slab. + __msan_allocated_memory(Ptr, Size); return Ptr; } @@ -117,6 +122,7 @@ void *BumpPtrAllocator::Allocate(size_t Size, size_t Alignment) { Ptr = AlignPtr((char*)(NewSlab + 1), Alignment); assert((uintptr_t)Ptr + Size <= (uintptr_t)NewSlab + NewSlab->Size); + __msan_allocated_memory(Ptr, Size); return Ptr; } @@ -125,6 +131,7 @@ void *BumpPtrAllocator::Allocate(size_t Size, size_t Alignment) { Ptr = AlignPtr(CurPtr, Alignment); CurPtr = Ptr + Size; assert(CurPtr <= End && "Unable to allocate memory!"); + __msan_allocated_memory(Ptr, Size); return Ptr; } -- 2.34.1