<div dir="ltr"><br><div class="gmail_extra"><br><div class="gmail_quote">On Fri, Aug 28, 2015 at 2:55 PM, Duncan P. N. Exon Smith via llvm-commits <span dir="ltr"><<a href="mailto:llvm-commits@lists.llvm.org" target="_blank">llvm-commits@lists.llvm.org</a>></span> wrote:<br><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">Author: dexonsmith<br>
Date: Fri Aug 28 16:55:35 2015<br>
New Revision: 246339<br>
<br>
URL: <a href="http://llvm.org/viewvc/llvm-project?rev=246339&view=rev" rel="noreferrer" target="_blank">http://llvm.org/viewvc/llvm-project?rev=246339&view=rev</a><br>
Log:<br>
DI: Add Function::getSubprogram()<br>
<br>
Add `Function::setSubprogram()` and `Function::getSubprogram()`,<br>
convenience methods to forward to `setMetadata()` and `getMetadata()`,<br>
respectively, and deal in `DISubprogram` instead of `MDNode`.<br>
<br>
Also add a verifier check to enforce that `!dbg` attachments are always<br>
subprograms.<br>
<br>
Originally (when I had the llvm-dev discussion back in April) I thought<br>
I'd store a pointer directly on `llvm::Function` for these attachments<br>
-- we frequently have debug info, and that's much cheaper than using map<br>
in the context if there are no other function-level attachments -- but<br>
for now I'm just using the generic infrastructure.  Let's add the extra<br>
complexity only if this shows up in a profile.<br></blockquote><div><br></div><div>Seems legit - makes sense for instructions (we have lots of them), but may not be an issue for the more infrequent Functions.</div><div> </div><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">
<br>
Added:<br>
    llvm/trunk/test/Verifier/metadata-function-dbg.ll<br>
Modified:<br>
    llvm/trunk/include/llvm/IR/Function.h<br>
    llvm/trunk/lib/IR/Metadata.cpp<br>
    llvm/trunk/lib/IR/Verifier.cpp<br>
    llvm/trunk/unittests/IR/MetadataTest.cpp<br>
<br>
Modified: llvm/trunk/include/llvm/IR/Function.h<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/llvm/trunk/include/llvm/IR/Function.h?rev=246339&r1=246338&r2=246339&view=diff" rel="noreferrer" target="_blank">http://llvm.org/viewvc/llvm-project/llvm/trunk/include/llvm/IR/Function.h?rev=246339&r1=246338&r2=246339&view=diff</a><br>
==============================================================================<br>
--- llvm/trunk/include/llvm/IR/Function.h (original)<br>
+++ llvm/trunk/include/llvm/IR/Function.h Fri Aug 28 16:55:35 2015<br>
@@ -32,6 +32,7 @@ namespace llvm {<br>
<br>
 class FunctionType;<br>
 class LLVMContext;<br>
+class DISubprogram;<br>
<br>
 template<> struct ilist_traits<Argument><br>
   : public SymbolTableListTraits<Argument, Function> {<br>
@@ -606,6 +607,17 @@ public:<br>
   /// Drop all metadata from \c this not included in \c KnownIDs.<br>
   void dropUnknownMetadata(ArrayRef<unsigned> KnownIDs);<br>
<br>
+  /// \brief Set the attached subprogram.<br>
+  ///<br>
+  /// Calls \a setMetadata() with \a LLVMContext::MD_dbg.<br>
+  void setSubprogram(DISubprogram *SP);<br>
+<br>
+  /// \brief Get the attached subprogram.<br>
+  ///<br>
+  /// Calls \a getMetadata() with \a LLVMContext::MD_dbg and casts the result<br>
+  /// to \a DISubprogram.<br>
+  DISubprogram *getSubprogram() const;<br>
+<br>
 private:<br>
   // Shadow Value::setValueSubclassData with a private forwarding method so that<br>
   // subclasses cannot accidentally use it.<br>
<br>
Modified: llvm/trunk/lib/IR/Metadata.cpp<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/IR/Metadata.cpp?rev=246339&r1=246338&r2=246339&view=diff" rel="noreferrer" target="_blank">http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/IR/Metadata.cpp?rev=246339&r1=246338&r2=246339&view=diff</a><br>
==============================================================================<br>
--- llvm/trunk/lib/IR/Metadata.cpp (original)<br>
+++ llvm/trunk/lib/IR/Metadata.cpp Fri Aug 28 16:55:35 2015<br>
@@ -1259,3 +1259,11 @@ void Function::clearMetadata() {<br>
   getContext().pImpl->FunctionMetadata.erase(this);<br>
   setHasMetadataHashEntry(false);<br>
 }<br>
+<br>
+void Function::setSubprogram(DISubprogram *SP) {<br>
+  setMetadata(LLVMContext::MD_dbg, SP);<br>
+}<br>
+<br>
+DISubprogram *Function::getSubprogram() const {<br>
+  return cast_or_null<DISubprogram>(getMetadata(LLVMContext::MD_dbg));<br>
+}<br>
<br>
Modified: llvm/trunk/lib/IR/Verifier.cpp<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/IR/Verifier.cpp?rev=246339&r1=246338&r2=246339&view=diff" rel="noreferrer" target="_blank">http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/IR/Verifier.cpp?rev=246339&r1=246338&r2=246339&view=diff</a><br>
==============================================================================<br>
--- llvm/trunk/lib/IR/Verifier.cpp (original)<br>
+++ llvm/trunk/lib/IR/Verifier.cpp Fri Aug 28 16:55:35 2015<br>
@@ -1779,8 +1779,20 @@ void Verifier::visitFunction(const Funct<br>
     }<br>
<br>
     // Visit metadata attachments.<br>
-    for (const auto &I : MDs)<br>
+    for (const auto &I : MDs) {<br>
+      // Verify that the attachment is legal.<br>
+      switch (I.first) {<br>
+      default:<br>
+        break;<br>
+      case LLVMContext::MD_dbg:<br>
+        Assert(isa<DISubprogram>(I.second),<br>
+               "function !dbg attachment must be a subprogram", &F, I.second);<br>
+        break;<br>
+      }<br>
+<br>
+      // Verify the metadata itself.<br>
       visitMDNode(*I.second);<br>
+    }<br>
   }<br>
<br>
   // If this function is actually an intrinsic, verify that it is only used in<br>
<br>
Added: llvm/trunk/test/Verifier/metadata-function-dbg.ll<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/llvm/trunk/test/Verifier/metadata-function-dbg.ll?rev=246339&view=auto" rel="noreferrer" target="_blank">http://llvm.org/viewvc/llvm-project/llvm/trunk/test/Verifier/metadata-function-dbg.ll?rev=246339&view=auto</a><br>
==============================================================================<br>
--- llvm/trunk/test/Verifier/metadata-function-dbg.ll (added)<br>
+++ llvm/trunk/test/Verifier/metadata-function-dbg.ll Fri Aug 28 16:55:35 2015<br>
@@ -0,0 +1,23 @@<br>
+; RUN: not llvm-as %s -disable-output 2>&1 | FileCheck %s<br>
+<br>
+define void @foo() !dbg !4 {<br>
+  unreachable<br>
+}<br>
+<br>
+; CHECK-NOT:  !dbg<br>
+; CHECK:      function !dbg attachment must be a subprogram<br>
+; CHECK-NEXT: void ()* @bar<br>
+; CHECK-NEXT: !{{[0-9]+}} = !{}<br>
+define void @bar() !dbg !6 {<br>
+  unreachable<br>
+}<br>
+<br>
+!llvm.module.flags = !{!0}<br>
+!0 = !{i32 2, !"Debug Info Version", i32 3}<br>
+<br>
+!<a href="http://llvm.dbg.cu" rel="noreferrer" target="_blank">llvm.dbg.cu</a> = !{!1}<br>
+!1 = distinct !DICompileUnit(language: DW_LANG_C99, file: !2, subprograms: !3)<br>
+!2 = !DIFile(filename: "t.c", directory: "/path/to/dir")<br>
+!3 = !{!4}<br>
+!4 = distinct !DISubprogram(name: "foo", scope: !1, file: !2, function: void ()* @foo)<br>
+!6 = !{}<br>
<br>
Modified: llvm/trunk/unittests/IR/MetadataTest.cpp<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/llvm/trunk/unittests/IR/MetadataTest.cpp?rev=246339&r1=246338&r2=246339&view=diff" rel="noreferrer" target="_blank">http://llvm.org/viewvc/llvm-project/llvm/trunk/unittests/IR/MetadataTest.cpp?rev=246339&r1=246338&r2=246339&view=diff</a><br>
==============================================================================<br>
--- llvm/trunk/unittests/IR/MetadataTest.cpp (original)<br>
+++ llvm/trunk/unittests/IR/MetadataTest.cpp Fri Aug 28 16:55:35 2015<br>
@@ -2273,4 +2273,16 @@ TEST_F(FunctionAttachmentTest, EntryCoun<br>
   EXPECT_EQ(12304u, *F->getEntryCount());<br>
 }<br>
<br>
+TEST_F(FunctionAttachmentTest, SubprogramAttachment) {<br>
+  Function *F = getFunction("foo");<br>
+  DISubprogram *SP = getSubprogram();<br>
+  F->setSubprogram(SP);<br>
+<br>
+  // Note that the static_cast confirms that F->getSubprogram() actually<br>
+  // returns an DISubprogram.<br>
+  EXPECT_EQ(SP, static_cast<DISubprogram *>(F->getSubprogram()));<br>
+  EXPECT_EQ(SP, F->getMetadata("dbg"));<br>
+  EXPECT_EQ(SP, F->getMetadata(LLVMContext::MD_dbg));<br>
+}<br>
+<br>
 }<br>
<br>
<br>
_______________________________________________<br>
llvm-commits mailing list<br>
<a href="mailto:llvm-commits@lists.llvm.org">llvm-commits@lists.llvm.org</a><br>
<a href="http://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-commits" rel="noreferrer" target="_blank">http://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-commits</a><br>
</blockquote></div><br></div></div>