diff options
| author | Duncan P. N. Exon Smith <dexonsmith@apple.com> | 2015-03-20 20:17:07 +0000 | 
|---|---|---|
| committer | Duncan P. N. Exon Smith <dexonsmith@apple.com> | 2015-03-20 20:17:07 +0000 | 
| commit | 00f9bf1c144ff624cae15dab893bcbff7c6bb4f8 (patch) | |
| tree | 5f942a3512d3335729bef5e68a398fa4f7d16c36 /llvm | |
| parent | e9ad54b3ee905ea3a77c35ca7d6e843b2c552e0b (diff) | |
| download | bcm5719-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.h | 23 | 
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.  | 

