Author: Orlando Cazalet-Hyams Date: 2024-03-15T11:03:53Z New Revision: eba928f0b9851e5fa78f152ddc1be2a28564e705
URL: https://github.com/llvm/llvm-project/commit/eba928f0b9851e5fa78f152ddc1be2a28564e705 DIFF: https://github.com/llvm/llvm-project/commit/eba928f0b9851e5fa78f152ddc1be2a28564e705.diff LOG: Revert "[RemoveDIs] Read/write DbgRecords directly from/to bitcode (#83251)" This reverts commit d6d3d96b654012d72ad170d272cb2fe2c8def90d. Added: Modified: llvm/include/llvm/Bitcode/LLVMBitCodes.h llvm/lib/Bitcode/Reader/BitcodeAnalyzer.cpp llvm/lib/Bitcode/Reader/BitcodeReader.cpp llvm/lib/Bitcode/Writer/BitcodeWriter.cpp llvm/lib/Bitcode/Writer/BitcodeWriterPass.cpp llvm/lib/Bitcode/Writer/ValueEnumerator.cpp llvm/lib/IR/BasicBlock.cpp llvm/lib/Linker/IRMover.cpp llvm/lib/Transforms/IPO/ThinLTOBitcodeWriter.cpp llvm/tools/llvm-as/llvm-as.cpp llvm/tools/verify-uselistorder/verify-uselistorder.cpp Removed: llvm/test/Bitcode/dbg-record-roundtrip.ll ################################################################################ diff --git a/llvm/include/llvm/Bitcode/LLVMBitCodes.h b/llvm/include/llvm/Bitcode/LLVMBitCodes.h index 39303e64852141..c0a52d64a101d0 100644 --- a/llvm/include/llvm/Bitcode/LLVMBitCodes.h +++ b/llvm/include/llvm/Bitcode/LLVMBitCodes.h @@ -624,17 +624,6 @@ enum FunctionCodes { // operation, align, vol, // ordering, synchscope] FUNC_CODE_BLOCKADDR_USERS = 60, // BLOCKADDR_USERS: [value...] - - FUNC_CODE_DEBUG_RECORD_VALUE = - 61, // [DILocation, DILocalVariable, DIExpression, ValueAsMetadata] - FUNC_CODE_DEBUG_RECORD_DECLARE = - 62, // [DILocation, DILocalVariable, DIExpression, ValueAsMetadata] - FUNC_CODE_DEBUG_RECORD_ASSIGN = - 63, // [DILocation, DILocalVariable, DIExpression, ValueAsMetadata, - // DIAssignID, DIExpression (addr), ValueAsMetadata (addr)] - FUNC_CODE_DEBUG_RECORD_VALUE_SIMPLE = - 64, // [DILocation, DILocalVariable, DIExpression, Value] - FUNC_CODE_DEBUG_RECORD_LABEL = 65, // [DILocation, DILabel] }; enum UseListCodes { diff --git a/llvm/lib/Bitcode/Reader/BitcodeAnalyzer.cpp b/llvm/lib/Bitcode/Reader/BitcodeAnalyzer.cpp index c085c715179ba6..7005011980ebc9 100644 --- a/llvm/lib/Bitcode/Reader/BitcodeAnalyzer.cpp +++ b/llvm/lib/Bitcode/Reader/BitcodeAnalyzer.cpp @@ -270,11 +270,6 @@ GetCodeName(unsigned CodeID, unsigned BlockID, STRINGIFY_CODE(FUNC_CODE, INST_CMPXCHG) STRINGIFY_CODE(FUNC_CODE, INST_CALLBR) STRINGIFY_CODE(FUNC_CODE, BLOCKADDR_USERS) - STRINGIFY_CODE(FUNC_CODE, DEBUG_RECORD_DECLARE) - STRINGIFY_CODE(FUNC_CODE, DEBUG_RECORD_VALUE) - STRINGIFY_CODE(FUNC_CODE, DEBUG_RECORD_ASSIGN) - STRINGIFY_CODE(FUNC_CODE, DEBUG_RECORD_VALUE_SIMPLE) - STRINGIFY_CODE(FUNC_CODE, DEBUG_RECORD_LABEL) } case bitc::VALUE_SYMTAB_BLOCK_ID: switch (CodeID) { diff --git a/llvm/lib/Bitcode/Reader/BitcodeReader.cpp b/llvm/lib/Bitcode/Reader/BitcodeReader.cpp index d284c9823c9ede..9c63116114f3c5 100644 --- a/llvm/lib/Bitcode/Reader/BitcodeReader.cpp +++ b/llvm/lib/Bitcode/Reader/BitcodeReader.cpp @@ -100,6 +100,9 @@ static cl::opt<bool> ExpandConstantExprs( cl::desc( "Expand constant expressions to instructions for testing purposes")); +// Declare external flag for whether we're using the new debug-info format. +extern llvm::cl::opt<bool> UseNewDbgInfoFormat; + namespace { enum { @@ -4276,10 +4279,6 @@ Error BitcodeReader::parseGlobalIndirectSymbolRecord( Error BitcodeReader::parseModule(uint64_t ResumeBit, bool ShouldLazyLoadMetadata, ParserCallbacks Callbacks) { - // Force the debug-info mode into the old format for now. - // FIXME: Remove this once all tools support RemoveDIs. - TheModule->IsNewDbgInfoFormat = false; - this->ValueTypeCallback = std::move(Callbacks.ValueType); if (ResumeBit) { if (Error JumpFailed = Stream.JumpToBit(ResumeBit)) @@ -6399,89 +6398,6 @@ Error BitcodeReader::parseFunctionBody(Function *F) { InstructionList.push_back(I); break; } - case bitc::FUNC_CODE_DEBUG_RECORD_LABEL: { - // DPLabels are placed after the Instructions that they are attached to. - Instruction *Inst = getLastInstruction(); - if (!Inst) - return error("Invalid dbg record: missing instruction"); - DILocation *DIL = cast<DILocation>(getFnMetadataByID(Record[0])); - DILabel *Label = cast<DILabel>(getFnMetadataByID(Record[1])); - Inst->getParent()->insertDbgRecordBefore( - new DPLabel(Label, DebugLoc(DIL)), Inst->getIterator()); - continue; // This isn't an instruction. - } - case bitc::FUNC_CODE_DEBUG_RECORD_VALUE_SIMPLE: - case bitc::FUNC_CODE_DEBUG_RECORD_VALUE: - case bitc::FUNC_CODE_DEBUG_RECORD_DECLARE: - case bitc::FUNC_CODE_DEBUG_RECORD_ASSIGN: { - // DPValues are placed after the Instructions that they are attached to. - Instruction *Inst = getLastInstruction(); - if (!Inst) - return error("Invalid dbg record: missing instruction"); - - // First 3 fields are common to all kinds: - // DILocation, DILocalVariable, DIExpression - // dbg_value (FUNC_CODE_DEBUG_RECORD_VALUE) - // ..., LocationMetadata - // dbg_value (FUNC_CODE_DEBUG_RECORD_VALUE_SIMPLE - abbrev'd) - // ..., Value - // dbg_declare (FUNC_CODE_DEBUG_RECORD_DECLARE) - // ..., LocationMetadata - // dbg_assign (FUNC_CODE_DEBUG_RECORD_ASSIGN) - // ..., LocationMetadata, DIAssignID, DIExpression, LocationMetadata - unsigned Slot = 0; - // Common fields (0-2). - DILocation *DIL = cast<DILocation>(getFnMetadataByID(Record[Slot++])); - DILocalVariable *Var = - cast<DILocalVariable>(getFnMetadataByID(Record[Slot++])); - DIExpression *Expr = - cast<DIExpression>(getFnMetadataByID(Record[Slot++])); - - // Union field (3: LocationMetadata | Value). - Metadata *RawLocation = nullptr; - if (BitCode == bitc::FUNC_CODE_DEBUG_RECORD_VALUE_SIMPLE) { - Value *V = nullptr; - unsigned TyID = 0; - // We never expect to see a fwd reference value here because - // use-before-defs are encoded with the standard non-abbrev record - // type (they'd require encoding the type too, and they're rare). As a - // result, getValueTypePair only ever increments Slot by one here (once - // for the value, never twice for value and type). - unsigned SlotBefore = Slot; - if (getValueTypePair(Record, Slot, NextValueNo, V, TyID, CurBB)) - return error("Invalid dbg record: invalid value"); - (void)SlotBefore; - assert((SlotBefore == Slot - 1) && "unexpected fwd ref"); - RawLocation = ValueAsMetadata::get(V); - } else { - RawLocation = getFnMetadataByID(Record[Slot++]); - } - - DPValue *DPV = nullptr; - switch (BitCode) { - case bitc::FUNC_CODE_DEBUG_RECORD_VALUE: - case bitc::FUNC_CODE_DEBUG_RECORD_VALUE_SIMPLE: - DPV = new DPValue(RawLocation, Var, Expr, DIL, - DPValue::LocationType::Value); - break; - case bitc::FUNC_CODE_DEBUG_RECORD_DECLARE: - DPV = new DPValue(RawLocation, Var, Expr, DIL, - DPValue::LocationType::Declare); - break; - case bitc::FUNC_CODE_DEBUG_RECORD_ASSIGN: { - DIAssignID *ID = cast<DIAssignID>(getFnMetadataByID(Record[Slot++])); - DIExpression *AddrExpr = - cast<DIExpression>(getFnMetadataByID(Record[Slot++])); - Metadata *Addr = getFnMetadataByID(Record[Slot++]); - DPV = new DPValue(RawLocation, Var, Expr, ID, Addr, AddrExpr, DIL); - break; - } - default: - llvm_unreachable("Unknown DPValue bitcode"); - } - Inst->getParent()->insertDbgRecordBefore(DPV, Inst->getIterator()); - continue; // This isn't an instruction. - } case bitc::FUNC_CODE_INST_CALL: { // CALL: [paramattrs, cc, fmf, fnty, fnid, arg0, arg1...] if (Record.size() < 3) @@ -6761,21 +6677,10 @@ Error BitcodeReader::materialize(GlobalValue *GV) { // Move the bit stream to the saved position of the deferred function body. if (Error JumpFailed = Stream.JumpToBit(DFII->second)) return JumpFailed; - - // Set the debug info mode to "new", forcing a mismatch between - // module and function debug modes. This is okay because we'll convert - // everything back to the old mode after parsing. - // FIXME: Remove this once all tools support RemoveDIs. - F->IsNewDbgInfoFormat = true; - if (Error Err = parseFunctionBody(F)) return Err; F->setIsMaterializable(false); - // Convert new debug info records into intrinsics. - // FIXME: Remove this once all tools support RemoveDIs. - F->convertFromNewDbgValues(); - if (StripDebugInfo) stripDebugInfo(*F); diff --git a/llvm/lib/Bitcode/Writer/BitcodeWriter.cpp b/llvm/lib/Bitcode/Writer/BitcodeWriter.cpp index 6f0879a4e0ee74..597f49332fad25 100644 --- a/llvm/lib/Bitcode/Writer/BitcodeWriter.cpp +++ b/llvm/lib/Bitcode/Writer/BitcodeWriter.cpp @@ -99,9 +99,6 @@ namespace llvm { extern FunctionSummary::ForceSummaryHotnessType ForceSummaryEdgesCold; } -extern bool WriteNewDbgInfoFormatToBitcode; -extern llvm::cl::opt<bool> UseNewDbgInfoFormat; - namespace { /// These are manifest constants used by the bitcode writer. They do not need to @@ -131,7 +128,6 @@ enum { FUNCTION_INST_RET_VAL_ABBREV, FUNCTION_INST_UNREACHABLE_ABBREV, FUNCTION_INST_GEP_ABBREV, - FUNCTION_DEBUG_RECORD_VALUE_ABBREV, }; /// Abstract class to manage the bitcode writing, subclassed for each bitcode @@ -3516,95 +3512,25 @@ void ModuleBitcodeWriter::writeFunction( NeedsMetadataAttachment |= I.hasMetadataOtherThanDebugLoc(); // If the instruction has a debug location, emit it. - if (DILocation *DL = I.getDebugLoc()) { - if (DL == LastDL) { - // Just repeat the same debug loc as last time. - Stream.EmitRecord(bitc::FUNC_CODE_DEBUG_LOC_AGAIN, Vals); - } else { - Vals.push_back(DL->getLine()); - Vals.push_back(DL->getColumn()); - Vals.push_back(VE.getMetadataOrNullID(DL->getScope())); - Vals.push_back(VE.getMetadataOrNullID(DL->getInlinedAt())); - Vals.push_back(DL->isImplicitCode()); - Stream.EmitRecord(bitc::FUNC_CODE_DEBUG_LOC, Vals); - Vals.clear(); - LastDL = DL; - } - } + DILocation *DL = I.getDebugLoc(); + if (!DL) + continue; - // If the instruction has DbgRecords attached to it, emit them. Note that - // they come after the instruction so that it's easy to attach them again - // when reading the bitcode, even though conceptually the debug locations - // start "before" the instruction. - if (I.hasDbgRecords() && WriteNewDbgInfoFormatToBitcode) { - /// Try to push the value only (unwrapped), otherwise push the - /// metadata wrapped value. Returns true if the value was pushed - /// without the ValueAsMetadata wrapper. - auto PushValueOrMetadata = [&Vals, InstID, - this](Metadata *RawLocation) { - assert(RawLocation && "RawLocation unexpectedly null in DPValue"); - if (ValueAsMetadata *VAM = dyn_cast<ValueAsMetadata>(RawLocation)) { - SmallVector<unsigned, 2> ValAndType; - // If the value is a fwd-ref the type is also pushed. We don't - // want the type, so fwd-refs are kept wrapped (pushValueAndType - // returns false if the value is pushed without type). - if (!pushValueAndType(VAM->getValue(), InstID, ValAndType)) { - Vals.push_back(ValAndType[0]); - return true; - } - } - // The metadata is a DIArgList, or ValueAsMetadata wrapping a - // fwd-ref. Push the metadata ID. - Vals.push_back(VE.getMetadataID(RawLocation)); - return false; - }; - - // Write out non-instruction debug information attached to this - // instruction. Write it after the instruction so that it's easy to - // re-attach to the instruction reading the records in. - for (DbgRecord &DR : I.DbgMarker->getDbgRecordRange()) { - if (DPLabel *DPL = dyn_cast<DPLabel>(&DR)) { - Vals.push_back(VE.getMetadataID(&*DPL->getDebugLoc())); - Vals.push_back(VE.getMetadataID(DPL->getLabel())); - Stream.EmitRecord(bitc::FUNC_CODE_DEBUG_RECORD_LABEL, Vals); - Vals.clear(); - continue; - } - - // First 3 fields are common to all kinds: - // DILocation, DILocalVariable, DIExpression - // dbg_value (FUNC_CODE_DEBUG_RECORD_VALUE) - // ..., LocationMetadata - // dbg_value (FUNC_CODE_DEBUG_RECORD_VALUE_SIMPLE - abbrev'd) - // ..., Value - // dbg_declare (FUNC_CODE_DEBUG_RECORD_DECLARE) - // ..., LocationMetadata - // dbg_assign (FUNC_CODE_DEBUG_RECORD_ASSIGN) - // ..., LocationMetadata, DIAssignID, DIExpression, LocationMetadata - DPValue &DPV = cast<DPValue>(DR); - Vals.push_back(VE.getMetadataID(&*DPV.getDebugLoc())); - Vals.push_back(VE.getMetadataID(DPV.getVariable())); - Vals.push_back(VE.getMetadataID(DPV.getExpression())); - if (DPV.isDbgValue()) { - if (PushValueOrMetadata(DPV.getRawLocation())) - Stream.EmitRecord(bitc::FUNC_CODE_DEBUG_RECORD_VALUE_SIMPLE, Vals, - FUNCTION_DEBUG_RECORD_VALUE_ABBREV); - else - Stream.EmitRecord(bitc::FUNC_CODE_DEBUG_RECORD_VALUE, Vals); - } else if (DPV.isDbgDeclare()) { - Vals.push_back(VE.getMetadataID(DPV.getRawLocation())); - Stream.EmitRecord(bitc::FUNC_CODE_DEBUG_RECORD_DECLARE, Vals); - } else { - assert(DPV.isDbgAssign() && "Unexpected DbgRecord kind"); - Vals.push_back(VE.getMetadataID(DPV.getRawLocation())); - Vals.push_back(VE.getMetadataID(DPV.getAssignID())); - Vals.push_back(VE.getMetadataID(DPV.getAddressExpression())); - Vals.push_back(VE.getMetadataID(DPV.getRawAddress())); - Stream.EmitRecord(bitc::FUNC_CODE_DEBUG_RECORD_ASSIGN, Vals); - } - Vals.clear(); - } + if (DL == LastDL) { + // Just repeat the same debug loc as last time. + Stream.EmitRecord(bitc::FUNC_CODE_DEBUG_LOC_AGAIN, Vals); + continue; } + + Vals.push_back(DL->getLine()); + Vals.push_back(DL->getColumn()); + Vals.push_back(VE.getMetadataOrNullID(DL->getScope())); + Vals.push_back(VE.getMetadataOrNullID(DL->getInlinedAt())); + Vals.push_back(DL->isImplicitCode()); + Stream.EmitRecord(bitc::FUNC_CODE_DEBUG_LOC, Vals); + Vals.clear(); + + LastDL = DL; } if (BlockAddress *BA = BlockAddress::lookup(&BB)) { @@ -3845,17 +3771,7 @@ void ModuleBitcodeWriter::writeBlockInfo() { FUNCTION_INST_GEP_ABBREV) llvm_unreachable("Unexpected abbrev ordering!"); } - { - auto Abbv = std::make_shared<BitCodeAbbrev>(); - Abbv->Add(BitCodeAbbrevOp(bitc::FUNC_CODE_DEBUG_RECORD_VALUE_SIMPLE)); - Abbv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::VBR, 7)); // dbgloc - Abbv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::VBR, 7)); // var - Abbv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::VBR, 7)); // expr - Abbv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::VBR, 6)); // val - if (Stream.EmitBlockInfoAbbrev(bitc::FUNCTION_BLOCK_ID, Abbv) != - FUNCTION_DEBUG_RECORD_VALUE_ABBREV) - llvm_unreachable("Unexpected abbrev ordering! 1"); - } + Stream.ExitBlock(); } diff --git a/llvm/lib/Bitcode/Writer/BitcodeWriterPass.cpp b/llvm/lib/Bitcode/Writer/BitcodeWriterPass.cpp index de2396f31f6669..0eb9c246f2a9b6 100644 --- a/llvm/lib/Bitcode/Writer/BitcodeWriterPass.cpp +++ b/llvm/lib/Bitcode/Writer/BitcodeWriterPass.cpp @@ -18,12 +18,11 @@ #include "llvm/Pass.h" using namespace llvm; -extern bool WriteNewDbgInfoFormatToBitcode; - PreservedAnalyses BitcodeWriterPass::run(Module &M, ModuleAnalysisManager &AM) { - bool ConvertToOldDbgFormatForWrite = - M.IsNewDbgInfoFormat && !WriteNewDbgInfoFormatToBitcode; - if (ConvertToOldDbgFormatForWrite) + // RemoveDIs: there's no bitcode representation of the DbgRecord debug-info, + // convert to dbg.values before writing out. + bool IsNewDbgInfoFormat = M.IsNewDbgInfoFormat; + if (IsNewDbgInfoFormat) M.convertFromNewDbgValues(); const ModuleSummaryIndex *Index = @@ -31,7 +30,7 @@ PreservedAnalyses BitcodeWriterPass::run(Module &M, ModuleAnalysisManager &AM) { : nullptr; WriteBitcodeToFile(M, OS, ShouldPreserveUseListOrder, Index, EmitModuleHash); - if (ConvertToOldDbgFormatForWrite) + if (IsNewDbgInfoFormat) M.convertToNewDbgValues(); return PreservedAnalyses::all(); @@ -57,15 +56,16 @@ namespace { StringRef getPassName() const override { return "Bitcode Writer"; } bool runOnModule(Module &M) override { - bool ConvertToOldDbgFormatForWrite = - M.IsNewDbgInfoFormat && !WriteNewDbgInfoFormatToBitcode; - if (ConvertToOldDbgFormatForWrite) + // RemoveDIs: there's no bitcode representation of the DbgRecord + // debug-info, convert to dbg.values before writing out. + bool IsNewDbgInfoFormat = M.IsNewDbgInfoFormat; + if (IsNewDbgInfoFormat) M.convertFromNewDbgValues(); WriteBitcodeToFile(M, OS, ShouldPreserveUseListOrder, /*Index=*/nullptr, /*EmitModuleHash=*/false); - if (ConvertToOldDbgFormatForWrite) + if (IsNewDbgInfoFormat) M.convertToNewDbgValues(); return false; } diff --git a/llvm/lib/Bitcode/Writer/ValueEnumerator.cpp b/llvm/lib/Bitcode/Writer/ValueEnumerator.cpp index 1c439c9543210e..fccb2a606f7ed9 100644 --- a/llvm/lib/Bitcode/Writer/ValueEnumerator.cpp +++ b/llvm/lib/Bitcode/Writer/ValueEnumerator.cpp @@ -134,28 +134,20 @@ static OrderMap orderModule(const Module &M) { // Metadata used by instructions is decoded before the actual instructions, // so visit any constants used by it beforehand. for (const BasicBlock &BB : F) - for (const Instruction &I : BB) { - auto OrderConstantFromMetadata = [&](Metadata *MD) { - if (const auto *VAM = dyn_cast<ValueAsMetadata>(MD)) { - orderConstantValue(VAM->getValue()); - } else if (const auto *AL = dyn_cast<DIArgList>(MD)) { - for (const auto *VAM : AL->getArgs()) + for (const Instruction &I : BB) + for (const Value *V : I.operands()) { + if (const auto *MAV = dyn_cast<MetadataAsValue>(V)) { + if (const auto *VAM = + dyn_cast<ValueAsMetadata>(MAV->getMetadata())) { orderConstantValue(VAM->getValue()); + } else if (const auto *AL = + dyn_cast<DIArgList>(MAV->getMetadata())) { + for (const auto *VAM : AL->getArgs()) + orderConstantValue(VAM->getValue()); + } } - }; - - for (DPValue &DPV : filterDbgVars(I.getDbgRecordRange())) { - OrderConstantFromMetadata(DPV.getRawLocation()); - if (DPV.isDbgAssign()) - OrderConstantFromMetadata(DPV.getRawAddress()); } - for (const Value *V : I.operands()) { - if (const auto *MAV = dyn_cast<MetadataAsValue>(V)) - OrderConstantFromMetadata(MAV->getMetadata()); - } - } - for (const Argument &A : F.args()) orderValue(&A, OM); for (const BasicBlock &BB : F) @@ -269,39 +261,33 @@ static UseListOrderStack predictUseListOrder(const Module &M) { // constants in the last Function they're used in. Module-level constants // have already been visited above. for (const Function &F : llvm::reverse(M)) { - auto PredictValueOrderFromMetadata = [&](Metadata *MD) { - if (const auto *VAM = dyn_cast<ValueAsMetadata>(MD)) { - predictValueUseListOrder(VAM->getValue(), &F, OM, Stack); - } else if (const auto *AL = dyn_cast<DIArgList>(MD)) { - for (const auto *VAM : AL->getArgs()) - predictValueUseListOrder(VAM->getValue(), &F, OM, Stack); - } - }; if (F.isDeclaration()) continue; for (const BasicBlock &BB : F) predictValueUseListOrder(&BB, &F, OM, Stack); for (const Argument &A : F.args()) predictValueUseListOrder(&A, &F, OM, Stack); - for (const BasicBlock &BB : F) { + for (const BasicBlock &BB : F) for (const Instruction &I : BB) { - for (DPValue &DPV : filterDbgVars(I.getDbgRecordRange())) { - PredictValueOrderFromMetadata(DPV.getRawLocation()); - if (DPV.isDbgAssign()) - PredictValueOrderFromMetadata(DPV.getRawAddress()); - } for (const Value *Op : I.operands()) { if (isa<Constant>(*Op) || isa<InlineAsm>(*Op)) // Visit GlobalValues. predictValueUseListOrder(Op, &F, OM, Stack); - if (const auto *MAV = dyn_cast<MetadataAsValue>(Op)) - PredictValueOrderFromMetadata(MAV->getMetadata()); + if (const auto *MAV = dyn_cast<MetadataAsValue>(Op)) { + if (const auto *VAM = + dyn_cast<ValueAsMetadata>(MAV->getMetadata())) { + predictValueUseListOrder(VAM->getValue(), &F, OM, Stack); + } else if (const auto *AL = + dyn_cast<DIArgList>(MAV->getMetadata())) { + for (const auto *VAM : AL->getArgs()) + predictValueUseListOrder(VAM->getValue(), &F, OM, Stack); + } + } } if (auto *SVI = dyn_cast<ShuffleVectorInst>(&I)) predictValueUseListOrder(SVI->getShuffleMaskForBitcode(), &F, OM, Stack); predictValueUseListOrder(&I, &F, OM, Stack); } - } } // Visit globals last, since the module-level use-list block will be seen @@ -423,41 +409,6 @@ ValueEnumerator::ValueEnumerator(const Module &M, for (const BasicBlock &BB : F) for (const Instruction &I : BB) { - // Local metadata is enumerated during function-incorporation, but - // any ConstantAsMetadata arguments in a DIArgList should be examined - // now. - auto EnumerateNonLocalValuesFromMetadata = [&](Metadata *MD) { - assert(MD && "Metadata unexpectedly null"); - if (const auto *AL = dyn_cast<DIArgList>(MD)) { - for (const auto *VAM : AL->getArgs()) { - if (isa<ConstantAsMetadata>(VAM)) - EnumerateMetadata(&F, VAM); - } - return; - } - - if (!isa<LocalAsMetadata>(MD)) - EnumerateMetadata(&F, MD); - }; - - for (DbgRecord &DR : I.getDbgRecordRange()) { - if (DPLabel *DPL = dyn_cast<DPLabel>(&DR)) { - EnumerateMetadata(&F, DPL->getLabel()); - EnumerateMetadata(&F, &*DPL->getDebugLoc()); - continue; - } - // Enumerate non-local location metadata. - DPValue &DPV = cast<DPValue>(DR); - EnumerateNonLocalValuesFromMetadata(DPV.getRawLocation()); - EnumerateMetadata(&F, DPV.getExpression()); - EnumerateMetadata(&F, DPV.getVariable()); - EnumerateMetadata(&F, &*DPV.getDebugLoc()); - if (DPV.isDbgAssign()) { - EnumerateNonLocalValuesFromMetadata(DPV.getRawAddress()); - EnumerateMetadata(&F, DPV.getAssignID()); - EnumerateMetadata(&F, DPV.getAddressExpression()); - } - } for (const Use &Op : I.operands()) { auto *MD = dyn_cast<MetadataAsValue>(&Op); if (!MD) { @@ -465,7 +416,19 @@ ValueEnumerator::ValueEnumerator(const Module &M, continue; } - EnumerateNonLocalValuesFromMetadata(MD->getMetadata()); + // Local metadata is enumerated during function-incorporation, but + // any ConstantAsMetadata arguments in a DIArgList should be examined + // now. + if (isa<LocalAsMetadata>(MD->getMetadata())) + continue; + if (auto *AL = dyn_cast<DIArgList>(MD->getMetadata())) { + for (auto *VAM : AL->getArgs()) + if (isa<ConstantAsMetadata>(VAM)) + EnumerateMetadata(&F, VAM); + continue; + } + + EnumerateMetadata(&F, MD->getMetadata()); } if (auto *SVI = dyn_cast<ShuffleVectorInst>(&I)) EnumerateType(SVI->getShuffleMaskForBitcode()->getType()); @@ -1101,41 +1064,27 @@ void ValueEnumerator::incorporateFunction(const Function &F) { SmallVector<LocalAsMetadata *, 8> FnLocalMDVector; SmallVector<DIArgList *, 8> ArgListMDVector; - - auto AddFnLocalMetadata = [&](Metadata *MD) { - if (!MD) - return; - if (auto *Local = dyn_cast<LocalAsMetadata>(MD)) { - // Enumerate metadata after the instructions they might refer to. - FnLocalMDVector.push_back(Local); - } else if (auto *ArgList = dyn_cast<DIArgList>(MD)) { - ArgListMDVector.push_back(ArgList); - for (ValueAsMetadata *VMD : ArgList->getArgs()) { - if (auto *Local = dyn_cast<LocalAsMetadata>(VMD)) { - // Enumerate metadata after the instructions they might refer - // to. - FnLocalMDVector.push_back(Local); - } - } - } - }; - // Add all of the instructions. for (const BasicBlock &BB : F) { for (const Instruction &I : BB) { for (const Use &OI : I.operands()) { - if (auto *MD = dyn_cast<MetadataAsValue>(&OI)) - AddFnLocalMetadata(MD->getMetadata()); - } - /// RemoveDIs: Add non-instruction function-local metadata uses. - for (DPValue &DPV : filterDbgVars(I.getDbgRecordRange())) { - assert(DPV.getRawLocation() && "DPValue location unexpectedly null"); - AddFnLocalMetadata(DPV.getRawLocation()); - if (DPV.isDbgAssign()) { - assert(DPV.getRawAddress() && "DPValue location unexpectedly null"); - AddFnLocalMetadata(DPV.getRawAddress()); + if (auto *MD = dyn_cast<MetadataAsValue>(&OI)) { + if (auto *Local = dyn_cast<LocalAsMetadata>(MD->getMetadata())) { + // Enumerate metadata after the instructions they might refer to. + FnLocalMDVector.push_back(Local); + } else if (auto *ArgList = dyn_cast<DIArgList>(MD->getMetadata())) { + ArgListMDVector.push_back(ArgList); + for (ValueAsMetadata *VMD : ArgList->getArgs()) { + if (auto *Local = dyn_cast<LocalAsMetadata>(VMD)) { + // Enumerate metadata after the instructions they might refer + // to. + FnLocalMDVector.push_back(Local); + } + } + } } } + if (!I.getType()->isVoidTy()) EnumerateValue(&I); } diff --git a/llvm/lib/IR/BasicBlock.cpp b/llvm/lib/IR/BasicBlock.cpp index 5f0780847938f3..4dd1bdd6e2f4ad 100644 --- a/llvm/lib/IR/BasicBlock.cpp +++ b/llvm/lib/IR/BasicBlock.cpp @@ -36,11 +36,6 @@ cl::opt<bool> "through iterators, eliminating intrinsics"), cl::init(true)); -bool WriteNewDbgInfoFormatToBitcode /*set default value in cl::init() below*/; -cl::opt<bool, true> WriteNewDbgInfoFormatToBitcode2( - "write-experimental-debuginfo-iterators-to-bitcode", cl::Hidden, - cl::location(WriteNewDbgInfoFormatToBitcode), cl::init(false)); - DPMarker *BasicBlock::createMarker(Instruction *I) { assert(IsNewDbgInfoFormat && "Tried to create a marker in a non new debug-info block!"); diff --git a/llvm/lib/Linker/IRMover.cpp b/llvm/lib/Linker/IRMover.cpp index a7e6db82e5c23c..37d21119447b9c 100644 --- a/llvm/lib/Linker/IRMover.cpp +++ b/llvm/lib/Linker/IRMover.cpp @@ -8,7 +8,6 @@ #include "llvm/Linker/IRMover.h" #include "LinkDiagnosticInfo.h" -#include "llvm/ADT/ScopeExit.h" #include "llvm/ADT/SetVector.h" #include "llvm/ADT/SmallPtrSet.h" #include "llvm/ADT/SmallString.h" @@ -1547,23 +1546,7 @@ Error IRLinker::run() { if (Error Err = SrcM->getMaterializer()->materializeMetadata()) return Err; - // Convert source module to match dest for the duration of the link. - bool SrcModuleNewDbgFormat = SrcM->IsNewDbgInfoFormat; - if (DstM.IsNewDbgInfoFormat != SrcM->IsNewDbgInfoFormat) { - if (DstM.IsNewDbgInfoFormat) - SrcM->convertToNewDbgValues(); - else - SrcM->convertFromNewDbgValues(); - } - // Undo debug mode conversion afterwards. - auto Cleanup = make_scope_exit([&]() { - if (SrcModuleNewDbgFormat != SrcM->IsNewDbgInfoFormat) { - if (SrcModuleNewDbgFormat) - SrcM->convertToNewDbgValues(); - else - SrcM->convertFromNewDbgValues(); - } - }); + DstM.IsNewDbgInfoFormat = SrcM->IsNewDbgInfoFormat; // Inherit the target data from the source module if the destination module // doesn't have one already. @@ -1792,6 +1775,8 @@ IRMover::IRMover(Module &M) : Composite(M) { Error IRMover::move(std::unique_ptr<Module> Src, ArrayRef<GlobalValue *> ValuesToLink, LazyCallback AddLazyFor, bool IsPerformingImport) { + if (getModule().IsNewDbgInfoFormat) + Src->convertToNewDbgValues(); IRLinker TheIRLinker(Composite, SharedMDs, IdentifiedStructTypes, std::move(Src), ValuesToLink, std::move(AddLazyFor), IsPerformingImport); diff --git a/llvm/lib/Transforms/IPO/ThinLTOBitcodeWriter.cpp b/llvm/lib/Transforms/IPO/ThinLTOBitcodeWriter.cpp index 6b9a1f6777fc30..dd6062d303d42e 100644 --- a/llvm/lib/Transforms/IPO/ThinLTOBitcodeWriter.cpp +++ b/llvm/lib/Transforms/IPO/ThinLTOBitcodeWriter.cpp @@ -575,7 +575,7 @@ bool writeThinLTOBitcode(raw_ostream &OS, raw_ostream *ThinLinkOS, } } // anonymous namespace -extern bool WriteNewDbgInfoFormatToBitcode; + PreservedAnalyses llvm::ThinLTOBitcodeWriterPass::run(Module &M, ModuleAnalysisManager &AM) { FunctionAnalysisManager &FAM = @@ -583,9 +583,8 @@ llvm::ThinLTOBitcodeWriterPass::run(Module &M, ModuleAnalysisManager &AM) { // RemoveDIs: there's no bitcode representation of the DPValue debug-info, // convert to dbg.values before writing out. - bool ConvertToOldDbgFormatForWrite = - M.IsNewDbgInfoFormat && !WriteNewDbgInfoFormatToBitcode; - if (ConvertToOldDbgFormatForWrite) + bool IsNewDbgInfoFormat = M.IsNewDbgInfoFormat; + if (IsNewDbgInfoFormat) M.convertFromNewDbgValues(); bool Changed = writeThinLTOBitcode( @@ -595,7 +594,7 @@ llvm::ThinLTOBitcodeWriterPass::run(Module &M, ModuleAnalysisManager &AM) { }, M, &AM.getResult<ModuleSummaryIndexAnalysis>(M)); - if (ConvertToOldDbgFormatForWrite) + if (IsNewDbgInfoFormat) M.convertToNewDbgValues(); return Changed ? PreservedAnalyses::none() : PreservedAnalyses::all(); diff --git a/llvm/test/Bitcode/dbg-record-roundtrip.ll b/llvm/test/Bitcode/dbg-record-roundtrip.ll deleted file mode 100644 index be6f65c34214ea..00000000000000 --- a/llvm/test/Bitcode/dbg-record-roundtrip.ll +++ /dev/null @@ -1,128 +0,0 @@ -;; Roundtrip tests. -; RUN: llvm-as --write-experimental-debuginfo-iterators-to-bitcode=true %s -o - | llvm-dis | FileCheck %s -;; Check that verify-uselistorder passes regardless of input format. -; RUN: llvm-as %s -o - --write-experimental-debuginfo-iterators-to-bitcode=true | verify-uselistorder -; RUN: verify-uselistorder %s - -;; Confirm we're producing RemoveDI records from various tools. -; RUN: opt %s -o - --write-experimental-debuginfo-iterators-to-bitcode=true | llvm-bcanalyzer - | FileCheck %s --check-prefix=BITCODE -; RUN: llvm-as %s -o - --write-experimental-debuginfo-iterators-to-bitcode=true | llvm-bcanalyzer - | FileCheck %s --check-prefix=BITCODE -; BITCODE-DAG: DEBUG_RECORD_LABEL -; BITCODE-DAG: DEBUG_RECORD_VALUE -; BITCODE-DAG: DEBUG_RECORD_ASSIGN -; BITCODE-DAG: DEBUG_RECORD_DECLARE - -;; Check that llvm-link doesn't explode if we give it diff erent formats to -;; link. -; RUN: llvm-as %s --experimental-debuginfo-iterators=true --write-experimental-debuginfo-iterators-to-bitcode=true -o - | llvm-link %s --experimental-debuginfo-iterators=false -; RUN: llvm-as %s --experimental-debuginfo-iterators=false -o - | llvm-link %s --experimental-debuginfo-iterators=true - -;; Checks inline. - -@g = internal dso_local global i32 0, align 4, !dbg !0 - -define internal dso_local noundef i32 @_Z3funv(i32 %p, ptr %storage) !dbg !13 { -entry: -;; Dbg record at top of block, check dbg.value configurations. -; CHECK: entry: -; CHECK-NEXT: dbg.value(metadata i32 %p, metadata ![[e:[0-9]+]], metadata !DIExpression()), !dbg ![[dbg:[0-9]+]] -; CHECK-NEXT: dbg.value(metadata ![[empty:[0-9]+]], metadata ![[e]], metadata !DIExpression()), !dbg ![[dbg]] -; CHECK-NEXT: dbg.value(metadata i32 poison, metadata ![[e]], metadata !DIExpression()), !dbg ![[dbg]] -; CHECK-NEXT: dbg.value(metadata i32 1, metadata ![[f:[0-9]+]], metadata !DIExpression()), !dbg ![[dbg]] - tail call void @llvm.dbg.value(metadata i32 %p, metadata !32, metadata !DIExpression()), !dbg !19 - tail call void @llvm.dbg.value(metadata !29, metadata !32, metadata !DIExpression()), !dbg !19 - tail call void @llvm.dbg.value(metadata i32 poison, metadata !32, metadata !DIExpression()), !dbg !19 - tail call void @llvm.dbg.value(metadata i32 1, metadata !33, metadata !DIExpression()), !dbg !19 -;; Arglist with an argument, constant, local use before def, poison. -; CHECK-NEXT: dbg.value(metadata !DIArgList(i32 %p, i32 0, i32 %0, i32 poison), metadata ![[f]], metadata !DIExpression(DW_OP_LLVM_arg, 0, DW_OP_LLVM_arg, 1, DW_OP_plus, DW_OP_LLVM_arg, 2, DW_OP_LLVM_arg, 3, DW_OP_plus, DW_OP_minus)), !dbg ![[dbg]] - tail call void @llvm.dbg.value(metadata !DIArgList(i32 %p, i32 0, i32 %0, i32 poison), metadata !33, metadata !DIExpression(DW_OP_LLVM_arg, 0, DW_OP_LLVM_arg, 1, DW_OP_plus, DW_OP_LLVM_arg, 2, DW_OP_LLVM_arg, 3, DW_OP_plus, DW_OP_minus)), !dbg !19 -;; Check dbg.assign use before def (value, addr and ID). Check expression order too. -; CHECK: dbg.assign(metadata i32 %0, metadata ![[i:[0-9]+]], metadata !DIExpression(DW_OP_plus_uconst, 0), -; CHECK-SAME: metadata ![[ID:[0-9]+]], metadata ptr %a, metadata !DIExpression(DW_OP_plus_uconst, 1)), !dbg ![[dbg]] - tail call void @llvm.dbg.assign(metadata i32 %0, metadata !36, metadata !DIExpression(DW_OP_plus_uconst, 0), metadata !37, metadata ptr %a, metadata !DIExpression(DW_OP_plus_uconst, 1)), !dbg !19 - %a = alloca i32, align 4, !DIAssignID !37 -; CHECK: %a = alloca i32, align 4, !DIAssignID ![[ID]] -;; Check dbg.declare configurations. -; CHECK-NEXT: dbg.declare(metadata ptr %a, metadata ![[a:[0-9]+]], metadata !DIExpression()), !dbg ![[dbg]] -; CHECK-NEXT: dbg.declare(metadata ![[empty:[0-9]+]], metadata ![[b:[0-9]+]], metadata !DIExpression()), !dbg ![[dbg]] -; CHECK-NEXT: dbg.declare(metadata ptr poison, metadata ![[c:[0-9]+]], metadata !DIExpression()), !dbg ![[dbg]] -; CHECK-NEXT: dbg.declare(metadata ptr null, metadata ![[d:[0-9]+]], metadata !DIExpression()), !dbg ![[dbg]] -; CHECK-NEXT: dbg.declare(metadata ptr @g, metadata ![[h:[0-9]+]], metadata !DIExpression()), !dbg ![[dbg]] - tail call void @llvm.dbg.declare(metadata ptr %a, metadata !17, metadata !DIExpression()), !dbg !19 - tail call void @llvm.dbg.declare(metadata !29, metadata !28, metadata !DIExpression()), !dbg !19 - tail call void @llvm.dbg.declare(metadata ptr poison, metadata !30, metadata !DIExpression()), !dbg !19 - tail call void @llvm.dbg.declare(metadata ptr null, metadata !31, metadata !DIExpression()), !dbg !19 - tail call void @llvm.dbg.declare(metadata ptr @g, metadata !35, metadata !DIExpression()), !dbg !19 -;; Argument value dbg.declare. -; CHECK: dbg.declare(metadata ptr %storage, metadata ![[g:[0-9]+]], metadata !DIExpression()), !dbg ![[dbg]] - tail call void @llvm.dbg.declare(metadata ptr %storage, metadata !34, metadata !DIExpression()), !dbg !19 -;; Use before def dbg.value. -; CHECK: dbg.value(metadata i32 %0, metadata ![[e]], metadata !DIExpression()), !dbg ![[dbg]] - tail call void @llvm.dbg.value(metadata i32 %0, metadata !32, metadata !DIExpression()), !dbg !19 - %0 = load i32, ptr @g, align 4, !dbg !20 -;; Non-argument local value dbg.value. -; CHECK: dbg.value(metadata i32 %0, metadata ![[e]], metadata !DIExpression()), !dbg ![[dbg]] - tail call void @llvm.dbg.value(metadata i32 %0, metadata !32, metadata !DIExpression()), !dbg !19 - store i32 %0, ptr %a, align 4, !dbg !19 - %1 = load i32, ptr %a, align 4, !dbg !25 -; CHECK: dbg.label(metadata ![[label:[0-9]+]]), !dbg ![[dbg]] - tail call void @llvm.dbg.label(metadata !38), !dbg !19 - ret i32 %1, !dbg !27 -} - -; CHECK-DAG: ![[a]] = !DILocalVariable(name: "a", -; CHECK-DAG: ![[b]] = !DILocalVariable(name: "b", -; CHECK-DAG: ![[c]] = !DILocalVariable(name: "c", -; CHECK-DAG: ![[d]] = !DILocalVariable(name: "d", -; CHECK-DAG: ![[e]] = !DILocalVariable(name: "e", -; CHECK-DAG: ![[f]] = !DILocalVariable(name: "f", -; CHECK-DAG: ![[g]] = !DILocalVariable(name: "g", -; CHECK-DAG: ![[h]] = !DILocalVariable(name: "h", -; CHECK-DAG: ![[i]] = !DILocalVariable(name: "i", -; CHECK-DAG: ![[empty]] = !{} -; CHECK-DAG: ![[label]] = !DILabel - -declare void @llvm.dbg.declare(metadata, metadata, metadata) -declare void @llvm.dbg.value(metadata, metadata, metadata) -declare void @llvm.dbg.assign(metadata, metadata, metadata, metadata, metadata, metadata) -declare void @llvm.dbg.label(metadata) - -!llvm.dbg.cu = !{!2} -!llvm.module.flags = !{!6, !7, !8, !9, !10, !11} -!llvm.ident = !{!12} - -!0 = !DIGlobalVariableExpression(var: !1, expr: !DIExpression()) -!1 = distinct !DIGlobalVariable(name: "g", scope: !2, file: !3, line: 1, type: !5, isLocal: false, isDefinition: true) -!2 = distinct !DICompileUnit(language: DW_LANG_C_plus_plus_14, file: !3, producer: "clang version 19.0.0", isOptimized: true, runtimeVersion: 0, emissionKind: FullDebug, globals: !4, splitDebugInlining: false, nameTableKind: None) -!3 = !DIFile(filename: "test.cpp", directory: "/") -!4 = !{!0} -!5 = !DIBasicType(name: "int", size: 32, encoding: DW_ATE_signed) -!6 = !{i32 7, !"Dwarf Version", i32 5} -!7 = !{i32 2, !"Debug Info Version", i32 3} -!8 = !{i32 1, !"wchar_size", i32 4} -!9 = !{i32 8, !"PIC Level", i32 2} -!10 = !{i32 7, !"PIE Level", i32 2} -!11 = !{i32 7, !"uwtable", i32 2} -!12 = !{!"clang version 19.0.0"} -!13 = distinct !DISubprogram(name: "fun", linkageName: "_Z3funv", scope: !3, file: !3, line: 2, type: !14, scopeLine: 2, flags: DIFlagPrototyped | DIFlagAllCallsDescribed, spFlags: DISPFlagDefinition | DISPFlagOptimized, unit: !2, retainedNodes: !16) -!14 = !DISubroutineType(types: !15) -!15 = !{!5} -!16 = !{!17} -!17 = !DILocalVariable(name: "a", scope: !13, file: !3, line: 3, type: !5) -!18 = !DILocation(line: 3, column: 3, scope: !13) -!19 = !DILocation(line: 3, column: 7, scope: !13) -!20 = !DILocation(line: 3, column: 11, scope: !13) -!25 = !DILocation(line: 4, column: 12, scope: !13) -!26 = !DILocation(line: 5, column: 1, scope: !13) -!27 = !DILocation(line: 4, column: 5, scope: !13) -!28 = !DILocalVariable(name: "b", scope: !13, file: !3, line: 3, type: !5) -!29 = !{} -!30 = !DILocalVariable(name: "c", scope: !13, file: !3, line: 3, type: !5) -!31 = !DILocalVariable(name: "d", scope: !13, file: !3, line: 3, type: !5) -!32 = !DILocalVariable(name: "e", scope: !13, file: !3, line: 3, type: !5) -!33 = !DILocalVariable(name: "f", scope: !13, file: !3, line: 3, type: !5) -!34 = !DILocalVariable(name: "g", scope: !13, file: !3, line: 3, type: !5) -!35 = !DILocalVariable(name: "h", scope: !13, file: !3, line: 3, type: !5) -!36 = !DILocalVariable(name: "i", scope: !13, file: !3, line: 3, type: !5) -!37 = distinct !DIAssignID() -!38 = !DILabel(scope: !13, name: "label", file: !3, line: 1) diff --git a/llvm/tools/llvm-as/llvm-as.cpp b/llvm/tools/llvm-as/llvm-as.cpp index fd852563838f37..1c869e1739319e 100644 --- a/llvm/tools/llvm-as/llvm-as.cpp +++ b/llvm/tools/llvm-as/llvm-as.cpp @@ -67,7 +67,6 @@ static cl::opt<std::string> ClDataLayout("data-layout", cl::desc("data layout string to use"), cl::value_desc("layout-string"), cl::init(""), cl::cat(AsCat)); -extern bool WriteNewDbgInfoFormatToBitcode; static void WriteOutputFile(const Module *M, const ModuleSummaryIndex *Index) { // Infer the output filename if needed. @@ -140,12 +139,6 @@ int main(int argc, char **argv) { Err.print(argv[0], errs()); return 1; } - - // Convert to new debug format if requested. - assert(!M->IsNewDbgInfoFormat && "Unexpectedly in new debug mode"); - if (UseNewDbgInfoFormat && WriteNewDbgInfoFormatToBitcode) - M->convertToNewDbgValues(); - std::unique_ptr<ModuleSummaryIndex> Index = std::move(ModuleAndIndex.Index); if (!DisableVerify) { diff --git a/llvm/tools/verify-uselistorder/verify-uselistorder.cpp b/llvm/tools/verify-uselistorder/verify-uselistorder.cpp index d929ae09958a1f..9afe6817fefb9f 100644 --- a/llvm/tools/verify-uselistorder/verify-uselistorder.cpp +++ b/llvm/tools/verify-uselistorder/verify-uselistorder.cpp @@ -166,11 +166,6 @@ std::unique_ptr<Module> TempFile::readBitcode(LLVMContext &Context) const { "verify-uselistorder: error: "); return nullptr; } - - // verify-uselistoder currently only supports old-style debug info mode. - // FIXME: Update mapping code for RemoveDIs. - assert(!ModuleOr.get()->IsNewDbgInfoFormat && - "Unexpectedly in new debug info mode"); return std::move(ModuleOr.get()); } @@ -180,9 +175,6 @@ std::unique_ptr<Module> TempFile::readAssembly(LLVMContext &Context) const { std::unique_ptr<Module> M = parseAssemblyFile(Filename, Err, Context); if (!M.get()) Err.print("verify-uselistorder", errs()); - // verify-uselistoder currently only supports old-style debug info mode. - // FIXME: Update mapping code for RemoveDIs. - assert(!M->IsNewDbgInfoFormat && "Unexpectedly in new debug info mode"); return M; } @@ -549,9 +541,6 @@ int main(int argc, char **argv) { // Load the input module... std::unique_ptr<Module> M = parseIRFile(InputFilename, Err, Context); - // verify-uselistoder currently only supports old-style debug info mode. - // FIXME: Update mapping code for RemoveDIs. - assert(!M->IsNewDbgInfoFormat && "Unexpectedly in new debug info mode"); if (!M.get()) { Err.print(argv[0], errs()); _______________________________________________ llvm-branch-commits mailing list llvm-branch-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-branch-commits