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 WebAssemblyDebugValueManager(MachineInstr * Instr)21be24c020SYury DelendikWebAssemblyDebugValueManager::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; 271db137b1SStephen Tozer CurrentReg = Instr->getOperand(0).getReg(); 285c38ae36SWouter van Oortmerssen 295c38ae36SWouter van Oortmerssen MachineBasicBlock::iterator DI = *Instr; 305c38ae36SWouter van Oortmerssen ++DI; 315c38ae36SWouter van Oortmerssen for (MachineBasicBlock::iterator DE = Instr->getParent()->end(); DI != DE; 325c38ae36SWouter van Oortmerssen ++DI) { 335c38ae36SWouter van Oortmerssen if (DI->isDebugValue() && 34f6774130SStephen Tozer DI->hasDebugOperandForReg(Instr->getOperand(0).getReg())) 35*a64ebb86SHeejin Ahn DbgValues.push_back(&*DI); 365c38ae36SWouter van Oortmerssen } 37be24c020SYury Delendik } 38be24c020SYury Delendik move(MachineInstr * Insert)39be24c020SYury Delendikvoid WebAssemblyDebugValueManager::move(MachineInstr *Insert) { 40be24c020SYury Delendik MachineBasicBlock *MBB = Insert->getParent(); 41be24c020SYury Delendik for (MachineInstr *DBI : reverse(DbgValues)) 42be24c020SYury Delendik MBB->splice(Insert, DBI->getParent(), DBI); 43be24c020SYury Delendik } 44be24c020SYury Delendik updateReg(unsigned Reg)45be24c020SYury Delendikvoid WebAssemblyDebugValueManager::updateReg(unsigned Reg) { 46be24c020SYury Delendik for (auto *DBI : DbgValues) 471db137b1SStephen Tozer for (auto &MO : DBI->getDebugOperandsForReg(CurrentReg)) 481db137b1SStephen Tozer MO.setReg(Reg); 491db137b1SStephen Tozer CurrentReg = Reg; 50be24c020SYury Delendik } 51be24c020SYury Delendik clone(MachineInstr * Insert,unsigned NewReg)52be24c020SYury Delendikvoid WebAssemblyDebugValueManager::clone(MachineInstr *Insert, 53be24c020SYury Delendik unsigned NewReg) { 54be24c020SYury Delendik MachineBasicBlock *MBB = Insert->getParent(); 55be24c020SYury Delendik MachineFunction *MF = MBB->getParent(); 56be24c020SYury Delendik for (MachineInstr *DBI : reverse(DbgValues)) { 57be24c020SYury Delendik MachineInstr *Clone = MF->CloneMachineInstr(DBI); 581db137b1SStephen Tozer for (auto &MO : Clone->getDebugOperandsForReg(CurrentReg)) 591db137b1SStephen Tozer MO.setReg(NewReg); 60be24c020SYury Delendik MBB->insert(Insert, Clone); 61be24c020SYury Delendik } 62be24c020SYury Delendik } 63adf7a0a5SYury Delendik replaceWithLocal(unsigned LocalId)64adf7a0a5SYury Delendikvoid WebAssemblyDebugValueManager::replaceWithLocal(unsigned LocalId) { 65adf7a0a5SYury Delendik for (auto *DBI : DbgValues) { 661db137b1SStephen Tozer auto IndexType = DBI->isIndirectDebugValue() 671db137b1SStephen Tozer ? llvm::WebAssembly::TI_LOCAL_INDIRECT 681db137b1SStephen Tozer : llvm::WebAssembly::TI_LOCAL; 691db137b1SStephen Tozer for (auto &MO : DBI->getDebugOperandsForReg(CurrentReg)) 701db137b1SStephen Tozer MO.ChangeToTargetIndex(IndexType, LocalId); 71adf7a0a5SYury Delendik } 72adf7a0a5SYury Delendik } 73