<p dir="ltr">Lgtm</p>
<div class="gmail_quote">On Dec 23, 2015 12:58 PM, "Keno Fischer via llvm-commits" <<a href="mailto:llvm-commits@lists.llvm.org">llvm-commits@lists.llvm.org</a>> wrote:<br type="attribution"><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">loladiro created this revision.<br>
loladiro added reviewers: vsk, dexonsmith.<br>
loladiro added a subscriber: llvm-commits.<br>
<br>
We need to actually remove the use of the personality function,<br>
otherwise we can run into trouble if we want to e.g. delete<br>
the personality function because ther's no way to get rid of<br>
its uses. Do this by resetting to ConstantPointerNull value<br>
that the operands are set to when first allocated.<br>
<br>
<a href="http://reviews.llvm.org/D15752" rel="noreferrer" target="_blank">http://reviews.llvm.org/D15752</a><br>
<br>
Files:<br>
  lib/IR/Function.cpp<br>
  unittests/IR/UserTest.cpp<br>
<br>
Index: unittests/IR/UserTest.cpp<br>
===================================================================<br>
--- unittests/IR/UserTest.cpp<br>
+++ unittests/IR/UserTest.cpp<br>
@@ -93,4 +93,28 @@<br>
   EXPECT_EQ(P.value_op_end(), (I - 2) + 8);<br>
 }<br>
<br>
+TEST(UserTest, PersonalityUser) {<br>
+  Module M("", getGlobalContext());<br>
+  FunctionType *RetVoidTy =<br>
+      FunctionType::get(Type::getVoidTy(getGlobalContext()), false);<br>
+  Function *PersonalityF = Function::Create(<br>
+      RetVoidTy, GlobalValue::ExternalLinkage, "PersonalityFn", &M);<br>
+  Function *TestF =<br>
+      Function::Create(RetVoidTy, GlobalValue::ExternalLinkage, "TestFn", &M);<br>
+<br>
+  // Set up the personality function<br>
+  TestF->setPersonalityFn(PersonalityF);<br>
+  auto PersonalityUsers = PersonalityF->user_begin();<br>
+<br>
+  // One user and that user is the Test function<br>
+  EXPECT_EQ(*PersonalityUsers, TestF);<br>
+  EXPECT_EQ(++PersonalityUsers, PersonalityF->user_end());<br>
+<br>
+  // Reset the personality function<br>
+  TestF->setPersonalityFn(nullptr);<br>
+<br>
+  // No users should remain<br>
+  EXPECT_TRUE(TestF->user_empty());<br>
+}<br>
+<br>
 } // end anonymous namespace<br>
Index: lib/IR/Function.cpp<br>
===================================================================<br>
--- lib/IR/Function.cpp<br>
+++ lib/IR/Function.cpp<br>
@@ -942,8 +942,7 @@<br>
 }<br>
<br>
 void Function::setPersonalityFn(Constant *Fn) {<br>
-  if (Fn)<br>
-    setHungoffOperand<0>(Fn);<br>
+  setHungoffOperand<0>(Fn);<br>
   setValueSubclassDataBit(3, Fn != nullptr);<br>
 }<br>
<br>
@@ -953,8 +952,7 @@<br>
 }<br>
<br>
 void Function::setPrefixData(Constant *PrefixData) {<br>
-  if (PrefixData)<br>
-    setHungoffOperand<1>(PrefixData);<br>
+  setHungoffOperand<1>(PrefixData);<br>
   setValueSubclassDataBit(1, PrefixData != nullptr);<br>
 }<br>
<br>
@@ -964,8 +962,7 @@<br>
 }<br>
<br>
 void Function::setPrologueData(Constant *PrologueData) {<br>
-  if (PrologueData)<br>
-    setHungoffOperand<2>(PrologueData);<br>
+  setHungoffOperand<2>(PrologueData);<br>
   setValueSubclassDataBit(2, PrologueData != nullptr);<br>
 }<br>
<br>
@@ -986,9 +983,13 @@<br>
<br>
 template <int Idx><br>
 void Function::setHungoffOperand(Constant *C) {<br>
-  assert(C && "Cannot set hungoff operand to nullptr");<br>
-  allocHungoffUselist();<br>
-  Op<Idx>().set(C);<br>
+  if (C) {<br>
+    allocHungoffUselist();<br>
+    Op<Idx>().set(C);<br>
+  } else if (getNumOperands()) {<br>
+    Op<Idx>().set(<br>
+        ConstantPointerNull::get(Type::getInt1PtrTy(getContext(), 0)));<br>
+  }<br>
 }<br>
<br>
 void Function::setValueSubclassDataBit(unsigned Bit, bool On) {<br>
<br>
<br>
<br>_______________________________________________<br>
llvm-commits mailing list<br>
<a href="mailto:llvm-commits@lists.llvm.org">llvm-commits@lists.llvm.org</a><br>
<a href="http://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-commits" rel="noreferrer" target="_blank">http://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-commits</a><br>
<br></blockquote></div>