[llvm] r206828 - Use unique_ptr to handle ownership of Value*s in Cloning unit tests.

Quentin Colombet qcolombet at apple.com
Tue Apr 22 09:50:27 PDT 2014


Thanks Eric and David.

Let me know if you need anything from me, but looks like you have a good hand on it :).

-Quentin
On Apr 21, 2014, at 11:16 PM, Eric Christopher <echristo at gmail.com> wrote:

> Yup, I can duplicate it...
> 
> -eric
> 
> ******************** TEST 'LLVM-Unit ::
> Transforms/Utils/Release+Asserts/UtilsTests/CloneInstruction.Exact'
> FAILED ********************
> 
> Note: Google Test filter = CloneInstruction.Exact
> 
> [==========] Running 1 test from 1 test case.
> 
> [----------] Global test environment set-up.
> 
> [----------] 1 test from CloneInstruction
> 
> [ RUN      ] CloneInstruction.Exact
> 
> UtilsTests(59399,0x7fff79e5b310) malloc: *** error for object
> 0x7ffe194067e0: pointer being freed was not allocated
> 
> *** set a breakpoint in malloc_error_break to debug
> 
> 0  UtilsTests               0x000000010684e198
> llvm::sys::PrintStackTrace(__sFILE*) + 40
> 
> 1  UtilsTests               0x000000010684e694 SignalHandler(int) + 548
> 
> 2  libsystem_platform.dylib 0x00007fff96d555aa _sigtramp + 26
> 
> 3  libsystem_platform.dylib 0x0000000000000061 _sigtramp + 1764403921
> 
> 4  libsystem_c.dylib        0x00007fff93d0ab1a abort + 125
> 
> 5  libsystem_malloc.dylib   0x00007fff8c91307f malloc_get_zone_name + 0
> 
> 6  UtilsTests               0x0000000106617280
> std::__1::__tree<std::__1::unique_ptr<llvm::Value,
> std::__1::default_delete<llvm::Value> >,
> std::__1::less<std::__1::unique_ptr<llvm::Value,
> std::__1::default_delete<llvm::Value> > >,
> std::__1::allocator<std::__1::unique_ptr<llvm::Value,
> std::__1::default_delete<llvm::Value> > >
>> ::destroy(std::__1::__tree_node<std::__1::unique_ptr<llvm::Value,
> std::__1::default_delete<llvm::Value> >, void*>*) + 64
> 
> 7  UtilsTests               0x000000010660e24b (anonymous
> namespace)::CloneInstruction::TearDown() + 59
> 
> 8  UtilsTests               0x0000000106638460 testing::TestInfo::Run() + 560
> 
> 9  UtilsTests               0x0000000106638b87 testing::TestCase::Run() + 439
> 
> 10 UtilsTests               0x0000000106640518
> testing::internal::UnitTestImpl::RunAllTests() + 920
> 
> 11 UtilsTests               0x000000010664016a testing::UnitTest::Run() + 106
> 
> 12 UtilsTests               0x0000000106655bc1 main + 65
> 
> 13 libdyld.dylib            0x00007fff8be0b5fd start + 1
> 
> 
> ********************
> 
> FAIL: LLVM-Unit ::
> Transforms/Utils/Release+Asserts/UtilsTests/CloneInstruction.Inbounds
> (17776 of 17798)
> 
> ******************** TEST 'LLVM-Unit ::
> Transforms/Utils/Release+Asserts/UtilsTests/CloneInstruction.Inbounds'
> FAILED ********************
> 
> Note: Google Test filter = CloneInstruction.Inbounds
> 
> [==========] Running 1 test from 1 test case.
> 
> [----------] Global test environment set-up.
> 
> [----------] 1 test from CloneInstruction
> 
> [ RUN      ] CloneInstruction.Inbounds
> 
> UtilsTests(59401,0x7fff79e5b310) malloc: *** error for object
> 0x7fe6d15067b0: pointer being freed was not allocated
> 
> *** set a breakpoint in malloc_error_break to debug
> 
> 0  UtilsTests               0x000000010e9e6198
> llvm::sys::PrintStackTrace(__sFILE*) + 40
> 
> 1  UtilsTests               0x000000010e9e6694 SignalHandler(int) + 548
> 
> 2  libsystem_platform.dylib 0x00007fff96d555aa _sigtramp + 26
> 
> 3  libsystem_platform.dylib 0x000000000000005f _sigtramp + 1764403919
> 
> 4  libsystem_c.dylib        0x00007fff93d0ab1a abort + 125
> 
> 5  libsystem_malloc.dylib   0x00007fff8c91307f malloc_get_zone_name + 0
> 
> 6  UtilsTests               0x000000010e7af280
> std::__1::__tree<std::__1::unique_ptr<llvm::Value,
> std::__1::default_delete<llvm::Value> >,
> std::__1::less<std::__1::unique_ptr<llvm::Value,
> std::__1::default_delete<llvm::Value> > >,
> std::__1::allocator<std::__1::unique_ptr<llvm::Value,
> std::__1::default_delete<llvm::Value> > >
>> ::destroy(std::__1::__tree_node<std::__1::unique_ptr<llvm::Value,
> std::__1::default_delete<llvm::Value> >, void*>*) + 64
> 
> 7  UtilsTests               0x000000010e7a624b (anonymous
> namespace)::CloneInstruction::TearDown() + 59
> 
> 8  UtilsTests               0x000000010e7d0460 testing::TestInfo::Run() + 560
> 
> 9  UtilsTests               0x000000010e7d0b87 testing::TestCase::Run() + 439
> 
> 10 UtilsTests               0x000000010e7d8518
> testing::internal::UnitTestImpl::RunAllTests() + 920
> 
> 11 UtilsTests               0x000000010e7d816a testing::UnitTest::Run() + 106
> 
> 12 UtilsTests               0x000000010e7edbc1 main + 65
> 
> 13 libdyld.dylib            0x00007fff8be0b5fd start + 1
> 
> 
> ********************
> 
> FAIL: LLVM-Unit ::
> Transforms/Utils/Release+Asserts/UtilsTests/CloneInstruction.OverflowBits
> (17793 of 17798)
> 
> ******************** TEST 'LLVM-Unit ::
> Transforms/Utils/Release+Asserts/UtilsTests/CloneInstruction.OverflowBits'
> FAILED ********************
> 
> Note: Google Test filter = CloneInstruction.OverflowBits
> 
> [==========] Running 1 test from 1 test case.
> 
> [----------] Global test environment set-up.
> 
> [----------] 1 test from CloneInstruction
> 
> [ RUN      ] CloneInstruction.OverflowBits
> 
> 0  UtilsTests               0x0000000108f2d198
> llvm::sys::PrintStackTrace(__sFILE*) + 40
> 
> 1  UtilsTests               0x0000000108f2d694 SignalHandler(int) + 548
> 
> 2  libsystem_platform.dylib 0x00007fff96d555aa _sigtramp + 26
> 
> 3  libsystem_platform.dylib 0x0000000300000001 _sigtramp + 1764403825
> 
> 4  UtilsTests               0x0000000108cee5fb llvm::BinaryOperator*
> (anonymous namespace)::CloneInstruction::clone<llvm::BinaryOperator>(llvm::BinaryOperator*)
> + 27
> 
> 5  UtilsTests               0x0000000108cf0b69 (anonymous
> namespace)::CloneInstruction_OverflowBits_Test::TestBody() + 6905
> 
> 6  UtilsTests               0x0000000108d160b1 testing::Test::Run() + 529
> 
> 7  UtilsTests               0x0000000108d17460 testing::TestInfo::Run() + 560
> 
> 8  UtilsTests               0x0000000108d17b87 testing::TestCase::Run() + 439
> 
> 9  UtilsTests               0x0000000108d1f518
> testing::internal::UnitTestImpl::RunAllTests() + 920
> 
> 10 UtilsTests               0x0000000108d1f16a testing::UnitTest::Run() + 106
> 
> 11 UtilsTests               0x0000000108d34bc1 main + 65
> 
> 12 libdyld.dylib            0x00007fff8be0b5fd start + 1
> 
> 13 libdyld.dylib            0x0000000000000002 start + 1948207622
> 
> On Mon, Apr 21, 2014 at 10:50 PM, Eric Christopher <echristo at gmail.com> wrote:
>> Sure, I'll give it a shot.
>> 
>> On Apr 21, 2014 10:43 PM, "David Blaikie" <dblaikie at gmail.com> wrote:
>>> 
>>> Unreverting your revert and running under valgrind didn't produce any
>>> failures - any ideas how else I might reproduce this? (it looks like
>>> it's a checking-malloc failure on MacOS? Presumably some kind of
>>> checked runtime?) Maybe I'll pester Eric to reproduce on a mac (I have
>>> a Macbook Air, but don't generally have code/devtools/etc on it)
>>> 
>>> On Mon, Apr 21, 2014 at 7:24 PM, Quentin Colombet <qcolombet at apple.com>
>>> wrote:
>>>> Thanks David.
>>>> 
>>>> I’ve reverted it in the meantime: r206839.
>>>> 
>>>> -Quentin
>>>> 
>>>> On Apr 21, 2014, at 6:39 PM, David Blaikie <dblaikie at gmail.com> wrote:
>>>> 
>>>> Will be able to have a look in a few hours. Feel free to revert in the
>>>> interim.
>>>> 
>>>> On Apr 21, 2014 6:03 PM, "Quentin Colombet" <qcolombet at apple.com> wrote:
>>>>> 
>>>>> Hi David,
>>>>> 
>>>>> Looks like your commit broke some bots:
>>>>> 
>>>>> 
>>>>> http://lab.llvm.org:8013/builders/clang-x86_64-darwin11-nobootstrap-RAincremental/builds/14682
>>>>> 
>>>>> ******************** TEST 'LLVM-Unit ::
>>>>> Transforms/Utils/Release+Asserts/UtilsTests/CloneInstruction.Exact'
>>>>> FAILED
>>>>> ********************
>>>>> Note: Google Test filter = CloneInstruction.Exact
>>>>> [==========] Running 1 test from 1 test case.
>>>>> [----------] Global test environment set-up.
>>>>> [----------] 1 test from CloneInstruction
>>>>> [ RUN      ] CloneInstruction.Exact
>>>>> UtilsTests(60096) malloc: *** error for object 0x104f036c0: pointer
>>>>> being
>>>>> freed was not allocated
>>>>> *** set a breakpoint in malloc_error_break to debug
>>>>> 0  UtilsTests        0x0000000104d9ee48
>>>>> llvm::sys::PrintStackTrace(__sFILE*) + 40
>>>>> 1  UtilsTests        0x0000000104d9f324 _ZL13SignalHandleri + 564
>>>>> 2  libsystem_c.dylib 0x00007fff94461cfa _sigtramp + 26
>>>>> 3  libsystem_c.dylib 0x0000000000000190 _sigtramp + 1807344816
>>>>> 4  libsystem_c.dylib 0x00007fff9445f84c free + 389
>>>>> 5  UtilsTests        0x0000000104cbc2c0
>>>>> std::__1::__tree<std::__1::unique_ptr<llvm::Value,
>>>>> std::__1::default_delete<llvm::Value> >,
>>>>> std::__1::less<std::__1::unique_ptr<llvm::Value,
>>>>> std::__1::default_delete<llvm::Value> > >,
>>>>> std::__1::allocator<std::__1::unique_ptr<llvm::Value,
>>>>> std::__1::default_delete<llvm::Value> > >
>>>>>> ::destroy(std::__1::__tree_node<std::__1::unique_ptr<llvm::Value,
>>>>> std::__1::default_delete<llvm::Value> >, void*>*) + 64
>>>>> 6  UtilsTests        0x0000000104cb46e0 (anonymous
>>>>> namespace)::CloneInstruction::TearDown() + 64
>>>>> 7  UtilsTests        0x0000000104ccfed0 testing::TestInfo::Run() + 832
>>>>> 8  UtilsTests        0x0000000104cd0430 testing::TestCase::Run() + 448
>>>>> 9  UtilsTests        0x0000000104cd75d5
>>>>> testing::internal::UnitTestImpl::RunAllTests() + 1317
>>>>> 10 UtilsTests        0x0000000104cd709a testing::UnitTest::Run() + 106
>>>>> 11 UtilsTests        0x0000000104ce5061 main + 65
>>>>> 12 UtilsTests        0x0000000104cacd54 start + 52
>>>>> 13 UtilsTests        0x0000000000000002 start + 4214567650
>>>>> 
>>>>> ********************
>>>>> 
>>>>> 
>>>>> 
>>>>> Could you take a look please?
>>>>> 
>>>>> Thanks,
>>>>> -Quentin
>>>>> 
>>>>> On Apr 21, 2014, at 4:47 PM, David Blaikie <dblaikie at gmail.com> wrote:
>>>>> 
>>>>> Author: dblaikie
>>>>> Date: Mon Apr 21 18:47:47 2014
>>>>> New Revision: 206828
>>>>> 
>>>>> URL: http://llvm.org/viewvc/llvm-project?rev=206828&view=rev
>>>>> Log:
>>>>> Use unique_ptr to handle ownership of Value*s in Cloning unit tests.
>>>>> 
>>>>> Modified:
>>>>>   llvm/trunk/unittests/Transforms/Utils/Cloning.cpp
>>>>> 
>>>>> Modified: llvm/trunk/unittests/Transforms/Utils/Cloning.cpp
>>>>> URL:
>>>>> 
>>>>> http://llvm.org/viewvc/llvm-project/llvm/trunk/unittests/Transforms/Utils/Cloning.cpp?rev=206828&r1=206827&r2=206828&view=diff
>>>>> 
>>>>> 
>>>>> ==============================================================================
>>>>> --- llvm/trunk/unittests/Transforms/Utils/Cloning.cpp (original)
>>>>> +++ llvm/trunk/unittests/Transforms/Utils/Cloning.cpp Mon Apr 21
>>>>> 18:47:47
>>>>> 2014
>>>>> @@ -10,7 +10,6 @@
>>>>> #include "llvm/Transforms/Utils/Cloning.h"
>>>>> #include "llvm/ADT/ArrayRef.h"
>>>>> #include "llvm/ADT/STLExtras.h"
>>>>> -#include "llvm/ADT/SmallPtrSet.h"
>>>>> #include "llvm/IR/Argument.h"
>>>>> #include "llvm/IR/Constant.h"
>>>>> #include "llvm/IR/DebugInfo.h"
>>>>> @@ -25,6 +24,8 @@
>>>>> #include "llvm/IR/LLVMContext.h"
>>>>> #include "gtest/gtest.h"
>>>>> 
>>>>> +#include <set>
>>>>> +
>>>>> using namespace llvm;
>>>>> 
>>>>> namespace {
>>>>> @@ -38,34 +39,38 @@ protected:
>>>>>  template <typename T>
>>>>>  T *clone(T *V1) {
>>>>>    Value *V2 = V1->clone();
>>>>> -    Orig.insert(V1);
>>>>> -    Clones.insert(V2);
>>>>> +    std::unique_ptr<Value> V(V1);
>>>>> +    if (!Orig.insert(std::move(V)).second)
>>>>> +      V.release(); // this wasn't the first time we added the element,
>>>>> so
>>>>> the
>>>>> +                   // set already had ownership
>>>>> +    Clones.insert(std::unique_ptr<Value>(V2));
>>>>>    return cast<T>(V2);
>>>>>  }
>>>>> 
>>>>> -  void eraseClones() {
>>>>> -    DeleteContainerPointers(Clones);
>>>>> -  }
>>>>> +  void eraseClones() { Clones.clear(); }
>>>>> 
>>>>>  virtual void TearDown() {
>>>>>    eraseClones();
>>>>> -    DeleteContainerPointers(Orig);
>>>>> -    delete V;
>>>>> +    Orig.clear();
>>>>> +    V.reset();
>>>>>  }
>>>>> 
>>>>> -  SmallPtrSet<Value *, 4> Orig;   // Erase on exit
>>>>> -  SmallPtrSet<Value *, 4> Clones; // Erase in eraseClones
>>>>> +  std::set<std::unique_ptr<Value>> Orig;   // Erase on exit
>>>>> +  std::set<std::unique_ptr<Value>> Clones; // Erase in eraseClones
>>>>> 
>>>>>  LLVMContext context;
>>>>> -  Value *V;
>>>>> +  std::unique_ptr<Value> V;
>>>>> };
>>>>> 
>>>>> TEST_F(CloneInstruction, OverflowBits) {
>>>>> -  V = new Argument(Type::getInt32Ty(context));
>>>>> +  V = make_unique<Argument>(Type::getInt32Ty(context));
>>>>> 
>>>>> -  BinaryOperator *Add = BinaryOperator::Create(Instruction::Add, V,
>>>>> V);
>>>>> -  BinaryOperator *Sub = BinaryOperator::Create(Instruction::Sub, V,
>>>>> V);
>>>>> -  BinaryOperator *Mul = BinaryOperator::Create(Instruction::Mul, V,
>>>>> V);
>>>>> +  BinaryOperator *Add =
>>>>> +      BinaryOperator::Create(Instruction::Add, V.get(), V.get());
>>>>> +  BinaryOperator *Sub =
>>>>> +      BinaryOperator::Create(Instruction::Sub, V.get(), V.get());
>>>>> +  BinaryOperator *Mul =
>>>>> +      BinaryOperator::Create(Instruction::Mul, V.get(), V.get());
>>>>> 
>>>>>  BinaryOperator *AddClone = this->clone(Add);
>>>>>  BinaryOperator *SubClone = this->clone(Sub);
>>>>> @@ -131,12 +136,12 @@ TEST_F(CloneInstruction, OverflowBits) {
>>>>> }
>>>>> 
>>>>> TEST_F(CloneInstruction, Inbounds) {
>>>>> -  V = new Argument(Type::getInt32PtrTy(context));
>>>>> +  V = make_unique<Argument>(Type::getInt32PtrTy(context));
>>>>> 
>>>>>  Constant *Z = Constant::getNullValue(Type::getInt32Ty(context));
>>>>>  std::vector<Value *> ops;
>>>>>  ops.push_back(Z);
>>>>> -  GetElementPtrInst *GEP = GetElementPtrInst::Create(V, ops);
>>>>> +  GetElementPtrInst *GEP = GetElementPtrInst::Create(V.get(), ops);
>>>>>  EXPECT_FALSE(this->clone(GEP)->isInBounds());
>>>>> 
>>>>>  GEP->setIsInBounds();
>>>>> @@ -144,9 +149,10 @@ TEST_F(CloneInstruction, Inbounds) {
>>>>> }
>>>>> 
>>>>> TEST_F(CloneInstruction, Exact) {
>>>>> -  V = new Argument(Type::getInt32Ty(context));
>>>>> +  V = make_unique<Argument>(Type::getInt32Ty(context));
>>>>> 
>>>>> -  BinaryOperator *SDiv = BinaryOperator::Create(Instruction::SDiv, V,
>>>>> V);
>>>>> +  BinaryOperator *SDiv =
>>>>> +      BinaryOperator::Create(Instruction::SDiv, V.get(), V.get());
>>>>>  EXPECT_FALSE(this->clone(SDiv)->isExact());
>>>>> 
>>>>>  SDiv->setIsExact(true);
>>>>> 
>>>>> 
>>>>> _______________________________________________
>>>>> llvm-commits mailing list
>>>>> llvm-commits at cs.uiuc.edu
>>>>> http://lists.cs.uiuc.edu/mailman/listinfo/llvm-commits
>>>>> 
>>>>> 
>>>> 
>>> 
>>> _______________________________________________
>>> llvm-commits mailing list
>>> llvm-commits at cs.uiuc.edu
>>> http://lists.cs.uiuc.edu/mailman/listinfo/llvm-commits





More information about the llvm-commits mailing list