diff options
author | vvvv <vvvv@ydb.tech> | 2024-02-06 20:01:22 +0300 |
---|---|---|
committer | vvvv <vvvv@ydb.tech> | 2024-02-06 20:22:16 +0300 |
commit | 0203b7a9a40828bb2bd4c32029b79ff0ea3d1f8f (patch) | |
tree | e630d0d5bd0bd29fc8c2d2842ed2cfde781b993a /contrib/libs/llvm16/lib/Target/WebAssembly/WebAssemblyDebugValueManager.cpp | |
parent | ba27db76d99d12a4f1c06960b5449423218614c4 (diff) | |
download | ydb-0203b7a9a40828bb2bd4c32029b79ff0ea3d1f8f.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); + } +} |