[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