1 //===-- WebAssemblyDebugValueManager.cpp - WebAssembly DebugValue Manager -===// 2 // 3 // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. 4 // See https://llvm.org/LICENSE.txt for license information. 5 // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception 6 // 7 //===----------------------------------------------------------------------===// 8 /// 9 /// \file 10 /// This file implements the manager for MachineInstr DebugValues. 11 /// 12 //===----------------------------------------------------------------------===// 13 14 #include "WebAssemblyDebugValueManager.h" 15 #include "WebAssembly.h" 16 #include "WebAssemblyMachineFunctionInfo.h" 17 #include "llvm/CodeGen/MachineInstr.h" 18 19 using namespace llvm; 20 21 WebAssemblyDebugValueManager::WebAssemblyDebugValueManager(MachineInstr *Def) { 22 // This code differs from MachineInstr::collectDebugValues in that it scans 23 // the whole BB, not just contiguous DBG_VALUEs. 24 if (!Def->getOperand(0).isReg()) 25 return; 26 CurrentReg = Def->getOperand(0).getReg(); 27 28 for (MachineBasicBlock::iterator MI = std::next(Def->getIterator()), 29 ME = Def->getParent()->end(); 30 MI != ME; ++MI) { 31 if (MI->isDebugValue() && MI->hasDebugOperandForReg(CurrentReg)) 32 DbgValues.push_back(&*MI); 33 } 34 } 35 36 void WebAssemblyDebugValueManager::move(MachineInstr *Insert) { 37 MachineBasicBlock *MBB = Insert->getParent(); 38 for (MachineInstr *DBI : reverse(DbgValues)) 39 MBB->splice(Insert, DBI->getParent(), DBI); 40 } 41 42 void WebAssemblyDebugValueManager::clone(MachineInstr *Insert, 43 Register NewReg) { 44 MachineBasicBlock *MBB = Insert->getParent(); 45 MachineFunction *MF = MBB->getParent(); 46 for (MachineInstr *DBI : reverse(DbgValues)) { 47 MachineInstr *Clone = MF->CloneMachineInstr(DBI); 48 for (auto &MO : Clone->getDebugOperandsForReg(CurrentReg)) 49 MO.setReg(NewReg); 50 MBB->insert(Insert, Clone); 51 } 52 } 53 54 void WebAssemblyDebugValueManager::updateReg(Register Reg) { 55 for (auto *DBI : DbgValues) 56 for (auto &MO : DBI->getDebugOperandsForReg(CurrentReg)) 57 MO.setReg(Reg); 58 CurrentReg = Reg; 59 } 60 61 void WebAssemblyDebugValueManager::replaceWithLocal(unsigned LocalId) { 62 for (auto *DBI : DbgValues) { 63 auto IndexType = DBI->isIndirectDebugValue() 64 ? llvm::WebAssembly::TI_LOCAL_INDIRECT 65 : llvm::WebAssembly::TI_LOCAL; 66 for (auto &MO : DBI->getDebugOperandsForReg(CurrentReg)) 67 MO.ChangeToTargetIndex(IndexType, LocalId); 68 } 69 } 70