1be24c020SYury Delendik //===-- WebAssemblyDebugValueManager.cpp - WebAssembly DebugValue Manager -===// 2be24c020SYury Delendik // 32946cd70SChandler Carruth // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. 42946cd70SChandler Carruth // See https://llvm.org/LICENSE.txt for license information. 52946cd70SChandler Carruth // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception 6be24c020SYury Delendik // 7be24c020SYury Delendik //===----------------------------------------------------------------------===// 8be24c020SYury Delendik /// 9be24c020SYury Delendik /// \file 10be24c020SYury Delendik /// This file implements the manager for MachineInstr DebugValues. 11be24c020SYury Delendik /// 12be24c020SYury Delendik //===----------------------------------------------------------------------===// 13be24c020SYury Delendik 14be24c020SYury Delendik #include "WebAssemblyDebugValueManager.h" 15adf7a0a5SYury Delendik #include "WebAssembly.h" 16be24c020SYury Delendik #include "WebAssemblyMachineFunctionInfo.h" 17be24c020SYury Delendik #include "llvm/CodeGen/MachineInstr.h" 18be24c020SYury Delendik 19be24c020SYury Delendik using namespace llvm; 20be24c020SYury Delendik 21be24c020SYury Delendik WebAssemblyDebugValueManager::WebAssemblyDebugValueManager( 22be24c020SYury Delendik MachineInstr *Instr) { 23*5c38ae36SWouter van Oortmerssen // This code differs from MachineInstr::collectDebugValues in that it scans 24*5c38ae36SWouter van Oortmerssen // the whole BB, not just contiguous DBG_VALUEs. 25*5c38ae36SWouter van Oortmerssen if (!Instr->getOperand(0).isReg()) 26*5c38ae36SWouter van Oortmerssen return; 27*5c38ae36SWouter van Oortmerssen 28*5c38ae36SWouter van Oortmerssen MachineBasicBlock::iterator DI = *Instr; 29*5c38ae36SWouter van Oortmerssen ++DI; 30*5c38ae36SWouter van Oortmerssen for (MachineBasicBlock::iterator DE = Instr->getParent()->end(); DI != DE; 31*5c38ae36SWouter van Oortmerssen ++DI) { 32*5c38ae36SWouter van Oortmerssen if (DI->isDebugValue() && 33*5c38ae36SWouter van Oortmerssen DI->getDebugOperandForReg(Instr->getOperand(0).getReg())) 34*5c38ae36SWouter van Oortmerssen DbgValues.push_back(&*DI); 35*5c38ae36SWouter van Oortmerssen } 36be24c020SYury Delendik } 37be24c020SYury Delendik 38be24c020SYury Delendik void WebAssemblyDebugValueManager::move(MachineInstr *Insert) { 39be24c020SYury Delendik MachineBasicBlock *MBB = Insert->getParent(); 40be24c020SYury Delendik for (MachineInstr *DBI : reverse(DbgValues)) 41be24c020SYury Delendik MBB->splice(Insert, DBI->getParent(), DBI); 42be24c020SYury Delendik } 43be24c020SYury Delendik 44be24c020SYury Delendik void WebAssemblyDebugValueManager::updateReg(unsigned Reg) { 45be24c020SYury Delendik for (auto *DBI : DbgValues) 46539381daSstozer DBI->getDebugOperand(0).setReg(Reg); 47be24c020SYury Delendik } 48be24c020SYury Delendik 49be24c020SYury Delendik void WebAssemblyDebugValueManager::clone(MachineInstr *Insert, 50be24c020SYury Delendik unsigned NewReg) { 51be24c020SYury Delendik MachineBasicBlock *MBB = Insert->getParent(); 52be24c020SYury Delendik MachineFunction *MF = MBB->getParent(); 53be24c020SYury Delendik for (MachineInstr *DBI : reverse(DbgValues)) { 54be24c020SYury Delendik MachineInstr *Clone = MF->CloneMachineInstr(DBI); 55539381daSstozer Clone->getDebugOperand(0).setReg(NewReg); 56be24c020SYury Delendik MBB->insert(Insert, Clone); 57be24c020SYury Delendik } 58be24c020SYury Delendik } 59adf7a0a5SYury Delendik 60adf7a0a5SYury Delendik void WebAssemblyDebugValueManager::replaceWithLocal(unsigned LocalId) { 61adf7a0a5SYury Delendik for (auto *DBI : DbgValues) { 62539381daSstozer MachineOperand &Op = DBI->getDebugOperand(0); 6348139ebcSWouter van Oortmerssen Op.ChangeToTargetIndex(llvm::WebAssembly::TI_LOCAL, LocalId); 64adf7a0a5SYury Delendik } 65adf7a0a5SYury Delendik } 66