now that libsystem no longer uses SmallVector, we can move

SmallVectorBase::grow_pod out of line, finally satisfying PR3758.

llvm-svn: 91529
This commit is contained in:
Chris Lattner 2009-12-16 08:44:24 +00:00
parent a6fc9de9fc
commit 4ea86c460a
3 changed files with 41 additions and 21 deletions

View File

@ -90,32 +90,14 @@ protected:
return size_t((char*)CapacityX - (char*)BeginX);
}
inline void grow_pod(size_t MinSizeInBytes, size_t TSize);
/// grow_pod - This is an implementation of the grow() method which only works
/// on POD-like datatypes and is out of line to reduce code duplication.
void grow_pod(size_t MinSizeInBytes, size_t TSize);
public:
bool empty() const { return BeginX == EndX; }
};
inline void SmallVectorBase::grow_pod(size_t MinSizeInBytes, size_t TSize) {
size_t CurSizeBytes = size_in_bytes();
size_t NewCapacityInBytes = 2 * capacity_in_bytes();
if (NewCapacityInBytes < MinSizeInBytes)
NewCapacityInBytes = MinSizeInBytes;
void *NewElts = operator new(NewCapacityInBytes);
// Copy the elements over.
memcpy(NewElts, this->BeginX, CurSizeBytes);
// If this wasn't grown from the inline copy, deallocate the old space.
if (!this->isSmall())
operator delete(this->BeginX);
this->EndX = (char*)NewElts+CurSizeBytes;
this->BeginX = NewElts;
this->CapacityX = (char*)this->BeginX + NewCapacityInBytes;
}
template <typename T>
class SmallVectorTemplateCommon : public SmallVectorBase {

View File

@ -23,6 +23,7 @@ add_llvm_library(LLVMSupport
Regex.cpp
SlowOperationInformer.cpp
SmallPtrSet.cpp
SmallVector.cpp
SourceMgr.cpp
Statistic.cpp
StringExtras.cpp

View File

@ -0,0 +1,37 @@
//===- llvm/ADT/SmallVector.cpp - 'Normally small' vectors ----------------===//
//
// The LLVM Compiler Infrastructure
//
// This file is distributed under the University of Illinois Open Source
// License. See LICENSE.TXT for details.
//
//===----------------------------------------------------------------------===//
//
// This file implements the SmallVector class.
//
//===----------------------------------------------------------------------===//
#include "llvm/ADT/SmallVector.h"
using namespace llvm;
/// grow_pod - This is an implementation of the grow() method which only works
/// on POD-like datatypes and is out of line to reduce code duplication.
void SmallVectorBase::grow_pod(size_t MinSizeInBytes, size_t TSize) {
size_t CurSizeBytes = size_in_bytes();
size_t NewCapacityInBytes = 2 * capacity_in_bytes();
if (NewCapacityInBytes < MinSizeInBytes)
NewCapacityInBytes = MinSizeInBytes;
void *NewElts = operator new(NewCapacityInBytes);
// Copy the elements over. No need to run dtors on PODs.
memcpy(NewElts, this->BeginX, CurSizeBytes);
// If this wasn't grown from the inline copy, deallocate the old space.
if (!this->isSmall())
operator delete(this->BeginX);
this->EndX = (char*)NewElts+CurSizeBytes;
this->BeginX = NewElts;
this->CapacityX = (char*)this->BeginX + NewCapacityInBytes;
}