From 646a736e7b4faddf2f632f97bffe182e5dc4512b Mon Sep 17 00:00:00 2001 From: Vedant Kumar Date: Thu, 24 May 2018 23:00:23 +0000 Subject: [PATCH] [Debugify] Set a DI version module flag for llc compatibility Setting the "Debug Info Version" module flag makes it possible to pipe synthetic debug info into llc, which is useful for testing backends. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@333237 91177308-0d34-0410-b5e6-96231b3b80d8 --- test/DebugInfo/debugify.ll | 1 + test/Transforms/DeadStoreElimination/debuginfo.ll | 22 +++++++---------- test/Transforms/InstCombine/debuginfo-variables.ll | 28 +++++++++++----------- test/Transforms/LCSSA/basictest.ll | 2 +- tools/opt/Debugify.cpp | 12 ++++++++-- 5 files changed, 34 insertions(+), 31 deletions(-) diff --git a/test/DebugInfo/debugify.ll b/test/DebugInfo/debugify.ll index 91e2371e16a..41b1e8a1443 100644 --- a/test/DebugInfo/debugify.ll +++ b/test/DebugInfo/debugify.ll @@ -51,6 +51,7 @@ define weak_odr zeroext i1 @baz() { ; CHECK-DAG: !llvm.dbg.cu = !{![[CU:.*]]} ; CHECK-DAG: !llvm.debugify = !{![[NUM_INSTS:.*]], ![[NUM_VARS:.*]]} +; CHECK-DAG: "Debug Info Version" ; CHECK-DAG: ![[CU]] = distinct !DICompileUnit(language: DW_LANG_C, file: {{.*}}, producer: "debugify", isOptimized: true, runtimeVersion: 0, emissionKind: FullDebug, enums: {{.*}}) ; CHECK-DAG: !DIFile(filename: "", directory: "/") diff --git a/test/Transforms/DeadStoreElimination/debuginfo.ll b/test/Transforms/DeadStoreElimination/debuginfo.ll index 3f95a629b7c..813c0425d01 100644 --- a/test/Transforms/DeadStoreElimination/debuginfo.ll +++ b/test/Transforms/DeadStoreElimination/debuginfo.ll @@ -14,10 +14,10 @@ define i32* @test_salvage() { ; CHECK-NEXT: store i32 0, i32* %P ; Check that all four original local variables have their values preserved. -; CHECK-NEXT: call void @llvm.dbg.value(metadata i8* %p, metadata !8, metadata !DIExpression()), !dbg !14 -; CHECK-NEXT: call void @llvm.dbg.value(metadata i32* %P, metadata !10, metadata !DIExpression()), !dbg !15 -; CHECK-NEXT: call void @llvm.dbg.value(metadata i32* %P, metadata !11, metadata !DIExpression(DW_OP_deref)), !dbg !18 -; CHECK-NEXT: call void @llvm.dbg.value(metadata i32* %P, metadata !13, metadata !DIExpression(DW_OP_deref, DW_OP_plus_uconst, 1, DW_OP_stack_value)), !dbg !19 +; CHECK-NEXT: @llvm.dbg.value(metadata i8* %p, metadata ![[p:.*]], metadata !DIExpression()) +; CHECK-NEXT: @llvm.dbg.value(metadata i32* %P, metadata ![[P:.*]], metadata !DIExpression()) +; CHECK-NEXT: @llvm.dbg.value(metadata i32* %P, metadata ![[DEAD:.*]], metadata !DIExpression(DW_OP_deref)) +; CHECK-NEXT: call void @llvm.dbg.value(metadata i32* %P, metadata ![[DEAD2:.*]], metadata !DIExpression(DW_OP_deref, DW_OP_plus_uconst, 1, DW_OP_stack_value)) %p = tail call i8* @malloc(i32 4) %P = bitcast i8* %p to i32* %DEAD = load i32, i32* %P @@ -28,13 +28,7 @@ define i32* @test_salvage() { ret i32* %P } -; CHECK: !8 = !DILocalVariable(name: "1", scope: !5, file: !1, line: 1, type: !9) -; CHECK: !10 = !DILocalVariable(name: "2", scope: !5, file: !1, line: 2, type: !9) -; CHECK: !11 = !DILocalVariable(name: "3", scope: !5, file: !1, line: 3, type: !12) -; CHECK: !13 = !DILocalVariable(name: "4", scope: !5, file: !1, line: 4, type: !12) -; CHECK-DAG: !14 = !DILocation(line: 1, column: 1, scope: !5) -; CHECK-DAG: !15 = !DILocation(line: 2, column: 1, scope: !5) -; CHECK-DAG: !18 = !DILocation(line: 3, column: 1, scope: !5) -; CHECK-DAG: !19 = !DILocation(line: 4, column: 1, scope: !5) -; CHECK-DAG: !16 = !DILocation(line: 6, column: 1, scope: !5) -; CHECK-DAG: !17 = !DILocation(line: 7, column: 1, scope: !5) +; CHECK: ![[p]] = !DILocalVariable(name: "1" +; CHECK: ![[P]] = !DILocalVariable(name: "2" +; CHECK: ![[DEAD]] = !DILocalVariable(name: "3" +; CHECK: ![[DEAD2]] = !DILocalVariable(name: "4" diff --git a/test/Transforms/InstCombine/debuginfo-variables.ll b/test/Transforms/InstCombine/debuginfo-variables.ll index cdb316238e8..8c4aba8de8a 100644 --- a/test/Transforms/InstCombine/debuginfo-variables.ll +++ b/test/Transforms/InstCombine/debuginfo-variables.ll @@ -3,8 +3,8 @@ define i64 @test_sext_zext(i16 %A) { ; CHECK-LABEL: @test_sext_zext( ; CHECK-NEXT: [[C2:%.*]] = zext i16 %A to i64 -; CHECK-NEXT: call void @llvm.dbg.value(metadata i64 [[C2]], metadata !8, metadata !DIExpression()), !dbg !13 -; CHECK-NEXT: call void @llvm.dbg.value(metadata i64 [[C2]], metadata !10, metadata !DIExpression()), !dbg !12 +; CHECK-NEXT: call void @llvm.dbg.value(metadata i64 [[C2]], {{.*}}, metadata !DIExpression()) +; CHECK-NEXT: call void @llvm.dbg.value(metadata i64 [[C2]], {{.*}}, metadata !DIExpression()) %c1 = zext i16 %A to i32 %c2 = sext i32 %c1 to i64 ret i64 %c2 @@ -12,84 +12,84 @@ define i64 @test_sext_zext(i16 %A) { define void @test_or(i64 %A) { ; CHECK-LABEL: @test_or( -; CHECK-NEXT: call void @llvm.dbg.value(metadata i64 %A, metadata !17, metadata !DIExpression(DW_OP_constu, 256, DW_OP_or, DW_OP_stack_value)), !dbg !18 +; CHECK-NEXT: call void @llvm.dbg.value(metadata i64 %A, {{.*}}, metadata !DIExpression(DW_OP_constu, 256, DW_OP_or, DW_OP_stack_value)) %1 = or i64 %A, 256 ret void } define void @test_xor(i32 %A) { ; CHECK-LABEL: @test_xor( -; CHECK-NEXT: call void @llvm.dbg.value(metadata i32 %A, metadata !22, metadata !DIExpression(DW_OP_constu, 1, DW_OP_xor, DW_OP_stack_value)), !dbg !23 +; CHECK-NEXT: call void @llvm.dbg.value(metadata i32 %A, {{.*}}, metadata !DIExpression(DW_OP_constu, 1, DW_OP_xor, DW_OP_stack_value)) %1 = xor i32 %A, 1 ret void } define void @test_sub_neg(i64 %A) { ; CHECK-LABEL: @test_sub_neg( -; CHECK-NEXT: call void @llvm.dbg.value(metadata i64 %A, metadata !27, metadata !DIExpression(DW_OP_plus_uconst, 1, DW_OP_stack_value)), !dbg !28 +; CHECK-NEXT: call void @llvm.dbg.value(metadata i64 %A, {{.*}}, metadata !DIExpression(DW_OP_plus_uconst, 1, DW_OP_stack_value)) %1 = sub i64 %A, -1 ret void } define void @test_sub_pos(i64 %A) { ; CHECK-LABEL: @test_sub_pos( -; CHECK-NEXT: call void @llvm.dbg.value(metadata i64 %A, metadata !32, metadata !DIExpression(DW_OP_constu, 1, DW_OP_minus, DW_OP_stack_value)), !dbg !33 +; CHECK-NEXT: call void @llvm.dbg.value(metadata i64 %A, {{.*}}, metadata !DIExpression(DW_OP_constu, 1, DW_OP_minus, DW_OP_stack_value)) %1 = sub i64 %A, 1 ret void } define void @test_shl(i64 %A) { ; CHECK-LABEL: @test_shl( -; CHECK-NEXT: call void @llvm.dbg.value(metadata i64 %A, metadata !37, metadata !DIExpression(DW_OP_constu, 7, DW_OP_shl, DW_OP_stack_value)), !dbg !38 +; CHECK-NEXT: call void @llvm.dbg.value(metadata i64 %A, {{.*}}, metadata !DIExpression(DW_OP_constu, 7, DW_OP_shl, DW_OP_stack_value)) %1 = shl i64 %A, 7 ret void } define void @test_lshr(i64 %A) { ; CHECK-LABEL: @test_lshr( -; CHECK-NEXT: call void @llvm.dbg.value(metadata i64 %A, metadata !42, metadata !DIExpression(DW_OP_constu, 7, DW_OP_shr, DW_OP_stack_value)), !dbg !43 +; CHECK-NEXT: call void @llvm.dbg.value(metadata i64 %A, {{.*}}, metadata !DIExpression(DW_OP_constu, 7, DW_OP_shr, DW_OP_stack_value)) %1 = lshr i64 %A, 7 ret void } define void @test_ashr(i64 %A) { ; CHECK-LABEL: @test_ashr( -; CHECK-NEXT: call void @llvm.dbg.value(metadata i64 %A, metadata !47, metadata !DIExpression(DW_OP_constu, 7, DW_OP_shra, DW_OP_stack_value)), !dbg !48 +; CHECK-NEXT: call void @llvm.dbg.value(metadata i64 %A, {{.*}}, metadata !DIExpression(DW_OP_constu, 7, DW_OP_shra, DW_OP_stack_value)) %1 = ashr i64 %A, 7 ret void } define void @test_mul(i64 %A) { ; CHECK-LABEL: @test_mul( -; CHECK-NEXT: call void @llvm.dbg.value(metadata i64 %A, metadata !52, metadata !DIExpression(DW_OP_constu, 7, DW_OP_mul, DW_OP_stack_value)), !dbg !53 +; CHECK-NEXT: call void @llvm.dbg.value(metadata i64 %A, {{.*}}, metadata !DIExpression(DW_OP_constu, 7, DW_OP_mul, DW_OP_stack_value)) %1 = mul i64 %A, 7 ret void } define void @test_sdiv(i64 %A) { ; CHECK-LABEL: @test_sdiv( -; CHECK-NEXT: call void @llvm.dbg.value(metadata i64 %A, metadata !57, metadata !DIExpression(DW_OP_constu, 7, DW_OP_div, DW_OP_stack_value)), !dbg !58 +; CHECK-NEXT: call void @llvm.dbg.value(metadata i64 %A, {{.*}}, metadata !DIExpression(DW_OP_constu, 7, DW_OP_div, DW_OP_stack_value)) %1 = sdiv i64 %A, 7 ret void } define void @test_srem(i64 %A) { ; CHECK-LABEL: @test_srem( -; CHECK-NEXT: call void @llvm.dbg.value(metadata i64 %A, metadata !62, metadata !DIExpression(DW_OP_constu, 7, DW_OP_mod, DW_OP_stack_value)), !dbg !63 +; CHECK-NEXT: call void @llvm.dbg.value(metadata i64 %A, {{.*}}, metadata !DIExpression(DW_OP_constu, 7, DW_OP_mod, DW_OP_stack_value)) %1 = srem i64 %A, 7 ret void } define void @test_ptrtoint(i64* %P) { ; CHECK-LABEL: @test_ptrtoint -; CHECK-NEXT: call void @llvm.dbg.value(metadata i64* %P, metadata !67, metadata !DIExpression()), !dbg !68 +; CHECK-NEXT: call void @llvm.dbg.value(metadata i64* %P, {{.*}}, metadata !DIExpression()) %1 = ptrtoint i64* %P to i64 ret void } define void @test_and(i64 %A) { ; CHECK-LABEL: @test_and( -; CHECK-NEXT: call void @llvm.dbg.value(metadata i64 %A, metadata !72, metadata !DIExpression(DW_OP_constu, 256, DW_OP_and, DW_OP_stack_value)), !dbg !73 +; CHECK-NEXT: call void @llvm.dbg.value(metadata i64 %A, {{.*}}, metadata !DIExpression(DW_OP_constu, 256, DW_OP_and, DW_OP_stack_value)) %1 = and i64 %A, 256 ret void } diff --git a/test/Transforms/LCSSA/basictest.ll b/test/Transforms/LCSSA/basictest.ll index 284de862eec..910e6f8f607 100644 --- a/test/Transforms/LCSSA/basictest.ll +++ b/test/Transforms/LCSSA/basictest.ll @@ -19,7 +19,7 @@ post.if: ; preds = %if.false, %if.true br i1 %S2, label %loop.exit, label %loop.interior loop.exit: ; preds = %post.if ; CHECK: %X3.lcssa = phi i32 -; CHECK2: call void @llvm.dbg.value(metadata i32 %X3.lcssa, metadata !11, metadata !DIExpression()), !dbg !19 +; CHECK2: call void @llvm.dbg.value(metadata i32 %X3.lcssa ; CHECK: %X4 = add i32 3, %X3.lcssa %X4 = add i32 3, %X3 ; [#uses=0] ret void diff --git a/tools/opt/Debugify.cpp b/tools/opt/Debugify.cpp index fb810da231f..ba8927fd19c 100644 --- a/tools/opt/Debugify.cpp +++ b/tools/opt/Debugify.cpp @@ -121,6 +121,12 @@ bool applyDebugifyMetadata(Module &M, addDebugifyOperand(NextVar - 1); // Original number of variables. assert(NMD->getNumOperands() == 2 && "llvm.debugify should have exactly 2 operands!"); + + // Claim that this synthetic debug info is valid. + StringRef DIVersionKey = "Debug Info Version"; + if (!M.getModuleFlag(DIVersionKey)) + M.addModuleFlag(Module::Warning, DIVersionKey, DEBUG_METADATA_VERSION); + return true; } @@ -270,10 +276,12 @@ struct CheckDebugifyFunctionPass : public FunctionPass { Module &M = *F.getParent(); auto FuncIt = F.getIterator(); return checkDebugifyMetadata(M, make_range(FuncIt, std::next(FuncIt)), - NameOfWrappedPass, "CheckFunctionDebugify", Strip); + NameOfWrappedPass, "CheckFunctionDebugify", + Strip); } - CheckDebugifyFunctionPass(bool Strip = false, StringRef NameOfWrappedPass = "") + CheckDebugifyFunctionPass(bool Strip = false, + StringRef NameOfWrappedPass = "") : FunctionPass(ID), Strip(Strip), NameOfWrappedPass(NameOfWrappedPass) {} void getAnalysisUsage(AnalysisUsage &AU) const override { -- 2.11.0