<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>