DebugInfo: Require valid DIDescriptors
authorDuncan P. N. Exon Smith <dexonsmith@apple.com>
Fri, 20 Mar 2015 20:17:07 +0000 (20:17 +0000)
committerDuncan P. N. Exon Smith <dexonsmith@apple.com>
Fri, 20 Mar 2015 20:17:07 +0000 (20:17 +0000)
As part of PR22777, switch from `dyn_cast_or_null<>` to `cast<>` in most
`DIDescriptor` accessors.  These classes are lightweight wrappers around
pointers, so the users should check for valid pointers before using
them.

This survives a Darwin clang -g bootstrap (after fixing testcases), but
it's possible the bots will complain about other configurations.  I'll
fix any fallout as quickly as I can!  Once this bakes for a bit I'll
remove the macros.

Note that `DebugLoc` implicitly gets stricter with this change as well,
since it forward to `DILocation`.  Any code that's using `DebugLoc`
accessors should check `DebugLoc::isUnknown()` first.  (BTW, I'm also
partway through a cleanup of the `DebugLoc` API to make it more obvious
what it is (a glorified pointer wrapper) and remove cruft from before
the Metadata/Value split.  I'll commit soon.)

llvm-svn: 232844

llvm/include/llvm/IR/DebugInfo.h

index c9189e5..3eaf91d 100644 (file)
@@ -266,23 +266,26 @@ public:
   void replaceAllUsesWith(MDNode *D);
 };
 
-#define RETURN_FROM_RAW(VALID, DEFAULT)                                        \
+#define RETURN_FROM_RAW(VALID, UNUSED)                                         \
   do {                                                                         \
-    if (auto *N = getRaw())                                                    \
-      return VALID;                                                            \
-    return DEFAULT;                                                            \
+    assert(this->DbgNode && "Expected non-null in accessor");                  \
+    auto *N = getRaw();                                                        \
+    assert(N && "Expected correct subclass in accessor");                      \
+    return VALID;                                                              \
   } while (false)
 #define RETURN_DESCRIPTOR_FROM_RAW(DESC, VALID)                                \
   do {                                                                         \
-    if (auto *N = getRaw())                                                    \
-      return DESC(dyn_cast_or_null<MDNode>(VALID));                            \
-    return DESC(static_cast<const MDNode *>(nullptr));                         \
+    assert(this->DbgNode && "Expected non-null in accessor");                  \
+    auto *N = getRaw();                                                        \
+    assert(N && "Expected correct subclass in accessor");                      \
+    return DESC(dyn_cast_or_null<MDNode>(VALID));                              \
   } while (false)
 #define RETURN_REF_FROM_RAW(REF, VALID)                                        \
   do {                                                                         \
-    if (auto *N = getRaw())                                                    \
-      return REF::get(VALID);                                                  \
-    return REF::get(nullptr);                                                  \
+    assert(this->DbgNode && "Expected non-null in accessor");                  \
+    auto *N = getRaw();                                                        \
+    assert(N && "Expected correct subclass in accessor");                      \
+    return REF::get(VALID);                                                    \
   } while (false)
 
 /// \brief This is used to represent ranges, for array bounds.