1*a64ebb86SHeejin Ahn //=== WebAssemblyNullifyDebugValueLists.cpp - Nullify DBG_VALUE_LISTs   ---===//
2*a64ebb86SHeejin Ahn //
3*a64ebb86SHeejin Ahn // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
4*a64ebb86SHeejin Ahn // See https://llvm.org/LICENSE.txt for license information.
5*a64ebb86SHeejin Ahn // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
6*a64ebb86SHeejin Ahn //
7*a64ebb86SHeejin Ahn //===----------------------------------------------------------------------===//
8*a64ebb86SHeejin Ahn ///
9*a64ebb86SHeejin Ahn /// \file
10*a64ebb86SHeejin Ahn /// Nullify DBG_VALUE_LISTs instructions as a temporary measure before we
11*a64ebb86SHeejin Ahn /// implement DBG_VALUE_LIST handling in WebAssemblyDebugValueManager.
12*a64ebb86SHeejin Ahn /// See https://bugs.llvm.org/show_bug.cgi?id=50361.
13*a64ebb86SHeejin Ahn /// TODO Correctly handle DBG_VALUE_LISTs
14*a64ebb86SHeejin Ahn ///
15*a64ebb86SHeejin Ahn //===----------------------------------------------------------------------===//
16*a64ebb86SHeejin Ahn 
17*a64ebb86SHeejin Ahn #include "WebAssembly.h"
18*a64ebb86SHeejin Ahn #include "WebAssemblySubtarget.h"
19*a64ebb86SHeejin Ahn using namespace llvm;
20*a64ebb86SHeejin Ahn 
21*a64ebb86SHeejin Ahn #define DEBUG_TYPE "wasm-nullify-dbg-value-lists"
22*a64ebb86SHeejin Ahn 
23*a64ebb86SHeejin Ahn namespace {
24*a64ebb86SHeejin Ahn class WebAssemblyNullifyDebugValueLists final : public MachineFunctionPass {
25*a64ebb86SHeejin Ahn   StringRef getPassName() const override {
26*a64ebb86SHeejin Ahn     return "WebAssembly Nullify DBG_VALUE_LISTs";
27*a64ebb86SHeejin Ahn   }
28*a64ebb86SHeejin Ahn 
29*a64ebb86SHeejin Ahn   bool runOnMachineFunction(MachineFunction &MF) override;
30*a64ebb86SHeejin Ahn 
31*a64ebb86SHeejin Ahn public:
32*a64ebb86SHeejin Ahn   static char ID; // Pass identification, replacement for typeid
33*a64ebb86SHeejin Ahn   WebAssemblyNullifyDebugValueLists() : MachineFunctionPass(ID) {}
34*a64ebb86SHeejin Ahn };
35*a64ebb86SHeejin Ahn } // end anonymous namespace
36*a64ebb86SHeejin Ahn 
37*a64ebb86SHeejin Ahn char WebAssemblyNullifyDebugValueLists::ID = 0;
38*a64ebb86SHeejin Ahn INITIALIZE_PASS(WebAssemblyNullifyDebugValueLists, DEBUG_TYPE,
39*a64ebb86SHeejin Ahn                 "WebAssembly Nullify DBG_VALUE_LISTs", false, false)
40*a64ebb86SHeejin Ahn 
41*a64ebb86SHeejin Ahn FunctionPass *llvm::createWebAssemblyNullifyDebugValueLists() {
42*a64ebb86SHeejin Ahn   return new WebAssemblyNullifyDebugValueLists();
43*a64ebb86SHeejin Ahn }
44*a64ebb86SHeejin Ahn 
45*a64ebb86SHeejin Ahn bool WebAssemblyNullifyDebugValueLists::runOnMachineFunction(
46*a64ebb86SHeejin Ahn     MachineFunction &MF) {
47*a64ebb86SHeejin Ahn   LLVM_DEBUG(dbgs() << "********** Nullify DBG_VALUE_LISTs **********\n"
48*a64ebb86SHeejin Ahn                        "********** Function: "
49*a64ebb86SHeejin Ahn                     << MF.getName() << '\n');
50*a64ebb86SHeejin Ahn   const auto &TII = *MF.getSubtarget<WebAssemblySubtarget>().getInstrInfo();
51*a64ebb86SHeejin Ahn   SmallVector<MachineInstr *, 2> DbgValueLists;
52*a64ebb86SHeejin Ahn   for (auto &MBB : MF)
53*a64ebb86SHeejin Ahn     for (auto &MI : MBB)
54*a64ebb86SHeejin Ahn       if (MI.getOpcode() == TargetOpcode::DBG_VALUE_LIST)
55*a64ebb86SHeejin Ahn         DbgValueLists.push_back(&MI);
56*a64ebb86SHeejin Ahn 
57*a64ebb86SHeejin Ahn   // Our backend, including WebAssemblyDebugValueManager, currently cannot
58*a64ebb86SHeejin Ahn   // handle DBG_VALUE_LISTs correctly. So this converts DBG_VALUE_LISTs to
59*a64ebb86SHeejin Ahn   // "DBG_VALUE $noreg", which will appear as "optimized out".
60*a64ebb86SHeejin Ahn   for (auto *DVL : DbgValueLists) {
61*a64ebb86SHeejin Ahn     BuildMI(*DVL->getParent(), DVL, DVL->getDebugLoc(),
62*a64ebb86SHeejin Ahn             TII.get(TargetOpcode::DBG_VALUE), false, Register(),
63*a64ebb86SHeejin Ahn             DVL->getOperand(0).getMetadata(), DVL->getOperand(1).getMetadata());
64*a64ebb86SHeejin Ahn     DVL->eraseFromParent();
65*a64ebb86SHeejin Ahn   }
66*a64ebb86SHeejin Ahn 
67*a64ebb86SHeejin Ahn   return !DbgValueLists.empty();
68*a64ebb86SHeejin Ahn }
69