[clang] 91b77dc - [IR] Don't use TrackingMDNodeRef for DebugLoc (#200649)
via cfe-commits
cfe-commits at lists.llvm.org
Mon Jun 1 01:05:56 PDT 2026
Author: Alexis Engelke
Date: 2026-06-01T10:05:48+02:00
New Revision: 91b77dc685cf628cbf925e43e25f2f86a912b38b
URL: https://github.com/llvm/llvm-project/commit/91b77dc685cf628cbf925e43e25f2f86a912b38b
DIFF: https://github.com/llvm/llvm-project/commit/91b77dc685cf628cbf925e43e25f2f86a912b38b.diff
LOG: [IR] Don't use TrackingMDNodeRef for DebugLoc (#200649)
TrackingMDNodeRef is expensive and the tracking functionality is only
used when parsing textual LLVM IR. Therefore, store a plain DILocation
pointer in DebugLoc and update the debug locs explicitly when parsing
finishes.
Invalid debug metadata now fails directly at parsing and not (just)
later when verifying. A consequence is that old-style DILocations cannot
be parsed from textual IR anymore.
As related cleanup, remove the now-unused hasTrivialDestructor() on
TrackingMDRef.
While work on changing DILocation to no longer be metadata is on the
way, it is going to take a while to finish, we can get this immediate
performance and max-rss improvement earlier.
Added:
llvm/test/Assembler/dbg-declare-invalid-debug-loc.ll
llvm/test/Assembler/dbg.ll
Modified:
clang/lib/CodeGen/CGClass.cpp
clang/lib/CodeGen/CGDebugInfo.h
llvm/include/llvm/AsmParser/LLParser.h
llvm/include/llvm/CodeGen/MachineInstr.h
llvm/include/llvm/CodeGen/SelectionDAGNodes.h
llvm/include/llvm/IR/DebugLoc.h
llvm/include/llvm/IR/DebugProgramInstruction.h
llvm/include/llvm/IR/TrackingMDRef.h
llvm/lib/AsmParser/LLParser.cpp
llvm/lib/CodeGen/MIRParser/MIParser.cpp
llvm/lib/CodeGen/MachineInstr.cpp
llvm/lib/CodeGen/SelectionDAG/InstrEmitter.cpp
llvm/lib/Frontend/OpenMP/OMPIRBuilder.cpp
llvm/lib/IR/AutoUpgrade.cpp
llvm/lib/IR/Core.cpp
llvm/lib/IR/DebugInfo.cpp
llvm/lib/IR/DebugLoc.cpp
llvm/lib/IR/DebugProgramInstruction.cpp
llvm/lib/IR/Metadata.cpp
llvm/test/CodeGen/X86/stack-protector-dbginfo.ll
llvm/test/DebugInfo/Generic/2009-10-16-Phi.ll
llvm/test/DebugInfo/Generic/location-verifier.ll
llvm/test/DebugInfo/MIR/X86/regcoalescer.mir
llvm/test/Transforms/MergeFunc/mergefunc-preserve-nonnull.ll
llvm/test/Verifier/RemoveDI/llvm.dbg.intrinsic-dbg-attachment.ll
llvm/test/Verifier/dbg.ll
llvm/test/tools/llvm-reduce/remove-metadata.ll
llvm/unittests/Analysis/IRSimilarityIdentifierTest.cpp
llvm/unittests/CodeGen/MachineInstrTest.cpp
llvm/unittests/Frontend/OpenMPIRBuilderTest.cpp
llvm/unittests/IR/InstructionsTest.cpp
llvm/unittests/SandboxIR/SandboxIRTest.cpp
Removed:
llvm/test/Verifier/dbg-declare-invalid-debug-loc.ll
################################################################################
diff --git a/clang/lib/CodeGen/CGClass.cpp b/clang/lib/CodeGen/CGClass.cpp
index de11e8bca43f1..d6aa877617515 100644
--- a/clang/lib/CodeGen/CGClass.cpp
+++ b/clang/lib/CodeGen/CGClass.cpp
@@ -1796,7 +1796,7 @@ class DestroyField final : public EHScopeStack::Cleanup {
class DeclAsInlineDebugLocation {
CGDebugInfo *DI;
- llvm::MDNode *InlinedAt;
+ llvm::DILocation *InlinedAt;
std::optional<ApplyDebugLocation> Location;
public:
diff --git a/clang/lib/CodeGen/CGDebugInfo.h b/clang/lib/CodeGen/CGDebugInfo.h
index 62b1afa224ffc..4c385c26efc4e 100644
--- a/clang/lib/CodeGen/CGDebugInfo.h
+++ b/clang/lib/CodeGen/CGDebugInfo.h
@@ -72,7 +72,7 @@ class CGDebugInfo {
llvm::DIFile *CurLocFile = nullptr;
unsigned CurLocLine = 0;
unsigned CurLocColumn = 0;
- llvm::MDNode *CurInlinedAt = nullptr;
+ llvm::DILocation *CurInlinedAt = nullptr;
llvm::DIType *VTablePtrType = nullptr;
llvm::DIType *ClassTy = nullptr;
llvm::DICompositeType *ObjTy = nullptr;
@@ -477,10 +477,10 @@ class CGDebugInfo {
/// Update the current inline scope. All subsequent calls to \p EmitLocation
/// will create a location with this inlinedAt field.
- void setInlinedAt(llvm::MDNode *InlinedAt) { CurInlinedAt = InlinedAt; }
+ void setInlinedAt(llvm::DILocation *InlinedAt) { CurInlinedAt = InlinedAt; }
/// \return the current inline scope.
- llvm::MDNode *getInlinedAt() const { return CurInlinedAt; }
+ llvm::DILocation *getInlinedAt() const { return CurInlinedAt; }
// Converts a SourceLocation to a DebugLoc
llvm::DebugLoc SourceLocToDebugLoc(SourceLocation Loc);
diff --git a/llvm/include/llvm/AsmParser/LLParser.h b/llvm/include/llvm/AsmParser/LLParser.h
index 938a45951e074..b545b7886e26e 100644
--- a/llvm/include/llvm/AsmParser/LLParser.h
+++ b/llvm/include/llvm/AsmParser/LLParser.h
@@ -185,6 +185,11 @@ namespace llvm {
/// scoped local types.
SmallVector<DISubprogram *> NewDistinctSPs;
+ SmallVector<std::tuple<LocTy, DbgRecord *, TrackingMDNodeRef>>
+ PendingDbgRecords;
+ SmallVector<std::tuple<LocTy, Instruction *, TrackingMDNodeRef>>
+ PendingDbgInsts;
+
/// Only the llvm-as tool may set this to false to bypass
/// UpgradeDebuginfo so it can generate broken bitcode.
bool UpgradeDebugInfo;
diff --git a/llvm/include/llvm/CodeGen/MachineInstr.h b/llvm/include/llvm/CodeGen/MachineInstr.h
index 0a7dd3f4eef65..09a9b83ccdd8d 100644
--- a/llvm/include/llvm/CodeGen/MachineInstr.h
+++ b/llvm/include/llvm/CodeGen/MachineInstr.h
@@ -1921,10 +1921,7 @@ class MachineInstr
/// Replace current source information with new such.
/// Avoid using this, the constructor argument is preferable.
- void setDebugLoc(DebugLoc DL) {
- DbgLoc = std::move(DL);
- assert(DbgLoc.hasTrivialDestructor() && "Expected trivial destructor");
- }
+ void setDebugLoc(DebugLoc DL) { DbgLoc = std::move(DL); }
/// Erase an operand from an instruction, leaving it with one
/// fewer operand than it started with.
diff --git a/llvm/include/llvm/CodeGen/SelectionDAGNodes.h b/llvm/include/llvm/CodeGen/SelectionDAGNodes.h
index 5654817a92930..c8104814ba77f 100644
--- a/llvm/include/llvm/CodeGen/SelectionDAGNodes.h
+++ b/llvm/include/llvm/CodeGen/SelectionDAGNodes.h
@@ -1232,7 +1232,6 @@ END_TWO_BYTE_PACK()
: NodeType(Opc), ValueList(VTs.VTs), NumValues(VTs.NumVTs),
IROrder(Order), debugLoc(std::move(dl)) {
memset(&RawSDNodeBits, 0, sizeof(RawSDNodeBits));
- assert(debugLoc.hasTrivialDestructor() && "Expected trivial destructor");
assert(NumValues == VTs.NumVTs &&
"NumValues wasn't wide enough for its operands!");
}
diff --git a/llvm/include/llvm/IR/DebugLoc.h b/llvm/include/llvm/IR/DebugLoc.h
index 484adbb6e6a6c..7fd7564357769 100644
--- a/llvm/include/llvm/IR/DebugLoc.h
+++ b/llvm/include/llvm/IR/DebugLoc.h
@@ -70,73 +70,63 @@ enum class DebugLocKind : uint8_t {
Temporary
};
-// Extends TrackingMDNodeRef to also store a DebugLocKind and Origin,
+// Extends a DILocation pointer to also store a DebugLocKind and Origin,
// allowing Debugify to ignore intentionally-empty DebugLocs and display the
// code responsible for generating unintentionally-empty DebugLocs.
// Currently we only need to track the Origin of this DILoc when using a
// DebugLoc that is not annotated (i.e. has DebugLocKind::Normal) and has a
// null DILocation, so only collect the origin stacktrace in those cases.
-class DILocAndCoverageTracking : public TrackingMDNodeRef, public DbgLocOrigin {
+class DILocAndCoverageTracking : public DbgLocOrigin {
+ DILocation *Loc;
+
public:
DebugLocKind Kind;
// Default constructor for empty DebugLocs.
DILocAndCoverageTracking()
- : TrackingMDNodeRef(nullptr), DbgLocOrigin(true),
- Kind(DebugLocKind::Normal) {}
- // Valid or nullptr MDNode*, no annotative DebugLocKind.
- DILocAndCoverageTracking(const MDNode *Loc)
- : TrackingMDNodeRef(const_cast<MDNode *>(Loc)), DbgLocOrigin(!Loc),
+ : DbgLocOrigin(true), Loc(nullptr), Kind(DebugLocKind::Normal) {}
+ // Valid or nullptr DILocation*, no annotative DebugLocKind.
+ DILocAndCoverageTracking(const DILocation *Loc)
+ : DbgLocOrigin(!Loc), Loc(const_cast<DILocation *>(Loc)),
Kind(DebugLocKind::Normal) {}
- LLVM_ABI DILocAndCoverageTracking(const DILocation *Loc);
- // Explicit DebugLocKind, which always means a nullptr MDNode*.
+ // Explicit DebugLocKind, which always means a nullptr DILocation*.
DILocAndCoverageTracking(DebugLocKind Kind)
- : TrackingMDNodeRef(nullptr), DbgLocOrigin(Kind == DebugLocKind::Normal),
- Kind(Kind) {}
+ : DbgLocOrigin(Kind == DebugLocKind::Normal), Loc(nullptr), Kind(Kind) {}
+
+ operator DILocation *() const { return Loc; }
};
template <> struct simplify_type<DILocAndCoverageTracking> {
- using SimpleType = MDNode *;
+ using SimpleType = DILocation *;
- static MDNode *getSimplifiedValue(DILocAndCoverageTracking &MD) {
- return MD.get();
+ static DILocation *getSimplifiedValue(DILocAndCoverageTracking &MD) {
+ return MD;
}
};
template <> struct simplify_type<const DILocAndCoverageTracking> {
- using SimpleType = MDNode *;
+ using SimpleType = DILocation *;
- static MDNode *getSimplifiedValue(const DILocAndCoverageTracking &MD) {
- return MD.get();
+ static DILocation *getSimplifiedValue(const DILocAndCoverageTracking &MD) {
+ return MD;
}
};
-using DebugLocTrackingRef = DILocAndCoverageTracking;
+using DebugLocRef = DILocAndCoverageTracking;
#else
-using DebugLocTrackingRef = TrackingMDNodeRef;
+using DebugLocRef = DILocation *;
#endif // LLVM_ENABLE_DEBUGLOC_TRACKING_COVERAGE
/// A debug info location.
///
-/// This class is a wrapper around a tracking reference to an \a DILocation
+/// This class is a wrapper around an \a DILocation
/// pointer.
///
/// To avoid extra includes, \a DebugLoc doubles the \a DILocation API with a
/// one based on relatively opaque \a MDNode pointers.
class DebugLoc {
-
- DebugLocTrackingRef Loc;
+ DebugLocRef Loc = {};
public:
- DebugLoc() = default;
-
/// Construct from an \a DILocation.
- LLVM_ABI DebugLoc(const DILocation *L);
-
- /// Construct from an \a MDNode.
- ///
- /// Note: if \c N is not an \a DILocation, a verifier check will fail, and
- /// accessors will crash. However, construction from other nodes is
- /// supported in order to handle forward references when reading textual
- /// IR.
- LLVM_ABI explicit DebugLoc(const MDNode *N);
+ DebugLoc(const DILocation *L = nullptr) : Loc(const_cast<DILocation *>(L)) {}
#if LLVM_ENABLE_DEBUGLOC_TRACKING_COVERAGE
DebugLoc(DebugLocKind Kind) : Loc(Kind) {}
@@ -225,7 +215,7 @@ class DebugLoc {
///
/// \pre !*this or \c isa<DILocation>(getAsMDNode()).
/// @{
- LLVM_ABI DILocation *get() const;
+ DILocation *get() const { return Loc; }
operator DILocation *() const { return get(); }
DILocation *operator->() const { return get(); }
DILocation &operator*() const { return *get(); }
@@ -239,9 +229,6 @@ class DebugLoc {
/// \a Instruction::hasMetadata().
explicit operator bool() const { return Loc; }
- /// Check whether this has a trivial destructor.
- bool hasTrivialDestructor() const { return Loc.hasTrivialDestructor(); }
-
enum { ReplaceLastInlinedAt = true };
/// Rebuild the entire inlined-at chain for this instruction so that the top
/// of the chain now is inlined-at the new call site.
@@ -287,7 +274,7 @@ class DebugLoc {
LLVM_ABI DebugLoc getFnDebugLoc() const;
/// Return \c this as a bar \a MDNode.
- MDNode *getAsMDNode() const { return Loc; }
+ LLVM_ABI MDNode *getAsMDNode() const;
/// Check if the DebugLoc corresponds to an implicit code.
LLVM_ABI bool isImplicitCode() const;
diff --git a/llvm/include/llvm/IR/DebugProgramInstruction.h b/llvm/include/llvm/IR/DebugProgramInstruction.h
index 20f11b4fb8bac..b7cedc60689c7 100644
--- a/llvm/include/llvm/IR/DebugProgramInstruction.h
+++ b/llvm/include/llvm/IR/DebugProgramInstruction.h
@@ -240,7 +240,7 @@ class DbgLabelRecord : public DbgRecord {
/// This constructor intentionally left private, so that it is only called via
/// "createUnresolvedDbgLabelRecord", which clearly expresses that it is for
/// parsing only.
- DbgLabelRecord(MDNode *Label, MDNode *DL);
+ DbgLabelRecord(MDNode *Label);
public:
LLVM_ABI DbgLabelRecord(DILabel *Label, DebugLoc DL);
@@ -249,8 +249,7 @@ class DbgLabelRecord : public DbgRecord {
/// MDNodes. Trying to access the resulting DbgLabelRecord's fields before
/// they are resolved, or if they resolve to the wrong type, will result in a
/// crash.
- LLVM_ABI static DbgLabelRecord *createUnresolvedDbgLabelRecord(MDNode *Label,
- MDNode *DL);
+ LLVM_ABI static DbgLabelRecord *createUnresolvedDbgLabelRecord(MDNode *Label);
LLVM_ABI DbgLabelRecord *clone() const;
LLVM_ABI void print(raw_ostream &O, bool IsForDebug = false) const;
@@ -323,7 +322,7 @@ class DbgVariableRecord : public DbgRecord, protected DebugValueUser {
/// depending on which Type is passed.
DbgVariableRecord(LocationType Type, Metadata *Val, MDNode *Variable,
MDNode *Expression, MDNode *AssignID, Metadata *Address,
- MDNode *AddressExpression, MDNode *DI);
+ MDNode *AddressExpression);
public:
/// Used to create DbgVariableRecords during parsing, where some metadata
@@ -333,11 +332,9 @@ class DbgVariableRecord : public DbgRecord, protected DebugValueUser {
/// for all types of DbgVariableRecords for simplicity while parsing, but
/// asserts if any necessary fields are empty or unused fields are not empty,
/// i.e. if the #dbg_assign fields are used for a non-dbg-assign type.
- LLVM_ABI static DbgVariableRecord *
- createUnresolvedDbgVariableRecord(LocationType Type, Metadata *Val,
- MDNode *Variable, MDNode *Expression,
- MDNode *AssignID, Metadata *Address,
- MDNode *AddressExpression, MDNode *DI);
+ LLVM_ABI static DbgVariableRecord *createUnresolvedDbgVariableRecord(
+ LocationType Type, Metadata *Val, MDNode *Variable, MDNode *Expression,
+ MDNode *AssignID, Metadata *Address, MDNode *AddressExpression);
LLVM_ABI static DbgVariableRecord *
createDVRAssign(Value *Val, DILocalVariable *Variable,
diff --git a/llvm/include/llvm/IR/TrackingMDRef.h b/llvm/include/llvm/IR/TrackingMDRef.h
index edbe0778d1e58..b8cd5fbb6f41c 100644
--- a/llvm/include/llvm/IR/TrackingMDRef.h
+++ b/llvm/include/llvm/IR/TrackingMDRef.h
@@ -69,13 +69,6 @@ class TrackingMDRef {
track();
}
- /// Check whether this has a trivial destructor.
- ///
- /// If \c MD isn't replaceable, the destructor will be a no-op.
- bool hasTrivialDestructor() const {
- return !MD || !MetadataTracking::isReplaceable(*MD);
- }
-
bool operator==(const TrackingMDRef &X) const { return MD == X.MD; }
bool operator!=(const TrackingMDRef &X) const { return MD != X.MD; }
@@ -130,9 +123,6 @@ template <class T> class TypedTrackingMDRef {
void reset() { Ref.reset(); }
void reset(T *MD) { Ref.reset(static_cast<Metadata *>(MD)); }
-
- /// Check whether this has a trivial destructor.
- bool hasTrivialDestructor() const { return Ref.hasTrivialDestructor(); }
};
using TrackingMDNodeRef = TypedTrackingMDRef<MDNode>;
diff --git a/llvm/lib/AsmParser/LLParser.cpp b/llvm/lib/AsmParser/LLParser.cpp
index b9c36c28d04cd..848132538b450 100644
--- a/llvm/lib/AsmParser/LLParser.cpp
+++ b/llvm/lib/AsmParser/LLParser.cpp
@@ -188,6 +188,11 @@ void LLParser::dropUnknownMetadataReferences() {
for (GlobalVariable &GV : M->globals())
GV.eraseMetadataIf(Pred);
+ llvm::erase_if(PendingDbgRecords,
+ [](const auto &E) { return std::get<2>(E)->isTemporary(); });
+ llvm::erase_if(PendingDbgInsts,
+ [](const auto &E) { return std::get<2>(E)->isTemporary(); });
+
for (const auto &[ID, Info] : make_early_inc_range(ForwardRefMDNodes)) {
// Check whether there is only a single use left, which would be in our
// own NumberedMetadata.
@@ -425,6 +430,20 @@ bool LLParser::validateEndOfModule(bool UpgradeDebugInfo) {
"use of undefined metadata '!" +
Twine(ForwardRefMDNodes.begin()->first) + "'");
+ // Set debug locations.
+ for (auto [Loc, DR, MD] : PendingDbgRecords) {
+ if (auto *DI = dyn_cast<DILocation>(MD))
+ DR->setDebugLoc(DebugLoc(DI));
+ else
+ return error(Loc, "invalid debug location");
+ }
+ for (auto [Loc, I, MD] : PendingDbgInsts) {
+ if (auto *DI = dyn_cast<DILocation>(MD))
+ I->setDebugLoc(DebugLoc(DI));
+ else
+ return error(Loc, "invalid !dbg metadata");
+ }
+
// Resolve metadata cycles.
for (auto &N : NumberedMetadata) {
if (N.second && !N.second->isResolved())
@@ -2407,11 +2426,14 @@ bool LLParser::parseInstructionMetadata(Instruction &Inst) {
unsigned MDK;
MDNode *N;
+ auto Loc = Lex.getLoc();
if (parseMetadataAttachment(MDK, N))
return true;
if (MDK == LLVMContext::MD_DIAssignID)
TempDIAssignIDAttachments[N].push_back(&Inst);
+ else if (MDK == LLVMContext::MD_dbg)
+ PendingDbgInsts.emplace_back(Loc, &Inst, N);
else
Inst.setMetadata(MDK, N);
@@ -7479,7 +7501,8 @@ bool LLParser::parseDebugRecord(DbgRecord *&DR, PerFunctionState &PFS) {
return true;
if (parseToken(lltok::rparen, "Expected ')' here"))
return true;
- DR = DbgLabelRecord::createUnresolvedDbgLabelRecord(Label, DbgLoc);
+ DR = DbgLabelRecord::createUnresolvedDbgLabelRecord(Label);
+ PendingDbgRecords.emplace_back(DVRLoc, DR, DbgLoc);
return false;
}
@@ -7547,7 +7570,8 @@ bool LLParser::parseDebugRecord(DbgRecord *&DR, PerFunctionState &PFS) {
return true;
DR = DbgVariableRecord::createUnresolvedDbgVariableRecord(
ValueType, ValLocMD, Variable, Expression, AssignID, AddressLocation,
- AddressExpression, DebugLoc);
+ AddressExpression);
+ PendingDbgRecords.emplace_back(DVRLoc, DR, DebugLoc);
return false;
}
//===----------------------------------------------------------------------===//
diff --git a/llvm/lib/CodeGen/MIRParser/MIParser.cpp b/llvm/lib/CodeGen/MIRParser/MIParser.cpp
index 6c646787ae623..2924c0dda2390 100644
--- a/llvm/lib/CodeGen/MIRParser/MIParser.cpp
+++ b/llvm/lib/CodeGen/MIRParser/MIParser.cpp
@@ -1196,9 +1196,9 @@ bool MIParser::parse(MachineInstr *&MI) {
} else {
return error("expected a metadata node after 'debug-location'");
}
- if (!isa<DILocation>(Node))
+ DebugLocation = DebugLoc(dyn_cast<DILocation>(Node));
+ if (!DebugLocation)
return error("referenced metadata is not a DILocation");
- DebugLocation = DebugLoc(Node);
}
// Parse the machine memory operands.
diff --git a/llvm/lib/CodeGen/MachineInstr.cpp b/llvm/lib/CodeGen/MachineInstr.cpp
index cc3dae91c16d2..374c92241b9fb 100644
--- a/llvm/lib/CodeGen/MachineInstr.cpp
+++ b/llvm/lib/CodeGen/MachineInstr.cpp
@@ -101,8 +101,6 @@ MachineInstr::MachineInstr(MachineFunction &MF, const MCInstrDesc &TID,
DebugLoc DL, bool NoImp)
: MCID(&TID), NumOperands(0), Flags(0), AsmPrinterFlags(0),
Opcode(TID.Opcode), DebugInstrNum(0), DbgLoc(std::move(DL)) {
- assert(DbgLoc.hasTrivialDestructor() && "Expected trivial destructor");
-
// Reserve space for the expected number of operands.
if (unsigned NumOps = MCID->getNumOperands() + MCID->implicit_defs().size() +
MCID->implicit_uses().size()) {
@@ -121,8 +119,6 @@ MachineInstr::MachineInstr(MachineFunction &MF, const MachineInstr &MI)
: MCID(&MI.getDesc()), NumOperands(0), Flags(0), AsmPrinterFlags(0),
Opcode(MI.getOpcode()), DebugInstrNum(0), Info(MI.Info),
DbgLoc(MI.getDebugLoc()) {
- assert(DbgLoc.hasTrivialDestructor() && "Expected trivial destructor");
-
CapOperands = OperandCapacity::get(MI.getNumOperands());
Operands = MF.allocateOperandArray(CapOperands);
diff --git a/llvm/lib/CodeGen/SelectionDAG/InstrEmitter.cpp b/llvm/lib/CodeGen/SelectionDAG/InstrEmitter.cpp
index 322766dee5aa9..fe81d4b2351e0 100644
--- a/llvm/lib/CodeGen/SelectionDAG/InstrEmitter.cpp
+++ b/llvm/lib/CodeGen/SelectionDAG/InstrEmitter.cpp
@@ -706,12 +706,10 @@ void InstrEmitter::EmitRegSequence(SDNode *Node, VRBaseMapType &VRBaseMap,
/// EmitDbgValue - Generate machine instruction for a dbg_value node.
///
-MachineInstr *
-InstrEmitter::EmitDbgValue(SDDbgValue *SD,
- VRBaseMapType &VRBaseMap) {
- DebugLoc DL = SD->getDebugLoc();
+MachineInstr *InstrEmitter::EmitDbgValue(SDDbgValue *SD,
+ VRBaseMapType &VRBaseMap) {
assert(cast<DILocalVariable>(SD->getVariable())
- ->isValidLocationForIntrinsic(DL) &&
+ ->isValidLocationForIntrinsic(SD->getDebugLoc()) &&
"Expected inlined-at fields to agree");
SD->setIsEmitted();
diff --git a/llvm/lib/Frontend/OpenMP/OMPIRBuilder.cpp b/llvm/lib/Frontend/OpenMP/OMPIRBuilder.cpp
index f35c7b7c6e467..c03497e162c9a 100644
--- a/llvm/lib/Frontend/OpenMP/OMPIRBuilder.cpp
+++ b/llvm/lib/Frontend/OpenMP/OMPIRBuilder.cpp
@@ -2392,9 +2392,9 @@ OpenMPIRBuilder::InsertPointOrErrorTy OpenMPIRBuilder::createTaskloop(
Value *TaskDupFn = *TaskDupFnOrErr;
OI->PostOutlineCB = [this, Ident, LBVal, UBVal, StepVal, Untied,
- TaskloopAllocaBB, CLI, Loc, TaskDupFn, ToBeDeleted,
- IfCond, GrainSize, NoGroup, Sched, FakeLB, FakeUB,
- FakeStep, FakeSharedsTy, Final, Mergeable, Priority,
+ TaskloopAllocaBB, CLI, TaskDupFn, ToBeDeleted, IfCond,
+ GrainSize, NoGroup, Sched, FakeLB, FakeUB, FakeStep,
+ FakeSharedsTy, Final, Mergeable, Priority,
NumOfCollapseLoops](Function &OutlinedFn) mutable {
// Replace the Stale CI by appropriate RTL function call.
assert(OutlinedFn.hasOneUse() &&
diff --git a/llvm/lib/IR/AutoUpgrade.cpp b/llvm/lib/IR/AutoUpgrade.cpp
index a3699344e918a..86a8a3ec06ff3 100644
--- a/llvm/lib/IR/AutoUpgrade.cpp
+++ b/llvm/lib/IR/AutoUpgrade.cpp
@@ -4894,32 +4894,24 @@ static Metadata *unwrapMAVMetadataOp(CallBase *CI, unsigned Op) {
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 = DbgLabelRecord::createUnresolvedDbgLabelRecord(unwrapMAVOp(CI, 0),
- CI->getDebugLoc());
+ DR = DbgLabelRecord::createUnresolvedDbgLabelRecord(unwrapMAVOp(CI, 0));
} else if (Name == "assign") {
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));
+ unwrapMAVOp(CI, 5));
} else if (Name == "declare") {
DR = DbgVariableRecord::createUnresolvedDbgVariableRecord(
DbgVariableRecord::LocationType::Declare, unwrapMAVMetadataOp(CI, 0),
- unwrapMAVOp(CI, 1), unwrapMAVOp(CI, 2), nullptr, nullptr, nullptr,
- getDebugLocSafe(CI));
+ unwrapMAVOp(CI, 1), unwrapMAVOp(CI, 2), nullptr, nullptr, nullptr);
} else if (Name == "addr") {
// Upgrade dbg.addr to dbg.value with DW_OP_deref.
MDNode *ExprNode = unwrapMAVOp(CI, 2);
@@ -4930,8 +4922,7 @@ static void upgradeDbgIntrinsicToDbgRecord(StringRef Name, CallBase *CI) {
}
DR = DbgVariableRecord::createUnresolvedDbgVariableRecord(
DbgVariableRecord::LocationType::Value, unwrapMAVMetadataOp(CI, 0),
- unwrapMAVOp(CI, 1), ExprNode, nullptr, nullptr, nullptr,
- getDebugLocSafe(CI));
+ unwrapMAVOp(CI, 1), ExprNode, nullptr, nullptr, nullptr);
} else if (Name == "value") {
// An old version of dbg.value had an extra offset argument.
unsigned VarOp = 1;
@@ -4947,8 +4938,9 @@ static void upgradeDbgIntrinsicToDbgRecord(StringRef Name, CallBase *CI) {
DR = DbgVariableRecord::createUnresolvedDbgVariableRecord(
DbgVariableRecord::LocationType::Value, unwrapMAVMetadataOp(CI, 0),
unwrapMAVOp(CI, VarOp), unwrapMAVOp(CI, ExprOp), nullptr, nullptr,
- nullptr, getDebugLocSafe(CI));
+ nullptr);
}
+ DR->setDebugLoc(CI->getDebugLoc());
assert(DR && "Unhandled intrinsic kind in upgrade to DbgRecord");
CI->getParent()->insertDbgRecordBefore(DR, CI->getIterator());
}
diff --git a/llvm/lib/IR/Core.cpp b/llvm/lib/IR/Core.cpp
index 5e6b03d01b6ba..e64341aa0d1d7 100644
--- a/llvm/lib/IR/Core.cpp
+++ b/llvm/lib/IR/Core.cpp
@@ -3486,14 +3486,14 @@ LLVMMetadataRef LLVMGetCurrentDebugLocation2(LLVMBuilderRef Builder) {
void LLVMSetCurrentDebugLocation2(LLVMBuilderRef Builder, LLVMMetadataRef Loc) {
if (Loc)
- unwrap(Builder)->SetCurrentDebugLocation(DebugLoc(unwrap<MDNode>(Loc)));
+ unwrap(Builder)->SetCurrentDebugLocation(DebugLoc(unwrap<DILocation>(Loc)));
else
unwrap(Builder)->SetCurrentDebugLocation(DebugLoc());
}
void LLVMSetCurrentDebugLocation(LLVMBuilderRef Builder, LLVMValueRef L) {
- MDNode *Loc =
- L ? cast<MDNode>(unwrap<MetadataAsValue>(L)->getMetadata()) : nullptr;
+ DILocation *Loc =
+ L ? cast<DILocation>(unwrap<MetadataAsValue>(L)->getMetadata()) : nullptr;
unwrap(Builder)->SetCurrentDebugLocation(DebugLoc(Loc));
}
diff --git a/llvm/lib/IR/DebugInfo.cpp b/llvm/lib/IR/DebugInfo.cpp
index f65973f2b5735..7889de7ebb49a 100644
--- a/llvm/lib/IR/DebugInfo.cpp
+++ b/llvm/lib/IR/DebugInfo.cpp
@@ -1990,7 +1990,7 @@ LLVMMetadataRef LLVMInstructionGetDebugLoc(LLVMValueRef Inst) {
void LLVMInstructionSetDebugLoc(LLVMValueRef Inst, LLVMMetadataRef Loc) {
if (Loc)
- unwrap<Instruction>(Inst)->setDebugLoc(DebugLoc(unwrap<MDNode>(Loc)));
+ unwrap<Instruction>(Inst)->setDebugLoc(DebugLoc(unwrap<DILocation>(Loc)));
else
unwrap<Instruction>(Inst)->setDebugLoc(DebugLoc());
}
diff --git a/llvm/lib/IR/DebugLoc.cpp b/llvm/lib/IR/DebugLoc.cpp
index a3c98aec98c81..c5eda4e81b1ce 100644
--- a/llvm/lib/IR/DebugLoc.cpp
+++ b/llvm/lib/IR/DebugLoc.cpp
@@ -33,21 +33,9 @@ void DbgLocOrigin::addTrace() {
}
#endif // LLVM_ENABLE_DEBUGLOC_TRACKING_ORIGIN
-#if LLVM_ENABLE_DEBUGLOC_TRACKING_COVERAGE
-DILocAndCoverageTracking::DILocAndCoverageTracking(const DILocation *L)
- : TrackingMDNodeRef(const_cast<DILocation *>(L)), DbgLocOrigin(!L),
- Kind(DebugLocKind::Normal) {}
-#endif // LLVM_ENABLE_DEBUGLOC_TRACKING_COVERAGE
-
//===----------------------------------------------------------------------===//
// DebugLoc Implementation
//===----------------------------------------------------------------------===//
-DebugLoc::DebugLoc(const DILocation *L) : Loc(const_cast<DILocation *>(L)) {}
-DebugLoc::DebugLoc(const MDNode *L) : Loc(const_cast<MDNode *>(L)) {}
-
-DILocation *DebugLoc::get() const {
- return cast_or_null<DILocation>(Loc.get());
-}
unsigned DebugLoc::getLine() const {
assert(get() && "Expected valid DebugLoc");
@@ -82,6 +70,8 @@ DebugLoc DebugLoc::getFnDebugLoc() const {
return DebugLoc();
}
+MDNode *DebugLoc::getAsMDNode() const { return Loc; }
+
bool DebugLoc::isImplicitCode() const {
if (DILocation *Loc = get())
return Loc->isImplicitCode();
diff --git a/llvm/lib/IR/DebugProgramInstruction.cpp b/llvm/lib/IR/DebugProgramInstruction.cpp
index 9efa3c71c0bb8..98335728665ba 100644
--- a/llvm/lib/IR/DebugProgramInstruction.cpp
+++ b/llvm/lib/IR/DebugProgramInstruction.cpp
@@ -145,8 +145,8 @@ DbgRecord::createDebugIntrinsic(Module *M, Instruction *InsertBefore) const {
llvm_unreachable("unsupported DbgRecord kind");
}
-DbgLabelRecord::DbgLabelRecord(MDNode *Label, MDNode *DL)
- : DbgRecord(LabelKind, DebugLoc(DL)), Label(Label) {
+DbgLabelRecord::DbgLabelRecord(MDNode *Label)
+ : DbgRecord(LabelKind, DebugLoc()), Label(Label) {
assert(Label && "Unexpected nullptr");
assert((isa<DILabel>(Label) || Label->isTemporary()) &&
"Label type must be or resolve to a DILabel");
@@ -156,26 +156,25 @@ DbgLabelRecord::DbgLabelRecord(DILabel *Label, DebugLoc DL)
assert(Label && "Unexpected nullptr");
}
-DbgLabelRecord *DbgLabelRecord::createUnresolvedDbgLabelRecord(MDNode *Label,
- MDNode *DL) {
- return new DbgLabelRecord(Label, DL);
+DbgLabelRecord *DbgLabelRecord::createUnresolvedDbgLabelRecord(MDNode *Label) {
+ return new DbgLabelRecord(Label);
}
DbgVariableRecord::DbgVariableRecord(DbgVariableRecord::LocationType Type,
Metadata *Val, MDNode *Variable,
MDNode *Expression, MDNode *AssignID,
Metadata *Address,
- MDNode *AddressExpression, MDNode *DI)
- : DbgRecord(ValueKind, DebugLoc(DI)),
+ MDNode *AddressExpression)
+ : DbgRecord(ValueKind, DebugLoc()),
DebugValueUser({Val, Address, AssignID}), Type(Type), Variable(Variable),
Expression(Expression), AddressExpression(AddressExpression) {}
DbgVariableRecord *DbgVariableRecord::createUnresolvedDbgVariableRecord(
DbgVariableRecord::LocationType Type, Metadata *Val, MDNode *Variable,
MDNode *Expression, MDNode *AssignID, Metadata *Address,
- MDNode *AddressExpression, MDNode *DI) {
+ MDNode *AddressExpression) {
return new DbgVariableRecord(Type, Val, Variable, Expression, AssignID,
- Address, AddressExpression, DI);
+ Address, AddressExpression);
}
DbgVariableRecord *
diff --git a/llvm/lib/IR/Metadata.cpp b/llvm/lib/IR/Metadata.cpp
index 82f224438eec5..491c788fc4445 100644
--- a/llvm/lib/IR/Metadata.cpp
+++ b/llvm/lib/IR/Metadata.cpp
@@ -1754,7 +1754,7 @@ void Instruction::setMetadata(unsigned KindID, MDNode *Node) {
// Handle 'dbg' as a special case since it is not stored in the hash table.
if (KindID == LLVMContext::MD_dbg) {
- DbgLoc = DebugLoc(Node);
+ DbgLoc = DebugLoc(cast_or_null<DILocation>(Node));
return;
}
diff --git a/llvm/test/Verifier/dbg-declare-invalid-debug-loc.ll b/llvm/test/Assembler/dbg-declare-invalid-debug-loc.ll
similarity index 83%
rename from llvm/test/Verifier/dbg-declare-invalid-debug-loc.ll
rename to llvm/test/Assembler/dbg-declare-invalid-debug-loc.ll
index c521a9b8eb11b..534bee253c6f8 100644
--- a/llvm/test/Verifier/dbg-declare-invalid-debug-loc.ll
+++ b/llvm/test/Assembler/dbg-declare-invalid-debug-loc.ll
@@ -1,14 +1,10 @@
-; RUN: opt %s -o /dev/null -S 2>&1 | FileCheck %s
+; RUN: not 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.
+; caught at the end of the parser.
;
-; 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
+; CHECK: invalid !dbg metadata
declare void @llvm.dbg.declare(metadata, metadata, metadata)
diff --git a/llvm/test/Assembler/dbg.ll b/llvm/test/Assembler/dbg.ll
new file mode 100644
index 0000000000000..63d9c0aa382dd
--- /dev/null
+++ b/llvm/test/Assembler/dbg.ll
@@ -0,0 +1,12 @@
+; RUN: not llvm-as -disable-output <%s 2>&1 | FileCheck %s
+
+define void @foo() {
+ ret void, !dbg !{}
+; CHECK: invalid !dbg metadata
+}
+
+!llvm.module.flags = !{!0}
+!0 = !{i32 2, !"Debug Info Version", i32 3}
+!1 = distinct !DISubprogram(type: !3)
+!2 = !{null}
+!3 = !DISubroutineType(types: !2)
diff --git a/llvm/test/CodeGen/X86/stack-protector-dbginfo.ll b/llvm/test/CodeGen/X86/stack-protector-dbginfo.ll
index 27ca9fd47e085..a001ab5dd9b6b 100644
--- a/llvm/test/CodeGen/X86/stack-protector-dbginfo.ll
+++ b/llvm/test/CodeGen/X86/stack-protector-dbginfo.ll
@@ -21,7 +21,7 @@ entry:
define i32 @IgnoreIntrinsicTest() #1 {
; IGNORE_INTRIN: IgnoreIntrinsicTest:
%1 = alloca i32, align 4
- call void @llvm.dbg.declare(metadata ptr %1, metadata !73, metadata !DIExpression()), !dbg !74
+ call void @llvm.dbg.declare(metadata ptr %1, metadata !73, metadata !DIExpression()), !dbg !75
store volatile i32 1, ptr %1, align 4
%2 = load volatile i32, ptr %1, align 4
%3 = mul nsw i32 %2, 42
diff --git a/llvm/test/DebugInfo/Generic/2009-10-16-Phi.ll b/llvm/test/DebugInfo/Generic/2009-10-16-Phi.ll
index e14653f6fcf28..2acb7389e0c8b 100644
--- a/llvm/test/DebugInfo/Generic/2009-10-16-Phi.ll
+++ b/llvm/test/DebugInfo/Generic/2009-10-16-Phi.ll
@@ -1,4 +1,4 @@
-; RUN: llvm-as %s -disable-output
+; RUN: not llvm-as %s -disable-output 2>&1 | FileCheck %s
define i32 @foo() {
E:
@@ -6,6 +6,7 @@ E:
B1:
br label %B2
B2:
+; CHECK: error: invalid !dbg metadata
%0 = phi i32 [ 0, %E ], [ 1, %B1 ], !dbg !0
ret i32 %0
}
diff --git a/llvm/test/DebugInfo/Generic/location-verifier.ll b/llvm/test/DebugInfo/Generic/location-verifier.ll
index 19b510ded3cb7..fccf094719846 100644
--- a/llvm/test/DebugInfo/Generic/location-verifier.ll
+++ b/llvm/test/DebugInfo/Generic/location-verifier.ll
@@ -1,4 +1,4 @@
-; RUN: llvm-as -disable-output -o - < %s 2>&1 | FileCheck %s
+; RUN: not llvm-as -disable-output -o - < %s 2>&1 | FileCheck %s
; ModuleID = 'test.c'
target datalayout = "e-m:o-i64:64-f80:128-n8:16:32:64-S128"
target triple = "x86_64-apple-macosx10.10.0"
@@ -27,7 +27,6 @@ attributes #0 = { nounwind ssp uwtable }
!10 = !{i32 2, !"Debug Info Version", i32 3}
!11 = !{i32 1, !"PIC Level", i32 2}
!12 = !{!"clang version 3.7.0 "}
-; An old-style DILocation should not pass verify.
-; CHECK: invalid !dbg metadata attachment
+; An old-style DILocation should not parse.
+; CHECK: invalid !dbg metadata
!13 = !{i32 2, i32 2, !4, null}
-; CHECK: warning: ignoring invalid debug info
diff --git a/llvm/test/DebugInfo/MIR/X86/regcoalescer.mir b/llvm/test/DebugInfo/MIR/X86/regcoalescer.mir
index 30c3bd27b0a2a..25d7048df3627 100644
--- a/llvm/test/DebugInfo/MIR/X86/regcoalescer.mir
+++ b/llvm/test/DebugInfo/MIR/X86/regcoalescer.mir
@@ -6,7 +6,7 @@
define i32 @main() local_unnamed_addr !dbg !14 {
entry:
- %shl = shl i32 undef, undef, !dbg !19
+ %shl = shl i32 undef, undef, !dbg !20
tail call void @llvm.dbg.value(metadata i32 %shl, metadata !18, metadata !DIExpression()), !dbg !20
ret i32 %shl, !dbg !21
}
diff --git a/llvm/test/Transforms/MergeFunc/mergefunc-preserve-nonnull.ll b/llvm/test/Transforms/MergeFunc/mergefunc-preserve-nonnull.ll
index 3481d53b626fc..544bba4909ea1 100644
--- a/llvm/test/Transforms/MergeFunc/mergefunc-preserve-nonnull.ll
+++ b/llvm/test/Transforms/MergeFunc/mergefunc-preserve-nonnull.ll
@@ -55,7 +55,7 @@ define void @noundef_dbg(ptr %0, ptr %1) {
; CHECK-NEXT: tail call void @noundef(ptr [[TMP0:%.*]], ptr [[TMP1:%.*]])
; CHECK-NEXT: ret void
;
- %3 = load ptr, ptr %1, align 8, !noundef !0, !dbg !1
+ %3 = load ptr, ptr %1, align 8, !noundef !0, !dbg !8
store ptr %3, ptr %0, align 8
ret void
}
@@ -79,3 +79,4 @@ define void @noalias_2(ptr %0, ptr %1) {
!5 = !{!5}
!6 = !{!6, !5}
!7 = !{!6}
+!8 = !DILocation(line: 1, column: 1, scope: !{})
diff --git a/llvm/test/Verifier/RemoveDI/llvm.dbg.intrinsic-dbg-attachment.ll b/llvm/test/Verifier/RemoveDI/llvm.dbg.intrinsic-dbg-attachment.ll
index db1f62c07da74..b1d70e2f975c4 100644
--- a/llvm/test/Verifier/RemoveDI/llvm.dbg.intrinsic-dbg-attachment.ll
+++ b/llvm/test/Verifier/RemoveDI/llvm.dbg.intrinsic-dbg-attachment.ll
@@ -1,22 +1,6 @@
; RUN: llvm-as -disable-output <%s 2>&1 | FileCheck %s
define void @foo() {
entry:
- #dbg_value(
- ptr undef,
- !DILocalVariable(scope: !1),
- !DIExpression(),
- !{})
-; CHECK-LABEL: invalid #dbg record DILocation
-; CHECK-NEXT: #dbg_value({{.*}})
-
- #dbg_declare(
- ptr undef,
- !DILocalVariable(scope: !1),
- !DIExpression(),
- !{})
-; CHECK-LABEL: invalid #dbg record DILocation
-; CHECK-NEXT: #dbg_declare({{.*}})
-
#dbg_value(
ptr undef,
!DILocalVariable(scope: !1),
diff --git a/llvm/test/Verifier/dbg.ll b/llvm/test/Verifier/dbg.ll
index 20958e9ede0b1..0202c1346cc0a 100644
--- a/llvm/test/Verifier/dbg.ll
+++ b/llvm/test/Verifier/dbg.ll
@@ -8,10 +8,7 @@ entry:
; CHECK-NEXT: ![[IA]] = !{}
exit:
- ret void, !dbg !{}
-; CHECK: invalid !dbg metadata attachment
-; CHECK-NEXT: ret void, !dbg ![[LOC:[0-9]+]]
-; CHECK-NEXT: ![[LOC]] = !{}
+ ret void
}
; CHECK: warning: ignoring invalid debug info
diff --git a/llvm/test/tools/llvm-reduce/remove-metadata.ll b/llvm/test/tools/llvm-reduce/remove-metadata.ll
index 3ff2d8b2d6848..ae86277642fed 100644
--- a/llvm/test/tools/llvm-reduce/remove-metadata.ll
+++ b/llvm/test/tools/llvm-reduce/remove-metadata.ll
@@ -7,10 +7,10 @@
; RUN: llvm-reduce -abort-on-invalid-reduction --test %python --test-arg %p/Inputs/remove-metadata.py %s -o %t
; RUN: FileCheck --implicit-check-not=! %s < %t
- at global = global i32 0, !dbg !0
+ at global = global i32 0, !foo !0
-define void @main() !dbg !0 {
- ret void, !dbg !0
+define void @main() !foo !0 {
+ ret void, !foo !0
}
!uninteresting = !{!0}
diff --git a/llvm/unittests/Analysis/IRSimilarityIdentifierTest.cpp b/llvm/unittests/Analysis/IRSimilarityIdentifierTest.cpp
index a4187c242870d..c74f9c63af219 100644
--- a/llvm/unittests/Analysis/IRSimilarityIdentifierTest.cpp
+++ b/llvm/unittests/Analysis/IRSimilarityIdentifierTest.cpp
@@ -1318,12 +1318,13 @@ TEST(IRInstructionMapper, DebugInfoInvisible) {
define i32 @f(i32 %a, i32 %b) {
then:
%0 = add i32 %a, %b
- #dbg_value(i32 0, !0, !0, !0)
+ #dbg_value(i32 0, !0, !0, !1)
%1 = add i32 %a, %b
ret i32 0
}
- !0 = distinct !{!"test\00", i32 10})";
+ !0 = distinct !{!"test\00", i32 10}
+ !1 = !DILocation(line: 1, column: 1, scope: !{}))";
LLVMContext Context;
std::unique_ptr<Module> M = makeLLVMModule(Context, ModuleString);
@@ -1925,12 +1926,12 @@ TEST(IRSimilarityCandidate, IdenticalWithDebug) {
define i32 @f(i32 %a, i32 %b) {
bb0:
%0 = add i32 %a, %b
- #dbg_value(i32 0, !0, !0, !0)
+ #dbg_value(i32 0, !0, !0, !2)
%1 = add i32 %b, %a
ret i32 0
bb1:
%2 = add i32 %a, %b
- #dbg_value(i32 1, !1, !1, !1)
+ #dbg_value(i32 1, !1, !1, !2)
%3 = add i32 %b, %a
ret i32 0
bb2:
@@ -1940,7 +1941,8 @@ TEST(IRSimilarityCandidate, IdenticalWithDebug) {
}
!0 = distinct !{!"test\00", i32 10}
- !1 = distinct !{!"test\00", i32 11})";
+ !1 = distinct !{!"test\00", i32 11}
+ !2 = !DILocation(line: 1, column: 1, scope: !{}))";
LLVMContext Context;
std::unique_ptr<Module> M = makeLLVMModule(Context, ModuleString);
diff --git a/llvm/unittests/CodeGen/MachineInstrTest.cpp b/llvm/unittests/CodeGen/MachineInstrTest.cpp
index e53044a50b606..47e260104775f 100644
--- a/llvm/unittests/CodeGen/MachineInstrTest.cpp
+++ b/llvm/unittests/CodeGen/MachineInstrTest.cpp
@@ -512,8 +512,12 @@ MATCHER_P(HasMIMetadata, MIMD, "") {
TEST(MachineInstrBuilder, BuildMI) {
LLVMContext Ctx;
MDNode *PCS = MDNode::getDistinct(Ctx, {});
- MDNode *DI = MDNode::getDistinct(Ctx, {});
- DebugLoc DL(DI);
+ DIFile *DIF = DIFile::getDistinct(Ctx, "filename", "");
+ DISubprogram *DIS = DISubprogram::getDistinct(
+ Ctx, nullptr, "", "", DIF, 0, nullptr, 0, nullptr, 0, 0, DINode::FlagZero,
+ DISubprogram::SPFlagZero, nullptr);
+ DILocation *DIL = DILocation::get(Ctx, 1, 5, DIS);
+ DebugLoc DL(DIL);
MIMetadata MIMD(DL, PCS);
EXPECT_EQ(MIMD.getDL(), DL);
EXPECT_EQ(MIMD.getPCSections(), PCS);
diff --git a/llvm/unittests/Frontend/OpenMPIRBuilderTest.cpp b/llvm/unittests/Frontend/OpenMPIRBuilderTest.cpp
index 06b8d90d41e0a..23432e2de2287 100644
--- a/llvm/unittests/Frontend/OpenMPIRBuilderTest.cpp
+++ b/llvm/unittests/Frontend/OpenMPIRBuilderTest.cpp
@@ -2878,8 +2878,6 @@ TEST_F(OpenMPIRBuilderTest, MasterDirective) {
F->setName("func");
IRBuilder<> Builder(BB);
- OpenMPIRBuilder::LocationDescription Loc({Builder.saveIP(), DL});
-
AllocaInst *PrivAI = nullptr;
BasicBlock *EntryBB = nullptr;
@@ -2960,8 +2958,6 @@ TEST_F(OpenMPIRBuilderTest, MaskedDirective) {
F->setName("func");
IRBuilder<> Builder(BB);
- OpenMPIRBuilder::LocationDescription Loc({Builder.saveIP(), DL});
-
AllocaInst *PrivAI = nullptr;
BasicBlock *EntryBB = nullptr;
@@ -3043,8 +3039,6 @@ TEST_F(OpenMPIRBuilderTest, CriticalDirective) {
F->setName("func");
IRBuilder<> Builder(BB);
- OpenMPIRBuilder::LocationDescription Loc({Builder.saveIP(), DL});
-
Type *PrivType = F->arg_begin()->getType();
AllocaInst *PrivAI = Builder.CreateAlloca(PrivType);
@@ -3128,8 +3122,6 @@ TEST_F(OpenMPIRBuilderTest, OrderedDirectiveDependSource) {
IRBuilder<> Builder(BB);
LLVMContext &Ctx = M->getContext();
- OpenMPIRBuilder::LocationDescription Loc({Builder.saveIP(), DL});
-
InsertPointTy AllocaIP(&F->getEntryBlock(),
F->getEntryBlock().getFirstInsertionPt());
@@ -3213,8 +3205,6 @@ TEST_F(OpenMPIRBuilderTest, OrderedDirectiveDependSink) {
IRBuilder<> Builder(BB);
LLVMContext &Ctx = M->getContext();
- OpenMPIRBuilder::LocationDescription Loc({Builder.saveIP(), DL});
-
InsertPointTy AllocaIP(&F->getEntryBlock(),
F->getEntryBlock().getFirstInsertionPt());
@@ -3297,8 +3287,6 @@ TEST_F(OpenMPIRBuilderTest, OrderedDirectiveThreads) {
F->setName("func");
IRBuilder<> Builder(BB);
- OpenMPIRBuilder::LocationDescription Loc({Builder.saveIP(), DL});
-
Type *PrivType = F->arg_begin()->getType();
AllocaInst *PrivAI = Builder.CreateAlloca(PrivType, nullptr, "priv.inst");
@@ -3374,8 +3362,6 @@ TEST_F(OpenMPIRBuilderTest, OrderedDirectiveSimd) {
F->setName("func");
IRBuilder<> Builder(BB);
- OpenMPIRBuilder::LocationDescription Loc({Builder.saveIP(), DL});
-
Type *PrivType = F->arg_begin()->getType();
AllocaInst *PrivAI = Builder.CreateAlloca(PrivType, nullptr, "priv.inst");
@@ -3441,8 +3427,6 @@ TEST_F(OpenMPIRBuilderTest, CopyinBlocks) {
F->setName("func");
IRBuilder<> Builder(BB);
- OpenMPIRBuilder::LocationDescription Loc({Builder.saveIP(), DL});
-
IntegerType *Int32 = Type::getInt32Ty(M->getContext());
AllocaInst *MasterAddress = Builder.CreateAlloca(Builder.getPtrTy());
AllocaInst *PrivAddress = Builder.CreateAlloca(Builder.getPtrTy());
@@ -3477,8 +3461,6 @@ TEST_F(OpenMPIRBuilderTest, SingleDirective) {
F->setName("func");
IRBuilder<> Builder(BB);
- OpenMPIRBuilder::LocationDescription Loc({Builder.saveIP(), DL});
-
AllocaInst *PrivAI = nullptr;
BasicBlock *EntryBB = nullptr;
@@ -3571,8 +3553,6 @@ TEST_F(OpenMPIRBuilderTest, SingleDirectiveNowait) {
F->setName("func");
IRBuilder<> Builder(BB);
- OpenMPIRBuilder::LocationDescription Loc({Builder.saveIP(), DL});
-
AllocaInst *PrivAI = nullptr;
BasicBlock *EntryBB = nullptr;
@@ -3685,8 +3665,6 @@ TEST_F(OpenMPIRBuilderTest, SingleDirectiveCopyPrivate) {
F->setName("func");
IRBuilder<> Builder(BB);
- OpenMPIRBuilder::LocationDescription Loc({Builder.saveIP(), DL});
-
AllocaInst *PrivAI = nullptr;
BasicBlock *EntryBB = nullptr;
@@ -3989,8 +3967,6 @@ TEST_F(OpenMPIRBuilderTest, OMPAtomicUpdate) {
F->setName("func");
IRBuilder<> Builder(BB);
- OpenMPIRBuilder::LocationDescription Loc({Builder.saveIP(), DL});
-
IntegerType *Int32 = Type::getInt32Ty(M->getContext());
AllocaInst *XVal = Builder.CreateAlloca(Int32);
XVal->setName("AtomicVar");
@@ -4058,8 +4034,6 @@ TEST_F(OpenMPIRBuilderTest, OMPAtomicUpdateFloat) {
F->setName("func");
IRBuilder<> Builder(BB);
- OpenMPIRBuilder::LocationDescription Loc({Builder.saveIP(), DL});
-
Type *FloatTy = Type::getFloatTy(M->getContext());
AllocaInst *XVal = Builder.CreateAlloca(FloatTy);
XVal->setName("AtomicVar");
@@ -4126,8 +4100,6 @@ TEST_F(OpenMPIRBuilderTest, OMPAtomicUpdateIntr) {
F->setName("func");
IRBuilder<> Builder(BB);
- OpenMPIRBuilder::LocationDescription Loc({Builder.saveIP(), DL});
-
Type *IntTy = Type::getInt32Ty(M->getContext());
AllocaInst *XVal = Builder.CreateAlloca(IntTy);
XVal->setName("AtomicVar");
@@ -4195,8 +4167,6 @@ TEST_F(OpenMPIRBuilderTest, OMPAtomicCapture) {
F->setName("func");
IRBuilder<> Builder(BB);
- OpenMPIRBuilder::LocationDescription Loc({Builder.saveIP(), DL});
-
LLVMContext &Ctx = M->getContext();
IntegerType *Int32 = Type::getInt32Ty(Ctx);
AllocaInst *XVal = Builder.CreateAlloca(Int32);
@@ -4247,8 +4217,6 @@ TEST_F(OpenMPIRBuilderTest, OMPAtomicCompare) {
F->setName("func");
IRBuilder<> Builder(BB);
- OpenMPIRBuilder::LocationDescription Loc({Builder.saveIP(), DL});
-
LLVMContext &Ctx = M->getContext();
IntegerType *Int32 = Type::getInt32Ty(Ctx);
AllocaInst *XVal = Builder.CreateAlloca(Int32);
@@ -4307,8 +4275,6 @@ TEST_F(OpenMPIRBuilderTest, OMPAtomicCompareCapture) {
F->setName("func");
IRBuilder<> Builder(BB);
- OpenMPIRBuilder::LocationDescription Loc({Builder.saveIP(), DL});
-
LLVMContext &Ctx = M->getContext();
IntegerType *Int32 = Type::getInt32Ty(Ctx);
AllocaInst *XVal = Builder.CreateAlloca(Int32);
@@ -4661,7 +4627,6 @@ TEST_F(OpenMPIRBuilderTest, CreateTeams) {
return Error::success();
};
- OpenMPIRBuilder::LocationDescription Loc({Builder.saveIP(), DL});
ASSERT_EXPECTED_INIT(
OpenMPIRBuilder::InsertPointTy, AfterIP,
OMPBuilder.createTeams(Builder, BodyGenCB, /*NumTeamsLower=*/nullptr,
@@ -4913,7 +4878,6 @@ TEST_F(OpenMPIRBuilderTest, CreateTeamsWithNumTeamsAndThreadLimit) {
return Error::success();
};
- OpenMPIRBuilder::LocationDescription Loc({Builder.saveIP(), DL});
ASSERT_EXPECTED_INIT(OpenMPIRBuilder::InsertPointTy, AfterIP,
OMPBuilder.createTeams(Builder, BodyGenCB, NumTeamsLower,
NumTeamsUpper, ThreadLimit,
diff --git a/llvm/unittests/IR/InstructionsTest.cpp b/llvm/unittests/IR/InstructionsTest.cpp
index 1c4361e4c0f20..a1f22bbac02a1 100644
--- a/llvm/unittests/IR/InstructionsTest.cpp
+++ b/llvm/unittests/IR/InstructionsTest.cpp
@@ -768,7 +768,7 @@ TEST(InstructionsTest, AlterCallBundles) {
AttrBuilder AB(C);
AB.addAttribute(Attribute::Cold);
Call->setAttributes(AttributeList::get(C, AttributeList::FunctionIndex, AB));
- Call->setDebugLoc(DebugLoc(MDNode::get(C, {})));
+ Call->setDebugLoc(DebugLoc(DILocation::get(C, 1, 1, MDNode::get(C, {}))));
OperandBundleDef NewBundle("after", ConstantInt::get(Int32Ty, 7));
std::unique_ptr<CallInst> Clone(CallInst::Create(Call.get(), NewBundle));
@@ -798,7 +798,7 @@ TEST(InstructionsTest, AlterInvokeBundles) {
AB.addAttribute(Attribute::Cold);
Invoke->setAttributes(
AttributeList::get(C, AttributeList::FunctionIndex, AB));
- Invoke->setDebugLoc(DebugLoc(MDNode::get(C, {})));
+ Invoke->setDebugLoc(DebugLoc(DILocation::get(C, 1, 1, MDNode::get(C, {}))));
OperandBundleDef NewBundle("after", ConstantInt::get(Int32Ty, 7));
std::unique_ptr<InvokeInst> Clone(
diff --git a/llvm/unittests/SandboxIR/SandboxIRTest.cpp b/llvm/unittests/SandboxIR/SandboxIRTest.cpp
index c3137a31a15c9..03b3667abc333 100644
--- a/llvm/unittests/SandboxIR/SandboxIRTest.cpp
+++ b/llvm/unittests/SandboxIR/SandboxIRTest.cpp
@@ -2010,7 +2010,7 @@ define void @foo(i8 %v1, ptr %ptr) {
ret void, !tbaa !2
}
-!1 = !{}
+!1 = !DILocation(line: 12, column: 1, scope: !{})
!2 = !{}
)IR");
llvm::Function *LLVMF = &*M->getFunction("foo");
More information about the cfe-commits
mailing list