From e2305f7e90deda96b65672dfe432f7454815c192 Mon Sep 17 00:00:00 2001 From: "Duncan P. N. Exon Smith" Date: Fri, 20 Mar 2015 20:17:07 +0000 Subject: [PATCH] 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 --- include/llvm/IR/DebugInfo.h | 23 +++++++++++++---------- 1 file changed, 13 insertions(+), 10 deletions(-) diff --git a/include/llvm/IR/DebugInfo.h b/include/llvm/IR/DebugInfo.h index c9189e551d5..3eaf91d491d 100644 --- a/include/llvm/IR/DebugInfo.h +++ b/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(VALID)); \ - return DESC(static_cast(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(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.