diff --git a/include/llvm/Metadata.h b/include/llvm/Metadata.h index f64978cab44..8766ea8003d 100644 --- a/include/llvm/Metadata.h +++ b/include/llvm/Metadata.h @@ -156,7 +156,7 @@ public: // function-local operand, return the first such operand's parent function. // Otherwise, return null. getFunction() should not be used for performance- // critical code because it recursively visits all the MDNode's operands. - Function *getFunction() const; + const Function *getFunction() const; // destroy - Delete this node. Only when there are no uses. void destroy(); diff --git a/lib/VMCore/AsmWriter.cpp b/lib/VMCore/AsmWriter.cpp index c0aeaf93c88..c9f3849c925 100644 --- a/lib/VMCore/AsmWriter.cpp +++ b/lib/VMCore/AsmWriter.cpp @@ -2062,7 +2062,7 @@ void Value::print(raw_ostream &ROS, AssemblyAnnotationWriter *AAW) const { else W.printAlias(cast(GV)); } else if (const MDNode *N = dyn_cast(this)) { - Function *F = N->getFunction(); + const Function *F = N->getFunction(); SlotTracker SlotTable(F); AssemblyWriter W(OS, SlotTable, F ? getModuleFromVal(F) : 0, AAW); W.printMDNodeBody(N); diff --git a/lib/VMCore/Metadata.cpp b/lib/VMCore/Metadata.cpp index 7d783958882..822dbd9521d 100644 --- a/lib/VMCore/Metadata.cpp +++ b/lib/VMCore/Metadata.cpp @@ -121,32 +121,27 @@ MDNode::~MDNode() { Op->~MDNodeOperand(); } +static const Function *getFunctionForValue(Value *V) { + if (!V) return NULL; + if (Instruction *I = dyn_cast(V)) + return I->getParent()->getParent(); + if (BasicBlock *BB = dyn_cast(V)) return BB->getParent(); + if (Argument *A = dyn_cast(V)) return A->getParent(); + return NULL; +} + #ifndef NDEBUG -static Function *assertLocalFunction(const MDNode *N) { +static const Function *assertLocalFunction(const MDNode *N) { if (!N->isFunctionLocal()) return NULL; - Function *F = NULL; + const Function *F = NULL, *NewF = NULL; for (unsigned i = 0, e = N->getNumOperands(); i != e; ++i) { - Value *V = N->getOperand(i); - if (!V) continue; - if (Instruction *I = dyn_cast(V)) { - if (F) assert(F == I->getParent()->getParent() && - "inconsistent function-local metadata"); - else F = I->getParent()->getParent(); - } else if (BasicBlock *BB = dyn_cast(V)) { - if (F) assert(F == BB->getParent() && - "inconsistent function-local metadata"); - else F = BB->getParent(); - } else if (Argument *A = dyn_cast(V)) { - if (F) assert(F == A->getParent() && - "inconsistent function-local metadata"); - else F = A->getParent(); - } else if (MDNode *MD = dyn_cast(V)) { - if (Function *NewF = assertLocalFunction(MD)) { - if (F) assert(F == NewF && "inconsistent function-local metadata"); - else F = NewF; - } + if (Value *V = N->getOperand(i)) { + if (MDNode *MD = dyn_cast(V)) NewF = assertLocalFunction(MD); + else NewF = getFunctionForValue(V); } + if (F && NewF) assert(F == NewF && "inconsistent function-local metadata"); + else if (!F) F = NewF; } return F; } @@ -156,24 +151,19 @@ static Function *assertLocalFunction(const MDNode *N) { // function-local operand, return the first such operand's parent function. // Otherwise, return null. getFunction() should not be used for performance- // critical code because it recursively visits all the MDNode's operands. -Function *MDNode::getFunction() const { +const Function *MDNode::getFunction() const { #ifndef NDEBUG return assertLocalFunction(this); #endif - if (!isFunctionLocal()) return NULL; for (unsigned i = 0, e = getNumOperands(); i != e; ++i) { - Value *V = getOperand(i); - if (!V) continue; - if (Instruction *I = dyn_cast(V)) - return I->getParent()->getParent(); - if (BasicBlock *BB = dyn_cast(V)) - return BB->getParent(); - if (Argument *A = dyn_cast(V)) - return A->getParent(); - if (MDNode *MD = dyn_cast(V)) - if (Function *F = MD->getFunction()) return F; + if (Value *V = getOperand(i)) { + if (MDNode *MD = dyn_cast(V)) + if (const Function *F = MD->getFunction()) return F; + else + return getFunctionForValue(V); + } } return NULL; }