xref: /llvm-project/llvm/lib/Target/WebAssembly/WebAssemblyDebugValueManager.cpp (revision 999643f1513e86d7d438ec953a3d73c4bc21eb25)
1 //===-- WebAssemblyDebugValueManager.cpp - WebAssembly DebugValue Manager -===//
2 //
3 // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
4 // See https://llvm.org/LICENSE.txt for license information.
5 // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
6 //
7 //===----------------------------------------------------------------------===//
8 ///
9 /// \file
10 /// This file implements the manager for MachineInstr DebugValues.
11 ///
12 //===----------------------------------------------------------------------===//
13 
14 #include "WebAssemblyDebugValueManager.h"
15 #include "WebAssembly.h"
16 #include "WebAssemblyMachineFunctionInfo.h"
17 #include "llvm/CodeGen/MachineInstr.h"
18 
19 using namespace llvm;
20 
21 WebAssemblyDebugValueManager::WebAssemblyDebugValueManager(MachineInstr *Def) {
22   // This code differs from MachineInstr::collectDebugValues in that it scans
23   // the whole BB, not just contiguous DBG_VALUEs.
24   if (!Def->getOperand(0).isReg())
25     return;
26   CurrentReg = Def->getOperand(0).getReg();
27 
28   for (MachineBasicBlock::iterator MI = std::next(Def->getIterator()),
29                                    ME = Def->getParent()->end();
30        MI != ME; ++MI) {
31     if (MI->isDebugValue() && MI->hasDebugOperandForReg(CurrentReg))
32       DbgValues.push_back(&*MI);
33   }
34 }
35 
36 void WebAssemblyDebugValueManager::move(MachineInstr *Insert) {
37   MachineBasicBlock *MBB = Insert->getParent();
38   for (MachineInstr *DBI : reverse(DbgValues))
39     MBB->splice(Insert, DBI->getParent(), DBI);
40 }
41 
42 void WebAssemblyDebugValueManager::clone(MachineInstr *Insert,
43                                          Register NewReg) {
44   MachineBasicBlock *MBB = Insert->getParent();
45   MachineFunction *MF = MBB->getParent();
46   for (MachineInstr *DBI : reverse(DbgValues)) {
47     MachineInstr *Clone = MF->CloneMachineInstr(DBI);
48     for (auto &MO : Clone->getDebugOperandsForReg(CurrentReg))
49       MO.setReg(NewReg);
50     MBB->insert(Insert, Clone);
51   }
52 }
53 
54 void WebAssemblyDebugValueManager::updateReg(Register Reg) {
55   for (auto *DBI : DbgValues)
56     for (auto &MO : DBI->getDebugOperandsForReg(CurrentReg))
57       MO.setReg(Reg);
58   CurrentReg = Reg;
59 }
60 
61 void WebAssemblyDebugValueManager::replaceWithLocal(unsigned LocalId) {
62   for (auto *DBI : DbgValues) {
63     auto IndexType = DBI->isIndirectDebugValue()
64                          ? llvm::WebAssembly::TI_LOCAL_INDIRECT
65                          : llvm::WebAssembly::TI_LOCAL;
66     for (auto &MO : DBI->getDebugOperandsForReg(CurrentReg))
67       MO.ChangeToTargetIndex(IndexType, LocalId);
68   }
69 }
70