Add a print method to MachineFunctionProperties for better error messages

This makes check failures much easier to understand.
Make it empty (but leave it in the class) for NDEBUG builds.

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

llvm-svn: 264780
This commit is contained in:
Derek Schuff 2016-03-29 20:28:20 +00:00
parent 32071a20bc
commit 07636cd5e7
3 changed files with 39 additions and 2 deletions

View File

@ -143,6 +143,8 @@ public:
return !V.Properties.test(Properties);
}
void print(raw_ostream &ROS) const;
private:
BitVector Properties =
BitVector(static_cast<unsigned>(Property::LastProperty));

View File

@ -54,6 +54,28 @@ static cl::opt<unsigned>
void MachineFunctionInitializer::anchor() {}
void MachineFunctionProperties::print(raw_ostream &ROS) const {
// Leave this function even in NDEBUG as an out-of-line anchor.
#if !defined(NDEBUG) || defined(LLVM_ENABLE_DUMP)
if (!Properties.any()) {
ROS << "(empty)";
return;
}
for (BitVector::size_type i = 0; i < Properties.size(); ++i) {
if (Properties[i]) {
switch(static_cast<Property>(i)) {
case Property::AllVRegsAllocated:
ROS << "AllVRegsAllocated ";
break;
default:
// TODO: Implement IsSSA/TracksLiveness when we make them properties.
llvm_unreachable("Unexpected value for property enum");
}
}
}
#endif
}
//===----------------------------------------------------------------------===//
// MachineFunction implementation
//===----------------------------------------------------------------------===//
@ -370,6 +392,9 @@ StringRef MachineFunction::getName() const {
void MachineFunction::print(raw_ostream &OS, SlotIndexes *Indexes) const {
OS << "# Machine code for function " << getName() << ": ";
OS << "Properties: <";
getProperties().print(OS);
OS << "> : ";
if (RegInfo) {
OS << (RegInfo->isSSA() ? "SSA" : "Post SSA");
if (!RegInfo->tracksLiveness())

View File

@ -44,8 +44,18 @@ bool MachineFunctionPass::runOnFunction(Function &F) {
MachineFunction &MF = getAnalysis<MachineFunctionAnalysis>().getMF();
MachineFunctionProperties &MFProps = MF.getProperties();
assert(MFProps.verifyRequiredProperties(RequiredProperties) &&
"Properties required by the pass are not met by the function");
#ifndef NDEBUG
if (!MFProps.verifyRequiredProperties(RequiredProperties)) {
errs() << "MachineFunctionProperties required by " << getPassName()
<< " pass are not met by function " << F.getName() << ".\n"
<< "Required properties: ";
RequiredProperties.print(errs());
errs() << "\nCurrent properties: ";
MFProps.print(errs());
errs() << "\n";
llvm_unreachable("MachineFunctionProperties check failed");
}
#endif
bool RV = runOnMachineFunction(MF);