[llvm] r200331 - Add BumpPtrAllocator::allocateCopy() utilities

Eli Bendersky eliben at google.com
Sat Feb 1 09:41:13 PST 2014


On Tue, Jan 28, 2014 at 11:21 AM, Nick Kledzik <kledzik at apple.com> wrote:

> Author: kledzik
> Date: Tue Jan 28 13:21:27 2014
> New Revision: 200331
>
> URL: http://llvm.org/viewvc/llvm-project?rev=200331&view=rev
> Log:
> Add BumpPtrAllocator::allocateCopy() utilities
>
> Makes it easy to use BumpPtrAllocator to make a copy of StringRef strings.
>
> Modified:
>     llvm/trunk/include/llvm/Support/Allocator.h
>     llvm/trunk/unittests/Support/AllocatorTest.cpp
>
> Modified: llvm/trunk/include/llvm/Support/Allocator.h
> URL:
> http://llvm.org/viewvc/llvm-project/llvm/trunk/include/llvm/Support/Allocator.h?rev=200331&r1=200330&r2=200331&view=diff
>
> ==============================================================================
> --- llvm/trunk/include/llvm/Support/Allocator.h (original)
> +++ llvm/trunk/include/llvm/Support/Allocator.h Tue Jan 28 13:21:27 2014
> @@ -14,6 +14,8 @@
>  #ifndef LLVM_SUPPORT_ALLOCATOR_H
>  #define LLVM_SUPPORT_ALLOCATOR_H
>
> +#include "llvm/ADT/ArrayRef.h"
> +#include "llvm/ADT/StringRef.h"
>  #include "llvm/Support/AlignOf.h"
>  #include "llvm/Support/DataTypes.h"
>  #include "llvm/Support/MathExtras.h"
> @@ -179,6 +181,40 @@ public:
>

Hi Nick,

It strikes me as strange to add a dependency for Allocator on StringRef for
this case (and I guess on ArrayRef too). If this is a service StringRef
needs from Allocator and not vice versa, wouldn't it make more sense to add
this utility method to StringRef (taking an Allocator)?

Eli







>
>    void PrintStats() const;
>
> +
> +  /// Allocate space and copy content into it.
> +  void *allocateCopy(const void *Src, size_t Size, size_t Alignment=1) {
> +    void *P = Allocate(Size, Alignment);
> +    memcpy(P, Src, Size);
> +    return P;
> +  }
> +
> +  /// Allocate space for an array of type T, and use std::copy()
> +  /// to copy the array contents.
> +  template <typename T>
> +  typename enable_if<isPodLike<T>, T*>::type
> +  allocateCopy(const T Src[], size_t Num) {
> +    T *P = Allocate<T>(Num);
> +    std::copy(Src, &Src[Num], P);
> +    return P;
> +  }
> +
> +  /// Copy a StringRef by allocating copy in BumpPtrAllocator.
> +  StringRef allocateCopy(StringRef Str) {
> +    size_t Length = Str.size();
> +    char *P = allocateCopy<char>(Str.data(), Length);
> +    return StringRef(P, Length);
> +  }
> +
> +  /// Copy a ArrayRef<T> by allocating copy in BumpPtrAllocator.
> +  template <typename T>
> +  typename enable_if<isPodLike<T>, ArrayRef<T>>::type
> +  allocateCopy(ArrayRef<T> Src) {
> +    size_t Length = Src.size();
> +    T *P = allocateCopy(Src.data(), Length*sizeof(T));
> +    return makeArrayRef(P, Length);
> +  }
> +
>    /// Compute the total physical memory allocated by this allocator.
>    size_t getTotalMemory() const;
>  };
>
> Modified: llvm/trunk/unittests/Support/AllocatorTest.cpp
> URL:
> http://llvm.org/viewvc/llvm-project/llvm/trunk/unittests/Support/AllocatorTest.cpp?rev=200331&r1=200330&r2=200331&view=diff
>
> ==============================================================================
> --- llvm/trunk/unittests/Support/AllocatorTest.cpp (original)
> +++ llvm/trunk/unittests/Support/AllocatorTest.cpp Tue Jan 28 13:21:27 2014
> @@ -147,4 +147,32 @@ TEST(AllocatorTest, TestBigAlignment) {
>    EXPECT_LE(Ptr + 3000, ((uintptr_t)Slab) + Slab->Size);
>  }
>
> +TEST(AllocatorTest, CopyStringRef) {
> +  BumpPtrAllocator Alloc;
> +  StringRef Str1 = "hello";
> +  StringRef Str2 = "bye";
> +  StringRef Str1c = Alloc.allocateCopy(Str1);
> +  StringRef Str2c = Alloc.allocateCopy(Str2);
> +  EXPECT_TRUE(Str1.equals(Str1c));
> +  EXPECT_NE(Str1.data(), Str1c.data());
> +  EXPECT_TRUE(Str2.equals(Str2c));
> +  EXPECT_NE(Str2.data(), Str2c.data());
> +}
> +
> +TEST(AllocatorTest, CopyArrayRef) {
> +  BumpPtrAllocator Alloc;
> +  static const uint16_t Words1[] = { 1, 4, 200, 37 };
> +  ArrayRef<uint16_t> Array1 = makeArrayRef(Words1, 4);
> +  static const uint16_t Words2[] = { 11, 4003, 67, 64000, 13 };
> +  ArrayRef<uint16_t> Array2 = makeArrayRef(Words2, 5);
> +  ArrayRef<uint16_t> Array1c = Alloc.allocateCopy(Array1);
> +  ArrayRef<uint16_t> Array2c = Alloc.allocateCopy(Array2);
> +  EXPECT_TRUE(Array1.equals(Array1c));
> +  EXPECT_NE(Array1.data(), Array1c.data());
> +  EXPECT_TRUE(Array2.equals(Array2c));
> +  EXPECT_NE(Array2.data(), Array2c.data());
> +}
> +
> +
> +
>  }  // anonymous namespace
>
>
> _______________________________________________
> llvm-commits mailing list
> llvm-commits at cs.uiuc.edu
> http://lists.cs.uiuc.edu/mailman/listinfo/llvm-commits
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.llvm.org/pipermail/llvm-commits/attachments/20140201/ad6efe38/attachment.html>


More information about the llvm-commits mailing list