Index: include/llvm/IR/Metadata.h =================================================================== --- include/llvm/IR/Metadata.h +++ include/llvm/IR/Metadata.h @@ -766,7 +766,7 @@ MDNode(LLVMContext &Context, unsigned ID, StorageType Storage, ArrayRef Ops1, ArrayRef Ops2 = None); - ~MDNode() = default; + LLVM_NO_SANITIZE_MEMORY_ATTRIBUTE ~MDNode() = default; void dropAllReferences(); Index: include/llvm/IR/User.h =================================================================== --- include/llvm/IR/User.h +++ include/llvm/IR/User.h @@ -72,8 +72,9 @@ void growHungoffUses(unsigned N, bool IsPhi = false); public: - ~User() override { - } + // Repress memory sanitization, due to use-after-destroy by operator + // delete. Bug report 24578 identifies this issue. + ~User() override {} /// \brief Free memory allocated for User and Use objects. void operator delete(void *Usr); /// \brief Placement delete - required by std, but never called. Index: include/llvm/Support/Compiler.h =================================================================== --- include/llvm/Support/Compiler.h +++ include/llvm/Support/Compiler.h @@ -323,10 +323,12 @@ #if __has_feature(memory_sanitizer) # define LLVM_MEMORY_SANITIZER_BUILD 1 # include +# define LLVM_NO_SANITIZE_MEMORY_ATTRIBUTE __attribute__((no_sanitize_memory)) #else # define LLVM_MEMORY_SANITIZER_BUILD 0 # define __msan_allocated_memory(p, size) # define __msan_unpoison(p, size) +# define LLVM_NO_SANITIZE_MEMORY_ATTRIBUTE #endif /// \macro LLVM_ADDRESS_SANITIZER_BUILD Index: lib/IR/User.cpp =================================================================== --- lib/IR/User.cpp +++ lib/IR/User.cpp @@ -118,7 +118,7 @@ // User operator delete Implementation //===----------------------------------------------------------------------===// -void User::operator delete(void *Usr) { +LLVM_NO_SANITIZE_MEMORY_ATTRIBUTE void User::operator delete(void *Usr) { // Hung off uses use a single Use* before the User, while other subclasses // use a Use[] allocated prior to the user. User *Obj = static_cast(Usr);