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 AndricFunctionPass *llvm::createWebAssemblyNullifyDebugValueLists() { 43fe6060f1SDimitry Andric return new WebAssemblyNullifyDebugValueLists(); 44fe6060f1SDimitry Andric } 45fe6060f1SDimitry Andric runOnMachineFunction(MachineFunction & MF)46fe6060f1SDimitry Andricbool 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