diff options
author | Duncan P. N. Exon Smith <dexonsmith@apple.com> | 2015-02-20 02:28:49 +0000 |
---|---|---|
committer | Duncan P. N. Exon Smith <dexonsmith@apple.com> | 2015-02-20 02:28:49 +0000 |
commit | f86505abdf501b257271e718742ee76b96ca969c (patch) | |
tree | c98516783948dea64e3c5b3db6cf84d9031ede80 /llvm | |
parent | 301ed0c3b498e4f79c1dfbb677b6e0b54ba8dff0 (diff) | |
download | bcm5719-llvm-f86505abdf501b257271e718742ee76b96ca969c.tar.gz bcm5719-llvm-f86505abdf501b257271e718742ee76b96ca969c.zip |
IR: Extract macros from DILocation, NFC
`DILocation` is a lightweight wrapper. Its accessors check for null and
the correct type, and then forward to `MDLocation`.
Extract a couple of macros to do the `dyn_cast_or_null<>` and default
return logic. I'll be using these to minimize error-prone boilerplate
when I move the new hierarchy into place -- since all the other
subclasses of `DIDescriptor` will similarly become lightweight wrappers.
(Note that I hope to obsolete these wrappers fairly quickly, with the
goal of renaming the underlying types (e.g., I'll rename `MDLocation` to
`DILocation` once the name is free).)
llvm-svn: 229953
Diffstat (limited to 'llvm')
-rw-r--r-- | llvm/include/llvm/IR/DebugInfo.h | 36 |
1 files changed, 20 insertions, 16 deletions
diff --git a/llvm/include/llvm/IR/DebugInfo.h b/llvm/include/llvm/IR/DebugInfo.h index f7d71e53702..f2c0861ac8a 100644 --- a/llvm/include/llvm/IR/DebugInfo.h +++ b/llvm/include/llvm/IR/DebugInfo.h @@ -252,6 +252,19 @@ public: void replaceAllUsesWith(MDNode *D); }; +#define RETURN_FROM_RAW(VALID, DEFAULT) \ + do { \ + if (auto *N = getRaw()) \ + return VALID; \ + return DEFAULT; \ + } 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)); \ + } while (false) + /// \brief This is used to represent ranges, for array bounds. class DISubrange : public DIDescriptor { friend class DIDescriptor; @@ -933,25 +946,13 @@ class DILocation : public DIDescriptor { public: explicit DILocation(const MDNode *N) : DIDescriptor(N) {} - unsigned getLineNumber() const { - if (auto *L = getRaw()) - return L->getLine(); - return 0; - } - unsigned getColumnNumber() const { - if (auto *L = getRaw()) - return L->getColumn(); - return 0; - } + unsigned getLineNumber() const { RETURN_FROM_RAW(N->getLine(), 0); } + unsigned getColumnNumber() const { RETURN_FROM_RAW(N->getColumn(), 0); } DIScope getScope() const { - if (auto *L = getRaw()) - return DIScope(dyn_cast_or_null<MDNode>(L->getScope())); - return DIScope(nullptr); + RETURN_DESCRIPTOR_FROM_RAW(DIScope, N->getScope()); } DILocation getOrigLocation() const { - if (auto *L = getRaw()) - return DILocation(dyn_cast_or_null<MDNode>(L->getInlinedAt())); - return DILocation(nullptr); + RETURN_DESCRIPTOR_FROM_RAW(DILocation, N->getInlinedAt()); } StringRef getFilename() const { return getScope().getFilename(); } StringRef getDirectory() const { return getScope().getDirectory(); } @@ -1042,6 +1043,9 @@ public: bool Verify() const; }; +#undef RETURN_FROM_RAW +#undef RETURN_DESCRIPTOR_FROM_RAW + /// \brief Find subprogram that is enclosing this scope. DISubprogram getDISubprogram(const MDNode *Scope); |