1
0
mirror of https://github.com/RPCS3/llvm-mirror.git synced 2024-10-18 18:42:46 +02:00

Improve error messages for attributes in the wrong context.

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
This commit is contained in:
Nick Lewycky 2021-04-28 13:15:39 -07:00
parent c9d96287d5
commit cb3a45a8ba
3 changed files with 53 additions and 6 deletions

View File

@ -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";

View File

@ -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);
}
}
}

View File

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