[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:14 PST 2016


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/9fecef54/attachment.html>


More information about the llvm-commits mailing list