From: Duncan P. N. Exon Smith Date: Sat, 28 Feb 2015 21:47:02 +0000 (+0000) Subject: IR: Specialize MDScope::getFile() for MDFile X-Git-Url: http://plrg.eecs.uci.edu/git/?a=commitdiff_plain;h=5bcf130056eeeea49a51a40fe088dc85f85bcb1d;p=oota-llvm.git IR: Specialize MDScope::getFile() for MDFile Fix `MDScope::getFile()` so that it correctly returns a valid `MDFile` even when it's an instance of `MDFile`. This logic is necessary because of r230057. I'm working on moving the new hierarchy into place out-of-tree (on track to commit Monday morning, BTW), and this was exposed by a few failing tests. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@230871 91177308-0d34-0410-b5e6-96231b3b80d8 --- diff --git a/include/llvm/IR/DebugInfoMetadata.h b/include/llvm/IR/DebugInfoMetadata.h index 4534a149257..1f47f8a1cc3 100644 --- a/include/llvm/IR/DebugInfoMetadata.h +++ b/include/llvm/IR/DebugInfoMetadata.h @@ -330,7 +330,15 @@ protected: ~MDScope() {} public: - Metadata *getFile() const { return getOperand(0); } + /// \brief Return the underlying file. + /// + /// An \a MDFile is an \a MDScope, but it doesn't point at a separate file + /// (it\em is the file). If \c this is an \a MDFile, we need to return \c + /// this. Otherwise, return the first operand, which is where all other + /// subclasses store their file pointer. + Metadata *getFile() const { + return isa(this) ? const_cast(this) : getOperand(0); + } static bool classof(const Metadata *MD) { switch (MD->getMetadataID()) { diff --git a/unittests/IR/MetadataTest.cpp b/unittests/IR/MetadataTest.cpp index 6f2372d58cb..4de6ecc0f9b 100644 --- a/unittests/IR/MetadataTest.cpp +++ b/unittests/IR/MetadataTest.cpp @@ -1041,6 +1041,12 @@ TEST_F(MDFileTest, get) { EXPECT_EQ(N, MDNode::replaceWithUniqued(std::move(Temp))); } +TEST_F(MDFileTest, ScopeGetFile) { + // Ensure that MDScope::getFile() returns itself. + MDScope *N = MDFile::get(Context, "file", "dir"); + EXPECT_EQ(N, N->getFile()); +} + typedef MetadataTest MDCompileUnitTest; TEST_F(MDCompileUnitTest, get) {