[llvm] r260571 - [codeview] Fix bug around multi-level wrapper inlining
David Blaikie via llvm-commits
llvm-commits at lists.llvm.org
Thu Feb 11 13:34:44 PST 2016
Ah, I see, was added in 260573
On Thu, Feb 11, 2016 at 1:34 PM, David Blaikie <dblaikie at gmail.com> wrote:
>
>
> On Thu, Feb 11, 2016 at 11:41 AM, Reid Kleckner via llvm-commits <
> llvm-commits at lists.llvm.org> wrote:
>
>> Author: rnk
>> Date: Thu Feb 11 13:41:47 2016
>> New Revision: 260571
>>
>> URL: http://llvm.org/viewvc/llvm-project?rev=260571&view=rev
>> Log:
>> [codeview] Fix bug around multi-level wrapper inlining
>>
>> If there were wrapper functions with no instructions of their own in the
>> inlining tree, we would fail to emit InlineSite records for them.
>>
>
> Test case?
>
>
>>
>> Modified:
>> llvm/trunk/lib/CodeGen/AsmPrinter/CodeViewDebug.cpp
>>
>> Modified: llvm/trunk/lib/CodeGen/AsmPrinter/CodeViewDebug.cpp
>> URL:
>> http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/CodeGen/AsmPrinter/CodeViewDebug.cpp?rev=260571&r1=260570&r2=260571&view=diff
>>
>> ==============================================================================
>> --- llvm/trunk/lib/CodeGen/AsmPrinter/CodeViewDebug.cpp (original)
>> +++ llvm/trunk/lib/CodeGen/AsmPrinter/CodeViewDebug.cpp Thu Feb 11
>> 13:41:47 2016
>> @@ -117,6 +117,13 @@ CodeViewDebug::InlineSite &CodeViewDebug
>> return *Site;
>> }
>>
>> +static void addLocIfNotPresent(SmallVectorImpl<const DILocation *> &Locs,
>> + const DILocation *Loc) {
>> + auto B = Locs.begin(), E = Locs.end();
>> + if (std::find(B, E, Loc) == E)
>> + Locs.push_back(Loc);
>> +}
>> +
>> void CodeViewDebug::maybeRecordLocation(DebugLoc DL,
>> const MachineFunction *MF) {
>> // Skip this instruction if it has the same location as the previous
>> one.
>> @@ -147,24 +154,24 @@ void CodeViewDebug::maybeRecordLocation(
>> CurFn->LastLoc = DL;
>>
>> unsigned FuncId = CurFn->FuncId;
>> - if (const DILocation *Loc = DL->getInlinedAt()) {
>> + if (DL->getInlinedAt()) {
>> + const DILocation *Loc = DL.get();
>> +
>> // If this location was actually inlined from somewhere else, give
>> it the ID
>> // of the inline call site.
>> - FuncId = getInlineSite(DL.get()).SiteFuncId;
>> - CurFn->ChildSites.push_back(Loc);
>> + FuncId = getInlineSite(Loc).SiteFuncId;
>> +
>> // Ensure we have links in the tree of inline call sites.
>> - const DILocation *ChildLoc = nullptr;
>> - while (Loc->getInlinedAt()) {
>> + const DILocation *SiteLoc;
>> + bool FirstLoc = true;
>> + while ((SiteLoc = Loc->getInlinedAt())) {
>> InlineSite &Site = getInlineSite(Loc);
>> - if (ChildLoc) {
>> - // Record the child inline site if not already present.
>> - auto B = Site.ChildSites.begin(), E = Site.ChildSites.end();
>> - if (std::find(B, E, Loc) != E)
>> - break;
>> - Site.ChildSites.push_back(Loc);
>> - }
>> - ChildLoc = Loc;
>> + if (!FirstLoc)
>> + addLocIfNotPresent(Site.ChildSites, Loc);
>> + FirstLoc = false;
>> + Loc = SiteLoc;
>> }
>> + addLocIfNotPresent(CurFn->ChildSites, Loc);
>> }
>>
>> OS.EmitCVLocDirective(FuncId, FileId, DL.getLine(), DL.getCol(),
>>
>>
>> _______________________________________________
>> llvm-commits mailing list
>> llvm-commits at lists.llvm.org
>> http://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-commits
>>
>
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.llvm.org/pipermail/llvm-commits/attachments/20160211/d6291217/attachment.html>
More information about the llvm-commits
mailing list