| //===-- WebAssemblyDebugValueManager.cpp - WebAssembly DebugValue Manager -===// | |
| // | |
| // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. | |
| // See https://llvm.org/LICENSE.txt for license information. | |
| // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception | |
| // | |
| //===----------------------------------------------------------------------===// | |
| /// | |
| /// \file | |
| /// This file implements the manager for MachineInstr DebugValues. | |
| /// | |
| //===----------------------------------------------------------------------===// | |
| #include "WebAssemblyDebugValueManager.h" | |
| #include "WebAssembly.h" | |
| #include "WebAssemblyMachineFunctionInfo.h" | |
| #include "llvm/CodeGen/MachineInstr.h" | |
| using namespace llvm; | |
| WebAssemblyDebugValueManager::WebAssemblyDebugValueManager( | |
| MachineInstr *Instr) { | |
| // This code differs from MachineInstr::collectDebugValues in that it scans | |
| // the whole BB, not just contiguous DBG_VALUEs. | |
| if (!Instr->getOperand(0).isReg()) | |
| return; | |
| CurrentReg = Instr->getOperand(0).getReg(); | |
| MachineBasicBlock::iterator DI = *Instr; | |
| ++DI; | |
| for (MachineBasicBlock::iterator DE = Instr->getParent()->end(); DI != DE; | |
| ++DI) { | |
| if (DI->isDebugValue() && | |
| DI->hasDebugOperandForReg(Instr->getOperand(0).getReg())) | |
| DbgValues.push_back(&*DI); | |
| } | |
| } | |
| void WebAssemblyDebugValueManager::move(MachineInstr *Insert) { | |
| MachineBasicBlock *MBB = Insert->getParent(); | |
| for (MachineInstr *DBI : reverse(DbgValues)) | |
| MBB->splice(Insert, DBI->getParent(), DBI); | |
| } | |
| void WebAssemblyDebugValueManager::updateReg(unsigned Reg) { | |
| for (auto *DBI : DbgValues) | |
| for (auto &MO : DBI->getDebugOperandsForReg(CurrentReg)) | |
| MO.setReg(Reg); | |
| CurrentReg = Reg; | |
| } | |
| void WebAssemblyDebugValueManager::clone(MachineInstr *Insert, | |
| unsigned NewReg) { | |
| MachineBasicBlock *MBB = Insert->getParent(); | |
| MachineFunction *MF = MBB->getParent(); | |
| for (MachineInstr *DBI : reverse(DbgValues)) { | |
| MachineInstr *Clone = MF->CloneMachineInstr(DBI); | |
| for (auto &MO : Clone->getDebugOperandsForReg(CurrentReg)) | |
| MO.setReg(NewReg); | |
| MBB->insert(Insert, Clone); | |
| } | |
| } | |
| void WebAssemblyDebugValueManager::replaceWithLocal(unsigned LocalId) { | |
| for (auto *DBI : DbgValues) { | |
| auto IndexType = DBI->isIndirectDebugValue() | |
| ? llvm::WebAssembly::TI_LOCAL_INDIRECT | |
| : llvm::WebAssembly::TI_LOCAL; | |
| for (auto &MO : DBI->getDebugOperandsForReg(CurrentReg)) | |
| MO.ChangeToTargetIndex(IndexType, LocalId); | |
| } | |
| } |