diff options
author | vvvv <vvvv@ydb.tech> | 2024-02-06 20:01:22 +0300 |
---|---|---|
committer | Alexander Smirnov <alex@ydb.tech> | 2024-02-09 19:18:27 +0300 |
commit | ee2b7fbda052aa09b6fdb83b8c6f0305fef3e193 (patch) | |
tree | 102765416c3866bde98a82facc7752d329ee0226 /contrib/libs/llvm16/lib/Target/WebAssembly/WebAssemblyDebugValueManager.cpp | |
parent | 7494ca32d3a5aca00b7ac527b5f127989335102c (diff) | |
download | ydb-ee2b7fbda052aa09b6fdb83b8c6f0305fef3e193.tar.gz |
llvm16 targets
Diffstat (limited to 'contrib/libs/llvm16/lib/Target/WebAssembly/WebAssemblyDebugValueManager.cpp')
-rw-r--r-- | contrib/libs/llvm16/lib/Target/WebAssembly/WebAssemblyDebugValueManager.cpp | 72 |
1 files changed, 72 insertions, 0 deletions
diff --git a/contrib/libs/llvm16/lib/Target/WebAssembly/WebAssemblyDebugValueManager.cpp b/contrib/libs/llvm16/lib/Target/WebAssembly/WebAssemblyDebugValueManager.cpp new file mode 100644 index 00000000000..55be64ad7da --- /dev/null +++ b/contrib/libs/llvm16/lib/Target/WebAssembly/WebAssemblyDebugValueManager.cpp @@ -0,0 +1,72 @@ +//===-- 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); + } +} |