[llvm] r316525 - Implement salavageDebugInfo functionality for SelectionDAG.

Dimitry Andric via llvm-commits llvm-commits at lists.llvm.org
Tue Dec 26 14:39:37 PST 2017


On 25 Oct 2017, at 00:55, Adrian Prantl via llvm-commits <llvm-commits at lists.llvm.org> wrote:
> 
> Author: adrian
> Date: Tue Oct 24 15:55:12 2017
> New Revision: 316525
> 
> URL: http://llvm.org/viewvc/llvm-project?rev=316525&view=rev
> Log:
> Implement salavageDebugInfo functionality for SelectionDAG.
...
> --- llvm/trunk/lib/CodeGen/SelectionDAG/SelectionDAG.cpp (original)
> +++ llvm/trunk/lib/CodeGen/SelectionDAG/SelectionDAG.cpp Tue Oct 24 15:55:12 2017
> @@ -6978,6 +6978,40 @@ SDDbgValue *SelectionDAG::getFrameIndexD
>   return new (DbgInfo->getAlloc()) SDDbgValue(Var, Expr, FI, DL, O);
> }
> 
> +void SelectionDAG::salvageDebugInfo(SDNode &N) {
> +  if (!N.getHasDebugValue())
> +    return;
> +  for (auto DV : GetDbgValues(&N)) {
> +    if (DV->isInvalidated())
> +      continue;
> +    switch (N.getOpcode()) {
> +    default:
> +      break;
> +    case ISD::ADD:
> +      SDValue N0 = N.getOperand(0);
> +      SDValue N1 = N.getOperand(1);
> +      if (!isConstantIntBuildVectorOrConstantInt(N0) &&
> +          isConstantIntBuildVectorOrConstantInt(N1)) {
> +        uint64_t Offset = N.getConstantOperandVal(1);
> +        // Rewrite an ADD constant node into a DIExpression. Since we are
> +        // performing arithmetic to compute the variable's *value* in the
> +        // DIExpression, we need to mark the expression with a
> +        // DW_OP_stack_value.
> +        auto *DIExpr = DV->getExpression();
> +        DIExpr = DIExpression::prepend(DIExpr, DIExpression::NoDeref, Offset,
> +                                       DIExpression::WithStackValue);
> +        SDDbgValue *Clone =
> +            getDbgValue(DV->getVariable(), DIExpr, N0.getNode(), N0.getResNo(),
> +                        DV->isIndirect(), DV->getDebugLoc(), DV->getOrder());
> +        DV->setIsInvalidated();
> +        AddDbgValue(Clone, N0.getNode(), false);
> +        DEBUG(dbgs() << "SALVAGE: Rewriting"; N0.getNode()->dumprFull(this);
> +              dbgs() << " into " << *DIExpr << '\n');
> +      }
> +    }
> +  }
> +}

Hi Adrian,

I'm getting sporadic and difficult to reproduce SIGBUS errors in this routine, looking like:

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

What seems to be happening is that the DbgInfo DenseMap gets modified (by the AddDbgValue(Clone, N0.getNode(), false) call), while we are still looping through it via the for (auto DV : GetDbgValues(&N)) loop.

I have not yet been able to find a clear answer as to whether it is allowed to modify a DenseMap while looping through it, but my gut feeling says it is a bad idea.  The transferDbgValues() function just above salvageDebugInfo() first loops through GetDbgValues(), then only adds new values after the loop.

-Dimitry

-------------- next part --------------
A non-text attachment was scrubbed...
Name: signature.asc
Type: application/pgp-signature
Size: 223 bytes
Desc: Message signed with OpenPGP
URL: <http://lists.llvm.org/pipermail/llvm-commits/attachments/20171226/59fa7366/attachment.sig>


More information about the llvm-commits mailing list