Skip to content

Commit

Permalink
Improve error messages for attributes in the wrong context.
Browse files Browse the repository at this point in the history
verifyFunctionAttrs has a comment that the value V is printed in error messages. The recently added errors for attributes didn't print V. Make them print V.

Change the stringification of AttributeList. Firstly they started with 'PAL[' which stood for ParamAttrsList. Change that to 'AttributeList[' matching its current name AttributeList. Print out semantic meaning of the index instead of the raw index value (i.e. 'return', 'function' or 'arg(n)').

Differential revision: https://reviews.llvm.org/D101484
  • Loading branch information
nlewycky committed Apr 29, 2021
1 parent 56d923e commit 30bbfda
Show file tree
Hide file tree
Showing 3 changed files with 53 additions and 6 deletions.
18 changes: 15 additions & 3 deletions llvm/lib/IR/Attributes.cpp
Expand Up @@ -1693,11 +1693,23 @@ unsigned AttributeList::getNumAttrSets() const {
}

void AttributeList::print(raw_ostream &O) const {
O << "PAL[\n";
O << "AttributeList[\n";

for (unsigned i = index_begin(), e = index_end(); i != e; ++i) {
if (getAttributes(i).hasAttributes())
O << " { " << i << " => " << getAsString(i) << " }\n";
if (!getAttributes(i).hasAttributes())
continue;
O << " { ";
switch (i) {
case AttrIndex::ReturnIndex:
O << "return";
break;
case AttrIndex::FunctionIndex:
O << "function";
break;
default:
O << "arg(" << i - AttrIndex::FirstArgIndex << ")";
}
O << " => " << getAsString(i) << " }\n";
}

O << "]\n";
Expand Down
6 changes: 3 additions & 3 deletions llvm/lib/IR/Verifier.cpp
Expand Up @@ -1895,13 +1895,13 @@ void Verifier::verifyFunctionAttrs(FunctionType *FT, AttributeList Attrs,

if (AttributeListsVisited.insert(Attrs.getRawPointer()).second) {
Assert(Attrs.hasParentContext(Context),
"Attribute list does not match Module context!", &Attrs);
"Attribute list does not match Module context!", &Attrs, V);
for (const auto &AttrSet : Attrs) {
Assert(!AttrSet.hasAttributes() || AttrSet.hasParentContext(Context),
"Attribute set does not match Module context!", &AttrSet);
"Attribute set does not match Module context!", &AttrSet, V);
for (const auto &A : AttrSet) {
Assert(A.hasParentContext(Context),
"Attribute does not match Module context!", &A);
"Attribute does not match Module context!", &A, V);
}
}
}
Expand Down
35 changes: 35 additions & 0 deletions llvm/unittests/IR/AttributesTest.cpp
Expand Up @@ -217,4 +217,39 @@ TEST(Attributes, HasParentContext) {
}
}

TEST(Attributes, AttributeListPrinting) {
LLVMContext C;

{
std::string S;
raw_string_ostream OS(S);
AttributeList AL;
AL.addAttribute(C, AttributeList::FunctionIndex, Attribute::AlwaysInline)
.print(OS);
EXPECT_EQ(S, "AttributeList[\n"
" { function => alwaysinline }\n"
"]\n");
}

{
std::string S;
raw_string_ostream OS(S);
AttributeList AL;
AL.addAttribute(C, AttributeList::ReturnIndex, Attribute::SExt).print(OS);
EXPECT_EQ(S, "AttributeList[\n"
" { return => signext }\n"
"]\n");
}

{
std::string S;
raw_string_ostream OS(S);
AttributeList AL;
AL.addParamAttribute(C, 5, Attribute::ZExt).print(OS);
EXPECT_EQ(S, "AttributeList[\n"
" { arg(5) => zeroext }\n"
"]\n");
}
}

} // end anonymous namespace

0 comments on commit 30bbfda

Please sign in to comment.