From: Duncan P. N. Exon Smith Date: Fri, 20 Feb 2015 02:28:49 +0000 (+0000) Subject: IR: Extract macros from DILocation, NFC X-Git-Url: http://review.tizen.org/git/?a=commitdiff_plain;h=f86505abdf501b257271e718742ee76b96ca969c;p=platform%2Fupstream%2Fllvm.git 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 --- diff --git a/llvm/include/llvm/IR/DebugInfo.h b/llvm/include/llvm/IR/DebugInfo.h index f7d71e5..f2c0861 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(VALID)); \ + return DESC(static_cast(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(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(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);