xref: /freebsd/contrib/llvm-project/llvm/lib/CodeGen/LiveDebugValues/LiveDebugValues.cpp (revision 13ec1e3155c7e9bf037b12af186351b7fa9b9450)
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