From 168146e84b6b96d17093807189d069a4a04e8d06 Mon Sep 17 00:00:00 2001 From: Pavel Labath Date: Mon, 16 Nov 2015 10:40:38 +0000 Subject: [PATCH] Don't generate discriminators for calls to debug intrinsics Summary: This fails a check in Verifier.cpp, which checks for location matches between the declared variable and the !dbg attachments. Reviewers: dnovillo, dblaikie, danielcdh Subscribers: llvm-commits Differential Revision: http://reviews.llvm.org/D14657 git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@253194 91177308-0d34-0410-b5e6-96231b3b80d8 --- lib/Transforms/Utils/AddDiscriminators.cpp | 36 ++++++++++--------- .../dbg-declare-discriminator.ll | 30 ++++++++++++++++ 2 files changed, 49 insertions(+), 17 deletions(-) create mode 100644 test/Transforms/AddDiscriminators/dbg-declare-discriminator.ll diff --git a/lib/Transforms/Utils/AddDiscriminators.cpp b/lib/Transforms/Utils/AddDiscriminators.cpp index 9125b583212..db2bf6a2a9f 100644 --- a/lib/Transforms/Utils/AddDiscriminators.cpp +++ b/lib/Transforms/Utils/AddDiscriminators.cpp @@ -58,6 +58,7 @@ #include "llvm/IR/DIBuilder.h" #include "llvm/IR/DebugInfo.h" #include "llvm/IR/Instructions.h" +#include "llvm/IR/IntrinsicInst.h" #include "llvm/IR/LLVMContext.h" #include "llvm/IR/Module.h" #include "llvm/Pass.h" @@ -233,26 +234,27 @@ bool AddDiscriminators::runOnFunction(Function &F) { const DILocation *FirstDIL = NULL; for (auto &I : B.getInstList()) { CallInst *Current = dyn_cast(&I); - if (Current) { - DILocation *CurrentDIL = Current->getDebugLoc(); - if (FirstDIL) { - if (CurrentDIL && CurrentDIL->getLine() == FirstDIL->getLine() && - CurrentDIL->getFilename() == FirstDIL->getFilename()) { - auto *Scope = FirstDIL->getScope(); - auto *File = Builder.createFile(FirstDIL->getFilename(), - Scope->getDirectory()); - auto *NewScope = Builder.createLexicalBlockFile( - Scope, File, FirstDIL->computeNewDiscriminator()); - Current->setDebugLoc(DILocation::get( - Ctx, CurrentDIL->getLine(), CurrentDIL->getColumn(), NewScope, - CurrentDIL->getInlinedAt())); - Changed = true; - } else { - FirstDIL = CurrentDIL; - } + if (!Current || isa(&I)) + continue; + + DILocation *CurrentDIL = Current->getDebugLoc(); + if (FirstDIL) { + if (CurrentDIL && CurrentDIL->getLine() == FirstDIL->getLine() && + CurrentDIL->getFilename() == FirstDIL->getFilename()) { + auto *Scope = FirstDIL->getScope(); + auto *File = Builder.createFile(FirstDIL->getFilename(), + Scope->getDirectory()); + auto *NewScope = Builder.createLexicalBlockFile( + Scope, File, FirstDIL->computeNewDiscriminator()); + Current->setDebugLoc(DILocation::get( + Ctx, CurrentDIL->getLine(), CurrentDIL->getColumn(), NewScope, + CurrentDIL->getInlinedAt())); + Changed = true; } else { FirstDIL = CurrentDIL; } + } else { + FirstDIL = CurrentDIL; } } } diff --git a/test/Transforms/AddDiscriminators/dbg-declare-discriminator.ll b/test/Transforms/AddDiscriminators/dbg-declare-discriminator.ll new file mode 100644 index 00000000000..5e90d32a62e --- /dev/null +++ b/test/Transforms/AddDiscriminators/dbg-declare-discriminator.ll @@ -0,0 +1,30 @@ +; RUN: opt -S -add-discriminators < %s | FileCheck %s + +declare void @llvm.dbg.declare(metadata, metadata, metadata) + +; This checks whether the add-discriminators pass producess valid metadata on +; llvm.dbg.declare instructions +; +; CHECK-LABEL: @test_valid_metadata +define void @test_valid_metadata() { + %a = alloca i8 + call void @llvm.dbg.declare(metadata i8* %a, metadata !2, metadata !5), !dbg !6 + %b = alloca i8 + call void @llvm.dbg.declare(metadata i8* %b, metadata !9, metadata !5), !dbg !11 + ret void +} + +!llvm.module.flags = !{!0, !1} + +!0 = !{i32 2, !"Dwarf Version", i32 4} +!1 = !{i32 2, !"Debug Info Version", i32 3} +!2 = !DILocalVariable(scope: !3) +!3 = distinct !DISubprogram(scope: null, file: !4, isLocal: false, isDefinition: true, isOptimized: false) +!4 = !DIFile(filename: "a.cpp", directory: "/tmp") +!5 = !DIExpression() +!6 = !DILocation(line: 0, scope: !3, inlinedAt: !7) +!7 = distinct !DILocation(line: 0, scope: !8) +!8 = distinct !DISubprogram(linkageName: "test_valid_metadata", scope: null, isLocal: false, isDefinition: true, isOptimized: false) +!9 = !DILocalVariable(scope: !10) +!10 = distinct !DISubprogram(scope: null, file: !4, isLocal: false, isDefinition: true, isOptimized: false) +!11 = !DILocation(line: 0, scope: !10) -- 2.34.1