mirror of
https://github.com/RPCS3/llvm.git
synced 2025-02-06 10:38:54 +00:00
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
This commit is contained in:
parent
b20d4f8d49
commit
c9715624fa
@ -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;
|
||||
}
|
||||
|
||||
|
Loading…
x
Reference in New Issue
Block a user