[llvm] r316525 - Implement salavageDebugInfo functionality for SelectionDAG.

Davide Italiano via llvm-commits llvm-commits at lists.llvm.org
Tue Jan 2 08:38:14 PST 2018


For the archives, this was fixed by r321545.

On Tue, Jan 2, 2018 at 5:33 PM, Adrian Prantl via llvm-commits
<llvm-commits at lists.llvm.org> wrote:
> Thanks for reporting this, that explanation sounds plausible. I'll take a look.
>
> -- adrian
>
>> On Dec 26, 2017, at 2:39 PM, Dimitry Andric <dimitry at andric.com> wrote:
>>
>> 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
>>
>
> _______________________________________________
> llvm-commits mailing list
> llvm-commits at lists.llvm.org
> http://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-commits



-- 
Davide

"There are no solved problems; there are only problems that are more
or less solved" -- Henri Poincare


More information about the llvm-commits mailing list