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) { 23*e8d8bef9SDimitry Andric // This code differs from MachineInstr::collectDebugValues in that it scans 24*e8d8bef9SDimitry Andric // the whole BB, not just contiguous DBG_VALUEs. 25*e8d8bef9SDimitry Andric if (!Instr->getOperand(0).isReg()) 26*e8d8bef9SDimitry Andric return; 27*e8d8bef9SDimitry Andric 28*e8d8bef9SDimitry Andric MachineBasicBlock::iterator DI = *Instr; 29*e8d8bef9SDimitry Andric ++DI; 30*e8d8bef9SDimitry Andric for (MachineBasicBlock::iterator DE = Instr->getParent()->end(); DI != DE; 31*e8d8bef9SDimitry Andric ++DI) { 32*e8d8bef9SDimitry Andric if (DI->isDebugValue() && 33*e8d8bef9SDimitry Andric DI->getDebugOperandForReg(Instr->getOperand(0).getReg())) 34*e8d8bef9SDimitry Andric DbgValues.push_back(&*DI); 35*e8d8bef9SDimitry Andric } 360b57cec5SDimitry Andric } 370b57cec5SDimitry Andric 380b57cec5SDimitry Andric void WebAssemblyDebugValueManager::move(MachineInstr *Insert) { 390b57cec5SDimitry Andric MachineBasicBlock *MBB = Insert->getParent(); 400b57cec5SDimitry Andric for (MachineInstr *DBI : reverse(DbgValues)) 410b57cec5SDimitry Andric MBB->splice(Insert, DBI->getParent(), DBI); 420b57cec5SDimitry Andric } 430b57cec5SDimitry Andric 440b57cec5SDimitry Andric void WebAssemblyDebugValueManager::updateReg(unsigned Reg) { 450b57cec5SDimitry Andric for (auto *DBI : DbgValues) 465ffd83dbSDimitry Andric DBI->getDebugOperand(0).setReg(Reg); 470b57cec5SDimitry Andric } 480b57cec5SDimitry Andric 490b57cec5SDimitry Andric void WebAssemblyDebugValueManager::clone(MachineInstr *Insert, 500b57cec5SDimitry Andric unsigned NewReg) { 510b57cec5SDimitry Andric MachineBasicBlock *MBB = Insert->getParent(); 520b57cec5SDimitry Andric MachineFunction *MF = MBB->getParent(); 530b57cec5SDimitry Andric for (MachineInstr *DBI : reverse(DbgValues)) { 540b57cec5SDimitry Andric MachineInstr *Clone = MF->CloneMachineInstr(DBI); 555ffd83dbSDimitry Andric Clone->getDebugOperand(0).setReg(NewReg); 560b57cec5SDimitry Andric MBB->insert(Insert, Clone); 570b57cec5SDimitry Andric } 580b57cec5SDimitry Andric } 59480093f4SDimitry Andric 60480093f4SDimitry Andric void WebAssemblyDebugValueManager::replaceWithLocal(unsigned LocalId) { 61480093f4SDimitry Andric for (auto *DBI : DbgValues) { 625ffd83dbSDimitry Andric MachineOperand &Op = DBI->getDebugOperand(0); 635ffd83dbSDimitry Andric Op.ChangeToTargetIndex(llvm::WebAssembly::TI_LOCAL, LocalId); 64480093f4SDimitry Andric } 65480093f4SDimitry Andric } 66