diff options
Diffstat (limited to 'lib/Transforms/Utils/AddDiscriminators.cpp')
| -rw-r--r-- | lib/Transforms/Utils/AddDiscriminators.cpp | 34 |
1 files changed, 25 insertions, 9 deletions
diff --git a/lib/Transforms/Utils/AddDiscriminators.cpp b/lib/Transforms/Utils/AddDiscriminators.cpp index e3ef423622231..564537af0c2a2 100644 --- a/lib/Transforms/Utils/AddDiscriminators.cpp +++ b/lib/Transforms/Utils/AddDiscriminators.cpp @@ -209,10 +209,18 @@ static bool addDiscriminators(Function &F) { // Only the lowest 7 bits are used to represent a discriminator to fit // it in 1 byte ULEB128 representation. unsigned Discriminator = R.second ? ++LDM[L] : LDM[L]; - I.setDebugLoc(DIL->setBaseDiscriminator(Discriminator)); - LLVM_DEBUG(dbgs() << DIL->getFilename() << ":" << DIL->getLine() << ":" - << DIL->getColumn() << ":" << Discriminator << " " << I - << "\n"); + auto NewDIL = DIL->setBaseDiscriminator(Discriminator); + if (!NewDIL) { + LLVM_DEBUG(dbgs() << "Could not encode discriminator: " + << DIL->getFilename() << ":" << DIL->getLine() << ":" + << DIL->getColumn() << ":" << Discriminator << " " + << I << "\n"); + } else { + I.setDebugLoc(NewDIL.getValue()); + LLVM_DEBUG(dbgs() << DIL->getFilename() << ":" << DIL->getLine() << ":" + << DIL->getColumn() << ":" << Discriminator << " " << I + << "\n"); + } Changed = true; } } @@ -224,23 +232,31 @@ static bool addDiscriminators(Function &F) { for (BasicBlock &B : F) { LocationSet CallLocations; for (auto &I : B.getInstList()) { - CallInst *Current = dyn_cast<CallInst>(&I); // We bypass intrinsic calls for the following two reasons: // 1) We want to avoid a non-deterministic assigment of // discriminators. // 2) We want to minimize the number of base discriminators used. - if (!Current || isa<IntrinsicInst>(&I)) + if (!isa<InvokeInst>(I) && (!isa<CallInst>(I) || isa<IntrinsicInst>(I))) continue; - DILocation *CurrentDIL = Current->getDebugLoc(); + DILocation *CurrentDIL = I.getDebugLoc(); if (!CurrentDIL) continue; Location L = std::make_pair(CurrentDIL->getFilename(), CurrentDIL->getLine()); if (!CallLocations.insert(L).second) { unsigned Discriminator = ++LDM[L]; - Current->setDebugLoc(CurrentDIL->setBaseDiscriminator(Discriminator)); - Changed = true; + auto NewDIL = CurrentDIL->setBaseDiscriminator(Discriminator); + if (!NewDIL) { + LLVM_DEBUG(dbgs() + << "Could not encode discriminator: " + << CurrentDIL->getFilename() << ":" + << CurrentDIL->getLine() << ":" << CurrentDIL->getColumn() + << ":" << Discriminator << " " << I << "\n"); + } else { + I.setDebugLoc(NewDIL.getValue()); + Changed = true; + } } } } |
