Index: llvm/trunk/lib/Transforms/Utils/AddDiscriminators.cpp =================================================================== --- llvm/trunk/lib/Transforms/Utils/AddDiscriminators.cpp +++ llvm/trunk/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 @@ 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; } } } Index: llvm/trunk/test/Transforms/AddDiscriminators/dbg-declare-discriminator.ll =================================================================== --- llvm/trunk/test/Transforms/AddDiscriminators/dbg-declare-discriminator.ll +++ llvm/trunk/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)