From: Ted Kremenek Date: Mon, 28 Apr 2008 17:58:07 +0000 (+0000) Subject: Bug fix in BumpPtrAllocator: don't assume that all objects have the same alignment... X-Git-Url: http://demsky.eecs.uci.edu/git/?a=commitdiff_plain;h=c9715624fa096bf412bf5d63214d9ea8fae485af;p=oota-llvm.git Bug fix in BumpPtrAllocator: don't assume that all objects have the same alignment. "Bump" of the pointer for the next allocated object to be of the specified alignment. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@50362 91177308-0d34-0410-b5e6-96231b3b80d8 --- diff --git a/lib/Support/Allocator.cpp b/lib/Support/Allocator.cpp index 5961afe04c7..8ccd3908446 100644 --- a/lib/Support/Allocator.cpp +++ b/lib/Support/Allocator.cpp @@ -46,13 +46,16 @@ public: /// Allocate - Allocate and return at least the specified number of bytes. /// void *Allocate(unsigned AllocSize, unsigned Alignment, MemRegion **RegPtr) { - // Round size up to an even multiple of the alignment. - AllocSize = (AllocSize+Alignment-1) & ~(Alignment-1); - // If there is space in this region, return it. - if (unsigned(NextPtr+AllocSize-(char*)this) <= RegionSize) { - void *Result = NextPtr; - NextPtr += AllocSize; + char* Result = (char*) (((uintptr_t) (NextPtr+Alignment-1)) + & ~(Alignment-1)); + + // Speculate the new value of NextPtr. + char* NextPtrTmp = Result + AllocSize; + + // If we are still within the current region, return Result. + if (unsigned (NextPtrTmp - (char*) this) <= RegionSize) { + NextPtr = NextPtrTmp; return Result; }