[llvm] r246339 - DI: Add Function::getSubprogram()

David Blaikie via llvm-commits llvm-commits at lists.llvm.org
Fri Aug 28 15:12:17 PDT 2015


On Fri, Aug 28, 2015 at 2:55 PM, Duncan P. N. Exon Smith via llvm-commits <
llvm-commits at lists.llvm.org> wrote:

> Author: dexonsmith
> Date: Fri Aug 28 16:55:35 2015
> New Revision: 246339
>
> URL: http://llvm.org/viewvc/llvm-project?rev=246339&view=rev
> Log:
> DI: Add Function::getSubprogram()
>
> Add `Function::setSubprogram()` and `Function::getSubprogram()`,
> convenience methods to forward to `setMetadata()` and `getMetadata()`,
> respectively, and deal in `DISubprogram` instead of `MDNode`.
>
> Also add a verifier check to enforce that `!dbg` attachments are always
> subprograms.
>
> Originally (when I had the llvm-dev discussion back in April) I thought
> I'd store a pointer directly on `llvm::Function` for these attachments
> -- we frequently have debug info, and that's much cheaper than using map
> in the context if there are no other function-level attachments -- but
> for now I'm just using the generic infrastructure.  Let's add the extra
> complexity only if this shows up in a profile.
>

Seems legit - makes sense for instructions (we have lots of them), but may
not be an issue for the more infrequent Functions.


>
> Added:
>     llvm/trunk/test/Verifier/metadata-function-dbg.ll
> Modified:
>     llvm/trunk/include/llvm/IR/Function.h
>     llvm/trunk/lib/IR/Metadata.cpp
>     llvm/trunk/lib/IR/Verifier.cpp
>     llvm/trunk/unittests/IR/MetadataTest.cpp
>
> Modified: llvm/trunk/include/llvm/IR/Function.h
> URL:
> http://llvm.org/viewvc/llvm-project/llvm/trunk/include/llvm/IR/Function.h?rev=246339&r1=246338&r2=246339&view=diff
>
> ==============================================================================
> --- llvm/trunk/include/llvm/IR/Function.h (original)
> +++ llvm/trunk/include/llvm/IR/Function.h Fri Aug 28 16:55:35 2015
> @@ -32,6 +32,7 @@ namespace llvm {
>
>  class FunctionType;
>  class LLVMContext;
> +class DISubprogram;
>
>  template<> struct ilist_traits<Argument>
>    : public SymbolTableListTraits<Argument, Function> {
> @@ -606,6 +607,17 @@ public:
>    /// Drop all metadata from \c this not included in \c KnownIDs.
>    void dropUnknownMetadata(ArrayRef<unsigned> KnownIDs);
>
> +  /// \brief Set the attached subprogram.
> +  ///
> +  /// Calls \a setMetadata() with \a LLVMContext::MD_dbg.
> +  void setSubprogram(DISubprogram *SP);
> +
> +  /// \brief Get the attached subprogram.
> +  ///
> +  /// Calls \a getMetadata() with \a LLVMContext::MD_dbg and casts the
> result
> +  /// to \a DISubprogram.
> +  DISubprogram *getSubprogram() const;
> +
>  private:
>    // Shadow Value::setValueSubclassData with a private forwarding method
> so that
>    // subclasses cannot accidentally use it.
>
> Modified: llvm/trunk/lib/IR/Metadata.cpp
> URL:
> http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/IR/Metadata.cpp?rev=246339&r1=246338&r2=246339&view=diff
>
> ==============================================================================
> --- llvm/trunk/lib/IR/Metadata.cpp (original)
> +++ llvm/trunk/lib/IR/Metadata.cpp Fri Aug 28 16:55:35 2015
> @@ -1259,3 +1259,11 @@ void Function::clearMetadata() {
>    getContext().pImpl->FunctionMetadata.erase(this);
>    setHasMetadataHashEntry(false);
>  }
> +
> +void Function::setSubprogram(DISubprogram *SP) {
> +  setMetadata(LLVMContext::MD_dbg, SP);
> +}
> +
> +DISubprogram *Function::getSubprogram() const {
> +  return cast_or_null<DISubprogram>(getMetadata(LLVMContext::MD_dbg));
> +}
>
> Modified: llvm/trunk/lib/IR/Verifier.cpp
> URL:
> http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/IR/Verifier.cpp?rev=246339&r1=246338&r2=246339&view=diff
>
> ==============================================================================
> --- llvm/trunk/lib/IR/Verifier.cpp (original)
> +++ llvm/trunk/lib/IR/Verifier.cpp Fri Aug 28 16:55:35 2015
> @@ -1779,8 +1779,20 @@ void Verifier::visitFunction(const Funct
>      }
>
>      // Visit metadata attachments.
> -    for (const auto &I : MDs)
> +    for (const auto &I : MDs) {
> +      // Verify that the attachment is legal.
> +      switch (I.first) {
> +      default:
> +        break;
> +      case LLVMContext::MD_dbg:
> +        Assert(isa<DISubprogram>(I.second),
> +               "function !dbg attachment must be a subprogram", &F,
> I.second);
> +        break;
> +      }
> +
> +      // Verify the metadata itself.
>        visitMDNode(*I.second);
> +    }
>    }
>
>    // If this function is actually an intrinsic, verify that it is only
> used in
>
> Added: llvm/trunk/test/Verifier/metadata-function-dbg.ll
> URL:
> http://llvm.org/viewvc/llvm-project/llvm/trunk/test/Verifier/metadata-function-dbg.ll?rev=246339&view=auto
>
> ==============================================================================
> --- llvm/trunk/test/Verifier/metadata-function-dbg.ll (added)
> +++ llvm/trunk/test/Verifier/metadata-function-dbg.ll Fri Aug 28 16:55:35
> 2015
> @@ -0,0 +1,23 @@
> +; RUN: not llvm-as %s -disable-output 2>&1 | FileCheck %s
> +
> +define void @foo() !dbg !4 {
> +  unreachable
> +}
> +
> +; CHECK-NOT:  !dbg
> +; CHECK:      function !dbg attachment must be a subprogram
> +; CHECK-NEXT: void ()* @bar
> +; CHECK-NEXT: !{{[0-9]+}} = !{}
> +define void @bar() !dbg !6 {
> +  unreachable
> +}
> +
> +!llvm.module.flags = !{!0}
> +!0 = !{i32 2, !"Debug Info Version", i32 3}
> +
> +!llvm.dbg.cu = !{!1}
> +!1 = distinct !DICompileUnit(language: DW_LANG_C99, file: !2,
> subprograms: !3)
> +!2 = !DIFile(filename: "t.c", directory: "/path/to/dir")
> +!3 = !{!4}
> +!4 = distinct !DISubprogram(name: "foo", scope: !1, file: !2, function:
> void ()* @foo)
> +!6 = !{}
>
> Modified: llvm/trunk/unittests/IR/MetadataTest.cpp
> URL:
> http://llvm.org/viewvc/llvm-project/llvm/trunk/unittests/IR/MetadataTest.cpp?rev=246339&r1=246338&r2=246339&view=diff
>
> ==============================================================================
> --- llvm/trunk/unittests/IR/MetadataTest.cpp (original)
> +++ llvm/trunk/unittests/IR/MetadataTest.cpp Fri Aug 28 16:55:35 2015
> @@ -2273,4 +2273,16 @@ TEST_F(FunctionAttachmentTest, EntryCoun
>    EXPECT_EQ(12304u, *F->getEntryCount());
>  }
>
> +TEST_F(FunctionAttachmentTest, SubprogramAttachment) {
> +  Function *F = getFunction("foo");
> +  DISubprogram *SP = getSubprogram();
> +  F->setSubprogram(SP);
> +
> +  // Note that the static_cast confirms that F->getSubprogram() actually
> +  // returns an DISubprogram.
> +  EXPECT_EQ(SP, static_cast<DISubprogram *>(F->getSubprogram()));
> +  EXPECT_EQ(SP, F->getMetadata("dbg"));
> +  EXPECT_EQ(SP, F->getMetadata(LLVMContext::MD_dbg));
> +}
> +
>  }
>
>
> _______________________________________________
> llvm-commits mailing list
> llvm-commits at lists.llvm.org
> http://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-commits
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.llvm.org/pipermail/llvm-commits/attachments/20150828/5f08ad57/attachment.html>


More information about the llvm-commits mailing list