[llvm] [llvm-dwarfdump][LineCov 1/3] Add variable coverage metrics (PR #169646)
Stephen Tozer via llvm-commits
llvm-commits at lists.llvm.org
Mon Dec 1 06:29:32 PST 2025
================
@@ -0,0 +1,244 @@
+//===-- Coverage.cpp - Debug info coverage metrics ------------------------===//
+//
+// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
+// See https://llvm.org/LICENSE.txt for license information.
+// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
+//
+//===----------------------------------------------------------------------===//
+
+#include "llvm-dwarfdump.h"
+#include "llvm/BinaryFormat/Dwarf.h"
+#include "llvm/DebugInfo/DIContext.h"
+#include "llvm/DebugInfo/DWARF/DWARFAcceleratorTable.h"
+#include "llvm/DebugInfo/DWARF/DWARFCompileUnit.h"
+#include "llvm/DebugInfo/DWARF/DWARFContext.h"
+#include "llvm/IR/CFG.h"
+#include "llvm/IR/DebugInfoMetadata.h"
+#include "llvm/IR/DebugProgramInstruction.h"
+#include "llvm/IR/Instructions.h"
+#include "llvm/IR/Module.h"
+#include "llvm/IRReader/IRReader.h"
+#include "llvm/Object/ObjectFile.h"
+#include "llvm/Support/MemoryBuffer.h"
+#include "llvm/Support/SourceMgr.h"
+#include <set>
+
+using namespace llvm;
+using namespace llvm::dwarf;
+using namespace llvm::object;
+
+typedef std::pair<std::string, std::string> StringPair;
+
+static std::optional<std::set<std::pair<uint16_t, uint32_t>>>
+computeVariableCoverage(DWARFContext &DICtx, DWARFDie DIE,
+ const DWARFDebugLine::LineTable *const LineTable) {
+ auto addLines = [](const DWARFDebugLine::LineTable *LineTable,
+ std::set<std::pair<uint16_t, uint32_t>> &Lines,
+ DWARFAddressRange Range,
+ std::map<std::string, uint16_t, std::less<>> &FileNames) {
+ std::vector<uint32_t> Rows;
+ if (LineTable->lookupAddressRange({Range.LowPC, Range.SectionIndex},
+ Range.HighPC - Range.LowPC, Rows)) {
+ for (const auto &RowI : Rows) {
+ const auto Row = LineTable->Rows[RowI];
+ if (Row.Address.Address < Range.LowPC)
+ continue;
+ const auto FileIndex = Row.File;
+
+ if (!any_of(FileNames,
+ [FileIndex](auto &FN) { return FN.second == FileIndex; })) {
+ std::string Name;
+ LineTable->getFileNameByIndex(
+ FileIndex, "",
+ DILineInfoSpecifier::FileLineInfoKind::RelativeFilePath, Name);
+ FileNames.emplace(Name, FileIndex);
+ }
+
+ const auto Line = Row.Line;
+ if (Line) // ignore zero lines
+ Lines.insert({FileIndex, Line});
+ }
+ }
+ };
+
+ std::map<std::string, uint16_t, std::less<>> FileNames;
+
+ auto Locations = DIE.getLocations(DW_AT_location);
+ std::optional<std::set<std::pair<uint16_t, uint32_t>>> Lines;
+ if (Locations) {
+ for (const auto &L : Locations.get()) {
+ if (L.Range) {
+ if (!Lines)
+ Lines = {{}};
+ addLines(LineTable, *Lines, L.Range.value(), FileNames);
+ }
+ }
+ } else {
+ consumeError(Locations.takeError());
+ }
+
+ auto Ranges = DIE.getParent().getAddressRanges();
+ std::optional<std::set<std::pair<uint16_t, uint32_t>>> ParentLines;
+ if (Ranges) {
+ ParentLines = {{}};
+ for (const auto &R : Ranges.get())
+ addLines(LineTable, *ParentLines, R, FileNames);
+ } else {
+ consumeError(Ranges.takeError());
+ }
+
+ if (!Lines && ParentLines) {
+ Lines = ParentLines;
+ } else if (ParentLines) {
+ std::set<std::pair<uint16_t, uint32_t>> Intersection;
+ std::set_intersection(Lines->begin(), Lines->end(), ParentLines->begin(),
+ ParentLines->end(),
+ std::inserter(Intersection, Intersection.begin()));
+ Lines = Intersection;
+ }
+
+ return Lines;
+}
+
+static const SmallVector<DWARFDie> getParentSubroutines(DWARFDie DIE) {
+ SmallVector<DWARFDie> Parents;
+ DWARFDie Parent = DIE;
+ do
+ if (Parent.getTag() == DW_TAG_subprogram ||
+ Parent.getTag() == DW_TAG_inlined_subroutine)
+ Parents.push_back(Parent);
+ while ((Parent = Parent.getParent()));
----------------
SLTozer wrote:
```suggestion
do {
if (Parent.getTag() == DW_TAG_subprogram ||
Parent.getTag() == DW_TAG_inlined_subroutine)
Parents.push_back(Parent);
} while ((Parent = Parent.getParent()));
```
Would definitely suggest using braces for the do while.
https://github.com/llvm/llvm-project/pull/169646
More information about the llvm-commits
mailing list