From 939993ff2fe38eca498b0806b22a35412222a0eb Mon Sep 17 00:00:00 2001 From: Dehao Chen Date: Mon, 29 Feb 2016 18:59:48 +0000 Subject: [PATCH] Move discriminator assignment to the right place. Summary: Now discriminator is assigned per-function instead of per-module. Reviewers: davidxl, dnovillo Subscribers: dblaikie, llvm-commits Differential Revision: http://reviews.llvm.org/D17664 llvm-svn: 262240 --- llvm/include/llvm/IR/DebugInfoMetadata.h | 9 --------- llvm/lib/IR/DebugInfoMetadata.cpp | 17 ----------------- llvm/lib/Transforms/Utils/AddDiscriminators.cpp | 11 +++++++---- 3 files changed, 7 insertions(+), 30 deletions(-) diff --git a/llvm/include/llvm/IR/DebugInfoMetadata.h b/llvm/include/llvm/IR/DebugInfoMetadata.h index 456313a70e83..2c031a5aeba2 100644 --- a/llvm/include/llvm/IR/DebugInfoMetadata.h +++ b/llvm/include/llvm/IR/DebugInfoMetadata.h @@ -1192,15 +1192,6 @@ public: /// instructions that are on different basic blocks. inline unsigned getDiscriminator() const; - /// \brief Compute new discriminator in the given context. - /// - /// This modifies the \a LLVMContext that \c this is in to increment the next - /// discriminator for \c this's line/filename combination. - /// - /// FIXME: Delete this. See comments in implementation and at the only call - /// site in \a AddDiscriminators::runOnFunction(). - unsigned computeNewDiscriminator() const; - Metadata *getRawScope() const { return getOperand(0); } Metadata *getRawInlinedAt() const { if (getNumOperands() == 2) diff --git a/llvm/lib/IR/DebugInfoMetadata.cpp b/llvm/lib/IR/DebugInfoMetadata.cpp index 58e0abdd577c..3dca84d9e5c8 100644 --- a/llvm/lib/IR/DebugInfoMetadata.cpp +++ b/llvm/lib/IR/DebugInfoMetadata.cpp @@ -66,23 +66,6 @@ DILocation *DILocation::getImpl(LLVMContext &Context, unsigned Line, Storage, Context.pImpl->DILocations); } -unsigned DILocation::computeNewDiscriminator() const { - // FIXME: This seems completely wrong. - // - // 1. If two modules are generated in the same context, then the second - // Module will get different discriminators than it would have if it were - // generated in its own context. - // 2. If this function is called after round-tripping to bitcode instead of - // before, it will give a different (and potentially incorrect!) return. - // - // The discriminator should instead be calculated from local information - // where it's actually needed. This logic should be moved to - // AddDiscriminators::runOnFunction(), where it doesn't pollute the - // LLVMContext. - std::pair Key(getFilename().data(), getLine()); - return ++getContext().pImpl->DiscriminatorTable[Key]; -} - unsigned DINode::getFlag(StringRef Flag) { return StringSwitch(Flag) #define HANDLE_DI_FLAG(ID, NAME) .Case("DIFlag" #NAME, Flag##NAME) diff --git a/llvm/lib/Transforms/Utils/AddDiscriminators.cpp b/llvm/lib/Transforms/Utils/AddDiscriminators.cpp index 3e585c623dd5..e0f58606d63f 100644 --- a/llvm/lib/Transforms/Utils/AddDiscriminators.cpp +++ b/llvm/lib/Transforms/Utils/AddDiscriminators.cpp @@ -173,8 +173,10 @@ bool AddDiscriminators::runOnFunction(Function &F) { typedef std::pair Location; typedef DenseMap BBScopeMap; typedef DenseMap LocationBBMap; + typedef DenseMap LocationDiscriminatorMap; LocationBBMap LBM; + LocationDiscriminatorMap LDM; // Traverse all instructions in the function. If the source line location // of the instruction appears in other basic block, assign a new @@ -199,8 +201,7 @@ bool AddDiscriminators::runOnFunction(Function &F) { auto *Scope = DIL->getScope(); auto *File = Builder.createFile(DIL->getFilename(), Scope->getDirectory()); - NewScope = Builder.createLexicalBlockFile( - Scope, File, DIL->computeNewDiscriminator()); + NewScope = Builder.createLexicalBlockFile(Scope, File, ++LDM[L]); } I.setDebugLoc(DILocation::get(Ctx, DIL->getLine(), DIL->getColumn(), NewScope, DIL->getInlinedAt())); @@ -230,8 +231,10 @@ bool AddDiscriminators::runOnFunction(Function &F) { auto *Scope = FirstDIL->getScope(); auto *File = Builder.createFile(FirstDIL->getFilename(), Scope->getDirectory()); - auto *NewScope = Builder.createLexicalBlockFile( - Scope, File, FirstDIL->computeNewDiscriminator()); + Location L = + std::make_pair(FirstDIL->getFilename(), FirstDIL->getLine()); + auto *NewScope = + Builder.createLexicalBlockFile(Scope, File, ++LDM[L]); Current->setDebugLoc(DILocation::get( Ctx, CurrentDIL->getLine(), CurrentDIL->getColumn(), NewScope, CurrentDIL->getInlinedAt()));