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.)

git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@232844 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
Duncan P. N. Exon Smith 2015-03-20 20:17:07 +00:00
parent d80979b25d
commit e2305f7e90

View 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.