[clang] fdbf073 - Revert "[DLCov] Implement DebugLoc coverage tracking (#107279)"
Stephen Tozer via cfe-commits
cfe-commits at lists.llvm.org
Thu Apr 24 16:38:17 PDT 2025
Author: Stephen Tozer
Date: 2025-04-25T00:36:28+01:00
New Revision: fdbf073a86573c9ac4d595fac8e06d252ce1469f
URL: https://github.com/llvm/llvm-project/commit/fdbf073a86573c9ac4d595fac8e06d252ce1469f
DIFF: https://github.com/llvm/llvm-project/commit/fdbf073a86573c9ac4d595fac8e06d252ce1469f.diff
LOG: Revert "[DLCov] Implement DebugLoc coverage tracking (#107279)"
This reverts commit a9d93ecf1f8d2cfe3f77851e0df179b386cff353.
Reverted due to the commit including a config in LLVM headers that is not
available outside of the llvm source tree.
Added:
Modified:
clang/lib/CodeGen/BackendUtil.cpp
llvm/docs/HowToUpdateDebugInfo.rst
llvm/include/llvm/IR/DebugLoc.h
llvm/lib/CodeGen/AsmPrinter/DwarfDebug.cpp
llvm/lib/IR/DebugInfo.cpp
llvm/lib/IR/DebugLoc.cpp
llvm/lib/Transforms/Utils/Debugify.cpp
Removed:
################################################################################
diff --git a/clang/lib/CodeGen/BackendUtil.cpp b/clang/lib/CodeGen/BackendUtil.cpp
index cafc703420183..f7eb853beb23c 100644
--- a/clang/lib/CodeGen/BackendUtil.cpp
+++ b/clang/lib/CodeGen/BackendUtil.cpp
@@ -961,22 +961,6 @@ void EmitAssemblyHelper::RunOptimizationPipeline(
Debugify.setOrigDIVerifyBugsReportFilePath(
CodeGenOpts.DIBugsReportFilePath);
Debugify.registerCallbacks(PIC, MAM);
-
-#if ENABLE_DEBUGLOC_COVERAGE_TRACKING
- // If we're using debug location coverage tracking, mark all the
- // instructions coming out of the frontend without a DebugLoc as being
- // compiler-generated, to prevent both those instructions and new
- // instructions that inherit their location from being treated as
- // incorrectly empty locations.
- for (Function &F : *TheModule) {
- if (!F.getSubprogram())
- continue;
- for (BasicBlock &BB : F)
- for (Instruction &I : BB)
- if (!I.getDebugLoc())
- I.setDebugLoc(DebugLoc::getCompilerGenerated());
- }
-#endif
}
// Attempt to load pass plugins and register their callbacks with PB.
for (auto &PluginFN : CodeGenOpts.PassPlugins) {
diff --git a/llvm/docs/HowToUpdateDebugInfo.rst b/llvm/docs/HowToUpdateDebugInfo.rst
index a87efe7e6e43f..3088f59c1066a 100644
--- a/llvm/docs/HowToUpdateDebugInfo.rst
+++ b/llvm/docs/HowToUpdateDebugInfo.rst
@@ -169,47 +169,6 @@ See the discussion in the section about
:ref:`merging locations<WhenToMergeLocation>` for examples of when the rule for
dropping locations applies.
-.. _NewInstLocations:
-
-Setting locations for new instructions
---------------------------------------
-
-Whenever a new instruction is created and there is no suitable location for that
-instruction, that instruction should be annotated accordingly. There are a set
-of special ``DebugLoc`` values that can be set on an instruction to annotate the
-reason that it does not have a valid location. These are as follows:
-
-* ``DebugLoc::getCompilerGenerated()``: This indicates that the instruction is a
- compiler-generated instruction, i.e. it is not associated with any user source
- code.
-
-* ``DebugLoc::getDropped()``: This indicates that the instruction has
- intentionally had its source location removed, according to the rules for
- :ref:`dropping locations<WhenToDropLocation>`; this is set automatically by
- ``Instruction::dropLocation()``.
-
-* ``DebugLoc::getUnknown()``: This indicates that the instruction does not have
- a known or currently knowable source location, e.g. that it is infeasible to
- determine the correct source location, or that the source location is
- ambiguous in a way that LLVM cannot currently represent.
-
-* ``DebugLoc::getTemporary()``: This is used for instructions that we don't
- expect to be emitted (e.g. ``UnreachableInst``), and so should not need a
- valid location; if we ever try to emit a temporary location into an object/asm
- file, this indicates that something has gone wrong.
-
-Where applicable, these should be used instead of leaving an instruction without
-an assigned location or explicitly setting the location as ``DebugLoc()``.
-Ordinarily these special locations are identical to an absent location, but LLVM
-built with coverage-tracking
-(``-DLLVM_ENABLE_DEBUGLOC_COVERAGE_TRACKING="COVERAGE"``) will keep track of
-these special locations in order to detect unintentionally-missing locations;
-for this reason, the most important rule is to *not* apply any of these if it
-isn't clear which, if any, is appropriate - an absent location can be detected
-and fixed, while an incorrectly annotated instruction is much harder to detect.
-On the other hand, if any of these clearly apply, then they should be used to
-prevent false positives from being flagged up.
-
Rules for updating debug values
===============================
diff --git a/llvm/include/llvm/IR/DebugLoc.h b/llvm/include/llvm/IR/DebugLoc.h
index 9f1dafa8b71d9..c22d3e9b10d27 100644
--- a/llvm/include/llvm/IR/DebugLoc.h
+++ b/llvm/include/llvm/IR/DebugLoc.h
@@ -14,7 +14,6 @@
#ifndef LLVM_IR_DEBUGLOC_H
#define LLVM_IR_DEBUGLOC_H
-#include "llvm/Config/config.h"
#include "llvm/IR/TrackingMDRef.h"
#include "llvm/Support/DataTypes.h"
@@ -23,73 +22,6 @@ namespace llvm {
class LLVMContext;
class raw_ostream;
class DILocation;
- class Function;
-
-#if ENABLE_DEBUGLOC_COVERAGE_TRACKING
- // Used to represent
diff erent "kinds" of DebugLoc, expressing that the
- // instruction it is part of is either normal and should contain a valid
- // DILocation, or otherwise describing the reason why the instruction does
- // not contain a valid DILocation.
- enum class DebugLocKind : uint8_t {
- // The instruction is expected to contain a valid DILocation.
- Normal,
- // The instruction is compiler-generated, i.e. it is not associated with any
- // line in the original source.
- CompilerGenerated,
- // The instruction has intentionally had its source location removed,
- // typically because it was moved outside of its original control-flow and
- // presenting the prior source location would be misleading for debuggers
- // or profilers.
- Dropped,
- // The instruction does not have a known or currently knowable source
- // location, e.g. the attribution is ambiguous in a way that can't be
- // represented, or determining the correct location is complicated and
- // requires future developer effort.
- Unknown,
- // DebugLoc is attached to an instruction that we don't expect to be
- // emitted, and so can omit a valid DILocation; we don't expect to ever try
- // and emit these into the line table, and trying to do so is a sign that
- // something has gone wrong (most likely a DebugLoc leaking from a transient
- // compiler-generated instruction).
- Temporary
- };
-
- // Extends TrackingMDNodeRef to also store a DebugLocKind, allowing Debugify
- // to ignore intentionally-empty DebugLocs.
- class DILocAndCoverageTracking : public TrackingMDNodeRef {
- public:
- DebugLocKind Kind;
- // Default constructor for empty DebugLocs.
- DILocAndCoverageTracking()
- : TrackingMDNodeRef(nullptr), Kind(DebugLocKind::Normal) {}
- // Valid or nullptr MDNode*, normal DebugLocKind.
- DILocAndCoverageTracking(const MDNode *Loc)
- : TrackingMDNodeRef(const_cast<MDNode *>(Loc)),
- Kind(DebugLocKind::Normal) {}
- DILocAndCoverageTracking(const DILocation *Loc);
- // Explicit DebugLocKind, which always means a nullptr MDNode*.
- DILocAndCoverageTracking(DebugLocKind Kind)
- : TrackingMDNodeRef(nullptr), Kind(Kind) {}
- };
- template <> struct simplify_type<DILocAndCoverageTracking> {
- using SimpleType = MDNode *;
-
- static MDNode *getSimplifiedValue(DILocAndCoverageTracking &MD) {
- return MD.get();
- }
- };
- template <> struct simplify_type<const DILocAndCoverageTracking> {
- using SimpleType = MDNode *;
-
- static MDNode *getSimplifiedValue(const DILocAndCoverageTracking &MD) {
- return MD.get();
- }
- };
-
- using DebugLocTrackingRef = DILocAndCoverageTracking;
-#else
- using DebugLocTrackingRef = TrackingMDNodeRef;
-#endif // ENABLE_DEBUGLOC_COVERAGE_TRACKING
/// A debug info location.
///
@@ -99,8 +31,7 @@ namespace llvm {
/// 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;
+ TrackingMDNodeRef Loc;
public:
DebugLoc() = default;
@@ -116,31 +47,6 @@ namespace llvm {
/// IR.
explicit DebugLoc(const MDNode *N);
-#if ENABLE_DEBUGLOC_COVERAGE_TRACKING
- DebugLoc(DebugLocKind Kind) : Loc(Kind) {}
- DebugLocKind getKind() const { return Loc.Kind; }
-#endif
-
-#if ENABLE_DEBUGLOC_COVERAGE_TRACKING
- static inline DebugLoc getTemporary() {
- return DebugLoc(DebugLocKind::Temporary);
- }
- static inline DebugLoc getUnknown() {
- return DebugLoc(DebugLocKind::Unknown);
- }
- static inline DebugLoc getCompilerGenerated() {
- return DebugLoc(DebugLocKind::CompilerGenerated);
- }
- static inline DebugLoc getDropped() {
- return DebugLoc(DebugLocKind::Dropped);
- }
-#else
- static inline DebugLoc getTemporary() { return DebugLoc(); }
- static inline DebugLoc getUnknown() { return DebugLoc(); }
- static inline DebugLoc getCompilerGenerated() { return DebugLoc(); }
- static inline DebugLoc getDropped() { return DebugLoc(); }
-#endif // ENABLE_DEBUGLOC_COVERAGE_TRACKING
-
/// Get the underlying \a DILocation.
///
/// \pre !*this or \c isa<DILocation>(getAsMDNode()).
diff --git a/llvm/lib/CodeGen/AsmPrinter/DwarfDebug.cpp b/llvm/lib/CodeGen/AsmPrinter/DwarfDebug.cpp
index 642404db8ce43..6c932651750ee 100644
--- a/llvm/lib/CodeGen/AsmPrinter/DwarfDebug.cpp
+++ b/llvm/lib/CodeGen/AsmPrinter/DwarfDebug.cpp
@@ -2098,10 +2098,6 @@ void DwarfDebug::beginInstruction(const MachineInstr *MI) {
}
if (!DL) {
- // FIXME: We could assert that `DL.getKind() != DebugLocKind::Temporary`
- // here, or otherwise record any temporary DebugLocs seen to ensure that
- // transient compiler-generated instructions aren't leaking their DLs to
- // other instructions.
// We have an unspecified location, which might want to be line 0.
// If we have already emitted a line-0 record, don't repeat it.
if (LastAsmLine == 0)
diff --git a/llvm/lib/IR/DebugInfo.cpp b/llvm/lib/IR/DebugInfo.cpp
index a6a88a2fecb30..7a133b209459b 100644
--- a/llvm/lib/IR/DebugInfo.cpp
+++ b/llvm/lib/IR/DebugInfo.cpp
@@ -987,10 +987,8 @@ void Instruction::updateLocationAfterHoist() { dropLocation(); }
void Instruction::dropLocation() {
const DebugLoc &DL = getDebugLoc();
- if (!DL) {
- setDebugLoc(DebugLoc::getDropped());
+ if (!DL)
return;
- }
// If this isn't a call, drop the location to allow a location from a
// preceding instruction to propagate.
@@ -1002,7 +1000,7 @@ void Instruction::dropLocation() {
}
if (!MayLowerToCall) {
- setDebugLoc(DebugLoc::getDropped());
+ setDebugLoc(DebugLoc());
return;
}
@@ -1021,7 +1019,7 @@ void Instruction::dropLocation() {
//
// One alternative is to set a line 0 location with the existing scope and
// inlinedAt info. The location might be sensitive to when inlining occurs.
- setDebugLoc(DebugLoc::getDropped());
+ setDebugLoc(DebugLoc());
}
//===----------------------------------------------------------------------===//
diff --git a/llvm/lib/IR/DebugLoc.cpp b/llvm/lib/IR/DebugLoc.cpp
index b05d0f6096bda..bdea52180f74a 100644
--- a/llvm/lib/IR/DebugLoc.cpp
+++ b/llvm/lib/IR/DebugLoc.cpp
@@ -11,12 +11,6 @@
#include "llvm/IR/DebugInfo.h"
using namespace llvm;
-#if ENABLE_DEBUGLOC_COVERAGE_TRACKING
-DILocAndCoverageTracking::DILocAndCoverageTracking(const DILocation *L)
- : TrackingMDNodeRef(const_cast<DILocation *>(L)),
- Kind(DebugLocKind::Normal) {}
-#endif // ENABLE_DEBUGLOC_COVERAGE_TRACKING
-
//===----------------------------------------------------------------------===//
// DebugLoc Implementation
//===----------------------------------------------------------------------===//
diff --git a/llvm/lib/Transforms/Utils/Debugify.cpp b/llvm/lib/Transforms/Utils/Debugify.cpp
index e5a7415431f56..e6b5e267d192b 100644
--- a/llvm/lib/Transforms/Utils/Debugify.cpp
+++ b/llvm/lib/Transforms/Utils/Debugify.cpp
@@ -290,16 +290,6 @@ bool llvm::stripDebugifyMetadata(Module &M) {
return Changed;
}
-bool hasLoc(const Instruction &I) {
- const DILocation *Loc = I.getDebugLoc().get();
-#if ENABLE_DEBUGLOC_COVERAGE_TRACKING
- DebugLocKind Kind = I.getDebugLoc().getKind();
- return Loc || Kind != DebugLocKind::Normal;
-#else
- return Loc;
-#endif
-}
-
bool llvm::collectDebugInfoMetadata(Module &M,
iterator_range<Module::iterator> Functions,
DebugInfoPerPass &DebugInfoBeforePass,
@@ -372,7 +362,9 @@ bool llvm::collectDebugInfoMetadata(Module &M,
LLVM_DEBUG(dbgs() << " Collecting info for inst: " << I << '\n');
DebugInfoBeforePass.InstToDelete.insert({&I, &I});
- DebugInfoBeforePass.DILocations.insert({&I, hasLoc(I)});
+ const DILocation *Loc = I.getDebugLoc().get();
+ bool HasLoc = Loc != nullptr;
+ DebugInfoBeforePass.DILocations.insert({&I, HasLoc});
}
}
}
@@ -615,7 +607,10 @@ bool llvm::checkDebugInfoMetadata(Module &M,
LLVM_DEBUG(dbgs() << " Collecting info for inst: " << I << '\n');
- DebugInfoAfterPass.DILocations.insert({&I, hasLoc(I)});
+ const DILocation *Loc = I.getDebugLoc().get();
+ bool HasLoc = Loc != nullptr;
+
+ DebugInfoAfterPass.DILocations.insert({&I, HasLoc});
}
}
}
More information about the cfe-commits
mailing list