summaryrefslogtreecommitdiffstats
path: root/llvm
diff options
context:
space:
mode:
authorDuncan P. N. Exon Smith <dexonsmith@apple.com>2015-03-20 20:17:07 +0000
committerDuncan P. N. Exon Smith <dexonsmith@apple.com>2015-03-20 20:17:07 +0000
commit00f9bf1c144ff624cae15dab893bcbff7c6bb4f8 (patch)
tree5f942a3512d3335729bef5e68a398fa4f7d16c36 /llvm
parente9ad54b3ee905ea3a77c35ca7d6e843b2c552e0b (diff)
downloadbcm5719-llvm-00f9bf1c144ff624cae15dab893bcbff7c6bb4f8.tar.gz
bcm5719-llvm-00f9bf1c144ff624cae15dab893bcbff7c6bb4f8.zip
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.) llvm-svn: 232844
Diffstat (limited to 'llvm')
-rw-r--r--llvm/include/llvm/IR/DebugInfo.h23
1 files changed, 13 insertions, 10 deletions
diff --git a/llvm/include/llvm/IR/DebugInfo.h b/llvm/include/llvm/IR/DebugInfo.h
index c9189e551d5..3eaf91d491d 100644
--- a/llvm/include/llvm/IR/DebugInfo.h
+++ b/llvm/include/llvm/IR/DebugInfo.h
@@ -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.
OpenPOWER on IntegriCloud