[LLVMdev] Am I missing something in this Value debug output code?

Kaylor, Andrew andrew.kaylor at intel.com
Tue Mar 10 12:23:13 PDT 2015

In the course of adding some new code I came across a debug output message before an assert that was extremely unhelpful.  If I incorrectly try to delete a Value object that still has uses in a debug build, an debug message is printed just before an assertion that says it is telling me where the value is still being used but actually just tries to print the value itself multiple times, which in my case was crashing because the Value was already partially destructed.

It looked like a pretty simple and obvious fix and I was just going to go ahead and commit it, but when I looked at the revision history I saw that the current behavior has been in place since 2002.  So I thought maybe it would be a good idea to get a reality check and make sure I wasn't being an idiot in some way.

Can someone give me a second opinion?

Here's the change I am proposing:

Index: lib/IR/Value.cpp
--- lib/IR/Value.cpp         (revision 231388)
+++ lib/IR/Value.cpp      (working copy)
@@ -69,15 +69,15 @@
#ifndef NDEBUG      // Only in -g mode...
   // Check to make sure that there are no uses of this value that are still
   // around when the value is destroyed.  If there are, then we have a dangling
-  // reference and something is wrong.  This code is here to print out what is
-  // still being referenced.  The value in question should be printed as
-  // a <badref>
+  // reference and something is wrong.  This code is here to print out where
+  // the value is still being referenced.  The value will be printed as a
+  // <badref>.
   if (!use_empty()) {
     dbgs() << "While deleting: " << *VTy << " %" << getName() << "\n";
     for (use_iterator I = use_begin(), E = use_end(); I != E; ++I)
       dbgs() << "Use still stuck around after Def is destroyed:"
-           << **I << "\n";
+           << *(I->getUser()) << "\n";
   assert(use_empty() && "Uses remain when a value is destroyed!");


This code appears in the Value::~Value().  I'm pretty sure that "**I" here is just going to be a reference to the Value being destructed, whereas *(I->getUser()) will provide useful information.
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.llvm.org/pipermail/llvm-dev/attachments/20150310/4402c473/attachment.html>

More information about the llvm-dev mailing list