1e8d8bef9SDimitry Andric //===- LiveDebugValues.cpp - Tracking Debug Value MIs ---------------------===// 2e8d8bef9SDimitry Andric // 3e8d8bef9SDimitry Andric // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. 4e8d8bef9SDimitry Andric // See https://llvm.org/LICENSE.txt for license information. 5e8d8bef9SDimitry Andric // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception 6e8d8bef9SDimitry Andric // 7e8d8bef9SDimitry Andric //===----------------------------------------------------------------------===// 8e8d8bef9SDimitry Andric 9e8d8bef9SDimitry Andric #include "LiveDebugValues.h" 10e8d8bef9SDimitry Andric 11e8d8bef9SDimitry Andric #include "llvm/CodeGen/MachineBasicBlock.h" 12e8d8bef9SDimitry Andric #include "llvm/CodeGen/MachineFrameInfo.h" 13e8d8bef9SDimitry Andric #include "llvm/CodeGen/MachineFunctionPass.h" 14e8d8bef9SDimitry Andric #include "llvm/CodeGen/Passes.h" 15e8d8bef9SDimitry Andric #include "llvm/InitializePasses.h" 16e8d8bef9SDimitry Andric #include "llvm/Pass.h" 17*fe6060f1SDimitry Andric #include "llvm/Support/CommandLine.h" 18e8d8bef9SDimitry Andric #include "llvm/Target/TargetMachine.h" 19e8d8bef9SDimitry Andric 20e8d8bef9SDimitry Andric /// \file LiveDebugValues.cpp 21e8d8bef9SDimitry Andric /// 22e8d8bef9SDimitry Andric /// The LiveDebugValues pass extends the range of variable locations 23e8d8bef9SDimitry Andric /// (specified by DBG_VALUE instructions) from single blocks to successors 24e8d8bef9SDimitry Andric /// and any other code locations where the variable location is valid. 25e8d8bef9SDimitry Andric /// There are currently two implementations: the "VarLoc" implementation 26e8d8bef9SDimitry Andric /// explicitly tracks the location of a variable, while the "InstrRef" 27e8d8bef9SDimitry Andric /// implementation tracks the values defined by instructions through locations. 28e8d8bef9SDimitry Andric /// 29e8d8bef9SDimitry Andric /// This file implements neither; it merely registers the pass, allows the 30e8d8bef9SDimitry Andric /// user to pick which implementation will be used to propagate variable 31e8d8bef9SDimitry Andric /// locations. 32e8d8bef9SDimitry Andric 33e8d8bef9SDimitry Andric #define DEBUG_TYPE "livedebugvalues" 34e8d8bef9SDimitry Andric 35e8d8bef9SDimitry Andric using namespace llvm; 36e8d8bef9SDimitry Andric 37*fe6060f1SDimitry Andric static cl::opt<bool> 38*fe6060f1SDimitry Andric ForceInstrRefLDV("force-instr-ref-livedebugvalues", cl::Hidden, 39*fe6060f1SDimitry Andric cl::desc("Use instruction-ref based LiveDebugValues with " 40*fe6060f1SDimitry Andric "normal DBG_VALUE inputs"), 41*fe6060f1SDimitry Andric cl::init(false)); 42*fe6060f1SDimitry Andric 43e8d8bef9SDimitry Andric /// Generic LiveDebugValues pass. Calls through to VarLocBasedLDV or 44e8d8bef9SDimitry Andric /// InstrRefBasedLDV to perform location propagation, via the LDVImpl 45e8d8bef9SDimitry Andric /// base class. 46e8d8bef9SDimitry Andric class LiveDebugValues : public MachineFunctionPass { 47e8d8bef9SDimitry Andric public: 48e8d8bef9SDimitry Andric static char ID; 49e8d8bef9SDimitry Andric 50e8d8bef9SDimitry Andric LiveDebugValues(); 51e8d8bef9SDimitry Andric ~LiveDebugValues() { 52e8d8bef9SDimitry Andric if (TheImpl) 53e8d8bef9SDimitry Andric delete TheImpl; 54e8d8bef9SDimitry Andric } 55e8d8bef9SDimitry Andric 56e8d8bef9SDimitry Andric /// Calculate the liveness information for the given machine function. 57e8d8bef9SDimitry Andric bool runOnMachineFunction(MachineFunction &MF) override; 58e8d8bef9SDimitry Andric 59e8d8bef9SDimitry Andric MachineFunctionProperties getRequiredProperties() const override { 60e8d8bef9SDimitry Andric return MachineFunctionProperties().set( 61e8d8bef9SDimitry Andric MachineFunctionProperties::Property::NoVRegs); 62e8d8bef9SDimitry Andric } 63e8d8bef9SDimitry Andric 64e8d8bef9SDimitry Andric void getAnalysisUsage(AnalysisUsage &AU) const override { 65e8d8bef9SDimitry Andric AU.setPreservesCFG(); 66e8d8bef9SDimitry Andric MachineFunctionPass::getAnalysisUsage(AU); 67e8d8bef9SDimitry Andric } 68e8d8bef9SDimitry Andric 69e8d8bef9SDimitry Andric private: 70e8d8bef9SDimitry Andric LDVImpl *TheImpl; 71e8d8bef9SDimitry Andric TargetPassConfig *TPC; 72e8d8bef9SDimitry Andric }; 73e8d8bef9SDimitry Andric 74e8d8bef9SDimitry Andric char LiveDebugValues::ID = 0; 75e8d8bef9SDimitry Andric 76e8d8bef9SDimitry Andric char &llvm::LiveDebugValuesID = LiveDebugValues::ID; 77e8d8bef9SDimitry Andric 78e8d8bef9SDimitry Andric INITIALIZE_PASS(LiveDebugValues, DEBUG_TYPE, "Live DEBUG_VALUE analysis", false, 79e8d8bef9SDimitry Andric false) 80e8d8bef9SDimitry Andric 81e8d8bef9SDimitry Andric /// Default construct and initialize the pass. 82e8d8bef9SDimitry Andric LiveDebugValues::LiveDebugValues() : MachineFunctionPass(ID) { 83e8d8bef9SDimitry Andric initializeLiveDebugValuesPass(*PassRegistry::getPassRegistry()); 84e8d8bef9SDimitry Andric TheImpl = nullptr; 85e8d8bef9SDimitry Andric } 86e8d8bef9SDimitry Andric 87e8d8bef9SDimitry Andric bool LiveDebugValues::runOnMachineFunction(MachineFunction &MF) { 88e8d8bef9SDimitry Andric if (!TheImpl) { 89e8d8bef9SDimitry Andric TPC = getAnalysisIfAvailable<TargetPassConfig>(); 90e8d8bef9SDimitry Andric 91e8d8bef9SDimitry Andric bool InstrRefBased = false; 92e8d8bef9SDimitry Andric if (TPC) { 93e8d8bef9SDimitry Andric auto &TM = TPC->getTM<TargetMachine>(); 94e8d8bef9SDimitry Andric InstrRefBased = TM.Options.ValueTrackingVariableLocations; 95e8d8bef9SDimitry Andric } 96e8d8bef9SDimitry Andric 97*fe6060f1SDimitry Andric // Allow the user to force selection of InstrRef LDV. 98*fe6060f1SDimitry Andric InstrRefBased |= ForceInstrRefLDV; 99*fe6060f1SDimitry Andric 100e8d8bef9SDimitry Andric if (InstrRefBased) 101e8d8bef9SDimitry Andric TheImpl = llvm::makeInstrRefBasedLiveDebugValues(); 102e8d8bef9SDimitry Andric else 103e8d8bef9SDimitry Andric TheImpl = llvm::makeVarLocBasedLiveDebugValues(); 104e8d8bef9SDimitry Andric } 105e8d8bef9SDimitry Andric 106e8d8bef9SDimitry Andric return TheImpl->ExtendRanges(MF, TPC); 107e8d8bef9SDimitry Andric } 108