mirror of
https://github.com/c64scene-ar/llvm-6502.git
synced 2025-09-13 23:25:06 +00:00
Teach MemoryBuiltins and InstructionSimplify that operator new never returns NULL.
This is safe per C++11 18.6.1.1p3: [operator new returns] a non-null pointer to suitably aligned storage (3.7.4), or else throw a bad_alloc exception. This requirement is binding on a replacement version of this function. Brings us a tiny bit closer to eliminating more vector push_backs. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@191310 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
@@ -35,6 +35,7 @@ enum AllocType {
|
||||
CallocLike = 1<<1, // allocates + bzero
|
||||
ReallocLike = 1<<2, // reallocates
|
||||
StrDupLike = 1<<3,
|
||||
OpNewLike = MallocLike | (1<<4), // allocates; never returns null
|
||||
AllocLike = MallocLike | CallocLike | StrDupLike,
|
||||
AnyAlloc = MallocLike | CallocLike | ReallocLike | StrDupLike
|
||||
};
|
||||
@@ -52,13 +53,13 @@ struct AllocFnsTy {
|
||||
static const AllocFnsTy AllocationFnData[] = {
|
||||
{LibFunc::malloc, MallocLike, 1, 0, -1},
|
||||
{LibFunc::valloc, MallocLike, 1, 0, -1},
|
||||
{LibFunc::Znwj, MallocLike, 1, 0, -1}, // new(unsigned int)
|
||||
{LibFunc::Znwj, OpNewLike, 1, 0, -1}, // new(unsigned int)
|
||||
{LibFunc::ZnwjRKSt9nothrow_t, MallocLike, 2, 0, -1}, // new(unsigned int, nothrow)
|
||||
{LibFunc::Znwm, MallocLike, 1, 0, -1}, // new(unsigned long)
|
||||
{LibFunc::Znwm, OpNewLike, 1, 0, -1}, // new(unsigned long)
|
||||
{LibFunc::ZnwmRKSt9nothrow_t, MallocLike, 2, 0, -1}, // new(unsigned long, nothrow)
|
||||
{LibFunc::Znaj, MallocLike, 1, 0, -1}, // new[](unsigned int)
|
||||
{LibFunc::Znaj, OpNewLike, 1, 0, -1}, // new[](unsigned int)
|
||||
{LibFunc::ZnajRKSt9nothrow_t, MallocLike, 2, 0, -1}, // new[](unsigned int, nothrow)
|
||||
{LibFunc::Znam, MallocLike, 1, 0, -1}, // new[](unsigned long)
|
||||
{LibFunc::Znam, OpNewLike, 1, 0, -1}, // new[](unsigned long)
|
||||
{LibFunc::ZnamRKSt9nothrow_t, MallocLike, 2, 0, -1}, // new[](unsigned long, nothrow)
|
||||
{LibFunc::posix_memalign, MallocLike, 3, 2, -1},
|
||||
{LibFunc::calloc, CallocLike, 2, 0, 1},
|
||||
@@ -189,6 +190,13 @@ bool llvm::isReallocLikeFn(const Value *V, const TargetLibraryInfo *TLI,
|
||||
return getAllocationData(V, ReallocLike, TLI, LookThroughBitCast);
|
||||
}
|
||||
|
||||
/// \brief Tests if a value is a call or invoke to a library function that
|
||||
/// allocates memory and never returns null (such as operator new).
|
||||
bool llvm::isOperatorNewLikeFn(const Value *V, const TargetLibraryInfo *TLI,
|
||||
bool LookThroughBitCast) {
|
||||
return getAllocationData(V, OpNewLike, TLI, LookThroughBitCast);
|
||||
}
|
||||
|
||||
/// extractMallocCall - Returns the corresponding CallInst if the instruction
|
||||
/// is a malloc call. Since CallInst::CreateMalloc() only creates calls, we
|
||||
/// ignore InvokeInst here.
|
||||
|
Reference in New Issue
Block a user