10b57cec5SDimitry Andric //===-- WebAssemblyDebugValueManager.cpp - WebAssembly DebugValue Manager -===// 20b57cec5SDimitry Andric // 30b57cec5SDimitry Andric // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. 40b57cec5SDimitry Andric // See https://llvm.org/LICENSE.txt for license information. 50b57cec5SDimitry Andric // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception 60b57cec5SDimitry Andric // 70b57cec5SDimitry Andric //===----------------------------------------------------------------------===// 80b57cec5SDimitry Andric /// 90b57cec5SDimitry Andric /// \file 100b57cec5SDimitry Andric /// This file implements the manager for MachineInstr DebugValues. 110b57cec5SDimitry Andric /// 120b57cec5SDimitry Andric //===----------------------------------------------------------------------===// 130b57cec5SDimitry Andric 140b57cec5SDimitry Andric #include "WebAssemblyDebugValueManager.h" 15480093f4SDimitry Andric #include "WebAssembly.h" 160b57cec5SDimitry Andric #include "WebAssemblyMachineFunctionInfo.h" 170b57cec5SDimitry Andric #include "llvm/CodeGen/MachineInstr.h" 180b57cec5SDimitry Andric 190b57cec5SDimitry Andric using namespace llvm; 200b57cec5SDimitry Andric WebAssemblyDebugValueManager(MachineInstr * Instr)210b57cec5SDimitry AndricWebAssemblyDebugValueManager::WebAssemblyDebugValueManager( 220b57cec5SDimitry Andric MachineInstr *Instr) { 23af732203SDimitry Andric // This code differs from MachineInstr::collectDebugValues in that it scans 24af732203SDimitry Andric // the whole BB, not just contiguous DBG_VALUEs. 25af732203SDimitry Andric if (!Instr->getOperand(0).isReg()) 26af732203SDimitry Andric return; 27*5f7ddb14SDimitry Andric CurrentReg = Instr->getOperand(0).getReg(); 28af732203SDimitry Andric 29af732203SDimitry Andric MachineBasicBlock::iterator DI = *Instr; 30af732203SDimitry Andric ++DI; 31af732203SDimitry Andric for (MachineBasicBlock::iterator DE = Instr->getParent()->end(); DI != DE; 32af732203SDimitry Andric ++DI) { 33af732203SDimitry Andric if (DI->isDebugValue() && 34*5f7ddb14SDimitry Andric DI->hasDebugOperandForReg(Instr->getOperand(0).getReg())) 35af732203SDimitry Andric DbgValues.push_back(&*DI); 36af732203SDimitry Andric } 370b57cec5SDimitry Andric } 380b57cec5SDimitry Andric move(MachineInstr * Insert)390b57cec5SDimitry Andricvoid WebAssemblyDebugValueManager::move(MachineInstr *Insert) { 400b57cec5SDimitry Andric MachineBasicBlock *MBB = Insert->getParent(); 410b57cec5SDimitry Andric for (MachineInstr *DBI : reverse(DbgValues)) 420b57cec5SDimitry Andric MBB->splice(Insert, DBI->getParent(), DBI); 430b57cec5SDimitry Andric } 440b57cec5SDimitry Andric updateReg(unsigned Reg)450b57cec5SDimitry Andricvoid WebAssemblyDebugValueManager::updateReg(unsigned Reg) { 460b57cec5SDimitry Andric for (auto *DBI : DbgValues) 47*5f7ddb14SDimitry Andric for (auto &MO : DBI->getDebugOperandsForReg(CurrentReg)) 48*5f7ddb14SDimitry Andric MO.setReg(Reg); 49*5f7ddb14SDimitry Andric CurrentReg = Reg; 500b57cec5SDimitry Andric } 510b57cec5SDimitry Andric clone(MachineInstr * Insert,unsigned NewReg)520b57cec5SDimitry Andricvoid WebAssemblyDebugValueManager::clone(MachineInstr *Insert, 530b57cec5SDimitry Andric unsigned NewReg) { 540b57cec5SDimitry Andric MachineBasicBlock *MBB = Insert->getParent(); 550b57cec5SDimitry Andric MachineFunction *MF = MBB->getParent(); 560b57cec5SDimitry Andric for (MachineInstr *DBI : reverse(DbgValues)) { 570b57cec5SDimitry Andric MachineInstr *Clone = MF->CloneMachineInstr(DBI); 58*5f7ddb14SDimitry Andric for (auto &MO : Clone->getDebugOperandsForReg(CurrentReg)) 59*5f7ddb14SDimitry Andric MO.setReg(NewReg); 600b57cec5SDimitry Andric MBB->insert(Insert, Clone); 610b57cec5SDimitry Andric } 620b57cec5SDimitry Andric } 63480093f4SDimitry Andric replaceWithLocal(unsigned LocalId)64480093f4SDimitry Andricvoid WebAssemblyDebugValueManager::replaceWithLocal(unsigned LocalId) { 65480093f4SDimitry Andric for (auto *DBI : DbgValues) { 66*5f7ddb14SDimitry Andric auto IndexType = DBI->isIndirectDebugValue() 67*5f7ddb14SDimitry Andric ? llvm::WebAssembly::TI_LOCAL_INDIRECT 68*5f7ddb14SDimitry Andric : llvm::WebAssembly::TI_LOCAL; 69*5f7ddb14SDimitry Andric for (auto &MO : DBI->getDebugOperandsForReg(CurrentReg)) 70*5f7ddb14SDimitry Andric MO.ChangeToTargetIndex(IndexType, LocalId); 71480093f4SDimitry Andric } 72480093f4SDimitry Andric } 73