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
This commit is contained in:
Duncan P. N. Exon Smith 2015-04-06 22:27:37 +00:00
parent 4e25cfa167
commit 5bf3cdc566
3 changed files with 22 additions and 16 deletions

View File

@ -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 <>

View File

@ -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);

View File

@ -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) {