xref: /freebsd-src/contrib/llvm-project/llvm/lib/Target/WebAssembly/WebAssemblyNullifyDebugValueLists.cpp (revision 06c3fb2749bda94cb5201f81ffdb8fa6c3161b2e)
1fe6060f1SDimitry Andric //=== WebAssemblyNullifyDebugValueLists.cpp - Nullify DBG_VALUE_LISTs   ---===//
2fe6060f1SDimitry Andric //
3fe6060f1SDimitry Andric // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
4fe6060f1SDimitry Andric // See https://llvm.org/LICENSE.txt for license information.
5fe6060f1SDimitry Andric // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
6fe6060f1SDimitry Andric //
7fe6060f1SDimitry Andric //===----------------------------------------------------------------------===//
8fe6060f1SDimitry Andric ///
9fe6060f1SDimitry Andric /// \file
10fe6060f1SDimitry Andric /// Nullify DBG_VALUE_LISTs instructions as a temporary measure before we
11fe6060f1SDimitry Andric /// implement DBG_VALUE_LIST handling in WebAssemblyDebugValueManager.
12*06c3fb27SDimitry Andric /// See https://github.com/llvm/llvm-project/issues/49705.
13fe6060f1SDimitry Andric /// TODO Correctly handle DBG_VALUE_LISTs
14fe6060f1SDimitry Andric ///
15fe6060f1SDimitry Andric //===----------------------------------------------------------------------===//
16fe6060f1SDimitry Andric 
17fe6060f1SDimitry Andric #include "WebAssembly.h"
18fe6060f1SDimitry Andric #include "WebAssemblySubtarget.h"
1981ad6265SDimitry Andric #include "llvm/CodeGen/MachineFunctionPass.h"
20fe6060f1SDimitry Andric using namespace llvm;
21fe6060f1SDimitry Andric 
22fe6060f1SDimitry Andric #define DEBUG_TYPE "wasm-nullify-dbg-value-lists"
23fe6060f1SDimitry Andric 
24fe6060f1SDimitry Andric namespace {
25fe6060f1SDimitry Andric class WebAssemblyNullifyDebugValueLists final : public MachineFunctionPass {
getPassName() const26fe6060f1SDimitry Andric   StringRef getPassName() const override {
27fe6060f1SDimitry Andric     return "WebAssembly Nullify DBG_VALUE_LISTs";
28fe6060f1SDimitry Andric   }
29fe6060f1SDimitry Andric 
30fe6060f1SDimitry Andric   bool runOnMachineFunction(MachineFunction &MF) override;
31fe6060f1SDimitry Andric 
32fe6060f1SDimitry Andric public:
33fe6060f1SDimitry Andric   static char ID; // Pass identification, replacement for typeid
WebAssemblyNullifyDebugValueLists()34fe6060f1SDimitry Andric   WebAssemblyNullifyDebugValueLists() : MachineFunctionPass(ID) {}
35fe6060f1SDimitry Andric };
36fe6060f1SDimitry Andric } // end anonymous namespace
37fe6060f1SDimitry Andric 
38fe6060f1SDimitry Andric char WebAssemblyNullifyDebugValueLists::ID = 0;
39fe6060f1SDimitry Andric INITIALIZE_PASS(WebAssemblyNullifyDebugValueLists, DEBUG_TYPE,
40fe6060f1SDimitry Andric                 "WebAssembly Nullify DBG_VALUE_LISTs", false, false)
41fe6060f1SDimitry Andric 
createWebAssemblyNullifyDebugValueLists()42fe6060f1SDimitry Andric FunctionPass *llvm::createWebAssemblyNullifyDebugValueLists() {
43fe6060f1SDimitry Andric   return new WebAssemblyNullifyDebugValueLists();
44fe6060f1SDimitry Andric }
45fe6060f1SDimitry Andric 
runOnMachineFunction(MachineFunction & MF)46fe6060f1SDimitry Andric bool WebAssemblyNullifyDebugValueLists::runOnMachineFunction(
47fe6060f1SDimitry Andric     MachineFunction &MF) {
48fe6060f1SDimitry Andric   LLVM_DEBUG(dbgs() << "********** Nullify DBG_VALUE_LISTs **********\n"
49fe6060f1SDimitry Andric                        "********** Function: "
50fe6060f1SDimitry Andric                     << MF.getName() << '\n');
51*06c3fb27SDimitry Andric   bool Changed = false;
52fe6060f1SDimitry Andric   // Our backend, including WebAssemblyDebugValueManager, currently cannot
53*06c3fb27SDimitry Andric   // handle DBG_VALUE_LISTs correctly. So this makes them undefined, which will
54*06c3fb27SDimitry Andric   // appear as "optimized out".
55*06c3fb27SDimitry Andric   for (auto &MBB : MF) {
56*06c3fb27SDimitry Andric     for (auto &MI : MBB) {
57*06c3fb27SDimitry Andric       if (MI.getOpcode() == TargetOpcode::DBG_VALUE_LIST) {
58*06c3fb27SDimitry Andric         MI.setDebugValueUndef();
59*06c3fb27SDimitry Andric         Changed = true;
60fe6060f1SDimitry Andric       }
61*06c3fb27SDimitry Andric     }
62*06c3fb27SDimitry Andric   }
63*06c3fb27SDimitry Andric   return Changed;
64fe6060f1SDimitry Andric }
65