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