Skip to content
This repository has been archived by the owner on Apr 23, 2020. It is now read-only.

Commit

Permalink
[Function] Properly remove use when clearing personality
Browse files Browse the repository at this point in the history
Summary:
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.

Reviewers: vsk, dexonsmith

Subscribers: llvm-commits

Differential Revision: http://reviews.llvm.org/D15752

git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@256345 91177308-0d34-0410-b5e6-96231b3b80d8
  • Loading branch information
Keno committed Dec 23, 2015
1 parent d7f93b3 commit fdf52d3
Show file tree
Hide file tree
Showing 2 changed files with 34 additions and 9 deletions.
19 changes: 10 additions & 9 deletions lib/IR/Function.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -942,8 +942,7 @@ Constant *Function::getPersonalityFn() const {
}

void Function::setPersonalityFn(Constant *Fn) {
if (Fn)
setHungoffOperand<0>(Fn);
setHungoffOperand<0>(Fn);
setValueSubclassDataBit(3, Fn != nullptr);
}

Expand All @@ -953,8 +952,7 @@ Constant *Function::getPrefixData() const {
}

void Function::setPrefixData(Constant *PrefixData) {
if (PrefixData)
setHungoffOperand<1>(PrefixData);
setHungoffOperand<1>(PrefixData);
setValueSubclassDataBit(1, PrefixData != nullptr);
}

Expand All @@ -964,8 +962,7 @@ Constant *Function::getPrologueData() const {
}

void Function::setPrologueData(Constant *PrologueData) {
if (PrologueData)
setHungoffOperand<2>(PrologueData);
setHungoffOperand<2>(PrologueData);
setValueSubclassDataBit(2, PrologueData != nullptr);
}

Expand All @@ -986,9 +983,13 @@ void Function::allocHungoffUselist() {

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) {
Expand Down
24 changes: 24 additions & 0 deletions unittests/IR/UserTest.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -93,4 +93,28 @@ TEST(UserTest, ValueOpIteration) {
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

0 comments on commit fdf52d3

Please sign in to comment.