diff options
author | Mircea Trofin <mtrofin@google.com> | 2018-12-21 22:48:50 +0000 |
---|---|---|
committer | Mircea Trofin <mtrofin@google.com> | 2018-12-21 22:48:50 +0000 |
commit | b53eeb6f4c824fcdfcb93dd9325a603c005660a7 (patch) | |
tree | 584b0989c4d54efc27f9a41e0c3430741f39fd7d /llvm/lib/Transforms/Utils/AddDiscriminators.cpp | |
parent | 8d20cfdfc6c26533a87c525cb6e8dbc50a65e036 (diff) | |
download | bcm5719-llvm-b53eeb6f4c824fcdfcb93dd9325a603c005660a7.tar.gz bcm5719-llvm-b53eeb6f4c824fcdfcb93dd9325a603c005660a7.zip |
[llvm] API for encoding/decoding DWARF discriminators.
Summary:
Added a pair of APIs for encoding/decoding the 3 components of a DWARF discriminator described in http://lists.llvm.org/pipermail/llvm-dev/2016-October/106532.html: the base discriminator, the duplication factor (useful in profile-guided optimization) and the copy index (used to identify copies of code in cases like loop unrolling)
The encoding packs 3 unsigned values in 32 bits. This CL addresses 2 issues:
- communicates overflow back to the user
- supports encoding all 3 components together. Current APIs assume a sequencing of events. For example, creating a new discriminator based on an existing one by changing the base discriminator was not supported.
Reviewers: davidxl, danielcdh, wmi, dblaikie
Reviewed By: dblaikie
Subscribers: zzheng, dmgreen, aprantl, JDevlieghere, llvm-commits
Differential Revision: https://reviews.llvm.org/D55681
llvm-svn: 349973
Diffstat (limited to 'llvm/lib/Transforms/Utils/AddDiscriminators.cpp')
-rw-r--r-- | llvm/lib/Transforms/Utils/AddDiscriminators.cpp | 29 |
1 files changed, 23 insertions, 6 deletions
diff --git a/llvm/lib/Transforms/Utils/AddDiscriminators.cpp b/llvm/lib/Transforms/Utils/AddDiscriminators.cpp index e3ef4236222..1e0fd5588ca 100644 --- a/llvm/lib/Transforms/Utils/AddDiscriminators.cpp +++ b/llvm/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; } } @@ -239,8 +247,17 @@ static bool addDiscriminators(Function &F) { 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 { + Current->setDebugLoc(NewDIL.getValue()); + Changed = true; + } } } } |