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) { 235c38ae36SWouter van Oortmerssen // This code differs from MachineInstr::collectDebugValues in that it scans 245c38ae36SWouter van Oortmerssen // the whole BB, not just contiguous DBG_VALUEs. 255c38ae36SWouter van Oortmerssen if (!Instr->getOperand(0).isReg()) 265c38ae36SWouter van Oortmerssen return; 275c38ae36SWouter van Oortmerssen 285c38ae36SWouter van Oortmerssen MachineBasicBlock::iterator DI = *Instr; 295c38ae36SWouter van Oortmerssen ++DI; 305c38ae36SWouter van Oortmerssen for (MachineBasicBlock::iterator DE = Instr->getParent()->end(); DI != DE; 315c38ae36SWouter van Oortmerssen ++DI) { 325c38ae36SWouter van Oortmerssen if (DI->isDebugValue() && 33*f6774130SStephen Tozer DI->hasDebugOperandForReg(Instr->getOperand(0).getReg())) 345c38ae36SWouter van Oortmerssen DbgValues.push_back(&*DI); 355c38ae36SWouter 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) { 62e3c0b0feSWouter van Oortmerssen MachineOperand &Op0 = DBI->getDebugOperand(0); 63e3c0b0feSWouter van Oortmerssen MachineOperand &Op1 = DBI->getOperand(1); 64e3c0b0feSWouter van Oortmerssen bool Indirect = Op1.isImm() && Op1.getImm() == 0; 65e3c0b0feSWouter van Oortmerssen Op0.ChangeToTargetIndex(Indirect ? llvm::WebAssembly::TI_LOCAL_INDIRECT 66e3c0b0feSWouter van Oortmerssen : llvm::WebAssembly::TI_LOCAL, 67e3c0b0feSWouter van Oortmerssen LocalId); 68adf7a0a5SYury Delendik } 69adf7a0a5SYury Delendik } 70