diff --git a/llvm/lib/AsmParser/LLParser.cpp b/llvm/lib/AsmParser/LLParser.cpp index b933d240c4d27..5c007dcf00224 100644 --- a/llvm/lib/AsmParser/LLParser.cpp +++ b/llvm/lib/AsmParser/LLParser.cpp @@ -8336,8 +8336,6 @@ bool LLParser::parseCall(Instruction *&Inst, PerFunctionState &PFS, return error(CallLoc, "llvm.dbg intrinsic should not appear in a module " "using non-intrinsic debug info"); } - if (!SeenOldDbgInfoFormat) - M->setNewDbgInfoFormatFlag(false); SeenOldDbgInfoFormat = true; } CI->setAttributes(PAL); diff --git a/llvm/lib/IR/AsmWriter.cpp b/llvm/lib/IR/AsmWriter.cpp index 7223dd845d18d..7828ba45ec27f 100644 --- a/llvm/lib/IR/AsmWriter.cpp +++ b/llvm/lib/IR/AsmWriter.cpp @@ -1204,17 +1204,23 @@ void SlotTracker::processFunctionMetadata(const Function &F) { } void SlotTracker::processDbgRecordMetadata(const DbgRecord &DR) { + // Tolerate null metadata pointers: it's a completely illegal debug record, + // but we can have faulty metadata from debug-intrinsic days being + // autoupgraded into debug records. This gets caught by the verifier, which + // then will print the faulty IR, hitting this code path. if (const DbgVariableRecord *DVR = dyn_cast(&DR)) { // Process metadata used by DbgRecords; we only specifically care about the // DILocalVariable, DILocation, and DIAssignID fields, as the Value and // Expression fields should only be printed inline and so do not use a slot. // Note: The above doesn't apply for empty-metadata operands. - if (auto *Empty = dyn_cast(DVR->getRawLocation())) + if (auto *Empty = dyn_cast_if_present(DVR->getRawLocation())) CreateMetadataSlot(Empty); - CreateMetadataSlot(DVR->getRawVariable()); + if (DVR->getRawVariable()) + CreateMetadataSlot(DVR->getRawVariable()); if (DVR->isDbgAssign()) { - CreateMetadataSlot(cast(DVR->getRawAssignID())); - if (auto *Empty = dyn_cast(DVR->getRawAddress())) + if (auto *AssignID = DVR->getRawAssignID()) + CreateMetadataSlot(cast(AssignID)); + if (auto *Empty = dyn_cast_if_present(DVR->getRawAddress())) CreateMetadataSlot(Empty); } } else if (const DbgLabelRecord *DLR = dyn_cast(&DR)) { @@ -1222,7 +1228,8 @@ void SlotTracker::processDbgRecordMetadata(const DbgRecord &DR) { } else { llvm_unreachable("unsupported DbgRecord kind"); } - CreateMetadataSlot(DR.getDebugLoc().getAsMDNode()); + if (DR.getDebugLoc()) + CreateMetadataSlot(DR.getDebugLoc().getAsMDNode()); } void SlotTracker::processInstructionMetadata(const Instruction &I) { @@ -4867,22 +4874,30 @@ void AssemblyWriter::printDbgVariableRecord(const DbgVariableRecord &DVR) { llvm_unreachable( "Tried to print a DbgVariableRecord with an invalid LocationType!"); } + + auto PrintOrNull = [&](Metadata *M) { + if (!M) + Out << "(null)"; + else + WriteAsOperandInternal(Out, M, WriterCtx, true); + }; + Out << "("; - WriteAsOperandInternal(Out, DVR.getRawLocation(), WriterCtx, true); + PrintOrNull(DVR.getRawLocation()); Out << ", "; - WriteAsOperandInternal(Out, DVR.getRawVariable(), WriterCtx, true); + PrintOrNull(DVR.getRawVariable()); Out << ", "; - WriteAsOperandInternal(Out, DVR.getRawExpression(), WriterCtx, true); + PrintOrNull(DVR.getRawExpression()); Out << ", "; if (DVR.isDbgAssign()) { - WriteAsOperandInternal(Out, DVR.getRawAssignID(), WriterCtx, true); + PrintOrNull(DVR.getRawAssignID()); Out << ", "; - WriteAsOperandInternal(Out, DVR.getRawAddress(), WriterCtx, true); + PrintOrNull(DVR.getRawAddress()); Out << ", "; - WriteAsOperandInternal(Out, DVR.getRawAddressExpression(), WriterCtx, true); + PrintOrNull(DVR.getRawAddressExpression()); Out << ", "; } - WriteAsOperandInternal(Out, DVR.getDebugLoc().getAsMDNode(), WriterCtx, true); + PrintOrNull(DVR.getDebugLoc().getAsMDNode()); Out << ")"; } diff --git a/llvm/lib/IR/AutoUpgrade.cpp b/llvm/lib/IR/AutoUpgrade.cpp index 814c00c669cb3..cb90af36f3d9f 100644 --- a/llvm/lib/IR/AutoUpgrade.cpp +++ b/llvm/lib/IR/AutoUpgrade.cpp @@ -1155,8 +1155,7 @@ static bool upgradeIntrinsicFunction1(Function *F, Function *&NewFn, case 'd': if (Name.consume_front("dbg.")) { // Mark debug intrinsics for upgrade to new debug format. - if (CanUpgradeDebugIntrinsicsToRecords && - F->getParent()->IsNewDbgInfoFormat) { + if (CanUpgradeDebugIntrinsicsToRecords) { if (Name == "addr" || Name == "value" || Name == "assign" || Name == "declare" || Name == "label") { // There's no function to replace these with. @@ -4395,39 +4394,66 @@ static Value *upgradeAMDGCNIntrinsicCall(StringRef Name, CallBase *CI, return Builder.CreateBitCast(RMW, RetTy); } -/// Helper to unwrap intrinsic call MetadataAsValue operands. -template -static MDType *unwrapMAVOp(CallBase *CI, unsigned Op) { - if (MetadataAsValue *MAV = dyn_cast(CI->getArgOperand(Op))) - return dyn_cast(MAV->getMetadata()); +/// Helper to unwrap intrinsic call MetadataAsValue operands. Return as a +/// plain MDNode, as it's the verifier's job to check these are the correct +/// types later. +static MDNode *unwrapMAVOp(CallBase *CI, unsigned Op) { + if (Op < CI->arg_size()) { + if (MetadataAsValue *MAV = + dyn_cast(CI->getArgOperand(Op))) { + Metadata *MD = MAV->getMetadata(); + return dyn_cast_if_present(MD); + } + } + return nullptr; +} + +/// Helper to unwrap Metadata MetadataAsValue operands, such as the Value field. +static Metadata *unwrapMAVMetadataOp(CallBase *CI, unsigned Op) { + if (Op < CI->arg_size()) + if (MetadataAsValue *MAV = dyn_cast(CI->getArgOperand(Op))) + return MAV->getMetadata(); return nullptr; } +static MDNode *getDebugLocSafe(const Instruction *I) { + // The MDNode attached to this instruction might not be the correct type, + // as the verifier has not yet be run. Fetch it as a bare MDNode. + return I->getDebugLoc().getAsMDNode(); +} + /// Convert debug intrinsic calls to non-instruction debug records. /// \p Name - Final part of the intrinsic name, e.g. 'value' in llvm.dbg.value. /// \p CI - The debug intrinsic call. static void upgradeDbgIntrinsicToDbgRecord(StringRef Name, CallBase *CI) { DbgRecord *DR = nullptr; if (Name == "label") { - DR = new DbgLabelRecord(unwrapMAVOp(CI, 0), CI->getDebugLoc()); + DR = DbgLabelRecord::createUnresolvedDbgLabelRecord(unwrapMAVOp(CI, 0), + CI->getDebugLoc()); } else if (Name == "assign") { - DR = new DbgVariableRecord( - unwrapMAVOp(CI, 0), unwrapMAVOp(CI, 1), - unwrapMAVOp(CI, 2), unwrapMAVOp(CI, 3), - unwrapMAVOp(CI, 4), unwrapMAVOp(CI, 5), - CI->getDebugLoc()); + DR = DbgVariableRecord::createUnresolvedDbgVariableRecord( + DbgVariableRecord::LocationType::Assign, unwrapMAVMetadataOp(CI, 0), + unwrapMAVOp(CI, 1), unwrapMAVOp(CI, 2), unwrapMAVOp(CI, 3), + unwrapMAVMetadataOp(CI, 4), + /*The address is a Value ref, it will be stored as a Metadata */ + unwrapMAVOp(CI, 5), getDebugLocSafe(CI)); } else if (Name == "declare") { - DR = new DbgVariableRecord( - unwrapMAVOp(CI, 0), unwrapMAVOp(CI, 1), - unwrapMAVOp(CI, 2), CI->getDebugLoc(), - DbgVariableRecord::LocationType::Declare); + DR = DbgVariableRecord::createUnresolvedDbgVariableRecord( + DbgVariableRecord::LocationType::Declare, unwrapMAVMetadataOp(CI, 0), + unwrapMAVOp(CI, 1), unwrapMAVOp(CI, 2), nullptr, nullptr, nullptr, + getDebugLocSafe(CI)); } else if (Name == "addr") { // Upgrade dbg.addr to dbg.value with DW_OP_deref. - DIExpression *Expr = unwrapMAVOp(CI, 2); - Expr = DIExpression::append(Expr, dwarf::DW_OP_deref); - DR = new DbgVariableRecord(unwrapMAVOp(CI, 0), - unwrapMAVOp(CI, 1), Expr, - CI->getDebugLoc()); + MDNode *ExprNode = unwrapMAVOp(CI, 2); + // Don't try to add something to the expression if it's not an expression. + // Instead, allow the verifier to fail later. + if (DIExpression *Expr = dyn_cast(ExprNode)) { + ExprNode = DIExpression::append(Expr, dwarf::DW_OP_deref); + } + DR = DbgVariableRecord::createUnresolvedDbgVariableRecord( + DbgVariableRecord::LocationType::Value, unwrapMAVMetadataOp(CI, 0), + unwrapMAVOp(CI, 1), ExprNode, nullptr, nullptr, nullptr, + getDebugLocSafe(CI)); } else if (Name == "value") { // An old version of dbg.value had an extra offset argument. unsigned VarOp = 1; @@ -4440,9 +4466,10 @@ static void upgradeDbgIntrinsicToDbgRecord(StringRef Name, CallBase *CI) { VarOp = 2; ExprOp = 3; } - DR = new DbgVariableRecord( - unwrapMAVOp(CI, 0), unwrapMAVOp(CI, VarOp), - unwrapMAVOp(CI, ExprOp), CI->getDebugLoc()); + DR = DbgVariableRecord::createUnresolvedDbgVariableRecord( + DbgVariableRecord::LocationType::Value, unwrapMAVMetadataOp(CI, 0), + unwrapMAVOp(CI, VarOp), unwrapMAVOp(CI, ExprOp), nullptr, nullptr, + nullptr, getDebugLocSafe(CI)); } assert(DR && "Unhandled intrinsic kind in upgrade to DbgRecord"); CI->getParent()->insertDbgRecordBefore(DR, CI->getIterator()); diff --git a/llvm/lib/IR/BasicBlock.cpp b/llvm/lib/IR/BasicBlock.cpp index ed11ea06398f1..f716e9970b841 100644 --- a/llvm/lib/IR/BasicBlock.cpp +++ b/llvm/lib/IR/BasicBlock.cpp @@ -32,8 +32,6 @@ using namespace llvm; STATISTIC(NumInstrRenumberings, "Number of renumberings across all blocks"); DbgMarker *BasicBlock::createMarker(Instruction *I) { - assert(IsNewDbgInfoFormat && - "Tried to create a marker in a non new debug-info block!"); if (I->DebugMarker) return I->DebugMarker; DbgMarker *Marker = new DbgMarker(); @@ -43,8 +41,6 @@ DbgMarker *BasicBlock::createMarker(Instruction *I) { } DbgMarker *BasicBlock::createMarker(InstListType::iterator It) { - assert(IsNewDbgInfoFormat && - "Tried to create a marker in a non new debug-info block!"); if (It != end()) return createMarker(&*It); DbgMarker *DM = getTrailingDbgRecords(); diff --git a/llvm/lib/IR/Verifier.cpp b/llvm/lib/IR/Verifier.cpp index 2d03a7a261b5b..e40bdc51aa70d 100644 --- a/llvm/lib/IR/Verifier.cpp +++ b/llvm/lib/IR/Verifier.cpp @@ -6710,7 +6710,7 @@ void Verifier::visit(DbgVariableRecord &DVR) { CheckDI(DVR.getType() == DbgVariableRecord::LocationType::Value || DVR.getType() == DbgVariableRecord::LocationType::Declare || DVR.getType() == DbgVariableRecord::LocationType::Assign, - "invalid #dbg record type", &DVR, DVR.getType()); + "invalid #dbg record type", &DVR, DVR.getType(), BB, F); // The location for a DbgVariableRecord must be either a ValueAsMetadata, // DIArgList, or an empty MDNode (which is a legacy representation for an @@ -6718,30 +6718,33 @@ void Verifier::visit(DbgVariableRecord &DVR) { auto *MD = DVR.getRawLocation(); CheckDI(MD && (isa(MD) || isa(MD) || (isa(MD) && !cast(MD)->getNumOperands())), - "invalid #dbg record address/value", &DVR, MD); + "invalid #dbg record address/value", &DVR, MD, BB, F); if (auto *VAM = dyn_cast(MD)) { visitValueAsMetadata(*VAM, F); if (DVR.isDbgDeclare()) { // Allow integers here to support inttoptr salvage. Type *Ty = VAM->getValue()->getType(); CheckDI(Ty->isPointerTy() || Ty->isIntegerTy(), - "location of #dbg_declare must be a pointer or int", &DVR, MD); + "location of #dbg_declare must be a pointer or int", &DVR, MD, BB, + F); } } else if (auto *AL = dyn_cast(MD)) { visitDIArgList(*AL, F); } CheckDI(isa_and_nonnull(DVR.getRawVariable()), - "invalid #dbg record variable", &DVR, DVR.getRawVariable()); + "invalid #dbg record variable", &DVR, DVR.getRawVariable(), BB, F); visitMDNode(*DVR.getRawVariable(), AreDebugLocsAllowed::No); CheckDI(isa_and_nonnull(DVR.getRawExpression()), - "invalid #dbg record expression", &DVR, DVR.getRawExpression()); + "invalid #dbg record expression", &DVR, DVR.getRawExpression(), BB, + F); visitMDNode(*DVR.getExpression(), AreDebugLocsAllowed::No); if (DVR.isDbgAssign()) { CheckDI(isa_and_nonnull(DVR.getRawAssignID()), - "invalid #dbg_assign DIAssignID", &DVR, DVR.getRawAssignID()); + "invalid #dbg_assign DIAssignID", &DVR, DVR.getRawAssignID(), BB, + F); visitMDNode(*cast(DVR.getRawAssignID()), AreDebugLocsAllowed::No); @@ -6752,29 +6755,29 @@ void Verifier::visit(DbgVariableRecord &DVR) { CheckDI( isa(RawAddr) || (isa(RawAddr) && !cast(RawAddr)->getNumOperands()), - "invalid #dbg_assign address", &DVR, DVR.getRawAddress()); + "invalid #dbg_assign address", &DVR, DVR.getRawAddress(), BB, F); if (auto *VAM = dyn_cast(RawAddr)) visitValueAsMetadata(*VAM, F); CheckDI(isa_and_nonnull(DVR.getRawAddressExpression()), "invalid #dbg_assign address expression", &DVR, - DVR.getRawAddressExpression()); + DVR.getRawAddressExpression(), BB, F); visitMDNode(*DVR.getAddressExpression(), AreDebugLocsAllowed::No); // All of the linked instructions should be in the same function as DVR. for (Instruction *I : at::getAssignmentInsts(&DVR)) CheckDI(DVR.getFunction() == I->getFunction(), - "inst not in same function as #dbg_assign", I, &DVR); + "inst not in same function as #dbg_assign", I, &DVR, BB, F); } // This check is redundant with one in visitLocalVariable(). DILocalVariable *Var = DVR.getVariable(); - CheckDI(isType(Var->getRawType()), "invalid type ref", Var, - Var->getRawType()); + CheckDI(isType(Var->getRawType()), "invalid type ref", Var, Var->getRawType(), + BB, F); auto *DLNode = DVR.getDebugLoc().getAsMDNode(); CheckDI(isa_and_nonnull(DLNode), "invalid #dbg record DILocation", - &DVR, DLNode); + &DVR, DLNode, BB, F); DILocation *Loc = DVR.getDebugLoc(); // The scopes for variables and !dbg attachments must agree. @@ -6786,7 +6789,7 @@ void Verifier::visit(DbgVariableRecord &DVR) { CheckDI(VarSP == LocSP, "mismatched subprogram between #dbg record variable and DILocation", &DVR, BB, F, Var, Var->getScope()->getSubprogram(), Loc, - Loc->getScope()->getSubprogram()); + Loc->getScope()->getSubprogram(), BB, F); verifyFnArgs(DVR); } diff --git a/llvm/test/Assembler/drop-debug-info-nonzero-alloca.ll b/llvm/test/Assembler/drop-debug-info-nonzero-alloca.ll index 2b089d2639375..c8b235757afba 100644 --- a/llvm/test/Assembler/drop-debug-info-nonzero-alloca.ll +++ b/llvm/test/Assembler/drop-debug-info-nonzero-alloca.ll @@ -12,8 +12,12 @@ entry: metadata ptr undef, metadata !DILocalVariable(scope: !1), metadata !DIExpression()) -; AS: llvm.dbg.value intrinsic requires a !dbg attachment +; AS: invalid #dbg record DILocation +; AS: #dbg_value(ptr undef, !{{[0-9]+}}, !DIExpression(), (null)) +; AS: label %entry +; AS: ptr @foo ; AS: warning: ignoring invalid debug info in + ret void } diff --git a/llvm/test/DebugInfo/Generic/assignment-tracking/parse-and-verify/verify.ll b/llvm/test/DebugInfo/Generic/assignment-tracking/parse-and-verify/verify.ll index 0a4b7c255dc71..d1f1e1ce768dc 100644 --- a/llvm/test/DebugInfo/Generic/assignment-tracking/parse-and-verify/verify.ll +++ b/llvm/test/DebugInfo/Generic/assignment-tracking/parse-and-verify/verify.ll @@ -8,7 +8,7 @@ define dso_local void @fun2() !dbg !15 { ;; DIAssignID copied here from @fun() where it is used by intrinsics. - ; CHECK: dbg.assign not in same function as inst + ; CHECK: DVRAssign not in same function as inst %x = alloca i32, align 4, !DIAssignID !14 ret void } @@ -17,24 +17,24 @@ define dso_local void @fun() !dbg !7 { entry: %a = alloca i32, align 4, !DIAssignID !14 ;; Here something other than a dbg.assign intrinsic is using a DIAssignID. - ; CHECK: !DIAssignID should only be used by llvm.dbg.assign intrinsics + ; CHECK: !DIAssignID should only be used by Assign DVRs call void @llvm.dbg.value(metadata !14, metadata !10, metadata !DIExpression()), !dbg !13 ;; Each following dbg.assign has an argument of the incorrect type. - ; CHECK: invalid llvm.dbg.assign intrinsic address/value + ; CHECK: invalid #dbg record address/value call void @llvm.dbg.assign(metadata !3, metadata !10, metadata !DIExpression(), metadata !14, metadata ptr undef, metadata !DIExpression()), !dbg !13 - ; CHECK: invalid llvm.dbg.assign intrinsic variable + ; CHECK: invalid #dbg record variable call void @llvm.dbg.assign(metadata i32 0, metadata !2, metadata !DIExpression(), metadata !14, metadata ptr undef, metadata !DIExpression()), !dbg !13 - ; CHECK: invalid llvm.dbg.assign intrinsic expression + ; CHECK: invalid #dbg record expression call void @llvm.dbg.assign(metadata !14, metadata !10, metadata !2, metadata !14, metadata ptr undef, metadata !DIExpression()), !dbg !13 - ; CHECK: invalid llvm.dbg.assign intrinsic DIAssignID + ; CHECK: invalid #dbg_assign DIAssignID call void @llvm.dbg.assign(metadata !14, metadata !10, metadata !DIExpression(), metadata !2, metadata ptr undef, metadata !DIExpression()), !dbg !13 - ; CHECK: invalid llvm.dbg.assign intrinsic address + ; CHECK: invalid #dbg_assign address call void @llvm.dbg.assign(metadata !14, metadata !10, metadata !DIExpression(), metadata !14, metadata !3, metadata !DIExpression()), !dbg !13 ;; Empty metadata debug operands are allowed. - ; CHECK-NOT: invalid llvm.dbg.assign + ; CHECK-NOT: invalid #dbg record call void @llvm.dbg.assign(metadata !14, metadata !10, metadata !DIExpression(), metadata !14, metadata !2, metadata !DIExpression()), !dbg !13 - ; CHECK: invalid llvm.dbg.assign intrinsic address expression + ; CHECK: invalid #dbg_assign address expression call void @llvm.dbg.assign(metadata !14, metadata !10, metadata !DIExpression(), metadata !14, metadata ptr undef, metadata !2), !dbg !13 ret void } diff --git a/llvm/test/DebugInfo/Generic/sroa-extract-bits.ll b/llvm/test/DebugInfo/Generic/sroa-extract-bits.ll index f47e495db6617..6db453605cb57 100644 --- a/llvm/test/DebugInfo/Generic/sroa-extract-bits.ll +++ b/llvm/test/DebugInfo/Generic/sroa-extract-bits.ll @@ -13,8 +13,8 @@ define i8 @test1(i32 %arg) { ; CHECK-NEXT: #dbg_value(i8 [[PTR_SROA_0_0_EXTRACT_TRUNC]], [[META2:![0-9]+]], !DIExpression(DW_OP_LLVM_extract_bits_zext, 0, 8), [[META7:![0-9]+]]) ; CHECK-NEXT: [[PTR_SROA_2_0_EXTRACT_SHIFT:%.*]] = lshr i32 [[ARG]], 8 ; CHECK-NEXT: [[PTR_SROA_2_0_EXTRACT_TRUNC:%.*]] = trunc i32 [[PTR_SROA_2_0_EXTRACT_SHIFT]] to i24 -; CHECK-NEXT: #dbg_value(i24 [[PTR_SROA_2_0_EXTRACT_TRUNC]], [[META8:![0-9]+]], !DIExpression(DW_OP_LLVM_extract_bits_zext, 8, 16), [[META7]]) -; CHECK-NEXT: #dbg_value(i24 [[PTR_SROA_2_0_EXTRACT_TRUNC]], [[META9:![0-9]+]], !DIExpression(DW_OP_LLVM_extract_bits_sext, 0, 8), [[META7]]) +; CHECK-NEXT: #dbg_value(i24 [[PTR_SROA_2_0_EXTRACT_TRUNC]], [[META8:![0-9]+]], !DIExpression(DW_OP_LLVM_extract_bits_sext, 0, 8), [[META7]]) +; CHECK-NEXT: #dbg_value(i24 [[PTR_SROA_2_0_EXTRACT_TRUNC]], [[META10:![0-9]+]], !DIExpression(DW_OP_LLVM_extract_bits_zext, 8, 16), [[META7]]) ; CHECK-NEXT: ret i8 [[PTR_SROA_0_0_EXTRACT_TRUNC]] ; entry: @@ -36,11 +36,11 @@ define i8 @test2(i32 %arg1, i8 %arg2) { ; CHECK-NEXT: #dbg_value(i8 [[PTR_SROA_0_0_EXTRACT_TRUNC]], [[META2]], !DIExpression(DW_OP_LLVM_extract_bits_zext, 0, 8), [[META7]]) ; CHECK-NEXT: [[PTR_SROA_2_0_EXTRACT_SHIFT:%.*]] = lshr i32 [[ARG1]], 8 ; CHECK-NEXT: [[PTR_SROA_2_0_EXTRACT_TRUNC:%.*]] = trunc i32 [[PTR_SROA_2_0_EXTRACT_SHIFT]] to i16 -; CHECK-NEXT: #dbg_value(i16 [[PTR_SROA_2_0_EXTRACT_TRUNC]], [[META9]], !DIExpression(DW_OP_LLVM_extract_bits_sext, 0, 16), [[META7]]) +; CHECK-NEXT: #dbg_value(i16 [[PTR_SROA_2_0_EXTRACT_TRUNC]], [[META8]], !DIExpression(DW_OP_LLVM_extract_bits_sext, 0, 16), [[META7]]) ; CHECK-NEXT: [[PTR_SROA_21_0_EXTRACT_SHIFT:%.*]] = lshr i32 [[ARG1]], 24 ; CHECK-NEXT: [[PTR_SROA_21_0_EXTRACT_TRUNC:%.*]] = trunc i32 [[PTR_SROA_21_0_EXTRACT_SHIFT]] to i8 -; CHECK-NEXT: #dbg_value(i8 [[PTR_SROA_21_0_EXTRACT_TRUNC]], [[META8]], !DIExpression(DW_OP_LLVM_extract_bits_zext, 0, 8), [[META7]]) -; CHECK-NEXT: #dbg_value(i8 [[ARG2]], [[META8]], !DIExpression(DW_OP_LLVM_extract_bits_zext, 0, 8), [[META7]]) +; CHECK-NEXT: #dbg_value(i8 [[PTR_SROA_21_0_EXTRACT_TRUNC]], [[META10]], !DIExpression(DW_OP_LLVM_extract_bits_zext, 0, 8), [[META7]]) +; CHECK-NEXT: #dbg_value(i8 [[ARG2]], [[META10]], !DIExpression(DW_OP_LLVM_extract_bits_zext, 0, 8), [[META7]]) ; CHECK-NEXT: ret i8 [[PTR_SROA_0_0_EXTRACT_TRUNC]] ; entry: @@ -84,7 +84,7 @@ define i16 @test4(i32 %arg) { ; CHECK-NEXT: #dbg_value(i16 [[PTR_SROA_0_0_EXTRACT_TRUNC]], [[META2]], !DIExpression(DW_OP_LLVM_extract_bits_zext, 0, 8), [[META7]]) ; CHECK-NEXT: [[PTR_SROA_2_0_EXTRACT_SHIFT:%.*]] = lshr i32 [[ARG]], 16 ; CHECK-NEXT: [[PTR_SROA_2_0_EXTRACT_TRUNC:%.*]] = trunc i32 [[PTR_SROA_2_0_EXTRACT_SHIFT]] to i16 -; CHECK-NEXT: #dbg_value(i16 [[PTR_SROA_2_0_EXTRACT_TRUNC]], [[META8]], !DIExpression(DW_OP_LLVM_extract_bits_zext, 8, 8), [[META7]]) +; CHECK-NEXT: #dbg_value(i16 [[PTR_SROA_2_0_EXTRACT_TRUNC]], [[META10]], !DIExpression(DW_OP_LLVM_extract_bits_zext, 8, 8), [[META7]]) ; CHECK-NEXT: ret i16 [[PTR_SROA_0_0_EXTRACT_TRUNC]] ; entry: @@ -107,8 +107,8 @@ define i8 @test5(i32 %arg) { ; CHECK-NEXT: #dbg_value(i8 [[PTR_SROA_0_0_EXTRACT_TRUNC]], [[META11:![0-9]+]], !DIExpression(), [[META7]]) ; CHECK-NEXT: [[PTR_SROA_2_0_EXTRACT_SHIFT:%.*]] = lshr i32 [[ARG]], 8 ; CHECK-NEXT: [[PTR_SROA_2_0_EXTRACT_TRUNC:%.*]] = trunc i32 [[PTR_SROA_2_0_EXTRACT_SHIFT]] to i24 -; CHECK-NEXT: #dbg_value(i24 [[PTR_SROA_2_0_EXTRACT_TRUNC]], [[META8]], !DIExpression(DW_OP_LLVM_extract_bits_zext, 8, 8), [[META7]]) -; CHECK-NEXT: #dbg_value(i24 [[PTR_SROA_2_0_EXTRACT_TRUNC]], [[META9]], !DIExpression(DW_OP_LLVM_extract_bits_sext, 0, 8), [[META7]]) +; CHECK-NEXT: #dbg_value(i24 [[PTR_SROA_2_0_EXTRACT_TRUNC]], [[META8]], !DIExpression(DW_OP_LLVM_extract_bits_sext, 0, 8), [[META7]]) +; CHECK-NEXT: #dbg_value(i24 [[PTR_SROA_2_0_EXTRACT_TRUNC]], [[META10]], !DIExpression(DW_OP_LLVM_extract_bits_zext, 8, 8), [[META7]]) ; CHECK-NEXT: ret i8 [[PTR_SROA_0_0_EXTRACT_TRUNC]] ; entry: @@ -130,11 +130,11 @@ define i8 @test6(i32 %arg1, i8 %arg2) { ; CHECK-NEXT: #dbg_value(i8 poison, [[META2]], !DIExpression(DW_OP_LLVM_extract_bits_sext, 0, 8), [[META7]]) ; CHECK-NEXT: [[PTR_SROA_2_0_EXTRACT_SHIFT:%.*]] = lshr i32 [[ARG1]], 8 ; CHECK-NEXT: [[PTR_SROA_2_0_EXTRACT_TRUNC:%.*]] = trunc i32 [[PTR_SROA_2_0_EXTRACT_SHIFT]] to i16 -; CHECK-NEXT: #dbg_value(i16 poison, [[META9]], !DIExpression(DW_OP_LLVM_extract_bits_zext, 0, 16), [[META7]]) +; CHECK-NEXT: #dbg_value(i16 poison, [[META8]], !DIExpression(DW_OP_LLVM_extract_bits_zext, 0, 16), [[META7]]) ; CHECK-NEXT: [[PTR_SROA_21_0_EXTRACT_SHIFT:%.*]] = lshr i32 [[ARG1]], 24 ; CHECK-NEXT: [[PTR_SROA_21_0_EXTRACT_TRUNC:%.*]] = trunc i32 [[PTR_SROA_21_0_EXTRACT_SHIFT]] to i8 -; CHECK-NEXT: #dbg_value(i8 poison, [[META8]], !DIExpression(DW_OP_LLVM_extract_bits_sext, 0, 8), [[META7]]) -; CHECK-NEXT: #dbg_value(i8 poison, [[META8]], !DIExpression(DW_OP_LLVM_extract_bits_sext, 0, 8), [[META7]]) +; CHECK-NEXT: #dbg_value(i8 poison, [[META10]], !DIExpression(DW_OP_LLVM_extract_bits_sext, 0, 8), [[META7]]) +; CHECK-NEXT: #dbg_value(i8 poison, [[META10]], !DIExpression(DW_OP_LLVM_extract_bits_sext, 0, 8), [[META7]]) ; CHECK-NEXT: ret i8 [[PTR_SROA_0_0_EXTRACT_TRUNC]] ; entry: @@ -197,9 +197,9 @@ entry: ; CHECK: [[META5]] = !DIFile(filename: "dbg-bit-piece.cpp", directory: "") ; CHECK: [[META6]] = !DIBasicType(name: "unsigned int", size: 32, encoding: DW_ATE_unsigned) ; CHECK: [[META7]] = !DILocation(line: 0, scope: [[META3]]) -; CHECK: [[META8]] = !DILocalVariable(name: "z", scope: [[META3]], type: [[META6]]) -; CHECK: [[META9]] = !DILocalVariable(name: "y", scope: [[META3]], type: [[META10:![0-9]+]]) -; CHECK: [[META10]] = !DIBasicType(name: "signed int", size: 32, encoding: DW_ATE_signed) +; CHECK: [[META8]] = !DILocalVariable(name: "y", scope: [[META3]], type: [[META9:![0-9]+]]) +; CHECK: [[META9]] = !DIBasicType(name: "signed int", size: 32, encoding: DW_ATE_signed) +; CHECK: [[META10]] = !DILocalVariable(name: "z", scope: [[META3]], type: [[META6]]) ; CHECK: [[META11]] = !DILocalVariable(name: "x", scope: [[META3]], type: [[META12:![0-9]+]]) ; CHECK: [[META12]] = !DIBasicType(name: "char", size: 8, encoding: DW_ATE_signed_char) ;. diff --git a/llvm/test/Transforms/IROutliner/outlining-debug-statements.ll b/llvm/test/Transforms/IROutliner/outlining-debug-statements.ll index bf846c310a525..c1140988fa916 100644 --- a/llvm/test/Transforms/IROutliner/outlining-debug-statements.ll +++ b/llvm/test/Transforms/IROutliner/outlining-debug-statements.ll @@ -19,7 +19,7 @@ entry: %c = alloca i32, align 4 store i32 2, ptr %a, align 4 store i32 3, ptr %b, align 4 - call void @llvm.dbg.value(metadata i64 0, metadata !14, metadata !DIExpression()), !dbg !14 + call void @llvm.dbg.value(metadata i64 0, metadata !14, metadata !DIExpression()), !dbg !15 store i32 4, ptr %c, align 4 %al = load i32, ptr %a %bl = load i32, ptr %b @@ -62,3 +62,4 @@ entry: !12 = !DISubroutineType(types: !13) !13 = !{} !14 = !DILocalVariable(name: "p_6", arg: 1, scope: !11, line: 117, type: !1) +!15 = !DILocation(line: 1, scope: !11) diff --git a/llvm/test/Transforms/ObjCARC/code-motion.ll b/llvm/test/Transforms/ObjCARC/code-motion.ll index 499ee77bc6541..9009b98b4b1e3 100644 --- a/llvm/test/Transforms/ObjCARC/code-motion.ll +++ b/llvm/test/Transforms/ObjCARC/code-motion.ll @@ -1,4 +1,4 @@ -; RUN: opt -passes=objc-arc -S < %s | FileCheck %s +; RUN: opt -passes=objc-arc -S < %s 2>&1 | FileCheck %s '--implicit-check-not=ignoring invalid debug' declare void @alterRefCount() declare void @use(ptr) @@ -17,7 +17,7 @@ define i32 @test(ptr %x, ptr %y, i8 %z, i32 %i) { store i32 %i, ptr %i.addr, align 4 %v1 = tail call ptr @llvm.objc.retain(ptr %x) store i8 %z, ptr %x - call void @llvm.dbg.declare(metadata ptr %i.addr, metadata !9, metadata !DIExpression()), !dbg !10 + call void @llvm.dbg.declare(metadata ptr %i.addr, metadata !11, metadata !DIExpression()), !dbg !10 call void @alterRefCount() tail call void @llvm.objc.release(ptr %x) ret i32 %i @@ -64,7 +64,7 @@ define void @test3(ptr %obj, i1 %cond) { ; CHECK-NEXT: call void @use(ptr [[OBJ]]) ; CHECK-NEXT: br label [[JOIN]] ; CHECK: join: -; CHECK-NEXT: call void @llvm.objc.release(ptr [[OBJ]]) {{.*}}, !clang.imprecise_release !2 +; CHECK-NEXT: call void @llvm.objc.release(ptr [[OBJ]]) {{.*}}, !clang.imprecise_release ![[EMPTYMETA:[0-9]+]] ; CHECK-NEXT: ret void ; %v0 = call ptr @llvm.objc.retain(ptr %obj) @@ -102,8 +102,8 @@ define void @test4(ptr %obj0, ptr %obj1, i1 %cond) { ; CHECK-NEXT: call void @use(ptr [[OBJ1]]) ; CHECK-NEXT: br label [[JOIN]] ; CHECK: join: -; CHECK-NEXT: call void @llvm.objc.release(ptr [[OBJ0]]) {{.*}}, !clang.imprecise_release !2 -; CHECK-NEXT: call void @llvm.objc.release(ptr [[OBJ1]]) {{.*}}, !clang.imprecise_release !2 +; CHECK-NEXT: call void @llvm.objc.release(ptr [[OBJ0]]) {{.*}}, !clang.imprecise_release ![[EMPTYMETA]] +; CHECK-NEXT: call void @llvm.objc.release(ptr [[OBJ1]]) {{.*}}, !clang.imprecise_release ![[EMPTYMETA]] ; CHECK-NEXT: ret void ; %v0 = call ptr @llvm.objc.retain(ptr %obj0) @@ -190,6 +190,8 @@ attributes #0 = { readonly } !llvm.module.flags = !{!0, !1} +; CHECK: ![[EMPTYMETA]] = !{} + !0 = !{i32 2, !"Dwarf Version", i32 4} !1 = !{i32 2, !"Debug Info Version", i32 3} !2 = !DILocalVariable(name: "i", arg: 1, scope: !3, file: !4, line: 1, type: !7) @@ -201,3 +203,4 @@ attributes #0 = { readonly } !8 = distinct !DICompileUnit(language: DW_LANG_ObjC, file: !4, isOptimized: false, runtimeVersion: 2, emissionKind: FullDebug, enums: !9, nameTableKind: None) !9 = !{} !10 = !DILocation(line: 1, column: 14, scope: !3) +!11 = !DILocalVariable(name: "foo", scope: !3, type: !7) diff --git a/llvm/test/Verifier/RemoveDI/invalid-dbg-declare-operands.ll b/llvm/test/Verifier/RemoveDI/invalid-dbg-declare-operands.ll new file mode 100644 index 0000000000000..cdc9d8df82aa7 --- /dev/null +++ b/llvm/test/Verifier/RemoveDI/invalid-dbg-declare-operands.ll @@ -0,0 +1,46 @@ +; RUN: llvm-as %s -o - 2>&1 | FileCheck %s +; CHECK: invalid #dbg record expression +; +; Fossilised debug-info with only two arguments to dbg.declare have been +; spotted in LLVMs test suite (debug-info-always-inline.ll), test that this +; does not cause a crash. LLVM needs to be able to autoupgrade invalid +; dbg.declares to invalid #dbg_declares because this occurs before the +; Verifier runs. + +; ModuleID = 'out.ll' +source_filename = "llvm/test/DebugInfo/Generic/debug-info-always-inline.ll" +target datalayout = "e-m:e-i64:64-f80:128-n8:16:32:64-S128" +target triple = "x86_64-unknown-linux-gnu" + +declare void @llvm.dbg.declare(metadata, metadata, metadata) + +; Function Attrs: alwaysinline nounwind sspstrong +define i32 @_Z3foov() !dbg !7 { +entry: + %sum = alloca i32, align 4, !dbg !11 + call void @llvm.dbg.declare(metadata ptr %sum, metadata !26), !dbg !11 + ret i32 0, !dbg !15 +} + +declare void @_Z3barv() + +!llvm.module.flags = !{!0, !1} +!llvm.ident = !{!2} +!llvm.dbg.cu = !{!3} +!llvm.debugify = !{!5, !6} + +!0 = !{i32 2, !"Dwarf Version", i32 4} +!1 = !{i32 2, !"Debug Info Version", i32 3} +!2 = !{!"clang version 3.6.0 (217844)"} +!3 = distinct !DICompileUnit(language: DW_LANG_C, file: !4, producer: "debugify", isOptimized: true, runtimeVersion: 0, emissionKind: FullDebug) +!4 = !DIFile(filename: "/fast/fs/llvm-main/llvm/test/DebugInfo/Generic/debug-info-always-inline.ll", directory: "/") +!5 = !{i32 14} +!6 = !{i32 7} +!7 = distinct !DISubprogram(name: "_Z3foov", linkageName: "_Z3foov", scope: null, file: !4, line: 1, type: !8, scopeLine: 1, spFlags: DISPFlagDefinition | DISPFlagOptimized, unit: !3, retainedNodes: !9) +!8 = !DISubroutineType(types: !9) +!9 = !{} +!11 = !DILocation(line: 2, column: 1, scope: !7) +!15 = !DILocation(line: 6, column: 1, scope: !7) +!25 = !DIBasicType(name: "int", size: 32, encoding: DW_ATE_signed) +!26 = !DILocalVariable(name: "b", scope: !7, file: !4, line: 1234, type: !25) + diff --git a/llvm/test/Verifier/dbg-declare-invalid-debug-loc.ll b/llvm/test/Verifier/dbg-declare-invalid-debug-loc.ll new file mode 100644 index 0000000000000..c521a9b8eb11b --- /dev/null +++ b/llvm/test/Verifier/dbg-declare-invalid-debug-loc.ll @@ -0,0 +1,42 @@ +; RUN: opt %s -o /dev/null -S 2>&1 | FileCheck %s +; +; The last dbg.declare intrinsic in this file has an illegal DILocation -- this +; needs to pass through the autoupgrade to #dbg_declare process and then get +; caught by the verifier. +; +; CHECK: invalid #dbg record DILocation +; CHECK-NEXT: #dbg_declare(ptr %1, ![[VAR:[0-9]+]], !DIExpression(), ![[PROG:[0-9]+]]) +; CHECK-NEXT: ![[PROG]] = distinct !DISubprogram(name: "IgnoreIntrinsicTest", +; CHECK-NEXT: label %0 +; CHECK-NEXT: ptr @IgnoreIntrinsicTest + +declare void @llvm.dbg.declare(metadata, metadata, metadata) + +define i32 @IgnoreIntrinsicTest() !dbg !10 { + %1 = alloca i32, align 4 + call void @llvm.dbg.declare(metadata ptr %1, metadata !14, metadata !DIExpression()), !dbg !10 + store volatile i32 1, ptr %1, align 4 + %2 = load volatile i32, ptr %1, align 4 + %3 = mul nsw i32 %2, 42 + ret i32 %3 +} + +!llvm.dbg.cu = !{!0} +!llvm.module.flags = !{!8, !9} + +!0 = distinct !DICompileUnit(language: DW_LANG_C_plus_plus, file: !1, producer: "clang version 3.4 ", isOptimized: true, runtimeVersion: 0, emissionKind: FullDebug, enums: !2, retainedTypes: !5, globals: !5, imports: !5) +!1 = !DIFile(filename: "", directory: "/Users/matt/ryan_bug") +!2 = !{!3} +!3 = !DICompositeType(tag: DW_TAG_enumeration_type, scope: !4, file: !1, line: 20, size: 32, align: 32, elements: !6) +!4 = !DICompositeType(tag: DW_TAG_structure_type, name: "C", file: !1, line: 19, size: 8, align: 8, elements: !5) +!5 = !{} +!6 = !{!7} +!7 = !DIEnumerator(name: "max_frame_size", value: 0) +!8 = !{i32 2, !"Dwarf Version", i32 2} +!9 = !{i32 1, !"Debug Info Version", i32 3} +!10 = distinct !DISubprogram(name: "IgnoreIntrinsicTest", linkageName: "IgnoreIntrinsicTest", scope: !1, file: !1, line: 1, type: !11, scopeLine: 1, flags: DIFlagPrototyped, spFlags: DISPFlagDefinition | DISPFlagOptimized, unit: !0, retainedNodes: !5) +!11 = !DISubroutineType(types: !12) +!12 = !{!13} +!13 = !DIBasicType(name: "int", size: 32, align: 32, encoding: DW_ATE_signed) +!14 = !DILocalVariable(name: "x", scope: !10, file: !1, line: 2, type: !13) +!15 = !DILocation(line: 2, column: 16, scope: !10) diff --git a/llvm/test/Verifier/diexpression-entry-value-llvm-ir.ll b/llvm/test/Verifier/diexpression-entry-value-llvm-ir.ll index 652e6667bfc5c..1a28f0ec519f7 100644 --- a/llvm/test/Verifier/diexpression-entry-value-llvm-ir.ll +++ b/llvm/test/Verifier/diexpression-entry-value-llvm-ir.ll @@ -1,9 +1,9 @@ ; RUN: llvm-as -disable-output <%s 2>&1| FileCheck %s -; CHECK-NOT: llvm.dbg.value +; CHECK-NOT: #dbg_value ; CHECK: Entry values are only allowed in MIR unless they target a swiftasync Argument -; CHECK: call void @llvm.dbg.value(metadata i32 %param, metadata !{{.*}}, metadata !DIExpression(DW_OP_LLVM_entry_value, 1)) -; CHECK-NOT: llvm.dbg.value +; CHECK: #dbg_value(i32 %param, !{{.*}}, !DIExpression(DW_OP_LLVM_entry_value, 1), +; CHECK-NOT: #dbg_value ; CHECK-NOT: Entry values are only allowed ; CHECK: warning: ignoring invalid debug info diff --git a/llvm/test/Verifier/llvm.dbg.declare-address.ll b/llvm/test/Verifier/llvm.dbg.declare-address.ll index 219f9ca0a6679..251526b4c321b 100644 --- a/llvm/test/Verifier/llvm.dbg.declare-address.ll +++ b/llvm/test/Verifier/llvm.dbg.declare-address.ll @@ -1,6 +1,6 @@ ; RUN: llvm-as -disable-output <%s 2>&1 | FileCheck %s -; CHECK: invalid llvm.dbg.declare intrinsic address/value -; CHECK-NEXT: call void @llvm.dbg.declare({{.*}}) +; CHECK: invalid #dbg record address/value +; CHECK-NEXT: #dbg_declare({{.*}}) ; CHECK-NEXT: !"" ; CHECK: warning: ignoring invalid debug info diff --git a/llvm/test/Verifier/llvm.dbg.declare-expression.ll b/llvm/test/Verifier/llvm.dbg.declare-expression.ll index 671ec21780088..de65bb570677e 100644 --- a/llvm/test/Verifier/llvm.dbg.declare-expression.ll +++ b/llvm/test/Verifier/llvm.dbg.declare-expression.ll @@ -1,7 +1,6 @@ ; RUN: llvm-as -disable-output <%s 2>&1 | FileCheck %s -; CHECK: invalid llvm.dbg.declare intrinsic expression -; CHECK-NEXT: call void @llvm.dbg.declare({{.*}}) -; CHECK-NEXT: !"" +; CHECK: invalid #dbg record expression +; CHECK-NEXT: #dbg_declare({{.*}}) ; CHECK: warning: ignoring invalid debug info define void @foo(i32 %a) { diff --git a/llvm/test/Verifier/llvm.dbg.declare-variable.ll b/llvm/test/Verifier/llvm.dbg.declare-variable.ll index 4f0ae4daa822f..601fab190d36b 100644 --- a/llvm/test/Verifier/llvm.dbg.declare-variable.ll +++ b/llvm/test/Verifier/llvm.dbg.declare-variable.ll @@ -1,13 +1,16 @@ ; RUN: llvm-as -disable-output <%s 2>&1 | FileCheck %s -; CHECK: invalid llvm.dbg.declare intrinsic variable -; CHECK-NEXT: call void @llvm.dbg.declare({{.*}}) -; CHECK-NEXT: !"" +; CHECK: invalid #dbg record variable +; CHECK-NEXT: #dbg_declare({{.*}}) +; CHECK-NEXT: DISubprogram ; CHECK: warning: ignoring invalid debug info +;; This test ensures we report an illegal variable as illegal, but also that +;; the illegal MDNode is printed out (DISubprogram) to help localise. + define void @foo(i32 %a) { entry: %s = alloca i32 - call void @llvm.dbg.declare(metadata ptr %s, metadata !"", metadata !DIExpression()), !dbg !DILocation(scope: !1) + call void @llvm.dbg.declare(metadata ptr %s, metadata !1, metadata !DIExpression()), !dbg !DILocation(scope: !1) ret void } diff --git a/llvm/test/Verifier/llvm.dbg.intrinsic-dbg-attachment.ll b/llvm/test/Verifier/llvm.dbg.intrinsic-dbg-attachment.ll index 5d82f490e055d..b1e22b20d0864 100644 --- a/llvm/test/Verifier/llvm.dbg.intrinsic-dbg-attachment.ll +++ b/llvm/test/Verifier/llvm.dbg.intrinsic-dbg-attachment.ll @@ -5,8 +5,8 @@ entry: metadata ptr undef, metadata !DILocalVariable(scope: !1), metadata !DIExpression()) -; CHECK-LABEL: llvm.dbg.value intrinsic requires a !dbg attachment -; CHECK-NEXT: call void @llvm.dbg.value({{.*}}) +; CHECK-LABEL: invalid #dbg record DILocation +; CHECK-NEXT: #dbg_value({{.*}}) ; CHECK-NEXT: label %entry ; CHECK-NEXT: ptr @foo @@ -14,8 +14,8 @@ entry: metadata ptr undef, metadata !DILocalVariable(scope: !1), metadata !DIExpression()) -; CHECK-LABEL: llvm.dbg.declare intrinsic requires a !dbg attachment -; CHECK-NEXT: call void @llvm.dbg.declare({{.*}}) +; CHECK-LABEL: invalid #dbg record DILocation +; CHECK-NEXT: #dbg_declare({{.*}}) ; CHECK-NEXT: label %entry ; CHECK-NEXT: ptr @foo @@ -24,8 +24,8 @@ entry: metadata !DILocalVariable(scope: !1), metadata !DIExpression()), !dbg !DILocation(scope: !2) -; CHECK-LABEL: mismatched subprogram between llvm.dbg.value variable and !dbg attachment -; CHECK-NEXT: call void @llvm.dbg.value({{[^,]+}}, metadata ![[VAR:[0-9]+]], {{[^,]+}}), !dbg ![[LOC:[0-9]+]] +; CHECK-LABEL: mismatched subprogram between #dbg record variable and DILocation +; CHECK-NEXT: #dbg_value({{[^,]+}}, ![[VAR:[0-9]+]], {{[^,]+}}, ![[LOC:[0-9]+]]) ; CHECK-NEXT: label %entry ; CHECK-NEXT: ptr @foo ; CHECK-NEXT: ![[VAR]] = !DILocalVariable({{.*}}scope: ![[VARSP:[0-9]+]] @@ -38,8 +38,8 @@ entry: metadata !DILocalVariable(scope: !1), metadata !DIExpression()), !dbg !DILocation(scope: !2) -; CHECK-LABEL: mismatched subprogram between llvm.dbg.declare variable and !dbg attachment -; CHECK-NEXT: call void @llvm.dbg.declare({{[^,]+}}, metadata ![[VAR:[0-9]+]], {{.*[^,]+}}), !dbg ![[LOC:[0-9]+]] +; CHECK-LABEL: mismatched subprogram between #dbg record variable and DILocation +; CHECK-NEXT: #dbg_declare({{[^,]+}}, ![[VAR:[0-9]+]], {{.*[^,]+}}, ![[LOC:[0-9]+]]) ; CHECK-NEXT: label %entry ; CHECK-NEXT: ptr @foo ; CHECK-NEXT: ![[VAR]] = !DILocalVariable({{.*}}scope: ![[VARSP:[0-9]+]] diff --git a/llvm/test/Verifier/llvm.dbg.value-expression.ll b/llvm/test/Verifier/llvm.dbg.value-expression.ll index cc45af2e8e7cb..92fd2add700ed 100644 --- a/llvm/test/Verifier/llvm.dbg.value-expression.ll +++ b/llvm/test/Verifier/llvm.dbg.value-expression.ll @@ -1,7 +1,6 @@ ; RUN: llvm-as -disable-output <%s 2>&1 | FileCheck %s -; CHECK: invalid llvm.dbg.value intrinsic expression -; CHECK-NEXT: call void @llvm.dbg.value({{.*}}) -; CHECK-NEXT: !"" +; CHECK: invalid #dbg record expression +; CHECK-NEXT: #dbg_value({{.*}}) ; CHECK: warning: ignoring invalid debug info define void @foo(i32 %a) { diff --git a/llvm/test/Verifier/llvm.dbg.value-value.ll b/llvm/test/Verifier/llvm.dbg.value-value.ll index 8b0ec1fed05c3..c390e530653cd 100644 --- a/llvm/test/Verifier/llvm.dbg.value-value.ll +++ b/llvm/test/Verifier/llvm.dbg.value-value.ll @@ -1,6 +1,6 @@ ; RUN: llvm-as -disable-output <%s 2>&1 | FileCheck %s -; CHECK: invalid llvm.dbg.value intrinsic address/value -; CHECK-NEXT: call void @llvm.dbg.value({{.*}}) +; CHECK: invalid #dbg record address/value +; CHECK-NEXT: #dbg_value({{.*}}) ; CHECK-NEXT: !"" ; CHECK: warning: ignoring invalid debug info diff --git a/llvm/test/Verifier/llvm.dbg.value-variable.ll b/llvm/test/Verifier/llvm.dbg.value-variable.ll index 4388e20797ce7..603a4b5c47e7d 100644 --- a/llvm/test/Verifier/llvm.dbg.value-variable.ll +++ b/llvm/test/Verifier/llvm.dbg.value-variable.ll @@ -1,7 +1,6 @@ ; RUN: llvm-as -disable-output <%s 2>&1 | FileCheck %s -; CHECK: invalid llvm.dbg.value intrinsic variable -; CHECK-NEXT: call void @llvm.dbg.value({{.*}}) -; CHECK-NEXT: !"" +; CHECK: invalid #dbg record variable +; CHECK-NEXT: #dbg_value({{.*}}) ; CHECK: warning: ignoring invalid debug info define void @foo(i32 %a) { diff --git a/llvm/unittests/IR/DebugInfoTest.cpp b/llvm/unittests/IR/DebugInfoTest.cpp index a888fd6c6cdc3..d7aa584bb8cb4 100644 --- a/llvm/unittests/IR/DebugInfoTest.cpp +++ b/llvm/unittests/IR/DebugInfoTest.cpp @@ -991,7 +991,6 @@ TEST(MetadataTest, ConvertDbgToDbgVariableRecord) { Instruction *RetInst = &*std::next(FirstInst->getIterator()); // Set-up DbgMarkers in this block. - ExitBlock->IsNewDbgInfoFormat = true; ExitBlock->createMarker(FirstInst); ExitBlock->createMarker(RetInst); @@ -1127,7 +1126,6 @@ TEST(MetadataTest, DbgVariableRecordConversionRoutines) { BasicBlock *BB1 = &F->getEntryBlock(); // First instruction should be a dbg.value. EXPECT_TRUE(isa(BB1->front())); - EXPECT_FALSE(BB1->IsNewDbgInfoFormat); // Validating the block for DbgVariableRecords / DbgMarkers shouldn't fail -- // there's no data stored right now. bool BrokenDebugInfo = false; @@ -1135,15 +1133,8 @@ TEST(MetadataTest, DbgVariableRecordConversionRoutines) { EXPECT_FALSE(Error); EXPECT_FALSE(BrokenDebugInfo); - // Function and module should be marked as not having the new format too. - EXPECT_FALSE(F->IsNewDbgInfoFormat); - EXPECT_FALSE(M->IsNewDbgInfoFormat); - // Now convert. M->convertToNewDbgValues(); - EXPECT_TRUE(M->IsNewDbgInfoFormat); - EXPECT_TRUE(F->IsNewDbgInfoFormat); - EXPECT_TRUE(BB1->IsNewDbgInfoFormat); // There should now be no dbg.value instructions! // Ensure the first instruction exists, the test all of them. @@ -1180,7 +1171,6 @@ TEST(MetadataTest, DbgVariableRecordConversionRoutines) { // There should be no DbgVariableRecords / DbgMarkers in the second block, but // it should be marked as being in the new format. BasicBlock *BB2 = BB1->getNextNode(); - EXPECT_TRUE(BB2->IsNewDbgInfoFormat); for (auto &Inst : *BB2) // Either there should be no marker, or it should be empty. EXPECT_TRUE(!Inst.DebugMarker || @@ -1207,9 +1197,6 @@ TEST(MetadataTest, DbgVariableRecordConversionRoutines) { // Convert everything back to the "old" format and ensure it's right. M->convertFromNewDbgValues(); - EXPECT_FALSE(M->IsNewDbgInfoFormat); - EXPECT_FALSE(F->IsNewDbgInfoFormat); - EXPECT_FALSE(BB1->IsNewDbgInfoFormat); EXPECT_EQ(BB1->size(), 4u); ASSERT_TRUE(isa(BB1->front()));