Index: lib/CodeGen/AsmPrinter/DwarfDebug.cpp =================================================================== --- lib/CodeGen/AsmPrinter/DwarfDebug.cpp +++ lib/CodeGen/AsmPrinter/DwarfDebug.cpp @@ -1718,9 +1718,11 @@ BTy.getEncoding() == dwarf::DW_ATE_signed_char)) { Streamer.EmitInt8(dwarf::DW_OP_consts, "DW_OP_consts"); Streamer.EmitSLEB128(Value.getInt()); + Streamer.EmitInt8(dwarf::DW_OP_stack_value, "DW_OP_stack_value"); } else { Streamer.EmitInt8(dwarf::DW_OP_constu, "DW_OP_constu"); Streamer.EmitULEB128(Value.getInt()); + Streamer.EmitInt8(dwarf::DW_OP_stack_value, "DW_OP_stack_value"); } } else if (Value.isLocation()) { MachineLocation Loc = Value.getLoc(); Index: test/DebugInfo/incorrect-variable-debugloc1.ll =================================================================== --- test/DebugInfo/incorrect-variable-debugloc1.ll +++ test/DebugInfo/incorrect-variable-debugloc1.ll @@ -0,0 +1,98 @@ +; REQUIRES: object-emission + +; RUN: %llc_dwarf -O2 -filetype=obj < %s | llvm-dwarfdump - | FileCheck %s + +; This is a test for BZ #21176. +; DW_OP_const is not a valid DWARF location. +; The proper way to describe a case where a value is constant +; in a specific address range is DW_OP_constu , DW_OP_stack_value. + +; Generated with clang -S -emit-llvm -g -O2 test.cpp + +; extern int func(int a); +; +; int main() +; { +; int c = 13; +; +; for (int a = 0; a < 100; ++a) +; c += func(a); +; +; return c; +;} + +; CHECK: Location description: 11 0d 9f +; CHECK: Location description: 11 00 9f + + +%struct.C = type { i32, %struct.B } +%struct.B = type { i32 } +%struct.A = type { i8 } + + +; Function Attrs: uwtable +define i32 @main() #0 { +entry: + tail call void @llvm.dbg.value(metadata !16, i64 0, metadata !10, metadata !17), !dbg !18 + tail call void @llvm.dbg.value(metadata !19, i64 0, metadata !11, metadata !17), !dbg !20 + br label %for.body, !dbg !21 + +for.body: ; preds = %for.body, %entry + %a.05 = phi i32 [ 0, %entry ], [ %inc, %for.body ] + %c.04 = phi i32 [ 13, %entry ], [ %add, %for.body ] + %call = tail call i32 @_Z4funci(i32 %a.05), !dbg !24 + %add = add nsw i32 %call, %c.04, !dbg !24 + tail call void @llvm.dbg.value(metadata !{i32 %add.lcssa}, i64 0, metadata !10, metadata !17), !dbg !18 + %inc = add nsw i32 %a.05, 1, !dbg !26 + tail call void @llvm.dbg.value(metadata !{i32 %inc}, i64 0, metadata !11, metadata !17), !dbg !20 + %exitcond = icmp eq i32 %inc, 100, !dbg !21 + br i1 %exitcond, label %for.end, label %for.body, !dbg !21 + +for.end: ; preds = %for.body + %add.lcssa = phi i32 [ %add, %for.body ] + ret i32 %add.lcssa, !dbg !27 +} + +declare i32 @_Z4funci(i32) #1 + +; Function Attrs: nounwind readnone +declare void @llvm.dbg.value(metadata, i64, metadata, metadata) #2 + +attributes #0 = { uwtable "less-precise-fpmad"="false" "no-frame-pointer-elim"="false" "no-infs-fp-math"="false" "no-nans-fp-math"="false" "stack-protector-buffer-size"="8" "unsafe-fp-math"="false" "use-soft-float"="false" } +attributes #1 = { "less-precise-fpmad"="false" "no-frame-pointer-elim"="false" "no-infs-fp-math"="false" "no-nans-fp-math"="false" "stack-protector-buffer-size"="8" "unsafe-fp-math"="false" "use-soft-float"="false" } +attributes #2 = { nounwind readnone } + +!llvm.dbg.cu = !{!0} +!llvm.module.flags = !{!13, !14} +!llvm.ident = !{!15} + +!0 = metadata !{metadata !"0x11\004\00clang version 3.6.0 (trunk 223270)\001\00\000\00\001", metadata !1, metadata !2, metadata !2, metadata !3, metadata !2, metadata !2} ; [ DW_TAG_compile_unit ] [/home/kromanova/ngh/ToT_latest/llvm/test/DebugInfo/test.cpp] [DW_LANG_C_plus_plus] +!1 = metadata !{metadata !"test.cpp", metadata !"/home/kromanova/ngh/ToT_latest/llvm/test/DebugInfo"} +!2 = metadata !{} +!3 = metadata !{metadata !4} +!4 = metadata !{metadata !"0x2e\00main\00main\00\003\000\001\000\000\00256\001\004", metadata !1, metadata !5, metadata !6, null, i32 ()* @main, null, null, metadata !9} ; [ DW_TAG_subprogram ] [line 3] [def] [scope 4] [main] +!5 = metadata !{metadata !"0x29", metadata !1} ; [ DW_TAG_file_type ] [/home/kromanova/ngh/ToT_latest/llvm/test/DebugInfo/test.cpp] +!6 = metadata !{metadata !"0x15\00\000\000\000\000\000\000", null, null, null, metadata !7, null, null, null} ; [ DW_TAG_subroutine_type ] [line 0, size 0, align 0, offset 0] [from ] +!7 = metadata !{metadata !8} +!8 = metadata !{metadata !"0x24\00int\000\0032\0032\000\000\005", null, null} ; [ DW_TAG_base_type ] [int] [line 0, size 32, align 32, offset 0, enc DW_ATE_signed] +!9 = metadata !{metadata !10, metadata !11} +!10 = metadata !{metadata !"0x100\00c\005\000", metadata !4, metadata !5, metadata !8} ; [ DW_TAG_auto_variable ] [c] [line 5] +!11 = metadata !{metadata !"0x100\00a\007\000", metadata !12, metadata !5, metadata !8} ; [ DW_TAG_auto_variable ] [a] [line 7] +!12 = metadata !{metadata !"0xb\007\009\000", metadata !1, metadata !4} ; [ DW_TAG_lexical_block ] [/home/kromanova/ngh/ToT_latest/llvm/test/DebugInfo/test.cpp] +!13 = metadata !{i32 2, metadata !"Dwarf Version", i32 4} +!14 = metadata !{i32 2, metadata !"Debug Info Version", i32 2} +!15 = metadata !{metadata !"clang version 3.6.0 (trunk 223270)"} +!16 = metadata !{i32 13} +!17 = metadata !{metadata !"0x102"} ; [ DW_TAG_expression ] +!18 = metadata !{i32 5, i32 13, metadata !4, null} +!19 = metadata !{i32 0} +!20 = metadata !{i32 7, i32 18, metadata !12, null} +!21 = metadata !{i32 7, i32 9, metadata !22, null} +!22 = metadata !{metadata !"0xb\002", metadata !1, metadata !23} ; [ DW_TAG_lexical_block ] [/home/kromanova/ngh/ToT_latest/llvm/test/DebugInfo/test.cpp] +!23 = metadata !{metadata !"0xb\001", metadata !1, metadata !12} ; [ DW_TAG_lexical_block ] [/home/kromanova/ngh/ToT_latest/llvm/test/DebugInfo/test.cpp] +!24 = metadata !{i32 8, i32 22, metadata !25, null} +!25 = metadata !{metadata !"0xb\007\009\001", metadata !1, metadata !12} ; [ DW_TAG_lexical_block ] [/home/kromanova/ngh/ToT_latest/llvm/test/DebugInfo/test.cpp] +!26 = metadata !{i32 7, i32 34, metadata !25, null} +!27 = metadata !{i32 10, i32 9, metadata !4, null} + +