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 210b57cec5SDimitry Andric WebAssemblyDebugValueManager::WebAssemblyDebugValueManager( 220b57cec5SDimitry Andric MachineInstr *Instr) { 23e8d8bef9SDimitry Andric // This code differs from MachineInstr::collectDebugValues in that it scans 24e8d8bef9SDimitry Andric // the whole BB, not just contiguous DBG_VALUEs. 25e8d8bef9SDimitry Andric if (!Instr->getOperand(0).isReg()) 26e8d8bef9SDimitry Andric return; 27*fe6060f1SDimitry Andric CurrentReg = Instr->getOperand(0).getReg(); 28e8d8bef9SDimitry Andric 29e8d8bef9SDimitry Andric MachineBasicBlock::iterator DI = *Instr; 30e8d8bef9SDimitry Andric ++DI; 31e8d8bef9SDimitry Andric for (MachineBasicBlock::iterator DE = Instr->getParent()->end(); DI != DE; 32e8d8bef9SDimitry Andric ++DI) { 33e8d8bef9SDimitry Andric if (DI->isDebugValue() && 34*fe6060f1SDimitry Andric DI->hasDebugOperandForReg(Instr->getOperand(0).getReg())) 35e8d8bef9SDimitry Andric DbgValues.push_back(&*DI); 36e8d8bef9SDimitry Andric } 370b57cec5SDimitry Andric } 380b57cec5SDimitry Andric 390b57cec5SDimitry Andric void 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 450b57cec5SDimitry Andric void WebAssemblyDebugValueManager::updateReg(unsigned Reg) { 460b57cec5SDimitry Andric for (auto *DBI : DbgValues) 47*fe6060f1SDimitry Andric for (auto &MO : DBI->getDebugOperandsForReg(CurrentReg)) 48*fe6060f1SDimitry Andric MO.setReg(Reg); 49*fe6060f1SDimitry Andric CurrentReg = Reg; 500b57cec5SDimitry Andric } 510b57cec5SDimitry Andric 520b57cec5SDimitry Andric void 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*fe6060f1SDimitry Andric for (auto &MO : Clone->getDebugOperandsForReg(CurrentReg)) 59*fe6060f1SDimitry Andric MO.setReg(NewReg); 600b57cec5SDimitry Andric MBB->insert(Insert, Clone); 610b57cec5SDimitry Andric } 620b57cec5SDimitry Andric } 63480093f4SDimitry Andric 64480093f4SDimitry Andric void WebAssemblyDebugValueManager::replaceWithLocal(unsigned LocalId) { 65480093f4SDimitry Andric for (auto *DBI : DbgValues) { 66*fe6060f1SDimitry Andric auto IndexType = DBI->isIndirectDebugValue() 67*fe6060f1SDimitry Andric ? llvm::WebAssembly::TI_LOCAL_INDIRECT 68*fe6060f1SDimitry Andric : llvm::WebAssembly::TI_LOCAL; 69*fe6060f1SDimitry Andric for (auto &MO : DBI->getDebugOperandsForReg(CurrentReg)) 70*fe6060f1SDimitry Andric MO.ChangeToTargetIndex(IndexType, LocalId); 71480093f4SDimitry Andric } 72480093f4SDimitry Andric } 73