[llvm] r321545 - Avoid modifying DbgInfo while looping in salvageDebuginfo

David Blaikie via llvm-commits llvm-commits at lists.llvm.org
Tue Jan 2 08:19:59 PST 2018


It'd still be good to have a test case for this - perhaps you could narrow
it down by putting a (temporary/not committed) assertion that would fire if
the container was modified within the loop? Then use that to more
deterministically reduce a test case.

On Thu, Dec 28, 2017 at 3:43 PM Dimitry Andric via llvm-commits <
llvm-commits at lists.llvm.org> wrote:

> Author: dim
> Date: Thu Dec 28 15:42:44 2017
> New Revision: 321545
>
> URL: http://llvm.org/viewvc/llvm-project?rev=321545&view=rev
> Log:
> Avoid modifying DbgInfo while looping in salvageDebuginfo
>
> Summary:
> I have been getting rather difficult to reproduce SIGBUS crashes when
> compiling certain FreeBSD sources, and their stack traces pointed
> squarely at `SelectionDAG::salvageDebugInfo()`:
>
> ```
> Core was generated by
> `/usr/obj/share/dim/src/freebsd/clang600-import/amd64.amd64/tmp/usr/bin/cc
> -cc1 -'.
> Program terminated with signal SIGBUS, Bus error.
> #0  isInvalidated () at
> /share/dim/src/freebsd/clang600-import/contrib/llvm/lib/CodeGen/SelectionDAG/SDNodeDbgValue.h:115
> 115       bool isInvalidated() const { return Invalid; }
> (gdb) bt
> #0  isInvalidated () at
> /share/dim/src/freebsd/clang600-import/contrib/llvm/lib/CodeGen/SelectionDAG/SDNodeDbgValue.h:115
> #1  salvageDebugInfo () at
> /share/dim/src/freebsd/clang600-import/contrib/llvm/lib/CodeGen/SelectionDAG/SelectionDAG.cpp:7116
> #2  0x00000000033b2516 in operator() () at
> /share/dim/src/freebsd/clang600-import/contrib/llvm/lib/CodeGen/SelectionDAG/SelectionDAGISel.cpp:3595
> #3  __invoke<(lambda at
> /share/dim/src/freebsd/clang600-import/contrib/llvm/lib/CodeGen/SelectionDAG/SelectionDAGISel.cpp:3593:59)
> &, llvm::SDNode *, llvm::SDNode *> () at
> /usr/include/c++/v1/type_traits:4323
> #4  __call<(lambda at
> /share/dim/src/freebsd/clang600-import/contrib/llvm/lib/CodeGen/SelectionDAG/SelectionDAGISel.cpp:3593:59)
> &, llvm::SDNode *, llvm::SDNode *> () at
> /usr/include/c++/v1/__functional_base:349
> #5  operator() () at /usr/include/c++/v1/functional:1562
> #6  0x00000000033b0817 in operator() () at
> /usr/include/c++/v1/functional:1916
> #7  NodeDeleted () at
> /share/dim/src/freebsd/clang600-import/contrib/llvm/include/llvm/CodeGen/SelectionDAG.h:293
> #8  0x0000000003529dde in RemoveDeadNodes () at
> /share/dim/src/freebsd/clang600-import/contrib/llvm/lib/CodeGen/SelectionDAG/SelectionDAG.cpp:610
> #9  0x00000000035556df in MorphNodeTo () at
> /share/dim/src/freebsd/clang600-import/contrib/llvm/lib/CodeGen/SelectionDAG/SelectionDAG.cpp:6794
> #10 0x00000000033a9acc in MorphNode () at
> /share/dim/src/freebsd/clang600-import/contrib/llvm/lib/CodeGen/SelectionDAG/SelectionDAGISel.cpp:2594
> #11 0x00000000033ac80b in SelectCodeCommon () at
> /share/dim/src/freebsd/clang600-import/contrib/llvm/lib/CodeGen/SelectionDAG/SelectionDAGISel.cpp:3601
> #12 0x00000000023d464b in SelectCode () at
> /usr/obj/share/dim/src/freebsd/clang600-import/amd64.amd64/tmp/obj-tools/lib/clang/libllvm/X86GenDAGISel.inc:282902
> #13 Select () at
> /share/dim/src/freebsd/clang600-import/contrib/llvm/lib/Target/X86/X86ISelDAGToDAG.cpp:3072
> #14 0x00000000033a5afa in DoInstructionSelection () at
> /share/dim/src/freebsd/clang600-import/contrib/llvm/lib/CodeGen/SelectionDAG/SelectionDAGISel.cpp:988
> #15 0x00000000033a4e1a in CodeGenAndEmitDAG () at
> /share/dim/src/freebsd/clang600-import/contrib/llvm/lib/CodeGen/SelectionDAG/SelectionDAGISel.cpp:868
> #16 0x00000000033a2643 in SelectAllBasicBlocks () at
> /share/dim/src/freebsd/clang600-import/contrib/llvm/lib/CodeGen/SelectionDAG/SelectionDAGISel.cpp:1624
> #17 0x000000000339f158 in runOnMachineFunction () at
> /share/dim/src/freebsd/clang600-import/contrib/llvm/lib/CodeGen/SelectionDAG/SelectionDAGISel.cpp:466
> #18 0x00000000023d03c4 in runOnMachineFunction () at
> /share/dim/src/freebsd/clang600-import/contrib/llvm/lib/Target/X86/X86ISelDAGToDAG.cpp:175
> #19 0x00000000035cc8c2 in runOnFunction () at
> /share/dim/src/freebsd/clang600-import/contrib/llvm/lib/CodeGen/MachineFunctionPass.cpp:62
> #20 0x00000000030dca9a in runOnFunction () at
> /share/dim/src/freebsd/clang600-import/contrib/llvm/lib/IR/LegacyPassManager.cpp:1520
> #21 0x00000000030dccf3 in runOnModule () at
> /share/dim/src/freebsd/clang600-import/contrib/llvm/lib/IR/LegacyPassManager.cpp:1541
> #22 0x00000000030dd228 in runOnModule () at
> /share/dim/src/freebsd/clang600-import/contrib/llvm/lib/IR/LegacyPassManager.cpp:1597
> #23 run () at
> /share/dim/src/freebsd/clang600-import/contrib/llvm/lib/IR/LegacyPassManager.cpp:1700
> #24 0x00000000014db578 in EmitAssembly () at
> /share/dim/src/freebsd/clang600-import/contrib/llvm/tools/clang/lib/CodeGen/BackendUtil.cpp:815
> #25 EmitBackendOutput () at
> /share/dim/src/freebsd/clang600-import/contrib/llvm/tools/clang/lib/CodeGen/BackendUtil.cpp:1181
> #26 0x00000000014d5b26 in HandleTranslationUnit () at
> /share/dim/src/freebsd/clang600-import/contrib/llvm/tools/clang/lib/CodeGen/CodeGenAction.cpp:292
> #27 0x0000000001c4c332 in ParseAST () at
> /share/dim/src/freebsd/clang600-import/contrib/llvm/tools/clang/lib/Parse/ParseAST.cpp:159
> #28 0x00000000015d546c in Execute () at
> /share/dim/src/freebsd/clang600-import/contrib/llvm/tools/clang/lib/Frontend/FrontendAction.cpp:897
> #29 0x0000000001cec311 in ExecuteAction () at
> /share/dim/src/freebsd/clang600-import/contrib/llvm/tools/clang/lib/Frontend/CompilerInstance.cpp:991
> #30 0x00000000014b4f81 in ExecuteCompilerInvocation () at
> /share/dim/src/freebsd/clang600-import/contrib/llvm/tools/clang/lib/FrontendTool/ExecuteCompilerInvocation.cpp:252
> #31 0x00000000014aa73f in cc1_main () at
> /share/dim/src/freebsd/clang600-import/contrib/llvm/tools/clang/tools/driver/cc1_main.cpp:221
> #32 0x00000000014b2928 in ExecuteCC1Tool () at
> /share/dim/src/freebsd/clang600-import/contrib/llvm/tools/clang/tools/driver/driver.cpp:309
> #33 main () at
> /share/dim/src/freebsd/clang600-import/contrib/llvm/tools/clang/tools/driver/driver.cpp:388
> (gdb) frame 1
> #1  salvageDebugInfo () at
> /share/dim/src/freebsd/clang600-import/contrib/llvm/lib/CodeGen/SelectionDAG/SelectionDAG.cpp:7116
> 7116        if (DV->isInvalidated())
> (gdb) disassemble
> Dump of assembler code for function salvageDebugInfo():
> [...]
>    0x0000000003557348 <+744>:   nopl   0x0(%rax,%rax,1)
>    0x0000000003557350 <+752>:   mov    (%r12),%r13
> => 0x0000000003557354 <+756>:   cmpb   $0x0,0x31(%r13)
>    0x0000000003557359 <+761>:   jne    0x35573b0 <salvageDebugInfo()+848>
> (gdb) info registers
> [...]
> r13            0x5a5a5a5a5a5a5a5a       6510615555426900570
> ```
>
> The `0x5a5a5a5a5a5a5a5a` value in `r13` indicates the memory was either
> uninitialized, or already freed.
>
> Unfortunately I do not have a simple self-contained test case for this.
> However, it seems pretty clear that the call to `AddDbgValue()` in
> `salvageDebugInfo()` causes the problems, since it modifies
> `SelectionDag::DbgInfo` while looping through one of its DenseMaps:
>
> ```
> void SelectionDAG::salvageDebugInfo(SDNode &N) {
> [...]
>   for (auto DV : GetDbgValues(&N)) {
>     if (DV->isInvalidated())
>       continue;
> [...]
>         AddDbgValue(Clone, N0.getNode(), false);
> [...]
>   }
> }
> ```
>
> At least, if I comment out the `AddDbgValue()` call, the crashes go
> away.  I propose to change this function slightly, similar to the
> `SelectionDAG::transferDbgValues()` function just above it, to save the
> cloned SDDbgValues in a separate SmallVector, and only call
> AddDbgValue() on them after the for loop is done.
>
> Reviewers: aprantl, bogner, bkramer, davide
>
> Reviewed By: davide
>
> Subscribers: davide, krytarowski, JDevlieghere, emaste, llvm-commits
>
> Differential Revision: https://reviews.llvm.org/D41589
>
> Modified:
>     llvm/trunk/lib/CodeGen/SelectionDAG/SelectionDAG.cpp
>
> Modified: llvm/trunk/lib/CodeGen/SelectionDAG/SelectionDAG.cpp
> URL:
> http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/CodeGen/SelectionDAG/SelectionDAG.cpp?rev=321545&r1=321544&r2=321545&view=diff
>
> ==============================================================================
> --- llvm/trunk/lib/CodeGen/SelectionDAG/SelectionDAG.cpp (original)
> +++ llvm/trunk/lib/CodeGen/SelectionDAG/SelectionDAG.cpp Thu Dec 28
> 15:42:44 2017
> @@ -7128,6 +7128,8 @@ void SelectionDAG::transferDbgValues(SDV
>  void SelectionDAG::salvageDebugInfo(SDNode &N) {
>    if (!N.getHasDebugValue())
>      return;
> +
> +  SmallVector<SDDbgValue *, 2> ClonedDVs;
>    for (auto DV : GetDbgValues(&N)) {
>      if (DV->isInvalidated())
>        continue;
> @@ -7151,13 +7153,16 @@ void SelectionDAG::salvageDebugInfo(SDNo
>          SDDbgValue *Clone =
>              getDbgValue(DV->getVariable(), DIExpr, N0.getNode(),
> N0.getResNo(),
>                          DV->isIndirect(), DV->getDebugLoc(),
> DV->getOrder());
> +        ClonedDVs.push_back(Clone);
>          DV->setIsInvalidated();
> -        AddDbgValue(Clone, N0.getNode(), false);
>          DEBUG(dbgs() << "SALVAGE: Rewriting";
> N0.getNode()->dumprFull(this);
>                dbgs() << " into " << *DIExpr << '\n');
>        }
>      }
>    }
> +
> +  for (SDDbgValue *Dbg : ClonedDVs)
> +    AddDbgValue(Dbg, Dbg->getSDNode(), false);
>  }
>
>  namespace {
>
>
> _______________________________________________
> 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/20180102/3e6f9dc7/attachment.html>


More information about the llvm-commits mailing list