[llvm] r316525 - Implement salavageDebugInfo functionality for SelectionDAG.

Adrian Prantl via llvm-commits llvm-commits at lists.llvm.org
Tue Jan 2 08:33:06 PST 2018


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
> 



More information about the llvm-commits mailing list