1344a3780SDimitry Andric //=== WebAssemblyNullifyDebugValueLists.cpp - Nullify DBG_VALUE_LISTs ---===// 2344a3780SDimitry Andric // 3344a3780SDimitry Andric // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. 4344a3780SDimitry Andric // See https://llvm.org/LICENSE.txt for license information. 5344a3780SDimitry Andric // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception 6344a3780SDimitry Andric // 7344a3780SDimitry Andric //===----------------------------------------------------------------------===// 8344a3780SDimitry Andric /// 9344a3780SDimitry Andric /// \file 10344a3780SDimitry Andric /// Nullify DBG_VALUE_LISTs instructions as a temporary measure before we 11344a3780SDimitry Andric /// implement DBG_VALUE_LIST handling in WebAssemblyDebugValueManager. 127fa27ce4SDimitry Andric /// See https://github.com/llvm/llvm-project/issues/49705. 13344a3780SDimitry Andric /// TODO Correctly handle DBG_VALUE_LISTs 14344a3780SDimitry Andric /// 15344a3780SDimitry Andric //===----------------------------------------------------------------------===// 16344a3780SDimitry Andric 17344a3780SDimitry Andric #include "WebAssembly.h" 18344a3780SDimitry Andric #include "WebAssemblySubtarget.h" 19145449b1SDimitry Andric #include "llvm/CodeGen/MachineFunctionPass.h" 20344a3780SDimitry Andric using namespace llvm; 21344a3780SDimitry Andric 22344a3780SDimitry Andric #define DEBUG_TYPE "wasm-nullify-dbg-value-lists" 23344a3780SDimitry Andric 24344a3780SDimitry Andric namespace { 25344a3780SDimitry Andric class WebAssemblyNullifyDebugValueLists final : public MachineFunctionPass { getPassName() const26344a3780SDimitry Andric StringRef getPassName() const override { 27344a3780SDimitry Andric return "WebAssembly Nullify DBG_VALUE_LISTs"; 28344a3780SDimitry Andric } 29344a3780SDimitry Andric 30344a3780SDimitry Andric bool runOnMachineFunction(MachineFunction &MF) override; 31344a3780SDimitry Andric 32344a3780SDimitry Andric public: 33344a3780SDimitry Andric static char ID; // Pass identification, replacement for typeid WebAssemblyNullifyDebugValueLists()34344a3780SDimitry Andric WebAssemblyNullifyDebugValueLists() : MachineFunctionPass(ID) {} 35344a3780SDimitry Andric }; 36344a3780SDimitry Andric } // end anonymous namespace 37344a3780SDimitry Andric 38344a3780SDimitry Andric char WebAssemblyNullifyDebugValueLists::ID = 0; 39344a3780SDimitry Andric INITIALIZE_PASS(WebAssemblyNullifyDebugValueLists, DEBUG_TYPE, 40344a3780SDimitry Andric "WebAssembly Nullify DBG_VALUE_LISTs", false, false) 41344a3780SDimitry Andric createWebAssemblyNullifyDebugValueLists()42344a3780SDimitry AndricFunctionPass *llvm::createWebAssemblyNullifyDebugValueLists() { 43344a3780SDimitry Andric return new WebAssemblyNullifyDebugValueLists(); 44344a3780SDimitry Andric } 45344a3780SDimitry Andric runOnMachineFunction(MachineFunction & MF)46344a3780SDimitry Andricbool WebAssemblyNullifyDebugValueLists::runOnMachineFunction( 47344a3780SDimitry Andric MachineFunction &MF) { 48344a3780SDimitry Andric LLVM_DEBUG(dbgs() << "********** Nullify DBG_VALUE_LISTs **********\n" 49344a3780SDimitry Andric "********** Function: " 50344a3780SDimitry Andric << MF.getName() << '\n'); 517fa27ce4SDimitry Andric bool Changed = false; 52344a3780SDimitry Andric // Our backend, including WebAssemblyDebugValueManager, currently cannot 537fa27ce4SDimitry Andric // handle DBG_VALUE_LISTs correctly. So this makes them undefined, which will 547fa27ce4SDimitry Andric // appear as "optimized out". 557fa27ce4SDimitry Andric for (auto &MBB : MF) { 567fa27ce4SDimitry Andric for (auto &MI : MBB) { 577fa27ce4SDimitry Andric if (MI.getOpcode() == TargetOpcode::DBG_VALUE_LIST) { 587fa27ce4SDimitry Andric MI.setDebugValueUndef(); 597fa27ce4SDimitry Andric Changed = true; 60344a3780SDimitry Andric } 617fa27ce4SDimitry Andric } 627fa27ce4SDimitry Andric } 637fa27ce4SDimitry Andric return Changed; 64344a3780SDimitry Andric } 65