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