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 Sandersvoid 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 Sandersvoid 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 Sandersvoid LostDebugLocObserver::createdInstr(MachineInstr &MI) { 78d9085f65SDaniel Sanders PotentialMIsForDebugLocs.insert(&MI); 79d9085f65SDaniel Sanders } 80d9085f65SDaniel Sanders irTranslatorNeverAddsLocations(unsigned Opcode)81*1d42764dSBenjamin Kramerstatic 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 Sandersvoid 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 Sandersvoid 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 Sandersvoid LostDebugLocObserver::changedInstr(MachineInstr &MI) { 112d9085f65SDaniel Sanders PotentialMIsForDebugLocs.insert(&MI); 113d9085f65SDaniel Sanders } 114