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