mirror of
https://github.com/RPCS3/llvm.git
synced 2025-03-04 08:37:45 +00:00
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 git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@264780 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
parent
68b470458c
commit
d239bc5dbb
@ -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));
|
||||
|
@ -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())
|
||||
|
@ -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);
|
||||
|
||||
|
Loading…
x
Reference in New Issue
Block a user