diff --git a/lib/IR/DebugInfo.cpp b/lib/IR/DebugInfo.cpp index 91823773212..9381a5b580e 100644 --- a/lib/IR/DebugInfo.cpp +++ b/lib/IR/DebugInfo.cpp @@ -252,32 +252,16 @@ static bool isDescriptorRef(const Metadata *MD) { } #endif -bool DIType::Verify() const { - auto *N = dyn_cast_or_null(DbgNode); - if (!N) - return false; - - if (isCompositeType()) - return DICompositeType(DbgNode).Verify(); - return true; -} - +bool DIType::Verify() const { return isType(); } bool DIBasicType::Verify() const { return isBasicType(); } bool DIDerivedType::Verify() const { return isDerivedType(); } - -bool DICompositeType::Verify() const { - auto *N = dyn_cast_or_null(DbgNode); - return N && !(isLValueReference() && isRValueReference()); -} +bool DICompositeType::Verify() const { return isCompositeType(); } bool DISubprogram::Verify() const { auto *N = dyn_cast_or_null(DbgNode); if (!N) return false; - if (isLValueReference() && isRValueReference()) - return false; - // If a DISubprogram has an llvm::Function*, then scope chains from all // instructions within the function should lead to this DISubprogram. if (auto *F = getFunction()) { diff --git a/lib/IR/Verifier.cpp b/lib/IR/Verifier.cpp index 19897d4c030..171c16bc76b 100644 --- a/lib/IR/Verifier.cpp +++ b/lib/IR/Verifier.cpp @@ -796,6 +796,11 @@ void Verifier::visitMDDerivedType(const MDDerivedType &N) { } } +static bool hasConflictingReferenceFlags(unsigned Flags) { + return (Flags & DebugNode::FlagLValueReference) && + (Flags & DebugNode::FlagRValueReference); +} + void Verifier::visitMDCompositeType(const MDCompositeType &N) { // Common derived type checks. visitMDDerivedTypeBase(N); @@ -814,6 +819,8 @@ void Verifier::visitMDCompositeType(const MDCompositeType &N) { N.getRawVTableHolder()); Assert(!N.getRawElements() || isa(N.getRawElements()), "invalid composite elements", &N, N.getRawElements()); + Assert(!hasConflictingReferenceFlags(N.getFlags()), "invalid reference flags", + &N); } void Verifier::visitMDSubroutineType(const MDSubroutineType &N) { @@ -824,6 +831,8 @@ void Verifier::visitMDSubroutineType(const MDSubroutineType &N) { Assert(isTypeRef(Ty), "invalid subroutine type ref", &N, Types, Ty); } } + Assert(!hasConflictingReferenceFlags(N.getFlags()), "invalid reference flags", + &N); } void Verifier::visitMDFile(const MDFile &N) { @@ -910,6 +919,8 @@ void Verifier::visitMDSubprogram(const MDSubprogram &N) { Op); } } + Assert(!hasConflictingReferenceFlags(N.getFlags()), "invalid reference flags", + &N); } void Verifier::visitMDLexicalBlockBase(const MDLexicalBlockBase &N) {