diff options
| author | Duncan P. N. Exon Smith <dexonsmith@apple.com> | 2015-04-06 22:27:37 +0000 |
|---|---|---|
| committer | Duncan P. N. Exon Smith <dexonsmith@apple.com> | 2015-04-06 22:27:37 +0000 |
| commit | 5bf3cdc566dfd2a653aa1342a850a7bd3d451677 (patch) | |
| tree | f470382d6205f993c615d207516afb7407c13522 | |
| parent | 4e25cfa167ea1768e6866ae8040b4afc4ac87719 (diff) | |
| download | bcm5719-llvm-5bf3cdc566dfd2a653aa1342a850a7bd3d451677.tar.gz bcm5719-llvm-5bf3cdc566dfd2a653aa1342a850a7bd3d451677.zip | |
DebugInfo: Reimplement DIRef<>::resolve() using TypedDebugNodeRef<>
Gut `DIRef<>::resolve()`, reimplementing it using
`TypedDebugNodeRef<>::resolve()`. Use three separate functions rather
than some sort of type traits, since the latter (i.e., mapping `DIScope`
=> `MDScope`) seems heavy-handed. I don't expect `DIRef<>` to last much
longer in tree anyway.
As a drive-by fix, make `TypedDebugNodeRef<>::resolve()` do the right
thing with `nullptr`.
llvm-svn: 234248
| -rw-r--r-- | llvm/include/llvm/IR/DebugInfo.h | 21 | ||||
| -rw-r--r-- | llvm/include/llvm/IR/DebugInfoMetadata.h | 3 | ||||
| -rw-r--r-- | llvm/lib/IR/DebugInfo.cpp | 14 |
3 files changed, 22 insertions, 16 deletions
diff --git a/llvm/include/llvm/IR/DebugInfo.h b/llvm/include/llvm/IR/DebugInfo.h index f851be737df..f022edddb0e 100644 --- a/llvm/include/llvm/IR/DebugInfo.h +++ b/llvm/include/llvm/IR/DebugInfo.h @@ -301,22 +301,11 @@ public: static DIRef get(const Metadata *MD) { return DIRef(MD); } }; -template <typename T> -T DIRef<T>::resolve(const DITypeIdentifierMap &Map) const { - if (!Val) - return T(); - - if (const MDNode *MD = dyn_cast<MDNode>(Val)) - return T(MD); - - const MDString *MS = cast<MDString>(Val); - // Find the corresponding MDNode. - DITypeIdentifierMap::const_iterator Iter = Map.find(MS); - assert(Iter != Map.end() && "Identifier not in the type map?"); - assert(DIDescriptor(Iter->second).isType() && - "MDNode in DITypeIdentifierMap should be a DIType."); - return T(Iter->second); -} +template <> +DIDescriptor DIRef<DIDescriptor>::resolve(const DITypeIdentifierMap &Map) const; +template <> +DIScope DIRef<DIScope>::resolve(const DITypeIdentifierMap &Map) const; +template <> DIType DIRef<DIType>::resolve(const DITypeIdentifierMap &Map) const; /// \brief Handle fields that are references to DIDescriptors. template <> diff --git a/llvm/include/llvm/IR/DebugInfoMetadata.h b/llvm/include/llvm/IR/DebugInfoMetadata.h index d162f957701..394c70ee950 100644 --- a/llvm/include/llvm/IR/DebugInfoMetadata.h +++ b/llvm/include/llvm/IR/DebugInfoMetadata.h @@ -75,6 +75,9 @@ public: static TypedDebugNodeRef get(const T *N); template <class MapTy> T *resolve(const MapTy &Map) const { + if (!MD) + return nullptr; + if (auto *Typed = dyn_cast<T>(MD)) return const_cast<T *>(Typed); diff --git a/llvm/lib/IR/DebugInfo.cpp b/llvm/lib/IR/DebugInfo.cpp index 8ae2bcb8485..721fbc8c3a0 100644 --- a/llvm/lib/IR/DebugInfo.cpp +++ b/llvm/lib/IR/DebugInfo.cpp @@ -685,6 +685,20 @@ template <> DITypeRef DIDescriptor::getFieldAs<DITypeRef>(unsigned Elt) const { return DITypeRef(cast_or_null<Metadata>(getField(DbgNode, Elt))); } +template <> +DIDescriptor +DIRef<DIDescriptor>::resolve(const DITypeIdentifierMap &Map) const { + return DIDescriptor(DebugNodeRef(Val).resolve(Map)); +} +template <> +DIScope DIRef<DIScope>::resolve(const DITypeIdentifierMap &Map) const { + return MDScopeRef(Val).resolve(Map); +} +template <> +DIType DIRef<DIType>::resolve(const DITypeIdentifierMap &Map) const { + return MDTypeRef(Val).resolve(Map); +} + bool llvm::stripDebugInfo(Function &F) { bool Changed = false; for (BasicBlock &BB : F) { |

