123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172 |
- //===-- 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);
- }
- }
|