typedef DebugNodeArray DIArray;
typedef MDTypeRefArray DITypeArray;
+typedef DebugNodeRef DIDescriptorRef;
+typedef MDScopeRef DIScopeRef;
+typedef MDTypeRef DITypeRef;
class DISubrange {
MDSubrange *N;
MDEnumerator &operator*() const { return *N; }
};
-template <typename T> class DIRef;
-typedef DIRef<DIDescriptor> DIDescriptorRef;
-typedef DIRef<DIScope> DIScopeRef;
-typedef DIRef<DIType> DITypeRef;
-
class DIScope {
MDScope *N;
MDScope &operator*() const { return *N; }
};
-/// \brief Represents reference to a DIDescriptor.
-///
-/// Abstracts over direct and identifier-based metadata references.
-template <typename T> class DIRef {
- /// \brief Val can be either a MDNode or a MDString.
- ///
- /// In the latter, MDString specifies the type identifier.
- const Metadata *Val;
-
-public:
- template <class U>
- DIRef(const TypedDebugNodeRef<U> &Ref,
- typename std::enable_if<std::is_convertible<U *, T>::value>::type * =
- nullptr)
- : Val(Ref) {}
-
- T resolve(const DITypeIdentifierMap &Map) const;
- operator Metadata *() const { return const_cast<Metadata *>(Val); }
-};
-
-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;
-
class DIType {
MDType *N;
private:
/// resolve - Look in the DwarfDebug map for the MDNode that
/// corresponds to the reference.
- template <typename T> T resolve(DIRef<T> Ref) const;
+ template <typename T> T *resolve(TypedDebugNodeRef<T> Ref) const;
};
void emitDebugLocEntryLocation(const DebugLocEntry &Entry);
/// Find the MDNode for the given reference.
- template <typename T> T resolve(DIRef<T> Ref) const {
- return Ref.resolve(TypeIdentifierMap);
- }
template <typename T> T *resolve(TypedDebugNodeRef<T> Ref) const {
return Ref.resolve(TypeIdentifierMap);
}
/// resolve - Look in the DwarfDebug map for the MDNode that
/// corresponds to the reference.
- template <typename T> T resolve(DIRef<T> Ref) const {
- return DD->resolve(Ref);
- }
template <typename T> T *resolve(TypedDebugNodeRef<T> Ref) const {
return DD->resolve(Ref);
}
return true;
}
-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) {