void ValueEnumerator::EnumerateMetadata(const Value *MD) { assert((isa<MDNode>(MD) || isa<MDString>(MD)) && "Invalid metadata kind"); // Enumerate the type of this value. EnumerateType(MD->getType()); const MDNode *N = dyn_cast<MDNode>(MD); // In the module-level pass, skip function-local nodes themselves, but // do walk their operands. if (N && N->isFunctionLocal() && N->getFunction()) { EnumerateMDNodeOperands(N); return; } // Check to see if it's already in! unsigned &MDValueID = MDValueMap[MD]; if (MDValueID) { // Increment use count. MDValues[MDValueID-1].second++; return; } MDValues.push_back(std::make_pair(MD, 1U)); MDValueID = MDValues.size(); // Enumerate all non-function-local operands. if (N) EnumerateMDNodeOperands(N); }
void ValueEnumerator::EnumerateMetadata(const llvm::Metadata *MD) { assert( (isa<MDNode>(MD) || isa<MDString>(MD) || isa<ConstantAsMetadata>(MD)) && "Invalid metadata kind"); // Insert a dummy ID to block the co-recursive call to // EnumerateMDNodeOperands() from re-visiting MD in a cyclic graph. // // Return early if there's already an ID. if (!MDValueMap.insert(std::make_pair(MD, 0)).second) return; // Visit operands first to minimize RAUW. if (auto *N = dyn_cast<MDNode>(MD)) EnumerateMDNodeOperands(N); else if (auto *C = dyn_cast<ConstantAsMetadata>(MD)) EnumerateValue(C->getValue()); HasMDString |= isa<MDString>(MD); #if LLVM_VERSION >= 37 HasDILocation |= isa<DILocation>(MD); #else HasDILocation |= isa<MDLocation>(MD); #endif // Replace the dummy ID inserted above with the correct one. MDValueMap may // have changed by inserting operands, so we need a fresh lookup here. MDs.push_back(MD); MDValueMap[MD] = MDs.size(); }