xref: /llvm-project/llvm/lib/Target/WebAssembly/WebAssemblyNullifyDebugValueLists.cpp (revision 43570a2841e2a8f1efd00503beee751cc1e72513)
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.
124e844a14SHeejin Ahn /// See https://github.com/llvm/llvm-project/issues/49705.
13a64ebb86SHeejin Ahn /// TODO Correctly handle DBG_VALUE_LISTs
14a64ebb86SHeejin Ahn ///
15a64ebb86SHeejin Ahn //===----------------------------------------------------------------------===//
16a64ebb86SHeejin Ahn 
17a64ebb86SHeejin Ahn #include "WebAssembly.h"
18989f1c72Sserge-sans-paille #include "llvm/CodeGen/MachineFunctionPass.h"
19a64ebb86SHeejin Ahn using namespace llvm;
20a64ebb86SHeejin Ahn 
21a64ebb86SHeejin Ahn #define DEBUG_TYPE "wasm-nullify-dbg-value-lists"
22a64ebb86SHeejin Ahn 
23a64ebb86SHeejin Ahn namespace {
24a64ebb86SHeejin Ahn class WebAssemblyNullifyDebugValueLists final : public MachineFunctionPass {
25a64ebb86SHeejin Ahn   StringRef getPassName() const override {
26a64ebb86SHeejin Ahn     return "WebAssembly Nullify DBG_VALUE_LISTs";
27a64ebb86SHeejin Ahn   }
28a64ebb86SHeejin Ahn 
29a64ebb86SHeejin Ahn   bool runOnMachineFunction(MachineFunction &MF) override;
30a64ebb86SHeejin Ahn 
31a64ebb86SHeejin Ahn public:
32a64ebb86SHeejin Ahn   static char ID; // Pass identification, replacement for typeid
33a64ebb86SHeejin Ahn   WebAssemblyNullifyDebugValueLists() : MachineFunctionPass(ID) {}
34a64ebb86SHeejin Ahn };
35a64ebb86SHeejin Ahn } // end anonymous namespace
36a64ebb86SHeejin Ahn 
37a64ebb86SHeejin Ahn char WebAssemblyNullifyDebugValueLists::ID = 0;
38a64ebb86SHeejin Ahn INITIALIZE_PASS(WebAssemblyNullifyDebugValueLists, DEBUG_TYPE,
39a64ebb86SHeejin Ahn                 "WebAssembly Nullify DBG_VALUE_LISTs", false, false)
40a64ebb86SHeejin Ahn 
41a64ebb86SHeejin Ahn FunctionPass *llvm::createWebAssemblyNullifyDebugValueLists() {
42a64ebb86SHeejin Ahn   return new WebAssemblyNullifyDebugValueLists();
43a64ebb86SHeejin Ahn }
44a64ebb86SHeejin Ahn 
45a64ebb86SHeejin Ahn bool WebAssemblyNullifyDebugValueLists::runOnMachineFunction(
46a64ebb86SHeejin Ahn     MachineFunction &MF) {
47a64ebb86SHeejin Ahn   LLVM_DEBUG(dbgs() << "********** Nullify DBG_VALUE_LISTs **********\n"
48a64ebb86SHeejin Ahn                        "********** Function: "
49a64ebb86SHeejin Ahn                     << MF.getName() << '\n');
50*4f2401f4SHeejin Ahn   bool Changed = false;
51a64ebb86SHeejin Ahn   // Our backend, including WebAssemblyDebugValueManager, currently cannot
52*4f2401f4SHeejin Ahn   // handle DBG_VALUE_LISTs correctly. So this makes them undefined, which will
53*4f2401f4SHeejin Ahn   // appear as "optimized out".
54*4f2401f4SHeejin Ahn   for (auto &MBB : MF) {
55*4f2401f4SHeejin Ahn     for (auto &MI : MBB) {
56*4f2401f4SHeejin Ahn       if (MI.getOpcode() == TargetOpcode::DBG_VALUE_LIST) {
57*4f2401f4SHeejin Ahn         MI.setDebugValueUndef();
58*4f2401f4SHeejin Ahn         Changed = true;
59a64ebb86SHeejin Ahn       }
60*4f2401f4SHeejin Ahn     }
61*4f2401f4SHeejin Ahn   }
62*4f2401f4SHeejin Ahn   return Changed;
63a64ebb86SHeejin Ahn }
64