diff options
author | Serge Pavlov <sepavloff@gmail.com> | 2018-05-30 09:01:12 +0000 |
---|---|---|
committer | Serge Pavlov <sepavloff@gmail.com> | 2018-05-30 09:01:12 +0000 |
commit | c4b6d0ebab4cfa0942aed43f030f3d57179c112e (patch) | |
tree | be72544769b40276a162ab35157b347253cc1bf2 | |
parent | f426fc7000fb6c4875cdcd846c07069f025b2e3d (diff) | |
download | bcm5719-llvm-c4b6d0ebab4cfa0942aed43f030f3d57179c112e.tar.gz bcm5719-llvm-c4b6d0ebab4cfa0942aed43f030f3d57179c112e.zip |
Revert commit 333506
It looks like this commit is responsible for the fail:
http://lab.llvm.org:8011/builders/sanitizer-x86_64-linux-autoconf/builds/24382.
llvm-svn: 333518
-rw-r--r-- | llvm/include/llvm/ADT/SmallVector.h | 5 | ||||
-rw-r--r-- | llvm/include/llvm/ADT/StringMap.h | 4 | ||||
-rw-r--r-- | llvm/include/llvm/Support/Allocator.h | 37 | ||||
-rw-r--r-- | llvm/include/llvm/Support/MemAlloc.h | 49 | ||||
-rw-r--r-- | llvm/lib/IR/DataLayout.cpp | 6 | ||||
-rw-r--r-- | llvm/lib/Support/FoldingSet.cpp | 7 | ||||
-rw-r--r-- | llvm/lib/Support/Mutex.cpp | 5 | ||||
-rw-r--r-- | llvm/lib/Support/SmallPtrSet.cpp | 20 | ||||
-rw-r--r-- | llvm/lib/Support/SmallVector.cpp | 8 | ||||
-rw-r--r-- | llvm/lib/Support/StringMap.cpp | 8 |
10 files changed, 80 insertions, 69 deletions
diff --git a/llvm/include/llvm/ADT/SmallVector.h b/llvm/include/llvm/ADT/SmallVector.h index e6e3aa82569..3d17e70bad6 100644 --- a/llvm/include/llvm/ADT/SmallVector.h +++ b/llvm/include/llvm/ADT/SmallVector.h @@ -18,7 +18,6 @@ #include "llvm/Support/AlignOf.h" #include "llvm/Support/Compiler.h" #include "llvm/Support/MathExtras.h" -#include "llvm/Support/MemAlloc.h" #include "llvm/Support/type_traits.h" #include "llvm/Support/ErrorHandling.h" #include <algorithm> @@ -239,7 +238,9 @@ void SmallVectorTemplateBase<T, isPodLike>::grow(size_t MinSize) { size_t NewCapacity = size_t(NextPowerOf2(CurCapacity+2)); if (NewCapacity < MinSize) NewCapacity = MinSize; - T *NewElts = static_cast<T*>(llvm::safe_malloc(NewCapacity*sizeof(T))); + T *NewElts = static_cast<T*>(malloc(NewCapacity*sizeof(T))); + if (NewElts == nullptr) + report_bad_alloc_error("Allocation of SmallVector element failed."); // Move the elements over. this->uninitialized_move(this->begin(), this->end(), NewElts); diff --git a/llvm/include/llvm/ADT/StringMap.h b/llvm/include/llvm/ADT/StringMap.h index a9f83d3f509..d34d5ed7e60 100644 --- a/llvm/include/llvm/ADT/StringMap.h +++ b/llvm/include/llvm/ADT/StringMap.h @@ -164,7 +164,9 @@ public: StringMapEntry *NewItem = static_cast<StringMapEntry*>(Allocator.Allocate(AllocSize,Alignment)); - assert(NewItem && "Unhandled out-of-memory"); + + if (NewItem == nullptr) + report_bad_alloc_error("Allocation of StringMap entry failed."); // Construct the value. new (NewItem) StringMapEntry(KeyLength, std::forward<InitTy>(InitVals)...); diff --git a/llvm/include/llvm/Support/Allocator.h b/llvm/include/llvm/Support/Allocator.h index 184ac491b1f..866cad56348 100644 --- a/llvm/include/llvm/Support/Allocator.h +++ b/llvm/include/llvm/Support/Allocator.h @@ -23,9 +23,8 @@ #include "llvm/ADT/SmallVector.h" #include "llvm/Support/Compiler.h" -#include "llvm/Support/ErrorHandling.h" #include "llvm/Support/MathExtras.h" -#include "llvm/Support/MemAlloc.h" +#include "llvm/Support/ErrorHandling.h" #include <algorithm> #include <cassert> #include <cstddef> @@ -96,7 +95,11 @@ public: LLVM_ATTRIBUTE_RETURNS_NONNULL void *Allocate(size_t Size, size_t /*Alignment*/) { - return safe_malloc(Size); + void* memPtr = malloc(Size); + if (memPtr == nullptr) + report_bad_alloc_error("Allocation in MallocAllocator failed."); + + return memPtr; } // Pull in base class overloads. @@ -436,6 +439,34 @@ public: T *Allocate(size_t num = 1) { return Allocator.Allocate<T>(num); } }; +/// \{ +/// Counterparts of allocation functions defined in namespace 'std', which crash +/// on allocation failure instead of returning null pointer. + +LLVM_ATTRIBUTE_RETURNS_NONNULL inline void *safe_malloc(size_t Sz) { + void *Result = std::malloc(Sz); + if (Result == nullptr) + report_bad_alloc_error("Allocation failed."); + return Result; +} + +LLVM_ATTRIBUTE_RETURNS_NONNULL inline void *safe_calloc(size_t Count, + size_t Sz) { + void *Result = std::calloc(Count, Sz); + if (Result == nullptr) + report_bad_alloc_error("Allocation failed."); + return Result; +} + +LLVM_ATTRIBUTE_RETURNS_NONNULL inline void *safe_realloc(void *Ptr, size_t Sz) { + void *Result = std::realloc(Ptr, Sz); + if (Result == nullptr) + report_bad_alloc_error("Allocation failed."); + return Result; +} + +/// \} + } // end namespace llvm template <typename AllocatorT, size_t SlabSize, size_t SizeThreshold> diff --git a/llvm/include/llvm/Support/MemAlloc.h b/llvm/include/llvm/Support/MemAlloc.h deleted file mode 100644 index d06c659cfba..00000000000 --- a/llvm/include/llvm/Support/MemAlloc.h +++ /dev/null @@ -1,49 +0,0 @@ -//===- MemAlloc.h - Memory allocation functions -----------------*- C++ -*-===// -// -// The LLVM Compiler Infrastructure -// -// This file is distributed under the University of Illinois Open Source -// License. See LICENSE.TXT for details. -// -//===----------------------------------------------------------------------===// -/// \file -/// -/// This file defines counterparts of C library allocation functions defined in -/// the namespace 'std'. The new allocation functions crash on allocation -/// failure instead of returning null pointer. -/// -//===----------------------------------------------------------------------===// - -#ifndef LLVM_SUPPORT_MEMALLOC_H -#define LLVM_SUPPORT_MEMALLOC_H - -#include "llvm/Support/Compiler.h" -#include "llvm/Support/ErrorHandling.h" -#include <cstdlib> - -namespace llvm { - -LLVM_ATTRIBUTE_RETURNS_NONNULL inline void *safe_malloc(size_t Sz) { - void *Result = std::malloc(Sz); - if (Result == nullptr) - report_bad_alloc_error("Allocation failed"); - return Result; -} - -LLVM_ATTRIBUTE_RETURNS_NONNULL inline void *safe_calloc(size_t Count, - size_t Sz) { - void *Result = std::calloc(Count, Sz); - if (Result == nullptr) - report_bad_alloc_error("Allocation failed"); - return Result; -} - -LLVM_ATTRIBUTE_RETURNS_NONNULL inline void *safe_realloc(void *Ptr, size_t Sz) { - void *Result = std::realloc(Ptr, Sz); - if (Result == nullptr) - report_bad_alloc_error("Allocation failed"); - return Result; -} - -} -#endif diff --git a/llvm/lib/IR/DataLayout.cpp b/llvm/lib/IR/DataLayout.cpp index 62c67127276..fff2f67fe5a 100644 --- a/llvm/lib/IR/DataLayout.cpp +++ b/llvm/lib/IR/DataLayout.cpp @@ -596,8 +596,10 @@ const StructLayout *DataLayout::getStructLayout(StructType *Ty) const { // Otherwise, create the struct layout. Because it is variable length, we // malloc it, then use placement new. int NumElts = Ty->getNumElements(); - StructLayout *L = (StructLayout *) - safe_malloc(sizeof(StructLayout)+(NumElts-1) * sizeof(uint64_t)); + StructLayout *L = + (StructLayout *)malloc(sizeof(StructLayout)+(NumElts-1) * sizeof(uint64_t)); + if (L == nullptr) + report_bad_alloc_error("Allocation of StructLayout elements failed."); // Set SL before calling StructLayout's ctor. The ctor could cause other // entries to be added to TheMap, invalidating our reference. diff --git a/llvm/lib/Support/FoldingSet.cpp b/llvm/lib/Support/FoldingSet.cpp index ec7d57586e8..94237954903 100644 --- a/llvm/lib/Support/FoldingSet.cpp +++ b/llvm/lib/Support/FoldingSet.cpp @@ -214,8 +214,11 @@ static void **GetBucketFor(unsigned Hash, void **Buckets, unsigned NumBuckets) { /// AllocateBuckets - Allocated initialized bucket memory. static void **AllocateBuckets(unsigned NumBuckets) { - void **Buckets = static_cast<void**>(safe_calloc(NumBuckets + 1, - sizeof(void*))); + void **Buckets = static_cast<void**>(calloc(NumBuckets+1, sizeof(void*))); + + if (Buckets == nullptr) + report_bad_alloc_error("Allocation of Buckets failed."); + // Set the very last bucket to be a non-null "pointer". Buckets[NumBuckets] = reinterpret_cast<void*>(-1); return Buckets; diff --git a/llvm/lib/Support/Mutex.cpp b/llvm/lib/Support/Mutex.cpp index 7138c7a4b98..c70125f108e 100644 --- a/llvm/lib/Support/Mutex.cpp +++ b/llvm/lib/Support/Mutex.cpp @@ -47,7 +47,10 @@ MutexImpl::MutexImpl( bool recursive) { // Declare the pthread_mutex data structures pthread_mutex_t* mutex = - static_cast<pthread_mutex_t*>(safe_malloc(sizeof(pthread_mutex_t))); + static_cast<pthread_mutex_t*>(malloc(sizeof(pthread_mutex_t))); + + if (mutex == nullptr) + report_bad_alloc_error("Mutex allocation failed"); pthread_mutexattr_t attr; diff --git a/llvm/lib/Support/SmallPtrSet.cpp b/llvm/lib/Support/SmallPtrSet.cpp index fed4a17d663..119bb871d4c 100644 --- a/llvm/lib/Support/SmallPtrSet.cpp +++ b/llvm/lib/Support/SmallPtrSet.cpp @@ -32,7 +32,9 @@ void SmallPtrSetImplBase::shrink_and_clear() { NumNonEmpty = NumTombstones = 0; // Install the new array. Clear all the buckets to empty. - CurArray = (const void**)safe_malloc(sizeof(void*) * CurArraySize); + CurArray = (const void**)malloc(sizeof(void*) * CurArraySize); + if (CurArray == nullptr) + report_bad_alloc_error("Allocation of SmallPtrSet bucket array failed."); memset(CurArray, -1, CurArraySize*sizeof(void*)); } @@ -98,7 +100,9 @@ void SmallPtrSetImplBase::Grow(unsigned NewSize) { bool WasSmall = isSmall(); // Install the new array. Clear all the buckets to empty. - const void **NewBuckets = (const void**) safe_malloc(sizeof(void*) * NewSize); + const void **NewBuckets = (const void**) malloc(sizeof(void*) * NewSize); + if (NewBuckets == nullptr) + report_bad_alloc_error("Allocation of SmallPtrSet bucket array failed."); // Reset member only if memory was allocated successfully CurArray = NewBuckets; @@ -128,7 +132,9 @@ SmallPtrSetImplBase::SmallPtrSetImplBase(const void **SmallStorage, CurArray = SmallArray; // Otherwise, allocate new heap space (unless we were the same size) } else { - CurArray = (const void**)safe_malloc(sizeof(void*) * that.CurArraySize); + CurArray = (const void**)malloc(sizeof(void*) * that.CurArraySize); + if (CurArray == nullptr) + report_bad_alloc_error("Allocation of SmallPtrSet bucket array failed."); } // Copy over the that array. @@ -157,12 +163,16 @@ void SmallPtrSetImplBase::CopyFrom(const SmallPtrSetImplBase &RHS) { // Otherwise, allocate new heap space (unless we were the same size) } else if (CurArraySize != RHS.CurArraySize) { if (isSmall()) - CurArray = (const void**)safe_malloc(sizeof(void*) * RHS.CurArraySize); + CurArray = (const void**)malloc(sizeof(void*) * RHS.CurArraySize); else { - const void **T = (const void**)safe_realloc(CurArray, + const void **T = (const void**)realloc(CurArray, sizeof(void*) * RHS.CurArraySize); + if (!T) + free(CurArray); CurArray = T; } + if (CurArray == nullptr) + report_bad_alloc_error("Allocation of SmallPtrSet bucket array failed."); } CopyHelper(RHS); diff --git a/llvm/lib/Support/SmallVector.cpp b/llvm/lib/Support/SmallVector.cpp index ccab4a125aa..74313151c76 100644 --- a/llvm/lib/Support/SmallVector.cpp +++ b/llvm/lib/Support/SmallVector.cpp @@ -25,13 +25,17 @@ void SmallVectorBase::grow_pod(void *FirstEl, size_t MinSizeInBytes, void *NewElts; if (BeginX == FirstEl) { - NewElts = safe_malloc(NewCapacityInBytes); + NewElts = malloc(NewCapacityInBytes); + if (NewElts == nullptr) + report_bad_alloc_error("Allocation of SmallVector element failed."); // Copy the elements over. No need to run dtors on PODs. memcpy(NewElts, this->BeginX, CurSizeBytes); } else { // If this wasn't grown from the inline copy, grow the allocated space. - NewElts = safe_realloc(this->BeginX, NewCapacityInBytes); + NewElts = realloc(this->BeginX, NewCapacityInBytes); + if (NewElts == nullptr) + report_bad_alloc_error("Reallocation of SmallVector element failed."); } this->EndX = (char*)NewElts+CurSizeBytes; diff --git a/llvm/lib/Support/StringMap.cpp b/llvm/lib/Support/StringMap.cpp index c1f707ce50a..79262cc6d3a 100644 --- a/llvm/lib/Support/StringMap.cpp +++ b/llvm/lib/Support/StringMap.cpp @@ -59,8 +59,10 @@ void StringMapImpl::init(unsigned InitSize) { NumTombstones = 0; TheTable = static_cast<StringMapEntryBase **>( - safe_calloc(NewNumBuckets+1, + std::calloc(NewNumBuckets+1, sizeof(StringMapEntryBase **) + sizeof(unsigned))); + if (TheTable == nullptr) + report_bad_alloc_error("Allocation of StringMap table failed."); // Set the member only if TheTable was successfully allocated NumBuckets = NewNumBuckets; @@ -218,7 +220,9 @@ unsigned StringMapImpl::RehashTable(unsigned BucketNo) { // Allocate one extra bucket which will always be non-empty. This allows the // iterators to stop at end. auto NewTableArray = static_cast<StringMapEntryBase **>( - safe_calloc(NewSize+1, sizeof(StringMapEntryBase *) + sizeof(unsigned))); + std::calloc(NewSize+1, sizeof(StringMapEntryBase *) + sizeof(unsigned))); + if (NewTableArray == nullptr) + report_bad_alloc_error("Allocation of StringMap hash table failed."); unsigned *NewHashArray = (unsigned *)(NewTableArray + NewSize + 1); NewTableArray[NewSize] = (StringMapEntryBase*)2; |