[llvm] ab08df2 - [IR] Do not set `none` for function uwtable (#93387)
via llvm-commits
llvm-commits at lists.llvm.org
Sun Jun 2 15:02:15 PDT 2024
Author: Joshua Cao
Date: 2024-06-02T15:02:11-07:00
New Revision: ab08df2292334d4980b3e81829a20904e59e13c9
URL: https://github.com/llvm/llvm-project/commit/ab08df2292334d4980b3e81829a20904e59e13c9
DIFF: https://github.com/llvm/llvm-project/commit/ab08df2292334d4980b3e81829a20904e59e13c9.diff
LOG: [IR] Do not set `none` for function uwtable (#93387)
This avoids the pitfall where we set the uwtable to none:
```
func.setUWTableKind(llvm::UWTableKind::None)
```
`Attribute::getAsString()` would see an unknown attribute and fail an
assertion. In this patch, we assert that we do not see a None uwtable
kind.
This also skips the check of `UWTableKind::Async`. It is dominated by
the check of `UWTableKind::Default`, which has the same enum value
(nfc).
Added:
Modified:
llvm/include/llvm/IR/Function.h
llvm/lib/CodeGen/MachineOutliner.cpp
llvm/lib/IR/Attributes.cpp
llvm/unittests/IR/FunctionTest.cpp
Removed:
################################################################################
diff --git a/llvm/include/llvm/IR/Function.h b/llvm/include/llvm/IR/Function.h
index cb514cde95b51..5468cedb0815a 100644
--- a/llvm/include/llvm/IR/Function.h
+++ b/llvm/include/llvm/IR/Function.h
@@ -654,7 +654,10 @@ class LLVM_EXTERNAL_VISIBILITY Function : public GlobalObject,
return getUWTableKind() != UWTableKind::None;
}
void setUWTableKind(UWTableKind K) {
- addFnAttr(Attribute::getWithUWTableKind(getContext(), K));
+ if (K == UWTableKind::None)
+ removeFnAttr(Attribute::UWTable);
+ else
+ addFnAttr(Attribute::getWithUWTableKind(getContext(), K));
}
/// True if this function needs an unwind table.
bool needsUnwindTableEntry() const {
diff --git a/llvm/lib/CodeGen/MachineOutliner.cpp b/llvm/lib/CodeGen/MachineOutliner.cpp
index dc2f5ef15206e..f174dd857def0 100644
--- a/llvm/lib/CodeGen/MachineOutliner.cpp
+++ b/llvm/lib/CodeGen/MachineOutliner.cpp
@@ -717,8 +717,7 @@ MachineFunction *MachineOutliner::createOutlinedFunction(
[](UWTableKind K, const outliner::Candidate &C) {
return std::max(K, C.getMF()->getFunction().getUWTableKind());
});
- if (UW != UWTableKind::None)
- F->setUWTableKind(UW);
+ F->setUWTableKind(UW);
BasicBlock *EntryBB = BasicBlock::Create(C, "entry", F);
IRBuilder<> Builder(EntryBB);
diff --git a/llvm/lib/IR/Attributes.cpp b/llvm/lib/IR/Attributes.cpp
index c8d6bdd423878..7a3c9a99ee4d8 100644
--- a/llvm/lib/IR/Attributes.cpp
+++ b/llvm/lib/IR/Attributes.cpp
@@ -526,13 +526,8 @@ std::string Attribute::getAsString(bool InAttrGrp) const {
if (hasAttribute(Attribute::UWTable)) {
UWTableKind Kind = getUWTableKind();
- if (Kind != UWTableKind::None) {
- return Kind == UWTableKind::Default
- ? "uwtable"
- : ("uwtable(" +
- Twine(Kind == UWTableKind::Sync ? "sync" : "async") + ")")
- .str();
- }
+ assert(Kind != UWTableKind::None && "uwtable attribute should not be none");
+ return Kind == UWTableKind::Default ? "uwtable" : "uwtable(sync)";
}
if (hasAttribute(Attribute::AllocKind)) {
diff --git a/llvm/unittests/IR/FunctionTest.cpp b/llvm/unittests/IR/FunctionTest.cpp
index 8e77dfbb9dbd9..9aaff3ea33830 100644
--- a/llvm/unittests/IR/FunctionTest.cpp
+++ b/llvm/unittests/IR/FunctionTest.cpp
@@ -486,4 +486,27 @@ TEST(FunctionTest, EraseBBs) {
It = F->erase(F->begin(), F->end());
EXPECT_EQ(F->size(), 0u);
}
+
+TEST(FunctionTest, UWTable) {
+ LLVMContext Ctx;
+ std::unique_ptr<Module> M = parseIR(Ctx, R"(
+ define void @foo() {
+ bb1:
+ ret void
+ }
+)");
+
+ Function &F = *M->getFunction("foo");
+
+ EXPECT_FALSE(F.hasUWTable());
+ EXPECT_TRUE(F.getUWTableKind() == UWTableKind::None);
+
+ F.setUWTableKind(UWTableKind::Async);
+ EXPECT_TRUE(F.hasUWTable());
+ EXPECT_TRUE(F.getUWTableKind() == UWTableKind::Async);
+
+ F.setUWTableKind(UWTableKind::None);
+ EXPECT_FALSE(F.hasUWTable());
+ EXPECT_TRUE(F.getUWTableKind() == UWTableKind::None);
+}
} // end namespace
More information about the llvm-commits
mailing list