[PATCH] D15752: [Function] Properly remove use when clearing personality

Rafael EspĂ­ndola via llvm-commits llvm-commits at lists.llvm.org
Wed Dec 23 10:10:12 PST 2015


Lgtm
On Dec 23, 2015 12:58 PM, "Keno Fischer via llvm-commits" <
llvm-commits at lists.llvm.org> wrote:

> loladiro created this revision.
> loladiro added reviewers: vsk, dexonsmith.
> loladiro added a subscriber: llvm-commits.
>
> We need to actually remove the use of the personality function,
> otherwise we can run into trouble if we want to e.g. delete
> the personality function because ther's no way to get rid of
> its uses. Do this by resetting to ConstantPointerNull value
> that the operands are set to when first allocated.
>
> http://reviews.llvm.org/D15752
>
> Files:
>   lib/IR/Function.cpp
>   unittests/IR/UserTest.cpp
>
> Index: unittests/IR/UserTest.cpp
> ===================================================================
> --- unittests/IR/UserTest.cpp
> +++ unittests/IR/UserTest.cpp
> @@ -93,4 +93,28 @@
>    EXPECT_EQ(P.value_op_end(), (I - 2) + 8);
>  }
>
> +TEST(UserTest, PersonalityUser) {
> +  Module M("", getGlobalContext());
> +  FunctionType *RetVoidTy =
> +      FunctionType::get(Type::getVoidTy(getGlobalContext()), false);
> +  Function *PersonalityF = Function::Create(
> +      RetVoidTy, GlobalValue::ExternalLinkage, "PersonalityFn", &M);
> +  Function *TestF =
> +      Function::Create(RetVoidTy, GlobalValue::ExternalLinkage, "TestFn",
> &M);
> +
> +  // Set up the personality function
> +  TestF->setPersonalityFn(PersonalityF);
> +  auto PersonalityUsers = PersonalityF->user_begin();
> +
> +  // One user and that user is the Test function
> +  EXPECT_EQ(*PersonalityUsers, TestF);
> +  EXPECT_EQ(++PersonalityUsers, PersonalityF->user_end());
> +
> +  // Reset the personality function
> +  TestF->setPersonalityFn(nullptr);
> +
> +  // No users should remain
> +  EXPECT_TRUE(TestF->user_empty());
> +}
> +
>  } // end anonymous namespace
> Index: lib/IR/Function.cpp
> ===================================================================
> --- lib/IR/Function.cpp
> +++ lib/IR/Function.cpp
> @@ -942,8 +942,7 @@
>  }
>
>  void Function::setPersonalityFn(Constant *Fn) {
> -  if (Fn)
> -    setHungoffOperand<0>(Fn);
> +  setHungoffOperand<0>(Fn);
>    setValueSubclassDataBit(3, Fn != nullptr);
>  }
>
> @@ -953,8 +952,7 @@
>  }
>
>  void Function::setPrefixData(Constant *PrefixData) {
> -  if (PrefixData)
> -    setHungoffOperand<1>(PrefixData);
> +  setHungoffOperand<1>(PrefixData);
>    setValueSubclassDataBit(1, PrefixData != nullptr);
>  }
>
> @@ -964,8 +962,7 @@
>  }
>
>  void Function::setPrologueData(Constant *PrologueData) {
> -  if (PrologueData)
> -    setHungoffOperand<2>(PrologueData);
> +  setHungoffOperand<2>(PrologueData);
>    setValueSubclassDataBit(2, PrologueData != nullptr);
>  }
>
> @@ -986,9 +983,13 @@
>
>  template <int Idx>
>  void Function::setHungoffOperand(Constant *C) {
> -  assert(C && "Cannot set hungoff operand to nullptr");
> -  allocHungoffUselist();
> -  Op<Idx>().set(C);
> +  if (C) {
> +    allocHungoffUselist();
> +    Op<Idx>().set(C);
> +  } else if (getNumOperands()) {
> +    Op<Idx>().set(
> +        ConstantPointerNull::get(Type::getInt1PtrTy(getContext(), 0)));
> +  }
>  }
>
>  void Function::setValueSubclassDataBit(unsigned Bit, bool On) {
>
>
>
> _______________________________________________
> llvm-commits mailing list
> llvm-commits at lists.llvm.org
> http://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-commits
>
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.llvm.org/pipermail/llvm-commits/attachments/20151223/b29687c9/attachment.html>


More information about the llvm-commits mailing list