[llvm-commits] [llvm] r109028 - in /llvm/trunk: docs/LangRef.html include/llvm/Analysis/DebugInfo.h include/llvm/Metadata.h lib/Analysis/DebugInfo.cpp lib/AsmParser/LLParser.cpp lib/Bitcode/Reader/BitcodeReader.cpp lib/Bitcode/Writer/BitcodeWriter.cpp lib/CodeGen/AsmPrinter/DwarfDebug.cpp lib/VMCore/AsmWriter.cpp lib/VMCore/Metadata.cpp test/Feature/NamedMDNode.ll

Nick Lewycky nicholas at mxc.ca
Wed Jul 21 21:30:12 PDT 2010


Nick Lewycky wrote:
> Dan Gohman wrote:
>> Author: djg
>> Date: Wed Jul 21 13:54:18 2010
>> New Revision: 109028
>>
>> URL: http://llvm.org/viewvc/llvm-project?rev=109028&view=rev
>> Log:
>> Disallow null as a named metadata operand.
>
> What? Why?
>
> Metadata can become null for any reason. I *do* have named metadata
> which points to globals and when those globals are eliminated in
> linking, I *do* expect the metadata to go null so I can clean up the
> metadata.
>
> Please revert this, unless you have a very good reason.

Sorry -- I think I missed an extra layer of indirection. The NamedMDNode 
will still point to an MDNode, while the contents of the MDNode goes to 
null. In which case, my mistake, please carry on! :-)

>
> Nick
>
>> Make MDNode::destroy private.
>> Fix the one thing that used MDNode::destroy, outside of MDNode itself.
>>
>> One should never delete or destroy an MDNode explicitly. MDNodes
>> implicitly go away when there are no references to them (implementation
>> details aside).
>>
>> Modified:
>>       llvm/trunk/docs/LangRef.html
>>       llvm/trunk/include/llvm/Analysis/DebugInfo.h
>>       llvm/trunk/include/llvm/Metadata.h
>>       llvm/trunk/lib/Analysis/DebugInfo.cpp
>>       llvm/trunk/lib/AsmParser/LLParser.cpp
>>       llvm/trunk/lib/Bitcode/Reader/BitcodeReader.cpp
>>       llvm/trunk/lib/Bitcode/Writer/BitcodeWriter.cpp
>>       llvm/trunk/lib/CodeGen/AsmPrinter/DwarfDebug.cpp
>>       llvm/trunk/lib/VMCore/AsmWriter.cpp
>>       llvm/trunk/lib/VMCore/Metadata.cpp
>>       llvm/trunk/test/Feature/NamedMDNode.ll
>>
>> Modified: llvm/trunk/docs/LangRef.html
>> URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/docs/LangRef.html?rev=109028&r1=109027&r2=109028&view=diff
>> ==============================================================================
>> --- llvm/trunk/docs/LangRef.html (original)
>> +++ llvm/trunk/docs/LangRef.html Wed Jul 21 13:54:18 2010
>> @@ -949,15 +949,17 @@
>>    <div class="doc_text">
>>
>>    <p>Named metadata is a collection of metadata.<a href="#metadata">Metadata
>> -   nodes</a>   (but not metadata strings) and null are the only valid operands for
>> +   nodes</a>   (but not metadata strings) are the only valid operands for
>>       a named metadata.</p>
>>
>>    <h5>Syntax:</h5>
>>    <pre class="doc_code">
>> -; An unnamed metadata node, which is referenced by the named metadata.
>> +; Some unnamed metadata nodes, which are referenced by the named metadata.
>> +!0 = metadata !{metadata !"zero"}
>>    !1 = metadata !{metadata !"one"}
>> +!2 = metadata !{metadata !"two"}
>>    ; A named metadata.
>> -!name = !{null, !1}
>> +!name = !{!0, !1, !2}
>>    </pre>
>>
>>    </div>
>>
>> Modified: llvm/trunk/include/llvm/Analysis/DebugInfo.h
>> URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/include/llvm/Analysis/DebugInfo.h?rev=109028&r1=109027&r2=109028&view=diff
>> ==============================================================================
>> --- llvm/trunk/include/llvm/Analysis/DebugInfo.h (original)
>> +++ llvm/trunk/include/llvm/Analysis/DebugInfo.h Wed Jul 21 13:54:18 2010
>> @@ -304,8 +304,7 @@
>>        void dump() const;
>>
>>        /// replaceAllUsesWith - Replace all uses of debug info referenced by
>> -    /// this descriptor. After this completes, the current debug info value
>> -    /// is erased.
>> +    /// this descriptor.
>>        void replaceAllUsesWith(DIDescriptor&D);
>>      };
>>
>>
>> Modified: llvm/trunk/include/llvm/Metadata.h
>> URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/include/llvm/Metadata.h?rev=109028&r1=109027&r2=109028&view=diff
>> ==============================================================================
>> --- llvm/trunk/include/llvm/Metadata.h (original)
>> +++ llvm/trunk/include/llvm/Metadata.h Wed Jul 21 13:54:18 2010
>> @@ -149,9 +149,6 @@
>>      // critical code because it recursively visits all the MDNode's operands.
>>      const Function *getFunction() const;
>>
>> -  // destroy - Delete this node.  Only when there are no uses.
>> -  void destroy();
>> -
>>      /// Profile - calculate a unique identifier for this MDNode to collapse
>>      /// duplicates
>>      void Profile(FoldingSetNodeID&ID) const;
>> @@ -162,6 +159,9 @@
>>        return V->getValueID() == MDNodeVal;
>>      }
>>    private:
>> +  // destroy - Delete this node.  Only when there are no uses.
>> +  void destroy();
>> +
>>      bool isNotUniqued() const {
>>        return (getSubclassDataFromValue()&   NotUniquedBit) != 0;
>>      }
>>
>> Modified: llvm/trunk/lib/Analysis/DebugInfo.cpp
>> URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Analysis/DebugInfo.cpp?rev=109028&r1=109027&r2=109028&view=diff
>> ==============================================================================
>> --- llvm/trunk/lib/Analysis/DebugInfo.cpp (original)
>> +++ llvm/trunk/lib/Analysis/DebugInfo.cpp Wed Jul 21 13:54:18 2010
>> @@ -233,8 +233,7 @@
>>    }
>>
>>    /// replaceAllUsesWith - Replace all uses of debug info referenced by
>> -/// this descriptor. After this completes, the current debug info value
>> -/// is erased.
>> +/// this descriptor.
>>    void DIDerivedType::replaceAllUsesWith(DIDescriptor&D) {
>>      if (!DbgNode)
>>        return;
>> @@ -249,7 +248,6 @@
>>        const MDNode *DN = D;
>>        const Value *V = cast_or_null<Value>(DN);
>>        Node->replaceAllUsesWith(const_cast<Value*>(V));
>> -    Node->destroy();
>>      }
>>    }
>>
>> @@ -1385,7 +1383,7 @@
>>        return 0;
>>
>>      for (unsigned i = 0, e = NMD->getNumOperands(); i != e; ++i) {
>> -    DIDescriptor DIG(cast_or_null<MDNode>(NMD->getOperand(i)));
>> +    DIDescriptor DIG(cast<MDNode>(NMD->getOperand(i)));
>>        if (!DIG.isGlobalVariable())
>>          continue;
>>        if (DIGlobalVariable(DIG).getGlobal() == V)
>>
>> Modified: llvm/trunk/lib/AsmParser/LLParser.cpp
>> URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/AsmParser/LLParser.cpp?rev=109028&r1=109027&r2=109028&view=diff
>> ==============================================================================
>> --- llvm/trunk/lib/AsmParser/LLParser.cpp (original)
>> +++ llvm/trunk/lib/AsmParser/LLParser.cpp Wed Jul 21 13:54:18 2010
>> @@ -546,12 +546,6 @@
>>      SmallVector<MDNode *, 8>   Elts;
>>      if (Lex.getKind() != lltok::rbrace)
>>        do {
>> -      // Null is a special case since it is typeless.
>> -      if (EatIfPresent(lltok::kw_null)) {
>> -        Elts.push_back(0);
>> -        continue;
>> -      }
>> -
>>          if (ParseToken(lltok::exclaim, "Expected '!' here"))
>>            return true;
>>
>>
>> Modified: llvm/trunk/lib/Bitcode/Reader/BitcodeReader.cpp
>> URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Bitcode/Reader/BitcodeReader.cpp?rev=109028&r1=109027&r2=109028&view=diff
>> ==============================================================================
>> --- llvm/trunk/lib/Bitcode/Reader/BitcodeReader.cpp (original)
>> +++ llvm/trunk/lib/Bitcode/Reader/BitcodeReader.cpp Wed Jul 21 13:54:18 2010
>> @@ -803,10 +803,6 @@
>>          unsigned Size = Record.size();
>>          SmallVector<MDNode *, 8>   Elts;
>>          for (unsigned i = 0; i != Size; ++i) {
>> -        if (Record[i] == ~0U) {
>> -          Elts.push_back(NULL);
>> -          continue;
>> -        }
>>            MDNode *MD = dyn_cast<MDNode>(MDValueList.getValueFwdRef(Record[i]));
>>            if (MD == 0)
>>              return Error("Malformed metadata record");
>>
>> Modified: llvm/trunk/lib/Bitcode/Writer/BitcodeWriter.cpp
>> URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Bitcode/Writer/BitcodeWriter.cpp?rev=109028&r1=109027&r2=109028&view=diff
>> ==============================================================================
>> --- llvm/trunk/lib/Bitcode/Writer/BitcodeWriter.cpp (original)
>> +++ llvm/trunk/lib/Bitcode/Writer/BitcodeWriter.cpp Wed Jul 21 13:54:18 2010
>> @@ -558,12 +558,8 @@
>>          Record.clear();
>>
>>          // Write named metadata operands.
>> -      for (unsigned i = 0, e = NMD->getNumOperands(); i != e; ++i) {
>> -        if (NMD->getOperand(i))
>> -          Record.push_back(VE.getValueID(NMD->getOperand(i)));
>> -        else
>> -          Record.push_back(~0U);
>> -      }
>> +      for (unsigned i = 0, e = NMD->getNumOperands(); i != e; ++i)
>> +        Record.push_back(VE.getValueID(NMD->getOperand(i)));
>>          Stream.EmitRecord(bitc::METADATA_NAMED_NODE, Record, 0);
>>          Record.clear();
>>        }
>>
>> Modified: llvm/trunk/lib/CodeGen/AsmPrinter/DwarfDebug.cpp
>> URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/CodeGen/AsmPrinter/DwarfDebug.cpp?rev=109028&r1=109027&r2=109028&view=diff
>> ==============================================================================
>> --- llvm/trunk/lib/CodeGen/AsmPrinter/DwarfDebug.cpp (original)
>> +++ llvm/trunk/lib/CodeGen/AsmPrinter/DwarfDebug.cpp Wed Jul 21 13:54:18 2010
>> @@ -2319,7 +2319,7 @@
>>          M->getNamedMetadata(Twine("llvm.dbg.lv.",
>>                                    getRealLinkageName(F->getName())))) {
>>        for (unsigned i = 0, e = NMD->getNumOperands(); i != e; ++i) {
>> -      DIVariable DV(cast_or_null<MDNode>(NMD->getOperand(i)));
>> +      DIVariable DV(cast<MDNode>(NMD->getOperand(i)));
>>          if (!DV || !Processed.insert(DV))
>>            continue;
>>          DbgScope *Scope = DbgScopeMap.lookup(DV.getContext());
>> @@ -2783,7 +2783,7 @@
>>                M->getNamedMetadata(Twine("llvm.dbg.lv.",
>>                                          getRealLinkageName(FName)))) {
>>              for (unsigned i = 0, e = NMD->getNumOperands(); i != e; ++i) {
>> -          DIVariable DV(cast_or_null<MDNode>(NMD->getOperand(i)));
>> +          DIVariable DV(cast<MDNode>(NMD->getOperand(i)));
>>              if (!DV || !ProcessedVars.insert(DV))
>>                continue;
>>              DbgScope *Scope = AbstractScopes.lookup(DV.getContext());
>>
>> Modified: llvm/trunk/lib/VMCore/AsmWriter.cpp
>> URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/VMCore/AsmWriter.cpp?rev=109028&r1=109027&r2=109028&view=diff
>> ==============================================================================
>> --- llvm/trunk/lib/VMCore/AsmWriter.cpp (original)
>> +++ llvm/trunk/lib/VMCore/AsmWriter.cpp Wed Jul 21 13:54:18 2010
>> @@ -638,10 +638,8 @@
>>             I = TheModule->named_metadata_begin(),
>>             E = TheModule->named_metadata_end(); I != E; ++I) {
>>        const NamedMDNode *NMD = I;
>> -    for (unsigned i = 0, e = NMD->getNumOperands(); i != e; ++i) {
>> -      if (MDNode *MD = NMD->getOperand(i))
>> -        CreateMetadataSlot(MD);
>> -    }
>> +    for (unsigned i = 0, e = NMD->getNumOperands(); i != e; ++i)
>> +      CreateMetadataSlot(NMD->getOperand(i));
>>      }
>>
>>      // Add all the unnamed functions to the table.
>> @@ -1424,10 +1422,7 @@
>>      Out<<   "!"<<   NMD->getName()<<   " = !{";
>>      for (unsigned i = 0, e = NMD->getNumOperands(); i != e; ++i) {
>>        if (i) Out<<   ", ";
>> -    if (MDNode *MD = NMD->getOperand(i))
>> -      Out<<   '!'<<   Machine.getMetadataSlot(MD);
>> -    else
>> -      Out<<   "null";
>> +    Out<<   '!'<<   Machine.getMetadataSlot(NMD->getOperand(i));
>>      }
>>      Out<<   "}\n";
>>    }
>>
>> Modified: llvm/trunk/lib/VMCore/Metadata.cpp
>> URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/VMCore/Metadata.cpp?rev=109028&r1=109027&r2=109028&view=diff
>> ==============================================================================
>> --- llvm/trunk/lib/VMCore/Metadata.cpp (original)
>> +++ llvm/trunk/lib/VMCore/Metadata.cpp Wed Jul 21 13:54:18 2010
>> @@ -389,7 +389,7 @@
>>    /// getOperand - Return specified operand.
>>    MDNode *NamedMDNode::getOperand(unsigned i) const {
>>      assert(i<   getNumOperands()&&   "Invalid Operand number!");
>> -  return dyn_cast_or_null<MDNode>(&*getNMDOps(Operands)[i]);
>> +  return dyn_cast<MDNode>(&*getNMDOps(Operands)[i]);
>>    }
>>
>>    /// addOperand - Add metadata Operand.
>>
>> Modified: llvm/trunk/test/Feature/NamedMDNode.ll
>> URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/test/Feature/NamedMDNode.ll?rev=109028&r1=109027&r2=109028&view=diff
>> ==============================================================================
>> --- llvm/trunk/test/Feature/NamedMDNode.ll (original)
>> +++ llvm/trunk/test/Feature/NamedMDNode.ll Wed Jul 21 13:54:18 2010
>> @@ -3,7 +3,7 @@
>>    ;; Simple NamedMDNode
>>    !0 = metadata !{i32 42}
>>    !1 = metadata !{metadata !"foo"}
>> -!llvm.stuff = !{!0, !1, null}
>> +!llvm.stuff = !{!0, !1}
>>
>>    !samename = !{!0, !1}
>>    declare void @samename()
>>
>>
>> _______________________________________________
>> llvm-commits mailing list
>> llvm-commits at cs.uiuc.edu
>> http://lists.cs.uiuc.edu/mailman/listinfo/llvm-commits
>>
>
> _______________________________________________
> llvm-commits mailing list
> llvm-commits at cs.uiuc.edu
> http://lists.cs.uiuc.edu/mailman/listinfo/llvm-commits
>




More information about the llvm-commits mailing list