[llvm] r301099 - Revert "Use DW_OP_stack_value when reconstructing variable values with arithmetic."

Yung, Douglas via llvm-commits llvm-commits at lists.llvm.org
Sat Apr 22 19:05:03 PDT 2017


Hi Adrian,

If it helps you to debug this issue, our internal opensource build bot hit a crash when building compiler-rt:

FAILED: cd /home/dyung/src/git/merge/build/projects/compiler-rt/lib/tsan/tests/rtl && /home/dyung/src/git/merge/build/./bin/clang -fPIC -fvisibility-inlines-hidden -std=c++11 -Wall -W -Wno-unused-parameter -Wwrite-strings -Wcast-qual -Wno-missing-field-initializers -pedantic -Wno-long-long -Wno-maybe-uninitialized -Wdelete-non-virtual-dtor -Wno-comment -ffunction-sections -fdata-sections -Wall -std=c++11 -Wno-unused-parameter -Wno-unknown-warning-option -fPIC -fno-builtin -fno-exceptions -fomit-frame-pointer -funwind-tables -fno-stack-protector -fvisibility=hidden -fvisibility-inlines-hidden -fno-lto -O3 -g -Wno-variadic-macros -Wno-non-virtual-dtor -fPIE -fno-rtti -DGTEST_NO_LLVM_RAW_OSTREAM=1 -DGTEST_HAS_RTTI=0 -I/home/dyung/src/git/merge/llvm/utils/unittest/googletest/include -I/home/dyung/src/git/merge/llvm/utils/unittest/googletest -I/home/dyung/src/git/merge/llvm/projects/compiler-rt/lib -I/home/dyung/src/git/merge/llvm/projects/compiler-rt/lib/tsan/rtl -DGTEST_HAS_RTTI=0 -m64 -c -o tsan_mop.cc.x86_64.o /home/dyung/src/git/merge/llvm/projects/compiler-rt/lib/tsan/tests/rtl/tsan_mop.cc
clang-5.0: /home/dyung/src/git/merge/llvm/lib/CodeGen/AsmPrinter/DwarfExpression.cpp:346: void llvm::DwarfExpression::addExpression(llvm::DIExpressionCursor&&, unsigned int): Assertion `LocationKind == Unknown || LocationKind == Implicit' failed.
#0 0x0000000001fa8a6a llvm::sys::PrintStackTrace(llvm::raw_ostream&) (/home/dyung/src/git/merge/build/bin/clang-5.0+0x1fa8a6a)
#1 0x0000000001fa6a7e llvm::sys::RunSignalHandlers() (/home/dyung/src/git/merge/build/bin/clang-5.0+0x1fa6a7e)
#2 0x0000000001fa6be2 SignalHandler(int) (/home/dyung/src/git/merge/build/bin/clang-5.0+0x1fa6be2)
#3 0x00007fac10c19330 __restore_rt (/lib/x86_64-linux-gnu/libpthread.so.0+0x10330)
#4 0x00007fac0fe53c37 gsignal (/lib/x86_64-linux-gnu/libc.so.6+0x36c37)
#5 0x00007fac0fe57028 abort (/lib/x86_64-linux-gnu/libc.so.6+0x3a028)
#6 0x00007fac0fe4cbf6 (/lib/x86_64-linux-gnu/libc.so.6+0x2fbf6)
#7 0x00007fac0fe4cca2 (/lib/x86_64-linux-gnu/libc.so.6+0x2fca2)
#8 0x00000000025854f9 llvm::DwarfExpression::addExpression(llvm::DIExpressionCursor&&, unsigned int) (/home/dyung/src/git/merge/build/bin/clang-5.0+0x25854f9)
#9 0x0000000002570c8d emitDebugLocValue(llvm::AsmPrinter const&, llvm::DIBasicType const*, llvm::ByteStreamer&, llvm::DebugLocEntry::Value const&, llvm::DwarfExpression&) [clone .isra.697] (/home/dyung/src/git/merge/build/bin/clang-5.0+0x2570c8d)
#10 0x0000000002578dc8 llvm::DebugLocEntry::finalize(llvm::AsmPrinter const&, llvm::DebugLocStream::ListBuilder&, llvm::DIBasicType const*) (/home/dyung/src/git/merge/build/bin/clang-5.0+0x2578dc8)
#11 0x000000000257f4ae llvm::DwarfDebug::collectVariableInfo(llvm::DwarfCompileUnit&, llvm::DISubprogram const*, llvm::DenseSet<std::pair<llvm::DILocalVariable const*, llvm::DILocation const*>, llvm::DenseMapInfo<std::pair<llvm::DILocalVariable const*, llvm::DILocation const*> > >&) (/home/dyung/src/git/merge/build/bin/clang-5.0+0x257f4ae)
#12 0x000000000257f9ac llvm::DwarfDebug::endFunctionImpl(llvm::MachineFunction const*) (/home/dyung/src/git/merge/build/bin/clang-5.0+0x257f9ac)
#13 0x00000000025b31e8 llvm::DebugHandlerBase::endFunction(llvm::MachineFunction const*) (/home/dyung/src/git/merge/build/bin/clang-5.0+0x25b31e8)
#14 0x0000000002561640 llvm::AsmPrinter::EmitFunctionBody() (/home/dyung/src/git/merge/build/bin/clang-5.0+0x2561640)
#15 0x0000000001466070 llvm::X86AsmPrinter::runOnMachineFunction(llvm::MachineFunction&) (/home/dyung/src/git/merge/build/bin/clang-5.0+0x1466070)
#16 0x00000000018b8e55 llvm::MachineFunctionPass::runOnFunction(llvm::Function&) (/home/dyung/src/git/merge/build/bin/clang-5.0+0x18b8e55)
#17 0x0000000001b88213 llvm::FPPassManager::runOnFunction(llvm::Function&) (/home/dyung/src/git/merge/build/bin/clang-5.0+0x1b88213)
#18 0x0000000001b882bc llvm::FPPassManager::runOnModule(llvm::Module&) (/home/dyung/src/git/merge/build/bin/clang-5.0+0x1b882bc)
#19 0x0000000001b8901f llvm::legacy::PassManagerImpl::run(llvm::Module&) (/home/dyung/src/git/merge/build/bin/clang-5.0+0x1b8901f)
#20 0x000000000212b316 (anonymous namespace)::EmitAssemblyHelper::EmitAssembly(clang::BackendAction, std::unique_ptr<llvm::raw_pwrite_stream, std::default_delete<llvm::raw_pwrite_stream> >) (/home/dyung/src/git/merge/build/bin/clang-5.0+0x212b316)
#21 0x000000000212c691 clang::EmitBackendOutput(clang::DiagnosticsEngine&, clang::HeaderSearchOptions const&, clang::CodeGenOptions const&, clang::TargetOptions const&, clang::LangOptions const&, llvm::DataLayout const&, llvm::Module*, clang::BackendAction, std::unique_ptr<llvm::raw_pwrite_stream, std::default_delete<llvm::raw_pwrite_stream> >) (/home/dyung/src/git/merge/build/bin/clang-5.0+0x212c691)
#22 0x00000000027c5d4b clang::BackendConsumer::HandleTranslationUnit(clang::ASTContext&) (/home/dyung/src/git/merge/build/bin/clang-5.0+0x27c5d4b)
#23 0x0000000002baa072 clang::ParseAST(clang::Sema&, bool, bool) (/home/dyung/src/git/merge/build/bin/clang-5.0+0x2baa072)
#24 0x00000000027c542a clang::CodeGenAction::ExecuteAction() (/home/dyung/src/git/merge/build/bin/clang-5.0+0x27c542a)
#25 0x000000000249f966 clang::FrontendAction::Execute() (/home/dyung/src/git/merge/build/bin/clang-5.0+0x249f966)
#26 0x000000000247a146 clang::CompilerInstance::ExecuteAction(clang::FrontendAction&) (/home/dyung/src/git/merge/build/bin/clang-5.0+0x247a146)
#27 0x000000000252a534 clang::ExecuteCompilerInvocation(clang::CompilerInstance*) (/home/dyung/src/git/merge/build/bin/clang-5.0+0x252a534)
#28 0x0000000000b906c8 cc1_main(llvm::ArrayRef<char const*>, char const*, void*) (/home/dyung/src/git/merge/build/bin/clang-5.0+0xb906c8)
#29 0x0000000000b30aa3 main (/home/dyung/src/git/merge/build/bin/clang-5.0+0xb30aa3)
#30 0x00007fac0fe3ef45 __libc_start_main (/lib/x86_64-linux-gnu/libc.so.6+0x21f45)
#31 0x0000000000b8bfa9 _start (/home/dyung/src/git/merge/build/bin/clang-5.0+0xb8bfa9)
Stack dump:
0.	Program arguments: /home/dyung/src/git/merge/build/bin/clang-5.0 -cc1 -triple x86_64-unknown-linux-gnu -emit-obj -disable-free -main-file-name tsan_mop.cc -mrelocation-model pic -pic-level 2 -pic-is-pie -mthread-model posix -fmath-errno -masm-verbose -mconstructor-aliases -munwind-tables -fuse-init-array -target-cpu x86-64 -momit-leaf-frame-pointer -dwarf-column-info -debug-info-kind=limited -dwarf-version=4 -debugger-tuning=gdb -ffunction-sections -fdata-sections -coverage-notes-file /home/dyung/src/git/merge/build/projects/compiler-rt/lib/tsan/tests/rtl/tsan_mop.cc.x86_64.gcno -resource-dir /home/dyung/src/git/merge/build/lib/clang/5.0.0 -D GTEST_NO_LLVM_RAW_OSTREAM=1 -D GTEST_HAS_RTTI=0 -I /home/dyung/src/git/merge/llvm/utils/unittest/googletest/include -I /home/dyung/src/git/merge/llvm/utils/unittest/googletest -I /home/dyung/src/git/merge/llvm/projects/compiler-rt/lib -I /home/dyung/src/git/merge/llvm/projects/compiler-rt/lib/tsan/rtl -D GTEST_HAS_RTTI=0 -internal-isystem /usr/lib/gcc/x86_64-linux-gnu/4.8/../../../../include/c++/4.8 -internal-isystem /usr/lib/gcc/x86_64-linux-gnu/4.8/../../../../include/x86_64-linux-gnu/c++/4.8 -internal-isystem /usr/lib/gcc/x86_64-linux-gnu/4.8/../../../../include/x86_64-linux-gnu/c++/4.8 -internal-isystem /usr/lib/gcc/x86_64-linux-gnu/4.8/../../../../include/c++/4.8/backward -internal-isystem /usr/local/include -internal-isystem /home/dyung/src/git/merge/build/lib/clang/5.0.0/include -internal-externc-isystem /usr/include/x86_64-linux-gnu -internal-externc-isystem /include -internal-externc-isystem /usr/include -O3 -Wall -W -Wno-unused-parameter -Wwrite-strings -Wcast-qual -Wno-missing-field-initializers -Wno-long-long -Wno-maybe-uninitialized -Wdelete-non-virtual-dtor -Wno-comment -Wall -Wno-unused-parameter -Wno-unknown-warning-option -Wno-variadic-macros -Wno-non-virtual-dtor -pedantic -std=c++11 -fdeprecated-macro -fdebug-compilation-dir /home/dyung/src/git/merge/build/projects/compiler-rt/lib/tsan/tests/rtl -ferror-limit 19 -fmessage-length 0 -fvisibility hidden -fvisibility-inlines-hidden -fno-builtin -fno-rtti -fobjc-runtime=gcc -fdiagnostics-show-option -vectorize-loops -vectorize-slp -o tsan_mop.cc.x86_64.o -x c++ /home/dyung/src/git/merge/llvm/projects/compiler-rt/lib/tsan/tests/rtl/tsan_mop.cc 
1.	<eof> parser at end of file
2.	Code generation
3.	Running pass 'Function Pass Manager' on module '/home/dyung/src/git/merge/llvm/projects/compiler-rt/lib/tsan/tests/rtl/tsan_mop.cc'.
4.	Running pass 'X86 Assembly Printer' on function '@_ZN37ThreadSanitizer_BenignRaceOnVptr_Test8TestBodyEv'
clang-5.0: error: unable to execute command: Aborted (core dumped)
clang-5.0: error: clang frontend command failed due to signal (use -v to see invocation)
clang version 5.0.0 
Target: x86_64-unknown-linux-gnu
Thread model: posix
InstalledDir: /home/dyung/src/git/merge/build/./bin

> -----Original Message-----
> From: llvm-commits [mailto:llvm-commits-bounces at lists.llvm.org] On Behalf Of
> Adrian Prantl via llvm-commits
> Sent: Saturday, April 22, 2017 17:45
> To: llvm-commits at lists.llvm.org
> Subject: [llvm] r301099 - Revert "Use DW_OP_stack_value when reconstructing
> variable values with arithmetic."
> 
> Author: adrian
> Date: Sat Apr 22 19:44:40 2017
> New Revision: 301099
> 
> URL: http://llvm.org/viewvc/llvm-project?rev=301099&view=rev
> Log:
> Revert "Use DW_OP_stack_value when reconstructing variable values with
> arithmetic."
> 
> This reverts commit r301093 while investigating stage2 bot breakage.
> 
> Modified:
>     llvm/trunk/lib/Transforms/Utils/Local.cpp
>     llvm/trunk/test/Transforms/InstCombine/debuginfo-dce.ll
> 
> Modified: llvm/trunk/lib/Transforms/Utils/Local.cpp
> URL: http://llvm.org/viewvc/llvm-
> project/llvm/trunk/lib/Transforms/Utils/Local.cpp?rev=301099&r1=301098&r2=3010
> 99&view=diff
> ==============================================================================
> --- llvm/trunk/lib/Transforms/Utils/Local.cpp (original)
> +++ llvm/trunk/lib/Transforms/Utils/Local.cpp Sat Apr 22 19:44:40 2017
> @@ -1268,37 +1268,21 @@ static void appendOffset(SmallVectorImpl
>    }
>  }
> 
> -enum { WithStackValue = true };
> -
> -/// Prepend \p DIExpr with a deref and offset operation and optionally turn
> it -/// into a stack value.
> +/// Prepend \p DIExpr with a deref and offset operation.
>  static DIExpression *prependDIExpr(DIBuilder &Builder, DIExpression *DIExpr,
> -                                   bool Deref, int64_t Offset = 0,
> -                                   bool StackValue = false) {
> -  if (!Deref && !Offset && !StackValue)
> +                                   bool Deref, int64_t Offset) {  if
> + (!Deref && !Offset)
>      return DIExpr;
> -
> -  SmallVector<uint64_t, 8> Ops;
> -  appendOffset(Ops, Offset);
> +  // Create a copy of the original DIDescriptor for user variable,
> + prepending  // "deref" operation to a list of address elements, as new
> + llvm.dbg.declare  // will take a value storing address of the memory
> + for variable, not  // alloca itself.
> +  SmallVector<uint64_t, 4> Ops;
>    if (Deref)
>      Ops.push_back(dwarf::DW_OP_deref);
> +  appendOffset(Ops, Offset);
>    if (DIExpr)
> -    for (auto Op : DIExpr->expr_ops()) {
> -      // A DW_OP_stack_value comes at the end, but before a
> DW_OP_LLVM_fragment.
> -      if (StackValue) {
> -        if (Op.getOp() == dwarf::DW_OP_stack_value)
> -          StackValue = false;
> -        else if (Op.getOp() == dwarf::DW_OP_LLVM_fragment) {
> -          Ops.push_back(dwarf::DW_OP_stack_value);
> -          StackValue = false;
> -        }
> -      }
> -      Ops.push_back(Op.getOp());
> -      for (unsigned I = 0; I < Op.getNumArgs(); ++I)
> -        Ops.push_back(Op.getArg(I));
> -    }
> -  if (StackValue)
> -    Ops.push_back(dwarf::DW_OP_stack_value);
> +    Ops.append(DIExpr->elements_begin(), DIExpr->elements_end());
>    return Builder.createExpression(Ops);  }
> 
> @@ -1390,15 +1374,12 @@ void llvm::salvageDebugInfo(Instruction
>        unsigned BitWidth =
>            M.getDataLayout().getPointerSizeInBits(GEP-
> >getPointerAddressSpace());
>        APInt Offset(BitWidth, 0);
> -      // Rewrite a constant GEP 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.
> +      // Rewrite a constant GEP into a DIExpression.
>        if (GEP->accumulateConstantOffset(M.getDataLayout(), Offset)) {
>          auto *DIExpr = DVI->getExpression();
>          DIBuilder DIB(M, /*AllowUnresolved*/ false);
>          // GEP offsets are i32 and thus always fit into an int64_t.
> -        DIExpr = prependDIExpr(DIB, DIExpr, NoDeref, Offset.getSExtValue(),
> -                               WithStackValue);
> +        DIExpr = prependDIExpr(DIB, DIExpr, NoDeref,
> + Offset.getSExtValue());
>          DVI->setOperand(0, MDWrap(I.getOperand(0)));
>          DVI->setOperand(3, MetadataAsValue::get(I.getContext(), DIExpr));
>          DEBUG(dbgs() << "SALVAGE: " << *DVI << '\n'); @@ -1410,7 +1391,7 @@
> void llvm::salvageDebugInfo(Instruction
>        // Rewrite the load into DW_OP_deref.
>        auto *DIExpr = DVI->getExpression();
>        DIBuilder DIB(M, /*AllowUnresolved*/ false);
> -      DIExpr = prependDIExpr(DIB, DIExpr, WithDeref);
> +      DIExpr = prependDIExpr(DIB, DIExpr, WithDeref, 0);
>        DVI->setOperand(0, MDWrap(I.getOperand(0)));
>        DVI->setOperand(3, MetadataAsValue::get(I.getContext(), DIExpr));
>        DEBUG(dbgs() << "SALVAGE:  " << *DVI << '\n');
> 
> Modified: llvm/trunk/test/Transforms/InstCombine/debuginfo-dce.ll
> URL: http://llvm.org/viewvc/llvm-
> project/llvm/trunk/test/Transforms/InstCombine/debuginfo-
> dce.ll?rev=301099&r1=301098&r2=301099&view=diff
> ==============================================================================
> --- llvm/trunk/test/Transforms/InstCombine/debuginfo-dce.ll (original)
> +++ llvm/trunk/test/Transforms/InstCombine/debuginfo-dce.ll Sat Apr 22
> +++ 19:44:40 2017
> @@ -23,6 +23,7 @@ target triple = "x86_64-apple-macosx10.1
> 
>  %struct.entry = type { %struct.entry* }
> 
> +; Function Attrs: nounwind ssp uwtable
>  define void @salvage_load(%struct.entry** %queue) local_unnamed_addr #0 !dbg
> !14 {
>  entry:
>    %im_not_dead = alloca %struct.entry*
> @@ -37,6 +38,7 @@ entry:
>    ret void, !dbg !21
>  }
> 
> +; Function Attrs: nounwind ssp uwtable
>  define void @salvage_bitcast(%struct.entry* %queue) local_unnamed_addr #0
> !dbg !14 {
>  entry:
>    %im_not_dead = alloca i8*
> @@ -51,54 +53,24 @@ entry:
>    ret void, !dbg !21
>  }
> 
> -define void @salvage_gep0(%struct.entry* %queue, %struct.entry* %end)
> local_unnamed_addr #0 !dbg !14 {
> +; Function Attrs: nounwind ssp uwtable
> +define void @salvage_gep(%struct.entry* %queue, %struct.entry* %end)
> +local_unnamed_addr #0 !dbg !14 {
>  entry:
>    %im_not_dead = alloca %struct.entry**
>    %0 = getelementptr inbounds %struct.entry, %struct.entry* %queue, i32 -1,
> i32 0, !dbg !19
>    %1 = getelementptr inbounds %struct.entry, %struct.entry* %queue, i32 -1,
> i32 0, !dbg !19
>    call void @llvm.dbg.value(metadata %struct.entry** %1, i64 0, metadata !18,
> metadata !20), !dbg !19 -; CHECK: define void @salvage_gep0
> +; CHECK: define void @salvage_gep
>  ; CHECK-NEXT: entry:
>  ; CHECK-NEXT: call void @llvm.dbg.value(metadata %struct.entry* %queue, i64
> 0,
> -; CHECK-SAME:                           metadata ![[GEP0_EXPR:[0-9]+]])
> -  store %struct.entry** %1, %struct.entry*** %im_not_dead, align 8
> -  ret void, !dbg !21
> -}
> -
> -define void @salvage_gep1(%struct.entry* %queue, %struct.entry* %end)
> local_unnamed_addr #0 !dbg !14 {
> -entry:
> -  %im_not_dead = alloca %struct.entry**
> -  %0 = getelementptr inbounds %struct.entry, %struct.entry* %queue, i32 -1,
> i32 0, !dbg !19
> -  %1 = getelementptr inbounds %struct.entry, %struct.entry* %queue, i32 -1,
> i32 0, !dbg !19
> -  call void @llvm.dbg.value(metadata %struct.entry** %1, i64 0, metadata !18,
> metadata !DIExpression(DW_OP_LLVM_fragment, 0, 32)), !dbg !19 -; CHECK: define
> void @salvage_gep1 -; CHECK-NEXT: entry:
> -; CHECK-NEXT: call void @llvm.dbg.value(metadata %struct.entry* %queue, i64
> 0,
> -; CHECK-SAME:                           metadata ![[GEP1_EXPR:[0-9]+]])
> -  store %struct.entry** %1, %struct.entry*** %im_not_dead, align 8
> -  ret void, !dbg !21
> -}
> -
> -define void @salvage_gep2(%struct.entry* %queue, %struct.entry* %end)
> local_unnamed_addr #0 !dbg !14 {
> -entry:
> -  %im_not_dead = alloca %struct.entry**
> -  %0 = getelementptr inbounds %struct.entry, %struct.entry* %queue, i32 -1,
> i32 0, !dbg !19
> -  %1 = getelementptr inbounds %struct.entry, %struct.entry* %queue, i32 -1,
> i32 0, !dbg !19
> -  call void @llvm.dbg.value(metadata %struct.entry** %1, i64 0, metadata !18,
> metadata !DIExpression(DW_OP_stack_value)), !dbg !19 -; CHECK: define void
> @salvage_gep2 -; CHECK-NEXT: entry:
> -; CHECK-NEXT: call void @llvm.dbg.value(metadata %struct.entry* %queue, i64
> 0,
> -; CHECK-SAME:                           metadata ![[GEP2_EXPR:[0-9]+]])
> +; CHECK-SAME:                           metadata ![[GEP_EXPR:[0-9]+]])
>    store %struct.entry** %1, %struct.entry*** %im_not_dead, align 8
>    ret void, !dbg !21
>  }
> 
>  ; CHECK: ![[LOAD_EXPR]] = !DIExpression(DW_OP_deref, DW_OP_plus, 0)  ; CHECK:
> ![[BITCAST_EXPR]] = !DIExpression(DW_OP_plus, 0) -; CHECK: ![[GEP0_EXPR]] =
> !DIExpression(DW_OP_minus, 8, DW_OP_plus, 0, DW_OP_stack_value) -; CHECK:
> ![[GEP1_EXPR]] = !DIExpression(DW_OP_minus, 8, DW_OP_stack_value,
> -; CHECK-SAME:                           DW_OP_LLVM_fragment, 0, 32)
> -; CHECK: ![[GEP2_EXPR]] = !DIExpression(DW_OP_minus, 8, DW_OP_stack_value)
> +; CHECK: ![[GEP_EXPR]] = !DIExpression(DW_OP_minus, 8, DW_OP_plus, 0)
> 
>  ; Function Attrs: nounwind readnone
>  declare void @llvm.dbg.value(metadata, i64, metadata, metadata) #1
> 
> 
> _______________________________________________
> llvm-commits mailing list
> llvm-commits at lists.llvm.org
> http://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-commits


More information about the llvm-commits mailing list