[llvm] r232844 - DebugInfo: Require valid DIDescriptors
Duncan P. N. Exon Smith
dexonsmith at apple.com
Fri Mar 20 13:17:07 PDT 2015
Author: dexonsmith
Date: Fri Mar 20 15:17:07 2015
New Revision: 232844
URL: http://llvm.org/viewvc/llvm-project?rev=232844&view=rev
Log:
DebugInfo: Require valid DIDescriptors
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.)
Modified:
llvm/trunk/include/llvm/IR/DebugInfo.h
Modified: llvm/trunk/include/llvm/IR/DebugInfo.h
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/include/llvm/IR/DebugInfo.h?rev=232844&r1=232843&r2=232844&view=diff
==============================================================================
--- llvm/trunk/include/llvm/IR/DebugInfo.h (original)
+++ llvm/trunk/include/llvm/IR/DebugInfo.h Fri Mar 20 15:17:07 2015
@@ -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.
More information about the llvm-commits
mailing list