IR: MDNode => Value: NamedMDNode::getOperator()
authorDuncan P. N. Exon Smith <dexonsmith@apple.com>
Wed, 5 Nov 2014 18:16:03 +0000 (18:16 +0000)
committerDuncan P. N. Exon Smith <dexonsmith@apple.com>
Wed, 5 Nov 2014 18:16:03 +0000 (18:16 +0000)
Change `NamedMDNode::getOperator()` from returning `MDNode *` to
returning `Value *`.  To reduce boilerplate at some call sites, add a
`getOperatorAsMDNode()` for named metadata that's expected to only
return `MDNode` -- for now, that's everything, but debug node named
metadata (such as llvm.dbg.cu and llvm.dbg.sp) will soon change.  This
is part of PR21433.

Note that there's a follow-up patch to clang for the API change.

git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@221375 91177308-0d34-0410-b5e6-96231b3b80d8

17 files changed:
include/llvm/IR/Metadata.h
lib/CodeGen/AsmPrinter/AsmPrinter.cpp
lib/CodeGen/AsmPrinter/DwarfDebug.cpp
lib/IR/Core.cpp
lib/IR/DebugInfo.cpp
lib/IR/Metadata.cpp
lib/IR/Module.cpp
lib/IR/TypeFinder.cpp
lib/IR/Verifier.cpp
lib/Linker/LinkModules.cpp
lib/Target/NVPTX/NVPTXGenericToNVVM.cpp
lib/Target/NVPTX/NVPTXUtilities.cpp
lib/Transforms/Instrumentation/AddressSanitizer.cpp
lib/Transforms/Instrumentation/DebugIR.cpp
lib/Transforms/Instrumentation/GCOVProfiling.cpp
lib/Transforms/ObjCARC/ObjCARCContract.cpp
tools/opt/BreakpointPrinter.cpp

index db072ca6616dc3ae175cc6a2523a46814a72dce0..fa325e7adb51e2b341fd5af51d99105628b9477d 100644 (file)
@@ -237,10 +237,10 @@ private:
 };
 
 //===----------------------------------------------------------------------===//
-/// \brief A tuple of MDNodes.
+/// \brief A tuple of metadata nodes.
 ///
 /// Despite its name, a NamedMDNode isn't itself an MDNode. NamedMDNodes belong
-/// to modules, have names, and contain lists of MDNodes.
+/// to modules, have names, and contain lists of metadata nodes.
 class NamedMDNode : public ilist_node<NamedMDNode> {
   friend class SymbolTableListTraits<NamedMDNode, Module>;
   friend struct ilist_traits<NamedMDNode>;
@@ -250,7 +250,7 @@ class NamedMDNode : public ilist_node<NamedMDNode> {
 
   std::string Name;
   Module *Parent;
-  void *Operands; // SmallVector<TrackingVH<MDNode>, 4>
+  void *Operands; // SmallVector<TrackingVH<Value>, 4>
 
   void setParent(Module *M) { Parent = M; }
 
@@ -305,7 +305,10 @@ public:
   inline Module *getParent() { return Parent; }
   inline const Module *getParent() const { return Parent; }
 
-  MDNode *getOperand(unsigned i) const;
+  Value *getOperand(unsigned i) const;
+  MDNode *getOperandAsMDNode(unsigned i) const {
+    return cast_or_null<MDNode>(getOperand(i));
+  }
   unsigned getNumOperands() const;
   void addOperand(Value *M);
   StringRef getName() const;
@@ -315,11 +318,11 @@ public:
   // ---------------------------------------------------------------------------
   // Operand Iterator interface...
   //
-  typedef op_iterator_impl<MDNode*, MDNode> op_iterator;
+  typedef op_iterator_impl<Value *, Value> op_iterator;
   op_iterator op_begin() { return op_iterator(this, 0); }
   op_iterator op_end()   { return op_iterator(this, getNumOperands()); }
 
-  typedef op_iterator_impl<const MDNode*, MDNode> const_op_iterator;
+  typedef op_iterator_impl<const Value *, Value> const_op_iterator;
   const_op_iterator op_begin() const { return const_op_iterator(this, 0); }
   const_op_iterator op_end()   const { return const_op_iterator(this, getNumOperands()); }
 
index e8bff7c6de5685f8ee8997ea10470fb700c9c889..ba42742dd35cf965e292e0a0902ceed37d630676 100644 (file)
@@ -1398,7 +1398,7 @@ void AsmPrinter::EmitModuleIdents(Module &M) {
 
   if (const NamedMDNode *NMD = M.getNamedMetadata("llvm.ident")) {
     for (unsigned i = 0, e = NMD->getNumOperands(); i != e; ++i) {
-      const MDNode *N = NMD->getOperand(i);
+      const MDNode *N = NMD->getOperandAsMDNode(i);
       assert(N->getNumOperands() == 1 &&
              "llvm.ident metadata entry can have only one operand");
       const MDString *S = cast<MDString>(N->getOperand(0));
index 4acd7271be9aff13f1fcb8ec6818e51365f581f1..9523446bd2205730572403afd64b398fe91f70ca 100644 (file)
@@ -450,8 +450,8 @@ void DwarfDebug::beginModule() {
 
   SingleCU = CU_Nodes->getNumOperands() == 1;
 
-  for (MDNode *N : CU_Nodes->operands()) {
-    DICompileUnit CUNode(N);
+  for (Value *N : CU_Nodes->operands()) {
+    DICompileUnit CUNode(cast<MDNode>(N));
     DwarfCompileUnit &CU = constructDwarfCompileUnit(CUNode);
     DIArray ImportedEntities = CUNode.getImportedEntities();
     for (unsigned i = 0, e = ImportedEntities.getNumElements(); i != e; ++i)
@@ -526,8 +526,8 @@ void DwarfDebug::collectDeadVariables() {
   const Module *M = MMI->getModule();
 
   if (NamedMDNode *CU_Nodes = M->getNamedMetadata("llvm.dbg.cu")) {
-    for (MDNode *N : CU_Nodes->operands()) {
-      DICompileUnit TheCU(N);
+    for (Value *N : CU_Nodes->operands()) {
+      DICompileUnit TheCU(cast<MDNode>(N));
       // Construct subprogram DIE and add variables DIEs.
       DwarfCompileUnit *SPCU =
           static_cast<DwarfCompileUnit *>(CUMap.lookup(TheCU));
index f6ab91972441599a37ad17ce66a4086d708b26cf..7e60e05fd009416b7e5c15b843137afb8d9ca4dc 100644 (file)
@@ -560,8 +560,8 @@ LLVMValueRef LLVMGetMetadata(LLVMValueRef Inst, unsigned KindID) {
 }
 
 void LLVMSetMetadata(LLVMValueRef Inst, unsigned KindID, LLVMValueRef MD) {
-  unwrap<Instruction>(Inst)->setMetadata(KindID,
-                                         MD ? unwrap<MDNode>(MD) : nullptr);
+  unwrap<Instruction>(Inst)
+      ->setMetadata(KindID, MD ? unwrap<Value>(MD) : nullptr);
 }
 
 /*--.. Conversion functions ................................................--*/
@@ -720,7 +720,7 @@ void LLVMAddNamedMetadataOperand(LLVMModuleRef M, const char* name,
   NamedMDNode *N = unwrap(M)->getOrInsertNamedMetadata(name);
   if (!N)
     return;
-  MDNode *Op = Val ? unwrap<MDNode>(Val) : nullptr;
+  Value *Op = Val ? unwrap<Value>(Val) : nullptr;
   if (Op)
     N->addOperand(Op);
 }
index 60904c2b356b2cf780a91ad4ab9207904777f2a0..38389e8ca1ebd23e5d2d98a6eb0a630c9b5ca642 100644 (file)
@@ -949,7 +949,7 @@ DITypeIdentifierMap
 llvm::generateDITypeIdentifierMap(const NamedMDNode *CU_Nodes) {
   DITypeIdentifierMap Map;
   for (unsigned CUi = 0, CUe = CU_Nodes->getNumOperands(); CUi != CUe; ++CUi) {
-    DICompileUnit CU(CU_Nodes->getOperand(CUi));
+    DICompileUnit CU(CU_Nodes->getOperandAsMDNode(CUi));
     DIArray Retain = CU.getRetainedTypes();
     for (unsigned Ti = 0, Te = Retain.getNumElements(); Ti != Te; ++Ti) {
       if (!Retain.getElement(Ti).isCompositeType())
@@ -997,7 +997,7 @@ void DebugInfoFinder::processModule(const Module &M) {
   InitializeTypeMap(M);
   if (NamedMDNode *CU_Nodes = M.getNamedMetadata("llvm.dbg.cu")) {
     for (unsigned i = 0, e = CU_Nodes->getNumOperands(); i != e; ++i) {
-      DICompileUnit CU(CU_Nodes->getOperand(i));
+      DICompileUnit CU(CU_Nodes->getOperandAsMDNode(i));
       addCompileUnit(CU);
       DIArray GVs = CU.getGlobalVariables();
       for (unsigned i = 0, e = GVs.getNumElements(); i != e; ++i) {
@@ -1542,8 +1542,8 @@ llvm::makeSubprogramMap(const Module &M) {
   if (!CU_Nodes)
     return R;
 
-  for (MDNode *N : CU_Nodes->operands()) {
-    DICompileUnit CUNode(N);
+  for (Value *N : CU_Nodes->operands()) {
+    DICompileUnit CUNode(cast<MDNode>(N));
     DIArray SPs = CUNode.getSubprograms();
     for (unsigned i = 0, e = SPs.getNumElements(); i != e; ++i) {
       DISubprogram SP(SPs.getElement(i));
index 3806fe4fd4e13c5a14b380e012cdb1230c18d8fd..59beb7341843edab52efe6a3dfa97a70c578f180 100644 (file)
@@ -555,14 +555,13 @@ MDNode *MDNode::getMostGenericRange(MDNode *A, MDNode *B) {
 // NamedMDNode implementation.
 //
 
-static SmallVector<TrackingVH<MDNode>, 4> &getNMDOps(void *Operands) {
-  return *(SmallVector<TrackingVH<MDNode>, 4>*)Operands;
+static SmallVector<TrackingVH<Value>, 4> &getNMDOps(void *Operands) {
+  return *(SmallVector<TrackingVH<Value>, 4> *)Operands;
 }
 
 NamedMDNode::NamedMDNode(const Twine &N)
-  : Name(N.str()), Parent(nullptr),
-    Operands(new SmallVector<TrackingVH<MDNode>, 4>()) {
-}
+    : Name(N.str()), Parent(nullptr),
+      Operands(new SmallVector<TrackingVH<Value>, 4>()) {}
 
 NamedMDNode::~NamedMDNode() {
   dropAllReferences();
@@ -573,7 +572,7 @@ unsigned NamedMDNode::getNumOperands() const {
   return (unsigned)getNMDOps(Operands).size();
 }
 
-MDNode *NamedMDNode::getOperand(unsigned i) const {
+Value *NamedMDNode::getOperand(unsigned i) const {
   assert(i < getNumOperands() && "Invalid Operand number!");
   return &*getNMDOps(Operands)[i];
 }
@@ -582,7 +581,7 @@ void NamedMDNode::addOperand(Value *V) {
   auto *M = cast<MDNode>(V);
   assert(!M->isFunctionLocal() &&
          "NamedMDNode operands must not be function-local!");
-  getNMDOps(Operands).push_back(TrackingVH<MDNode>(M));
+  getNMDOps(Operands).push_back(TrackingVH<Value>(M));
 }
 
 void NamedMDNode::eraseFromParent() {
index e35eefbd45c5fce1173a6f0e2c340613a16e62a8..35d28481fcbb8342a4b599a14eb98fe99f4c53b8 100644 (file)
@@ -276,7 +276,8 @@ getModuleFlagsMetadata(SmallVectorImpl<ModuleFlagEntry> &Flags) const {
   const NamedMDNode *ModFlags = getModuleFlagsMetadata();
   if (!ModFlags) return;
 
-  for (const MDNode *Flag : ModFlags->operands()) {
+  for (const Value *FlagMD : ModFlags->operands()) {
+    const MDNode *Flag = cast<MDNode>(FlagMD);
     ModFlagBehavior MFB;
     if (Flag->getNumOperands() >= 3 &&
         isValidModFlagBehavior(Flag->getOperand(0), MFB) &&
index d1d8e1381bebc15a4167eadd9aeeb649d3938279..3aae4e69ec1f3f56c23659d5213682a2724eaef6 100644 (file)
@@ -81,7 +81,7 @@ void TypeFinder::run(const Module &M, bool onlyNamed) {
          E = M.named_metadata_end(); I != E; ++I) {
     const NamedMDNode *NMD = I;
     for (unsigned i = 0, e = NMD->getNumOperands(); i != e; ++i)
-      incorporateMDNode(NMD->getOperand(i));
+      incorporateMDNode(NMD->getOperandAsMDNode(i));
   }
 }
 
index 1c54e9b062e466ac1df5baa010b4d49678387a9d..395f2e74d61f0bc1a01b13ea1d34edc16df8c463 100644 (file)
@@ -555,7 +555,7 @@ void Verifier::visitGlobalAlias(const GlobalAlias &GA) {
 
 void Verifier::visitNamedMDNode(const NamedMDNode &NMD) {
   for (unsigned i = 0, e = NMD.getNumOperands(); i != e; ++i) {
-    MDNode *MD = NMD.getOperand(i);
+    MDNode *MD = NMD.getOperandAsMDNode(i);
     if (!MD)
       continue;
 
@@ -624,7 +624,7 @@ void Verifier::visitModuleIdents(const Module &M) {
   // llvm.ident takes a list of metadata entry. Each entry has only one string.
   // Scan each llvm.ident entry and make sure that this requirement is met.
   for (unsigned i = 0, e = Idents->getNumOperands(); i != e; ++i) {
-    const MDNode *N = Idents->getOperand(i);
+    const MDNode *N = Idents->getOperandAsMDNode(i);
     Assert1(N->getNumOperands() == 1,
             "incorrect number of operands in llvm.ident metadata", N);
     Assert1(isa<MDString>(N->getOperand(0)),
@@ -642,7 +642,7 @@ void Verifier::visitModuleFlags(const Module &M) {
   DenseMap<const MDString*, const MDNode*> SeenIDs;
   SmallVector<const MDNode*, 16> Requirements;
   for (unsigned I = 0, E = Flags->getNumOperands(); I != E; ++I) {
-    visitModuleFlag(Flags->getOperand(I), SeenIDs, Requirements);
+    visitModuleFlag(Flags->getOperandAsMDNode(I), SeenIDs, Requirements);
   }
 
   // Validate that the requirements in the module are valid.
index bac187bb3a39b7c3631ea614290305bd0643c2d6..3a2eb6c178c74b7acd7754518850a119bfbde126 100644 (file)
@@ -1287,7 +1287,7 @@ bool ModuleLinker::linkModuleFlagsMetadata() {
   DenseMap<MDString*, MDNode*> Flags;
   SmallSetVector<MDNode*, 16> Requirements;
   for (unsigned I = 0, E = DstModFlags->getNumOperands(); I != E; ++I) {
-    MDNode *Op = DstModFlags->getOperand(I);
+    MDNode *Op = DstModFlags->getOperandAsMDNode(I);
     ConstantInt *Behavior = cast<ConstantInt>(Op->getOperand(0));
     MDString *ID = cast<MDString>(Op->getOperand(1));
 
@@ -1302,7 +1302,7 @@ bool ModuleLinker::linkModuleFlagsMetadata() {
   // requirements.
   bool HasErr = false;
   for (unsigned I = 0, E = SrcModFlags->getNumOperands(); I != E; ++I) {
-    MDNode *SrcOp = SrcModFlags->getOperand(I);
+    MDNode *SrcOp = SrcModFlags->getOperandAsMDNode(I);
     ConstantInt *SrcBehavior = cast<ConstantInt>(SrcOp->getOperand(0));
     MDString *ID = cast<MDString>(SrcOp->getOperand(1));
     MDNode *DstOp = Flags.lookup(ID);
index 58fa95b54ac4920172ef43513387204f83870950..496cfbd7955d9595c1d13c9de514380db24d34df 100644 (file)
@@ -371,7 +371,7 @@ void GenericToNVVM::remapNamedMDNode(Module *M, NamedMDNode *N) {
   // Check if any operand is or contains a global variable in  GVMap, and thus
   // converted to another value.
   for (unsigned i = 0; i < NumOperands; ++i) {
-    MDNode *Operand = N->getOperand(i);
+    MDNode *Operand = cast<MDNode>(N->getOperand(i));
     MDNode *NewOperand = remapMDNode(M, Operand);
     OperandChanged |= Operand != NewOperand;
     NewOperands.push_back(NewOperand);
index d6a14250a4351a9d5eb683b8efef7bb5488faa2a..f1a9a6cc1ea982da6a7e46b3da2cd5478385b8ae 100644 (file)
@@ -73,7 +73,7 @@ static void cacheAnnotationFromMD(const Module *m, const GlobalValue *gv) {
     return;
   key_val_pair_t tmp;
   for (unsigned i = 0, e = NMD->getNumOperands(); i != e; ++i) {
-    const MDNode *elem = NMD->getOperand(i);
+    const MDNode *elem = NMD->getOperandAsMDNode(i);
 
     Value *entity = elem->getOperand(0);
     // entity may be null due to DCE
index 2d5eb0ac4e23b8212edfc8543b66b411fceb5c43..906de7e4fda65f100af3a24031c1372868a63fe7 100644 (file)
@@ -256,7 +256,9 @@ class GlobalsMetadata {
     NamedMDNode *Globals = M.getNamedMetadata("llvm.asan.globals");
     if (!Globals)
       return;
-    for (auto MDN : Globals->operands()) {
+    for (const Value *MDV : Globals->operands()) {
+      const MDNode *MDN = cast<MDNode>(MDV);
+
       // Metadata node contains the global and the fields of "Entry".
       assert(MDN->getNumOperands() == 5);
       Value *V = MDN->getOperand(0);
index 5234341b32edc8a156fc16afe9af382890df0170..7a0ed81eed6b914628bfd87d2e9b6690004f3477 100644 (file)
@@ -474,7 +474,7 @@ bool getSourceInfoFromDI(const Module &M, std::string &Directory,
   if (!CUNode || CUNode->getNumOperands() == 0)
     return false;
 
-  DICompileUnit CU(CUNode->getOperand(0));
+  DICompileUnit CU(cast<MDNode>(CUNode->getOperand(0)));
   if (!CU.Verify())
     return false;
 
index 0baa1c494e5b739487c87c2154c3d3e3fe447bf0..72b49a6cce3a64c53e549347a83d98c242128c47 100644 (file)
@@ -417,7 +417,7 @@ namespace {
 std::string GCOVProfiler::mangleName(DICompileUnit CU, const char *NewStem) {
   if (NamedMDNode *GCov = M->getNamedMetadata("llvm.gcov")) {
     for (int i = 0, e = GCov->getNumOperands(); i != e; ++i) {
-      MDNode *N = GCov->getOperand(i);
+      MDNode *N = GCov->getOperandAsMDNode(i);
       if (N->getNumOperands() != 2) continue;
       MDString *GCovFile = dyn_cast<MDString>(N->getOperand(0));
       MDNode *CompileUnit = dyn_cast<MDNode>(N->getOperand(1));
@@ -479,7 +479,7 @@ void GCOVProfiler::emitProfileNotes() {
     // this pass over the original .o's as they're produced, or run it after
     // LTO, we'll generate the same .gcno files.
 
-    DICompileUnit CU(CU_Nodes->getOperand(i));
+    DICompileUnit CU(CU_Nodes->getOperandAsMDNode(i));
     std::error_code EC;
     raw_fd_ostream out(mangleName(CU, "gcno"), EC, sys::fs::F_None);
     std::string EdgeDestinations;
@@ -565,7 +565,7 @@ bool GCOVProfiler::emitProfileArcs() {
   bool Result = false;
   bool InsertIndCounterIncrCode = false;
   for (unsigned i = 0, e = CU_Nodes->getNumOperands(); i != e; ++i) {
-    DICompileUnit CU(CU_Nodes->getOperand(i));
+    DICompileUnit CU(CU_Nodes->getOperandAsMDNode(i));
     DIArray SPs = CU.getSubprograms();
     SmallVector<std::pair<GlobalVariable *, MDNode *>, 8> CountersBySP;
     for (unsigned i = 0, e = SPs.getNumElements(); i != e; ++i) {
@@ -846,7 +846,7 @@ Function *GCOVProfiler::insertCounterWriteout(
   NamedMDNode *CU_Nodes = M->getNamedMetadata("llvm.dbg.cu");
   if (CU_Nodes) {
     for (unsigned i = 0, e = CU_Nodes->getNumOperands(); i != e; ++i) {
-      DICompileUnit CU(CU_Nodes->getOperand(i));
+      DICompileUnit CU(CU_Nodes->getOperandAsMDNode(i));
       std::string FilenameGcda = mangleName(CU, "gcda");
       uint32_t CfgChecksum = FileChecksums.empty() ? 0 : FileChecksums[i];
       Builder.CreateCall3(StartFile,
index eb325eb9417f775697312e2aefd81c9f47d0f158..04a0d917224b9176fd3f07fa0e04f874b1a59830 100644 (file)
@@ -305,7 +305,7 @@ bool ObjCARCContract::doInitialization(Module &M) {
   if (NamedMDNode *NMD =
         M.getNamedMetadata("clang.arc.retainAutoreleasedReturnValueMarker"))
     if (NMD->getNumOperands() == 1) {
-      const MDNode *N = NMD->getOperand(0);
+      const MDNode *N = NMD->getOperandAsMDNode(0);
       if (N->getNumOperands() == 1)
         if (const MDString *S = dyn_cast<MDString>(N->getOperand(0)))
           RetainRVMarker = S;
index 44f4a11773ef43bad82520c13919ac107bd7854e..e557875546ab08eb6ec0194b810a001cb45a1ca6 100644 (file)
@@ -55,7 +55,7 @@ struct BreakpointPrinter : public ModulePass {
     if (NamedMDNode *NMD = M.getNamedMetadata("llvm.dbg.sp"))
       for (unsigned i = 0, e = NMD->getNumOperands(); i != e; ++i) {
         std::string Name;
-        DISubprogram SP(NMD->getOperand(i));
+        DISubprogram SP(cast_or_null<MDNode>(NMD->getOperand(i)));
         assert((!SP || SP.isSubprogram()) &&
                "A MDNode in llvm.dbg.sp should be null or a DISubprogram.");
         if (!SP)