summaryrefslogtreecommitdiffstats
path: root/llvm
diff options
context:
space:
mode:
authorDuncan P. N. Exon Smith <dexonsmith@apple.com>2015-02-20 02:28:49 +0000
committerDuncan P. N. Exon Smith <dexonsmith@apple.com>2015-02-20 02:28:49 +0000
commitf86505abdf501b257271e718742ee76b96ca969c (patch)
treec98516783948dea64e3c5b3db6cf84d9031ede80 /llvm
parent301ed0c3b498e4f79c1dfbb677b6e0b54ba8dff0 (diff)
downloadbcm5719-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.h36
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);
OpenPOWER on IntegriCloud