xref: /llvm-project/llvm/lib/CodeGen/GlobalISel/LostDebugLocObserver.cpp (revision 1d42764df7c9fd9db09d658390383d109a3f96d2)
1d9085f65SDaniel Sanders //===----- llvm/CodeGen/GlobalISel/LostDebugLocObserver.cpp -----*- C++ -*-===//
2d9085f65SDaniel Sanders //
3d9085f65SDaniel Sanders // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
4d9085f65SDaniel Sanders // See https://llvm.org/LICENSE.txt for license information.
5d9085f65SDaniel Sanders // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
6d9085f65SDaniel Sanders //
7d9085f65SDaniel Sanders //===----------------------------------------------------------------------===//
8d9085f65SDaniel Sanders //
9d9085f65SDaniel Sanders /// Tracks DebugLocs between checkpoints and verifies that they are transferred.
10d9085f65SDaniel Sanders //
11d9085f65SDaniel Sanders //===----------------------------------------------------------------------===//
12d9085f65SDaniel Sanders 
13d9085f65SDaniel Sanders #include "llvm/CodeGen/GlobalISel/LostDebugLocObserver.h"
14d9085f65SDaniel Sanders 
15d9085f65SDaniel Sanders using namespace llvm;
16d9085f65SDaniel Sanders 
17d9085f65SDaniel Sanders #define LOC_DEBUG(X) DEBUG_WITH_TYPE(DebugType.str().c_str(), X)
18d9085f65SDaniel Sanders 
analyzeDebugLocations()19d9085f65SDaniel Sanders void LostDebugLocObserver::analyzeDebugLocations() {
20d9085f65SDaniel Sanders   if (LostDebugLocs.empty()) {
21d9085f65SDaniel Sanders     LOC_DEBUG(dbgs() << ".. No debug info was present\n");
22d9085f65SDaniel Sanders     return;
23d9085f65SDaniel Sanders   }
24d9085f65SDaniel Sanders   if (PotentialMIsForDebugLocs.empty()) {
25d9085f65SDaniel Sanders     LOC_DEBUG(
26d9085f65SDaniel Sanders         dbgs() << ".. No instructions to carry debug info (dead code?)\n");
27d9085f65SDaniel Sanders     return;
28d9085f65SDaniel Sanders   }
29d9085f65SDaniel Sanders 
30d9085f65SDaniel Sanders   LOC_DEBUG(dbgs() << ".. Searching " << PotentialMIsForDebugLocs.size()
31d9085f65SDaniel Sanders                    << " instrs for " << LostDebugLocs.size() << " locations\n");
32d9085f65SDaniel Sanders   SmallPtrSet<MachineInstr *, 4> FoundIn;
33d9085f65SDaniel Sanders   for (MachineInstr *MI : PotentialMIsForDebugLocs) {
34d9085f65SDaniel Sanders     if (!MI->getDebugLoc())
35d9085f65SDaniel Sanders       continue;
36d9085f65SDaniel Sanders     // Check this first in case there's a matching line-0 location on both input
37d9085f65SDaniel Sanders     // and output.
38d9085f65SDaniel Sanders     if (MI->getDebugLoc().getLine() == 0) {
39d9085f65SDaniel Sanders       LOC_DEBUG(
40d9085f65SDaniel Sanders           dbgs() << ".. Assuming line-0 location covers remainder (if any)\n");
41d9085f65SDaniel Sanders       return;
42d9085f65SDaniel Sanders     }
43d9085f65SDaniel Sanders     if (LostDebugLocs.erase(MI->getDebugLoc())) {
44d9085f65SDaniel Sanders       LOC_DEBUG(dbgs() << ".. .. found " << MI->getDebugLoc() << " in " << *MI);
45d9085f65SDaniel Sanders       FoundIn.insert(MI);
46d9085f65SDaniel Sanders       continue;
47d9085f65SDaniel Sanders     }
48d9085f65SDaniel Sanders   }
49d9085f65SDaniel Sanders   if (LostDebugLocs.empty())
50d9085f65SDaniel Sanders     return;
51d9085f65SDaniel Sanders 
52d9085f65SDaniel Sanders   NumLostDebugLocs += LostDebugLocs.size();
53d9085f65SDaniel Sanders   LOC_DEBUG({
54d9085f65SDaniel Sanders     dbgs() << ".. Lost locations:\n";
55d9085f65SDaniel Sanders     for (const DebugLoc &Loc : LostDebugLocs) {
56d9085f65SDaniel Sanders       dbgs() << ".. .. ";
57d9085f65SDaniel Sanders       Loc.print(dbgs());
58d9085f65SDaniel Sanders       dbgs() << "\n";
59d9085f65SDaniel Sanders     }
60d9085f65SDaniel Sanders     dbgs() << ".. MIs with matched locations:\n";
61d9085f65SDaniel Sanders     for (MachineInstr *MI : FoundIn)
62d9085f65SDaniel Sanders       if (PotentialMIsForDebugLocs.erase(MI))
63d9085f65SDaniel Sanders         dbgs() << ".. .. " << *MI;
64d9085f65SDaniel Sanders     dbgs() << ".. Remaining MIs with unmatched/no locations:\n";
65d9085f65SDaniel Sanders     for (const MachineInstr *MI : PotentialMIsForDebugLocs)
66d9085f65SDaniel Sanders       dbgs() << ".. .. " << *MI;
67d9085f65SDaniel Sanders   });
68d9085f65SDaniel Sanders }
69d9085f65SDaniel Sanders 
checkpoint(bool CheckDebugLocs)70d9085f65SDaniel Sanders void LostDebugLocObserver::checkpoint(bool CheckDebugLocs) {
71d9085f65SDaniel Sanders   if (CheckDebugLocs)
72d9085f65SDaniel Sanders     analyzeDebugLocations();
73d9085f65SDaniel Sanders   PotentialMIsForDebugLocs.clear();
74d9085f65SDaniel Sanders   LostDebugLocs.clear();
75d9085f65SDaniel Sanders }
76d9085f65SDaniel Sanders 
createdInstr(MachineInstr & MI)77d9085f65SDaniel Sanders void LostDebugLocObserver::createdInstr(MachineInstr &MI) {
78d9085f65SDaniel Sanders   PotentialMIsForDebugLocs.insert(&MI);
79d9085f65SDaniel Sanders }
80d9085f65SDaniel Sanders 
irTranslatorNeverAddsLocations(unsigned Opcode)81*1d42764dSBenjamin Kramer static bool irTranslatorNeverAddsLocations(unsigned Opcode) {
82d9085f65SDaniel Sanders   switch (Opcode) {
83d9085f65SDaniel Sanders   default:
84d9085f65SDaniel Sanders     return false;
85d9085f65SDaniel Sanders   case TargetOpcode::G_CONSTANT:
86d9085f65SDaniel Sanders   case TargetOpcode::G_FCONSTANT:
87d9085f65SDaniel Sanders   case TargetOpcode::G_IMPLICIT_DEF:
88d9085f65SDaniel Sanders   case TargetOpcode::G_GLOBAL_VALUE:
89d9085f65SDaniel Sanders     return true;
90d9085f65SDaniel Sanders   }
91d9085f65SDaniel Sanders }
92d9085f65SDaniel Sanders 
erasingInstr(MachineInstr & MI)93d9085f65SDaniel Sanders void LostDebugLocObserver::erasingInstr(MachineInstr &MI) {
94d9085f65SDaniel Sanders   if (irTranslatorNeverAddsLocations(MI.getOpcode()))
95d9085f65SDaniel Sanders     return;
96d9085f65SDaniel Sanders 
97d9085f65SDaniel Sanders   PotentialMIsForDebugLocs.erase(&MI);
98d9085f65SDaniel Sanders   if (MI.getDebugLoc())
99d9085f65SDaniel Sanders     LostDebugLocs.insert(MI.getDebugLoc());
100d9085f65SDaniel Sanders }
101d9085f65SDaniel Sanders 
changingInstr(MachineInstr & MI)102d9085f65SDaniel Sanders void LostDebugLocObserver::changingInstr(MachineInstr &MI) {
103d9085f65SDaniel Sanders   if (irTranslatorNeverAddsLocations(MI.getOpcode()))
104d9085f65SDaniel Sanders     return;
105d9085f65SDaniel Sanders 
106d9085f65SDaniel Sanders   PotentialMIsForDebugLocs.erase(&MI);
107d9085f65SDaniel Sanders   if (MI.getDebugLoc())
108d9085f65SDaniel Sanders     LostDebugLocs.insert(MI.getDebugLoc());
109d9085f65SDaniel Sanders }
110d9085f65SDaniel Sanders 
changedInstr(MachineInstr & MI)111d9085f65SDaniel Sanders void LostDebugLocObserver::changedInstr(MachineInstr &MI) {
112d9085f65SDaniel Sanders   PotentialMIsForDebugLocs.insert(&MI);
113d9085f65SDaniel Sanders }
114